mirror of
https://github.com/getnamingo/registry.git
synced 2025-05-13 16:16:59 +02:00
Added create tld option
This commit is contained in:
parent
73af9ed9c4
commit
2d6111ccec
3 changed files with 438 additions and 191 deletions
|
@ -5,6 +5,7 @@ namespace App\Controllers;
|
|||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Respect\Validation\Validator as v;
|
||||
|
||||
class SystemController extends Controller
|
||||
{
|
||||
|
@ -47,6 +48,235 @@ class SystemController extends Controller
|
|||
return $response->withHeader('Location', '/dashboard')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($request->getMethod() === 'POST') {
|
||||
// Retrieve POST data
|
||||
$data = $request->getParsedBody();
|
||||
$db = $this->container->get('db');
|
||||
|
||||
if (isset($data['extension'])) {
|
||||
$extension = $data['extension'];
|
||||
|
||||
// Remove any leading and trailing dots
|
||||
$extension = trim($extension, '.');
|
||||
|
||||
// Add a dot at the beginning if it's missing
|
||||
if ($extension !== '' && $extension[0] !== '.') {
|
||||
$extension = '.' . $extension;
|
||||
}
|
||||
|
||||
// Store the modified 'extension' value back in $data
|
||||
$data['extension'] = $extension;
|
||||
}
|
||||
|
||||
$validators = [
|
||||
'extension' => v::stringType()->notEmpty()->length(3, 64),
|
||||
'tldType' => v::stringType()->notEmpty(),
|
||||
'script' => v::stringType()->notEmpty(),
|
||||
'createm0' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm12' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm24' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm36' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm48' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm60' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm72' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm84' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm96' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm108' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'createm120' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm0' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm12' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm24' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm36' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm48' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm60' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm72' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm84' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm96' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm108' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'renewm120' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm0' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm12' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm24' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm36' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm48' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm60' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm72' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm84' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm96' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm108' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'transferm120' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'restorePrice' => v::numericVal()->between(0.00, 9999999.99, true),
|
||||
'premiumNamesFile' => v::optional(v::file()->mimetype('text/csv')->size(5 * 1024 * 1024)),
|
||||
'categoryPrice1' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice2' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice3' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice4' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice5' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice6' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice7' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice8' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice9' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryPrice10' => v::optional(v::numericVal()->between(0.00, 9999999.99, true)),
|
||||
'categoryName1' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName2' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName3' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName4' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName5' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName6' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName7' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName8' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName9' => v::optional(v::stringType()->length(1, 50)),
|
||||
'categoryName10' => v::optional(v::stringType()->length(1, 50))
|
||||
];
|
||||
|
||||
$errors = [];
|
||||
foreach ($validators as $field => $validator) {
|
||||
// If the field is not set and it's optional, skip validation
|
||||
if (!isset($data[$field]) && strpos($field, 'category') === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
$validator->assert(isset($data[$field]) ? $data[$field] : []);
|
||||
} catch (\Respect\Validation\Exceptions\NestedValidationException $e) {
|
||||
$errors[$field] = $e->getMessages();
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($errors)) {
|
||||
// Handle errors
|
||||
$errorText = '';
|
||||
|
||||
foreach ($errors as $field => $messages) {
|
||||
$errorText .= ucfirst($field) . ' errors: ' . implode(', ', $messages) . '; ';
|
||||
}
|
||||
|
||||
// Trim the final semicolon and space
|
||||
$errorText = rtrim($errorText, '; ');
|
||||
|
||||
$this->container->get('flash')->addMessage('error', $errorText);
|
||||
return $response->withHeader('Location', '/registry/tld/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$result = $db->select(
|
||||
'SELECT id FROM domain_tld WHERE tld = ?',
|
||||
[ $data['extension'] ]
|
||||
);
|
||||
|
||||
if (!empty($result)) {
|
||||
$this->container->get('flash')->addMessage('error', 'The TLD you are trying to add already exists');
|
||||
return $response->withHeader('Location', '/registry/tld/create')->withStatus(302);
|
||||
}
|
||||
|
||||
switch ($data['extension']) {
|
||||
case 'ascii':
|
||||
$idntable = '/^(?!-)(?!.*--)[A-Z0-9-]{1,63}(?<!-)(.(?!-)(?!.*--)[A-Z0-9-]{1,63}(?<!-))*$/i';
|
||||
break;
|
||||
case 'cyrillic':
|
||||
$idntable = '/^[а-яА-ЯґҐєЄіІїЇѝЍћЋљЈ]+$/u';
|
||||
break;
|
||||
case 'japanese':
|
||||
$idntable = '/^[ぁ-んァ-ン一-龯々]+$/u';
|
||||
break;
|
||||
case 'korean':
|
||||
$idntable = '/^[가-힣]+$/u';
|
||||
break;
|
||||
default:
|
||||
$idntable = '/^(?!-)(?!.*--)[A-Z0-9-]{1,63}(?<!-)(.(?!-)(?!.*--)[A-Z0-9-]{1,63}(?<!-))*$/i';
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
$db->beginTransaction();
|
||||
|
||||
$currentDateTime = new \DateTime();
|
||||
$crdate = $currentDateTime->format('Y-m-d H:i:s.v'); // Current timestamp
|
||||
|
||||
$db->insert('domain_tld', [
|
||||
'tld' => $data['extension'],
|
||||
'idn_table' => $idntable,
|
||||
'secure' => 0,
|
||||
]);
|
||||
$tld_id = $db->getlastInsertId();
|
||||
|
||||
$db->insert(
|
||||
'domain_price',
|
||||
[
|
||||
'tldid' => $tld_id,
|
||||
'command' => 'create',
|
||||
'm0' => $data['createm0'],
|
||||
'm12' => $data['createm12'],
|
||||
'm24' => $data['createm24'],
|
||||
'm36' => $data['createm36'],
|
||||
'm48' => $data['createm48'],
|
||||
'm60' => $data['createm60'],
|
||||
'm72' => $data['createm72'],
|
||||
'm84' => $data['createm84'],
|
||||
'm96' => $data['createm96'],
|
||||
'm108' => $data['createm108'],
|
||||
'm120' => $data['createm120']
|
||||
]
|
||||
);
|
||||
|
||||
$db->insert(
|
||||
'domain_price',
|
||||
[
|
||||
'tldid' => $tld_id,
|
||||
'command' => 'renew',
|
||||
'm0' => $data['renewm0'],
|
||||
'm12' => $data['renewm12'],
|
||||
'm24' => $data['renewm24'],
|
||||
'm36' => $data['renewm36'],
|
||||
'm48' => $data['renewm48'],
|
||||
'm60' => $data['renewm60'],
|
||||
'm72' => $data['renewm72'],
|
||||
'm84' => $data['renewm84'],
|
||||
'm96' => $data['renewm96'],
|
||||
'm108' => $data['renewm108'],
|
||||
'm120' => $data['renewm120']
|
||||
]
|
||||
);
|
||||
|
||||
$db->insert(
|
||||
'domain_price',
|
||||
[
|
||||
'tldid' => $tld_id,
|
||||
'command' => 'transfer',
|
||||
'm0' => $data['transferm0'],
|
||||
'm12' => $data['transferm12'],
|
||||
'm24' => $data['transferm24'],
|
||||
'm36' => $data['transferm36'],
|
||||
'm48' => $data['transferm48'],
|
||||
'm60' => $data['transferm60'],
|
||||
'm72' => $data['transferm72'],
|
||||
'm84' => $data['transferm84'],
|
||||
'm96' => $data['transferm96'],
|
||||
'm108' => $data['transferm108'],
|
||||
'm120' => $data['transferm120']
|
||||
]
|
||||
);
|
||||
|
||||
$db->insert(
|
||||
'domain_restore_price',
|
||||
[
|
||||
'tldid' => $tld_id,
|
||||
'price' => $data['restorePrice']
|
||||
]
|
||||
);
|
||||
|
||||
//todo: add premium domains and price categories
|
||||
|
||||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/registry/tld/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$this->container->get('flash')->addMessage('success', 'TLD ' . $data['extension'] . ' has been created successfully');
|
||||
return $response->withHeader('Location', '/registry/tlds')->withStatus(302);
|
||||
}
|
||||
|
||||
$db = $this->container->get('db');
|
||||
|
||||
return view($response,'admin/system/createTld.twig');
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{% extends "layouts/app.twig" %}
|
||||
|
||||
{% block title %}{{ __('Create TLD') }}{% endblock %}
|
||||
{% block title %}{{ __('Create New TLD') }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-wrapper">
|
||||
|
@ -14,7 +14,7 @@
|
|||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Create TLD') }}
|
||||
{{ __('Create New TLD') }}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -24,147 +24,169 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
<form action="/registrar/create" method="post" autocomplete="off">
|
||||
{% include 'partials/flash.twig' %}
|
||||
<form action="/registry/tld/create" method="post" autocomplete="off">
|
||||
{{ csrf.field | raw }}
|
||||
<!-- Registrar Details Card -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">New TLD Registration</h5>
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">General Details</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<label for="tldName" class="form-label required">TLD Extension</label>
|
||||
<input type="text" class="form-control" id="tldExtension" name="extension" placeholder="Enter TLD" required>
|
||||
<small class="form-text text-muted">Enter the desired top-level domain (TLD) name, like '.test' or '.example'.</small>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form>
|
||||
<!-- TLD Field -->
|
||||
<div class="mb-3">
|
||||
<label for="tldName" class="form-label">TLD Extension</label>
|
||||
<input type="text" class="form-control" id="tldExtension" placeholder="Enter TLD">
|
||||
<small class="form-text text-muted">Enter the desired top-level domain (TLD) name, like '.test' or '.example'.</small>
|
||||
</div>
|
||||
|
||||
<!-- DNSSEC Toggle Switch (Disabled) -->
|
||||
<div class="mb-3">
|
||||
<label class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="dnssecToggle" disabled>
|
||||
<span class="form-check-label">DNSSEC</span>
|
||||
</label>
|
||||
<small class="form-text text-muted">DNSSEC is currently activated manually. This option is for display purposes only.</small>
|
||||
</div>
|
||||
|
||||
<!-- TLD Type Selector (ccTLD or gTLD) -->
|
||||
<div class="mb-3">
|
||||
<label for="tldTypeSelector" class="form-label">TLD Type</label>
|
||||
<select class="form-select" id="tldTypeSelector">
|
||||
<option value="ccTLD">ccTLD</option>
|
||||
<option value="gTLD">gTLD</option>
|
||||
</select>
|
||||
<small class="form-text text-muted">Select the type of TLD: ccTLD (Country Code Top-Level Domain) or gTLD (Generic Top-Level Domain).</small>
|
||||
</div>
|
||||
|
||||
<!-- Supported Script Dropdown -->
|
||||
<div class="mb-3">
|
||||
<label for="scriptDropdown" class="form-label">Supported Script</label>
|
||||
<select class="form-select" id="scriptDropdown">
|
||||
<option selected>ASCII</option>
|
||||
<option value="cyrillic">Cyrillic</option>
|
||||
<option value="japanese">Japanese</option>
|
||||
<option value="korean">Korean</option>
|
||||
</select>
|
||||
<small class="form-text text-muted">Choose the script type that the TLD will support. Options include ASCII, Cyrillic, Japanese, and Korean.</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="dnssecToggle" disabled>
|
||||
<span class="form-check-label">DNSSEC</span>
|
||||
</label>
|
||||
<small class="form-text text-muted">DNSSEC is currently activated manually. This option is for display purposes only.</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="tldTypeSelector" class="form-label required">TLD Type</label>
|
||||
<select class="form-select" id="tldTypeSelector" name="tldType" required>
|
||||
<option value="ccTLD">ccTLD</option>
|
||||
<option value="gTLD">gTLD</option>
|
||||
</select>
|
||||
<small class="form-text text-muted">Select the type of TLD: ccTLD (Country Code Top-Level Domain) or gTLD (Generic Top-Level Domain).</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="scriptDropdown" class="form-label required">Supported Script</label>
|
||||
<select class="form-select" id="scriptDropdown" name="script" required>
|
||||
<option value="ascii" selected>ASCII</option>
|
||||
<option value="cyrillic">Cyrillic</option>
|
||||
<option value="japanese">Japanese</option>
|
||||
<option value="korean">Korean</option>
|
||||
</select>
|
||||
<small class="form-text text-muted">Choose the script type that the TLD will support. Options include ASCII, Cyrillic, Japanese, and Korean.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">TLD Pricing</h5>
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Pricing</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Command</th>
|
||||
<th>Setup Fee</th>
|
||||
<th>1 Year <span class="text-red">*</span></th>
|
||||
<th>2 Years <span class="text-red">*</span></th>
|
||||
<th>3 Years <span class="text-red">*</span></th>
|
||||
<th>4 Years <span class="text-red">*</span></th>
|
||||
<th>5 Years <span class="text-red">*</span></th>
|
||||
<th>6 Years <span class="text-red">*</span></th>
|
||||
<th>7 Years <span class="text-red">*</span></th>
|
||||
<th>8 Years <span class="text-red">*</span></th>
|
||||
<th>9 Years <span class="text-red">*</span></th>
|
||||
<th>10 Years <span class="text-red">*</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Create</td>
|
||||
<td><input type="number" class="form-control" name="createm0" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm12" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm24" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm36" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm48" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm60" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm72" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm84" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm96" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm108" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm120" placeholder="0.00" required min="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew</td>
|
||||
<td><input type="number" class="form-control" name="renewm0" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm12" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm24" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm36" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm48" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm60" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm72" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm84" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm96" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm108" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm120" placeholder="0.00" required min="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Transfer</td>
|
||||
<td><input type="number" class="form-control" name="transferm0" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm12" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm24" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm36" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm48" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm60" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm72" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm84" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm96" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm108" placeholder="0.00" required min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm120" placeholder="0.00" required min="0"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<small class="form-text text-muted">When you type a price for 1 Year above, it will automatically get multiplied for subsequent years.</small>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Pricing Table -->
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Command / Duration</th>
|
||||
<th>Setup Fee</th>
|
||||
<th>1 Year</th>
|
||||
<th>2 Years</th>
|
||||
<th>3 Year</th>
|
||||
<th>4 Years</th>
|
||||
<th>5 Year</th>
|
||||
<th>6 Years</th>
|
||||
<th>7 Year</th>
|
||||
<th>8 Years</th>
|
||||
<th>9 Years</th>
|
||||
<th>10 Years</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- Create Command Row -->
|
||||
<tr>
|
||||
<td>Create</td>
|
||||
<td><input type="number" class="form-control" name="createm0" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm12" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm24" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm36" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm48" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm60" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm72" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm84" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm96" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm108" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm120" placeholder="0.00"></td>
|
||||
</tr>
|
||||
<!-- Renew Command Row -->
|
||||
<tr>
|
||||
<td>Renew</td>
|
||||
<td><input type="number" class="form-control" name="renewm0" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm12" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm24" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm36" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm48" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm60" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm72" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm84" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm96" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm108" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm120" placeholder="0.00"></td>
|
||||
</tr>
|
||||
<!-- Transfer Command Row -->
|
||||
<tr>
|
||||
<td>Transfer</td>
|
||||
<td><input type="number" class="form-control" name="transferm0" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm12" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm24" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm36" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm48" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm60" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm72" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm84" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm96" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm108" placeholder="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm120" placeholder="0.00"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- Restore Price Input -->
|
||||
<div class="mb-3 mt-3">
|
||||
<label for="restorePrice" class="form-label">Restore Price</label>
|
||||
<input type="number" class="form-control" id="restorePrice" placeholder="Enter Restore Price">
|
||||
<small class="form-text text-muted">Enter the price for restoring a TLD.</small>
|
||||
</div>
|
||||
<div class="mb-3 mt-3">
|
||||
<label for="restorePrice" class="form-label required">Restore Price</label>
|
||||
<input type="number" class="form-control" id="restorePrice" name="restorePrice" placeholder="0.00" required min="0">
|
||||
<small class="form-text text-muted">Enter the price for restoring the TLD.</small>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create Registrar</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Premium Names</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<label for="premiumNamesFile" class="form-label">Upload CSV File</label>
|
||||
<input type="file" class="form-control" id="premiumNamesFile" name="premiumNamesFile" accept=".csv">
|
||||
<small class="form-text text-muted">
|
||||
Upload a CSV file with premium names. Each row should contain a name and its pricing category, separated by a comma.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h6 class="mt-4 mb-3">Set Premium Name Price Categories</h6>
|
||||
<table class="table" id="categoriesTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Category Name</th>
|
||||
<th>Price</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="text" class="form-control" name="categoryName1" placeholder="Category 1"></td>
|
||||
<td><input type="number" class="form-control" name="categoryPrice1" placeholder="0.00" min="0"></td>
|
||||
<td><button type="button" class="btn btn-success add-category">+</button></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create TLD</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer footer-transparent d-print-none">
|
||||
<div class="container-xl">
|
||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||
|
@ -180,61 +202,68 @@
|
|||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const ipForm = document.getElementById('ipWhitelistForm');
|
||||
const maxFields = 5;
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const createm12Input = document.querySelector('input[name="createm12"]');
|
||||
const renewm12Input = document.querySelector('input[name="renewm12"]');
|
||||
const transferm12Input = document.querySelector('input[name="transferm12"]');
|
||||
|
||||
ipForm.addEventListener('click', function(e) {
|
||||
const target = e.target;
|
||||
|
||||
// Handle Add IP Button Click
|
||||
if (target.classList.contains('add-ip')) {
|
||||
const totalFields = ipForm.querySelectorAll('input[name="ipAddress[]"]').length;
|
||||
if (totalFields < maxFields) {
|
||||
const newField = target.parentElement.cloneNode(true);
|
||||
newField.querySelector('input').value = '';
|
||||
newField.querySelector('.add-ip').classList.replace('btn-primary', 'btn-danger');
|
||||
newField.querySelector('.add-ip').textContent = '-';
|
||||
newField.querySelector('.add-ip').classList.replace('add-ip', 'remove-ip');
|
||||
ipForm.querySelector('#ipAddressFields').appendChild(newField);
|
||||
}
|
||||
const updateMultiplication = (input, startColumnIndex, baseInputName) => {
|
||||
const inputValue = parseFloat(input.value);
|
||||
if (!isNaN(inputValue)) {
|
||||
for (let i = startColumnIndex; i <= 10; i++) {
|
||||
const columnName = `${baseInputName}${12 * i}`;
|
||||
const columnInput = document.querySelector(`input[name="${columnName}"]`);
|
||||
if (columnInput) {
|
||||
columnInput.value = (inputValue * i).toFixed(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Handle Remove IP Button Click
|
||||
if (target.classList.contains('remove-ip')) {
|
||||
target.parentElement.remove();
|
||||
}
|
||||
createm12Input.addEventListener('input', () => {
|
||||
updateMultiplication(createm12Input, 2, 'createm');
|
||||
});
|
||||
|
||||
renewm12Input.addEventListener('input', () => {
|
||||
updateMultiplication(renewm12Input, 2, 'renewm');
|
||||
});
|
||||
|
||||
transferm12Input.addEventListener('input', () => {
|
||||
updateMultiplication(transferm12Input, 2, 'transferm');
|
||||
});
|
||||
|
||||
const categoriesTable = document.getElementById('categoriesTable');
|
||||
const addCategoryButton = document.querySelector('.add-category');
|
||||
|
||||
const maxCategories = 10;
|
||||
let categoryCount = 1;
|
||||
|
||||
addCategoryButton.addEventListener('click', function() {
|
||||
if (categoryCount < maxCategories) {
|
||||
categoryCount++;
|
||||
const newRow = document.createElement('tr');
|
||||
newRow.innerHTML = `
|
||||
<td><input type="text" class="form-control" name="categoryName${categoryCount}" placeholder="Category ${categoryCount}"></td>
|
||||
<td><input type="number" class="form-control" name="categoryPrice${categoryCount}" placeholder="0.00" min="0"></td>
|
||||
<td><button type="button" class="btn btn-danger remove-category">-</button></td>
|
||||
`;
|
||||
categoriesTable.querySelector('tbody').appendChild(newRow);
|
||||
}
|
||||
|
||||
if (categoryCount >= maxCategories) {
|
||||
addCategoryButton.style.display = 'none'; // Disable adding more categories after reaching the limit
|
||||
}
|
||||
});
|
||||
|
||||
const copyCheckbox = document.getElementById('copyOwnerData');
|
||||
|
||||
// Function to copy data to another tab
|
||||
function copyDataToTab(tabId) {
|
||||
const ownerInputs = document.querySelectorAll('#owner input:not([type="checkbox"]), #owner select');
|
||||
const targetFields = document.querySelectorAll(`${tabId} input:not([type='checkbox']), ${tabId} select`);
|
||||
|
||||
ownerInputs.forEach((input, index) => {
|
||||
if (targetFields[index] && input.tagName === targetFields[index].tagName) {
|
||||
targetFields[index].value = input.value;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
copyCheckbox.addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
copyDataToTab('#billing');
|
||||
copyDataToTab('#abuse');
|
||||
} else {
|
||||
// Clear fields when unchecked, if desired
|
||||
['#billing', '#abuse'].forEach(tabId => {
|
||||
const fields = document.querySelectorAll(`${tabId} input:not([type='checkbox']), ${tabId} select`);
|
||||
fields.forEach(field => {
|
||||
field.value = '';
|
||||
});
|
||||
});
|
||||
}
|
||||
categoriesTable.addEventListener('click', function(event) {
|
||||
if (event.target.classList.contains('remove-category')) {
|
||||
const row = event.target.closest('tr');
|
||||
row.remove();
|
||||
categoryCount--;
|
||||
addCategoryButton.style.display = 'block'; // Enable adding more categories after removing one
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -41,19 +41,7 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if subject is defined %}
|
||||
<div class="alert alert-important alert-success alert-dismissible" role="alert">
|
||||
<div class="d-flex">
|
||||
<div>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" /><path d="M12 8v4" /><path d="M12 16h.01" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Support ticket') }} <strong>{{ subject }}</strong> {{ __('was created!') }}
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% include 'partials/flash.twig' %}
|
||||
<div class="card">
|
||||
<div class="card-body border-bottom py-3">
|
||||
<div class="d-flex">
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue