mirror of
https://github.com/getnamingo/registry.git
synced 2025-05-10 16:58:34 +02:00
Merge branch 'getnamingo:main' into main-lang
This commit is contained in:
commit
9497da26c6
115 changed files with 6563 additions and 3112 deletions
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "composer" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "weekly"
|
20
README.md
20
README.md
|
@ -50,9 +50,25 @@ Namingo is equipped with a comprehensive suite of features to meet the diverse n
|
|||
|
||||
- **Automation Scripts**: Ensures the continuous and smooth operation of the registry by performing routine checks and operations. Advanced scripting capabilities also facilitate the generation of RDE deposits, the creation of ICANN's monthly reports, Spec 11 abuse monitoring, and ensure full compliance with other ICANN gTLD requirements for streamlined regulatory adherence.
|
||||
|
||||
## Installation Instructions
|
||||
## Documentation
|
||||
|
||||
For detailed installation steps, please refer to [Install.md](docs/install.md).
|
||||
We invite you to thoroughly review all the `.md` files within the `docs` directory to familiarize yourself with the various aspects of Namingo. These documents provide comprehensive guidance on installation, configuration, and initial operation, ensuring you have all the information you need to successfully manage your domain registry.
|
||||
|
||||
### Installation Instructions
|
||||
|
||||
#### Automated Install
|
||||
|
||||
For a quick and easy installation, you can use the automated install script by running the following command:
|
||||
|
||||
```bash
|
||||
wget https://namingo.org/install.sh -O install.sh && chmod +x install.sh && ./install.sh
|
||||
```
|
||||
|
||||
This command will download and execute the `install.sh` script from Namingo's website, which automates the installation process.
|
||||
|
||||
#### Manual Installation Steps
|
||||
|
||||
For detailed installation steps, please refer to [install.md](docs/install.md).
|
||||
|
||||
## Support
|
||||
|
||||
|
|
37
SECURITY.md
Normal file
37
SECURITY.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 1.0-betaX | :white_check_mark: |
|
||||
| < 1.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
The Namingo team takes the security of our software seriously. If you believe you have found a security vulnerability in any version of our software, we would like you to let us know right away. We will investigate all legitimate reports and do our best to quickly fix the problem.
|
||||
|
||||
Please follow these steps to report a vulnerability:
|
||||
|
||||
1. **Do not report security vulnerabilities through public GitHub issues.**
|
||||
2. Instead, please email us directly at [help@namingo.org](mailto:help@namingo.org). Provide a detailed description of the issue, including the following information:
|
||||
- The version of the software that you are using
|
||||
- A description of the vulnerability and how it can be reproduced
|
||||
- The potential impact of the vulnerability
|
||||
3. We will respond to your report within 48 hours to acknowledge receipt of your report and to outline the next steps in handling your submission.
|
||||
4. After the initial reply to your report, the security team will endeavor to keep you informed of the progress being made towards a fix and full announcement. We may also ask for additional information or guidance.
|
||||
|
||||
### Disclosure Policy
|
||||
|
||||
When we receive a vulnerability report, our immediate priority is to confirm and fix the vulnerability. We ask that you do not publicly disclose the issue until we have had the chance to resolve it.
|
||||
|
||||
We aim to handle all security issues transparently after the initial assessment phase. Once the issue is resolved, we will release a security advisory detailing the vulnerability, our response, and acknowledgments to the reporters.
|
||||
|
||||
### Comments on this Policy
|
||||
|
||||
If you have suggestions on how this process could be improved, please submit a pull request or issue.
|
||||
|
||||
Thank you for helping to keep Namingo and its users safe.
|
|
@ -204,6 +204,10 @@
|
|||
"audit": true,
|
||||
"skip": null
|
||||
},
|
||||
"users_audit": {
|
||||
"audit": true,
|
||||
"skip": null
|
||||
},
|
||||
"users_confirmations": {
|
||||
"audit": null,
|
||||
"skip": null
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
"setbased/php-audit": "^1.9",
|
||||
"monolog/monolog": "^3.5",
|
||||
"league/flysystem": "^3.23",
|
||||
"league/flysystem-sftp-v3": "^3.22"
|
||||
"league/flysystem-sftp-v3": "^3.22",
|
||||
"peppeocchi/php-cron-scheduler": "^4.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ return [
|
|||
'db_type' => 'mysql',
|
||||
'db_host' => 'localhost',
|
||||
'db_port' => 3306,
|
||||
'db_database' => 'your_database_name',
|
||||
'db_database' => 'registry',
|
||||
'db_username' => 'your_username',
|
||||
'db_password' => 'your_password',
|
||||
|
||||
|
@ -50,7 +50,7 @@ return [
|
|||
'urs_imap_username' => 'your_username',
|
||||
'urs_imap_password' => 'your_password',
|
||||
|
||||
// Notifications Configuration
|
||||
// Message Broker Configuration
|
||||
'mailer' => 'phpmailer', // sendgrid, mailgun are also available
|
||||
'mailer_api_key' => 'YOUR_API_KEY',
|
||||
'mailer_domain' => 'example.com',
|
||||
|
|
48
automation/cron.php
Normal file
48
automation/cron.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
// Configuration
|
||||
$cronJobConfig = [
|
||||
'accounting' => false, // Set to true to enable
|
||||
'backup' => false, // Set to true to enable
|
||||
'gtld_mode' => false, // Set to true to enable
|
||||
'spec11' => false, // Set to true to enable
|
||||
];
|
||||
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
use GO\Scheduler;
|
||||
$scheduler = new Scheduler();
|
||||
|
||||
$scheduler->php('/opt/registry/automation/write-zone.php')->at('*/15 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/registrar.php')->at('35 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/statistics.php')->at('59 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/rdap-urls.php')->at('50 1 * * *');
|
||||
$scheduler->php('/var/www/cp/bin/file_cache.php')->at('0 0 * * 1');
|
||||
|
||||
$scheduler->php('/opt/registry/automation/change-domain-status.php')->at('30 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/auto-approve-transfer.php')->at('45 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/auto-clean-unused-contact-and-host.php')->at('5 0 * * *');
|
||||
|
||||
if ($cronJobConfig['accounting']) {
|
||||
$scheduler->php('/opt/registry/automation/send-invoice.php')->at('1 0 1 * *');
|
||||
}
|
||||
|
||||
if ($cronJobConfig['backup']) {
|
||||
$scheduler->raw('/opt/registry/automation/vendor/bin/phpbu --configuration=/opt/registry/automation/backup.json')->at('15 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/backup-upload.php')->at('30 * * * *');
|
||||
}
|
||||
|
||||
if ($cronJobConfig['spec11']) {
|
||||
$scheduler->php('/opt/registry/automation/abusemonitor.php')->at('30 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/abusereport.php')->at('5 0 * * *');
|
||||
}
|
||||
|
||||
if ($cronJobConfig['gtld_mode']) {
|
||||
$scheduler->php('/opt/registry/automation/lordn.php')->at('10 0 * * *');
|
||||
$scheduler->php('/opt/registry/automation/tmch.php')->at('0 0,12 * * *');
|
||||
$scheduler->php('/opt/registry/automation/urs.php')->at('45 * * * *');
|
||||
$scheduler->php('/opt/registry/automation/escrow.php')->at('5 0 * * *');
|
||||
$scheduler->php('/opt/registry/automation/reporting.php')->at('1 0 1 * *');
|
||||
}
|
||||
|
||||
$scheduler->run();
|
|
@ -1,57 +0,0 @@
|
|||
#----------> Crontab Configuration for Namingo <--------------------------------#
|
||||
|
||||
# run write-zone.php every 15 min.
|
||||
*/15 * * * * root /usr/bin/php8.2 /opt/registry/automation/write-zone.php
|
||||
|
||||
# run statistics.php at 59 min, every hour
|
||||
59 * * * * root /usr/bin/php8.2 /opt/registry/automation/statistics.php
|
||||
|
||||
# run backup at 15 min, every hour
|
||||
15 * * * * /opt/registry/automation/vendor/bin/phpbu --configuration=/opt/registry/automation/backup.json
|
||||
|
||||
# run backup-upload.php at 30 min, every hour
|
||||
30 * * * * root /usr/bin/php8.2 /opt/registry/automation/backup-upload.php
|
||||
|
||||
# run change-domain-status.php every hour
|
||||
30 * * * * root /usr/bin/php8.2 /opt/registry/automation/change-domain-status.php
|
||||
|
||||
# run auto-approve-transfer.php every hour
|
||||
45 * * * * root /usr/bin/php8.2 /opt/registry/automation/auto-approve-transfer.php
|
||||
|
||||
# run registrar.php every hour
|
||||
35 * * * * root /usr/bin/php8.2 /opt/registry/automation/registrar.php
|
||||
|
||||
# run abusemonitor.php every hour
|
||||
30 * * * * root /usr/bin/php8.2 /opt/registry/automation/abusemonitor.php
|
||||
|
||||
# run abusereport.php every day
|
||||
5 0 * * * root /usr/bin/php8.2 /opt/registry/automation/abusereport.php
|
||||
|
||||
# run lordn.php every day
|
||||
10 0 * * * root /usr/bin/php8.2 /opt/registry/automation/lordn.php
|
||||
|
||||
# run send-invoice.php every 1st day
|
||||
1 0 1 * * root /usr/bin/php8.2 /opt/registry/automation/send-invoice.php
|
||||
|
||||
# run auto-clean-unused-contact-and-host.php every day
|
||||
5 0 * * * root /usr/bin/php8.2 /opt/registry/automation/auto-clean-unused-contact-and-host.php
|
||||
|
||||
# run tmch.php twice a day
|
||||
0 0,12 * * * root /usr/bin/php8.2 /opt/registry/automation/tmch.php
|
||||
|
||||
# run escrow.php every day
|
||||
5 0 * * * root /usr/bin/php8.2 /opt/registry/automation/escrow.php
|
||||
|
||||
# run rdap-urls.php every day
|
||||
50 1 * * * root /usr/bin/php8.2 /opt/registry/automation/rdap-urls.php
|
||||
|
||||
# run file_cache.php every day
|
||||
0 2 * * * root /usr/bin/php8.2 /var/www/cp/bin/file_cache.php
|
||||
|
||||
# run reporting.php every 1st day
|
||||
1 0 1 * * root /usr/bin/php8.2 /opt/registry/automation/reporting.php
|
||||
|
||||
# run urs.php every hour
|
||||
45 * * * * root /usr/bin/php8.2 /opt/registry/automation/urs.php
|
||||
|
||||
#----------> End Crontab Configuration for Namingo <----------------------------#
|
|
@ -140,14 +140,14 @@ Coroutine::create(function () use ($pool, $log, $c) {
|
|||
$completed_zone = $builder->build($zone);
|
||||
|
||||
if ($c['dns_server'] == 'bind') {
|
||||
$basePath = '/etc/bind/zones';
|
||||
$basePath = '/var/lib/bind';
|
||||
} elseif ($c['dns_server'] == 'nsd') {
|
||||
$basePath = '/etc/nsd';
|
||||
} elseif ($c['dns_server'] == 'knot') {
|
||||
$basePath = '/etc/knot';
|
||||
} else {
|
||||
// Default path
|
||||
$basePath = '/etc/bind/zones';
|
||||
$basePath = '/var/lib/bind';
|
||||
}
|
||||
|
||||
file_put_contents("{$basePath}/{$cleanedTld}.zone", $completed_zone);
|
||||
|
|
|
@ -277,6 +277,23 @@ class Auth
|
|||
public static function changeCurrentPassword($oldPassword, $newPassword){
|
||||
$auth = self::$auth;
|
||||
try {
|
||||
global $container;
|
||||
$db = $container->get('db');
|
||||
$currentDateTime = new \DateTime();
|
||||
$currentDate = $currentDateTime->format('Y-m-d H:i:s.v'); // Current timestamp
|
||||
$db->insert(
|
||||
'users_audit',
|
||||
[
|
||||
'user_id' => $_SESSION['auth_user_id'],
|
||||
'user_event' => 'user.update.password',
|
||||
'user_resource' => 'control.panel',
|
||||
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
|
||||
'user_ip' => get_client_ip(),
|
||||
'user_location' => get_client_location(),
|
||||
'event_time' => $currentDate,
|
||||
'user_data' => null
|
||||
]
|
||||
);
|
||||
$auth->changePassword($oldPassword, $newPassword);
|
||||
redirect()->route('profile')->with('success','Password has been changed');
|
||||
}
|
||||
|
|
|
@ -5,6 +5,9 @@ namespace App\Controllers;
|
|||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Selective\XmlDSig\PublicKeyStore;
|
||||
use Selective\XmlDSig\CryptoVerifier;
|
||||
use Selective\XmlDSig\XmlSignatureVerifier;
|
||||
|
||||
class ApplicationsController extends Controller
|
||||
{
|
||||
|
@ -65,12 +68,8 @@ class ApplicationsController extends Controller
|
|||
$invalid_domain = validate_label($domainName, $db);
|
||||
|
||||
if ($invalid_domain) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid domain name in application',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Invalid domain name');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$valid_tld = false;
|
||||
|
@ -85,12 +84,8 @@ class ApplicationsController extends Controller
|
|||
}
|
||||
|
||||
if (!$valid_tld) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid domain extension in application',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Invalid domain extension');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$domain_already_exist = $db->selectValue(
|
||||
|
@ -99,12 +94,8 @@ class ApplicationsController extends Controller
|
|||
);
|
||||
|
||||
if ($domain_already_exist) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Application already exists',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Application already exists');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$currentDateTime = new \DateTime();
|
||||
|
@ -122,25 +113,16 @@ class ApplicationsController extends Controller
|
|||
);
|
||||
|
||||
if ($phase_details !== 'Application') {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($phaseType === 'claims') {
|
||||
if (!isset($data['noticeid']) || $data['noticeid'] === '' ||
|
||||
!isset($data['notafter']) || $data['notafter'] === '' ||
|
||||
!isset($data['accepted']) || $data['accepted'] === '') {
|
||||
// Trigger an error or handle the situation as needed
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => "Error: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'",
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', "Error creating application: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'");
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$noticeid = $data['noticeid'];
|
||||
|
@ -151,6 +133,66 @@ class ApplicationsController extends Controller
|
|||
$notafter = null;
|
||||
$accepted = null;
|
||||
}
|
||||
|
||||
if ($phaseType === 'sunrise') {
|
||||
if ($smd !== null && $smd !== '') {
|
||||
// Extract the BASE64 encoded part
|
||||
$beginMarker = "-----BEGIN ENCODED SMD-----";
|
||||
$endMarker = "-----END ENCODED SMD-----";
|
||||
$beginPos = strpos($smd, $beginMarker) + strlen($beginMarker);
|
||||
$endPos = strpos($smd, $endMarker);
|
||||
$encodedSMD = trim(substr($smd, $beginPos, $endPos - $beginPos));
|
||||
|
||||
// Decode the BASE64 content
|
||||
$xmlContent = base64_decode($encodedSMD);
|
||||
|
||||
// Load the XML content using DOMDocument
|
||||
$domDocument = new \DOMDocument();
|
||||
$domDocument->preserveWhiteSpace = false;
|
||||
$domDocument->formatOutput = true;
|
||||
$domDocument->loadXML($xmlContent);
|
||||
|
||||
// Parse data
|
||||
$xpath = new \DOMXPath($domDocument);
|
||||
$xpath->registerNamespace('smd', 'urn:ietf:params:xml:ns:signedMark-1.0');
|
||||
$xpath->registerNamespace('mark', 'urn:ietf:params:xml:ns:mark-1.0');
|
||||
|
||||
$notBefore = new \DateTime($xpath->evaluate('string(//smd:notBefore)'));
|
||||
$notAfter = new \DateTime($xpath->evaluate('string(//smd:notAfter)'));
|
||||
$markName = $xpath->evaluate('string(//mark:markName)');
|
||||
$labels = [];
|
||||
foreach ($xpath->query('//mark:label') as $x_label) {
|
||||
$labels[] = $x_label->nodeValue;
|
||||
}
|
||||
|
||||
if (!in_array($label, $labels)) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: SMD file is not valid for the application being created');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Check if current date and time is between notBefore and notAfter
|
||||
$now = new \DateTime();
|
||||
if (!($now >= $notBefore && $now <= $notAfter)) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Current time is outside the valid range in the SMD file');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Verify the signature
|
||||
$publicKeyStore = new PublicKeyStore();
|
||||
$publicKeyStore->loadFromDocument($domDocument);
|
||||
$cryptoVerifier = new CryptoVerifier($publicKeyStore);
|
||||
$xmlSignatureVerifier = new XmlSignatureVerifier($cryptoVerifier);
|
||||
$isValid = $xmlSignatureVerifier->verifyXml($xmlContent);
|
||||
|
||||
if (!$isValid) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The XML signature of the SMD file is not valid');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
} else {
|
||||
$this->container->get('flash')->addMessage('error', "Error creating application: SMD upload is required in the 'sunrise' phase.");
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
$domain_already_reserved = $db->selectValue(
|
||||
'SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1',
|
||||
|
@ -158,12 +200,8 @@ class ApplicationsController extends Controller
|
|||
);
|
||||
|
||||
if ($domain_already_reserved) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Domain name in application is reserved or restricted',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Domain name in application is reserved or restricted');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$date_add = 12;
|
||||
|
@ -177,21 +215,13 @@ class ApplicationsController extends Controller
|
|||
$price = $returnValue['price'];
|
||||
|
||||
if (!$price) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The price, period and currency for such TLD are not declared',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The price, period and currency for such TLD are not declared');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (($registrar_balance + $creditLimit) < $price) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Low credit: minimum threshold reached',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Low credit: minimum threshold reached');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$nameservers = array_filter($data['nameserver'] ?? [], function($value) {
|
||||
|
@ -206,31 +236,19 @@ class ApplicationsController extends Controller
|
|||
|
||||
if (!empty($nameservers)) {
|
||||
if (count($nameservers) !== count(array_unique($nameservers))) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Duplicate nameservers detected. Please provide unique nameservers.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Duplicate nameservers detected. Please provide unique nameservers.');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
foreach ($nameservers as $index => $nameserver) {
|
||||
if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid hostName',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Invalid hostName');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!preg_match('/^([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9]){0,1}\.){1,125}[A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])$/i', $nameserver) && strlen($nameserver) < 254) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid hostName',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Invalid hostName');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -240,21 +258,13 @@ class ApplicationsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Registrant does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Registrant does not exist');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,21 +273,13 @@ class ApplicationsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Admin contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Admin contact does not exist');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -286,21 +288,13 @@ class ApplicationsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Tech contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Tech contact does not exist');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -309,49 +303,29 @@ class ApplicationsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Billing contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Billing contact does not exist');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$authInfo) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Missing application authinfo',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Missing application authinfo');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (strlen($authInfo) < 6 || strlen($authInfo) > 16) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Password needs to be at least 6 and up to 16 characters long',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Password needs to be at least 6 and up to 16 characters long');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!preg_match('/[A-Z]/', $authInfo)) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Password should have both upper and lower case characters',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: Password should have both upper and lower case characters');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$registrant_id = $db->selectValue(
|
||||
|
@ -535,12 +509,8 @@ class ApplicationsController extends Controller
|
|||
|
||||
if ($internal_host) {
|
||||
if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) {
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Error: No IPv4 or IPv6 addresses provided for internal host',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating application: No IPv4 or IPv6 addresses provided for internal host');
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) {
|
||||
|
@ -604,20 +574,12 @@ class ApplicationsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Database failure: ' . $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
} catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/domains/createApplication.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Database failure: ' . $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/application/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$crdate = $db->selectValue(
|
||||
|
|
|
@ -59,6 +59,8 @@ class AuthController extends Controller
|
|||
* @throws \Pinga\Auth\AuthError
|
||||
*/
|
||||
public function login(Request $request, Response $response){
|
||||
global $container;
|
||||
|
||||
$data = $request->getParsedBody();
|
||||
if(isset($data['remember'])){
|
||||
$remember = $data['remember'];
|
||||
|
@ -71,8 +73,25 @@ class AuthController extends Controller
|
|||
$code = null;
|
||||
}
|
||||
$login = Auth::login($data['email'], $data['password'], $remember, $code);
|
||||
if($login===true)
|
||||
if($login===true) {
|
||||
$db = $container->get('db');
|
||||
$currentDateTime = new \DateTime();
|
||||
$currentDate = $currentDateTime->format('Y-m-d H:i:s.v'); // Current timestamp
|
||||
$db->insert(
|
||||
'users_audit',
|
||||
[
|
||||
'user_id' => $_SESSION['auth_user_id'],
|
||||
'user_event' => 'user.login',
|
||||
'user_resource' => 'control.panel',
|
||||
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
|
||||
'user_ip' => get_client_ip(),
|
||||
'user_location' => get_client_location(),
|
||||
'event_time' => $currentDate,
|
||||
'user_data' => null
|
||||
]
|
||||
);
|
||||
redirect()->route('home');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -80,6 +99,23 @@ class AuthController extends Controller
|
|||
*/
|
||||
public function logout()
|
||||
{
|
||||
global $container;
|
||||
$db = $container->get('db');
|
||||
$currentDateTime = new \DateTime();
|
||||
$currentDate = $currentDateTime->format('Y-m-d H:i:s.v'); // Current timestamp
|
||||
$db->insert(
|
||||
'users_audit',
|
||||
[
|
||||
'user_id' => $_SESSION['auth_user_id'],
|
||||
'user_event' => 'user.logout',
|
||||
'user_resource' => 'control.panel',
|
||||
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
|
||||
'user_ip' => get_client_ip(),
|
||||
'user_location' => get_client_location(),
|
||||
'event_time' => $currentDate,
|
||||
'user_data' => null
|
||||
]
|
||||
);
|
||||
Auth::logout();
|
||||
redirect()->route('login');
|
||||
}
|
||||
|
|
|
@ -58,36 +58,21 @@ class ContactsController extends Controller
|
|||
$authInfo_pw = $data['authInfo'] ?? null;
|
||||
|
||||
if (!$contactID) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Please provide a contact ID',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Please provide a contact ID');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Validation for contact ID
|
||||
$invalid_identifier = validate_identifier($contactID);
|
||||
if ($invalid_identifier) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => $invalid_identifier,
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: ' . $invalid_identifier);
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$contact = $db->select('SELECT * FROM contact WHERE identifier = ?', [$contactID]);
|
||||
if ($contact) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Contact ID already exists',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Contact ID already exists');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$result = $db->selectRow('SELECT registrar_id FROM registrar_users WHERE user_id = ?', [$_SESSION['auth_user_id']]);
|
||||
|
@ -100,104 +85,59 @@ class ContactsController extends Controller
|
|||
|
||||
if ($postalInfoIntName) {
|
||||
if (!$postalInfoIntName) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Missing contact name',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Missing contact name');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntName)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact name',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact name');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($postalInfoIntOrg) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntOrg)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact org',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact org');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoIntStreet1) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet1)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoIntStreet2) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet2)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street 2');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoIntStreet3) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet3)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street 3');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoIntCity)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact city',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact city');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($postalInfoIntSp) {
|
||||
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoIntSp)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact state/province',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact state/province');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoIntPc) {
|
||||
if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoIntPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoIntPc)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid contact postal code',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact postal code');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,167 +145,92 @@ class ContactsController extends Controller
|
|||
|
||||
if ($postalInfoLocName) {
|
||||
if (!$postalInfoLocName) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Missing loc contact name',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Missing loc contact name');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocName)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact name',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact name');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($postalInfoLocOrg) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocOrg)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact org',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact org');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoLocStreet1) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet1)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoLocStreet2) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet2)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street 2');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoLocStreet3) {
|
||||
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet3)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact street',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street 3');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoLocCity)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact city',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact city');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($postalInfoLocSp) {
|
||||
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoLocSp)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact state/province',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact state/province');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($postalInfoLocPc) {
|
||||
if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoLocPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoLocPc)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Invalid loc contact postal code',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact postal code');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($voice && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $voice) || strlen($voice) > 17)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Voice must be (\+[0-9]{1,3}\.[0-9]{1,14})',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Voice must be (\+[0-9]{1,3}\.[0-9]{1,14})');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($fax && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $fax) || strlen($fax) > 17)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Fax must be (\+[0-9]{1,3}\.[0-9]{1,14})',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Fax must be (\+[0-9]{1,3}\.[0-9]{1,14})');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Email address failed check',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Email address failed check');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!$authInfo_pw) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Email contact authinfo',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Email contact authinfo missing');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ((strlen($authInfo_pw) < 6) || (strlen($authInfo_pw) > 16)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Password needs to be at least 6 and up to 16 characters long',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Password needs to be at least 6 and up to 16 characters long');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!preg_match('/[A-Z]/', $authInfo_pw)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'Password should have both upper and lower case characters',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: Password should have both upper and lower case characters');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$disclose_voice = isset($data['disclose_voice']) ? 1 : 0;
|
||||
|
@ -383,13 +248,8 @@ class ContactsController extends Controller
|
|||
$nin_type = (isset($data['isBusiness']) && $data['isBusiness'] === 'on') ? 'business' : 'personal';
|
||||
|
||||
if (!preg_match('/\d/', $nin)) {
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => 'NIN should contain one or more numbers',
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Unable to create contact: NIN should contain one or more numbers');
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -480,13 +340,8 @@ class ContactsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'error' => $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/contact/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$crdate = $db->selectValue(
|
||||
|
@ -494,13 +349,8 @@ class ContactsController extends Controller
|
|||
[$contact_id]
|
||||
);
|
||||
|
||||
return view($response, 'admin/contacts/createContact.twig', [
|
||||
'contactID' => $contactID,
|
||||
'crdate' => $crdate,
|
||||
'registrars' => $registrars,
|
||||
'countries' => $countries,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('success', 'Contact ' . $contactID . ' has been created successfully on ' . $crdate);
|
||||
return $response->withHeader('Location', '/contacts')->withStatus(302);
|
||||
}
|
||||
|
||||
$iso3166 = new ISO3166();
|
||||
|
|
|
@ -6,6 +6,9 @@ use App\Models\Domain;
|
|||
use Psr\Http\Message\ResponseInterface as Response;
|
||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Selective\XmlDSig\PublicKeyStore;
|
||||
use Selective\XmlDSig\CryptoVerifier;
|
||||
use Selective\XmlDSig\XmlSignatureVerifier;
|
||||
|
||||
class DomainsController extends Controller
|
||||
{
|
||||
|
@ -145,13 +148,8 @@ class DomainsController extends Controller
|
|||
$invalid_domain = validate_label($domainName, $db);
|
||||
|
||||
if ($invalid_domain) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid domain name',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid domain name');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$valid_tld = false;
|
||||
|
@ -166,13 +164,8 @@ class DomainsController extends Controller
|
|||
}
|
||||
|
||||
if (!$valid_tld) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid domain extension',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid domain extension');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$domain_already_exist = $db->selectValue(
|
||||
|
@ -181,13 +174,8 @@ class DomainsController extends Controller
|
|||
);
|
||||
|
||||
if ($domain_already_exist) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Domain name already exists',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Domain name already exists');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$currentDateTime = new \DateTime();
|
||||
|
@ -207,40 +195,20 @@ class DomainsController extends Controller
|
|||
if ($phase_details !== 'First-Come-First-Serve') {
|
||||
if ($phaseType !== 'none') {
|
||||
if ($phaseType == null && $phaseType == '') {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
} else if ($phase_details == null) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The launch phase ' . $phaseType . ' is currently not active.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is currently not active.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
} else if ($phaseType !== 'none') {
|
||||
if ($phaseType == null && $phaseType == '') {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
} else if ($phase_details == null) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The launch phase ' . $phaseType . ' is currently not active.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is currently not active.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -248,14 +216,8 @@ class DomainsController extends Controller
|
|||
if (!isset($data['noticeid']) || $data['noticeid'] === '' ||
|
||||
!isset($data['notafter']) || $data['notafter'] === '' ||
|
||||
!isset($data['accepted']) || $data['accepted'] === '') {
|
||||
// Trigger an error or handle the situation as needed
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => "Error: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'",
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', "Error creating domain: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'");
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$noticeid = $data['noticeid'];
|
||||
|
@ -266,6 +228,66 @@ class DomainsController extends Controller
|
|||
$notafter = null;
|
||||
$accepted = null;
|
||||
}
|
||||
|
||||
if ($phaseType === 'sunrise') {
|
||||
if ($smd !== null && $smd !== '') {
|
||||
// Extract the BASE64 encoded part
|
||||
$beginMarker = "-----BEGIN ENCODED SMD-----";
|
||||
$endMarker = "-----END ENCODED SMD-----";
|
||||
$beginPos = strpos($smd, $beginMarker) + strlen($beginMarker);
|
||||
$endPos = strpos($smd, $endMarker);
|
||||
$encodedSMD = trim(substr($smd, $beginPos, $endPos - $beginPos));
|
||||
|
||||
// Decode the BASE64 content
|
||||
$xmlContent = base64_decode($encodedSMD);
|
||||
|
||||
// Load the XML content using DOMDocument
|
||||
$domDocument = new \DOMDocument();
|
||||
$domDocument->preserveWhiteSpace = false;
|
||||
$domDocument->formatOutput = true;
|
||||
$domDocument->loadXML($xmlContent);
|
||||
|
||||
// Parse data
|
||||
$xpath = new \DOMXPath($domDocument);
|
||||
$xpath->registerNamespace('smd', 'urn:ietf:params:xml:ns:signedMark-1.0');
|
||||
$xpath->registerNamespace('mark', 'urn:ietf:params:xml:ns:mark-1.0');
|
||||
|
||||
$notBefore = new \DateTime($xpath->evaluate('string(//smd:notBefore)'));
|
||||
$notAfter = new \DateTime($xpath->evaluate('string(//smd:notAfter)'));
|
||||
$markName = $xpath->evaluate('string(//mark:markName)');
|
||||
$labels = [];
|
||||
foreach ($xpath->query('//mark:label') as $x_label) {
|
||||
$labels[] = $x_label->nodeValue;
|
||||
}
|
||||
|
||||
if (!in_array($label, $labels)) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: SMD file is not valid for the domain name being registered.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Check if current date and time is between notBefore and notAfter
|
||||
$now = new \DateTime();
|
||||
if (!($now >= $notBefore && $now <= $notAfter)) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Current time is outside the valid range in the SMD.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Verify the signature
|
||||
$publicKeyStore = new PublicKeyStore();
|
||||
$publicKeyStore->loadFromDocument($domDocument);
|
||||
$cryptoVerifier = new CryptoVerifier($publicKeyStore);
|
||||
$xmlSignatureVerifier = new XmlSignatureVerifier($cryptoVerifier);
|
||||
$isValid = $xmlSignatureVerifier->verifyXml($xmlContent);
|
||||
|
||||
if (!$isValid) {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The XML signature of the SMD file is not valid.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
} else {
|
||||
$this->container->get('flash')->addMessage('error', "Error creating domain: SMD upload is required in the 'sunrise' phase.");
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
$domain_already_reserved = $db->selectValue(
|
||||
'SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1',
|
||||
|
@ -280,25 +302,15 @@ class DomainsController extends Controller
|
|||
$this->container->get('flash')->addMessage('error', 'Domain ' . $domainName . ' is not available: Allocation Token mismatch');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
} else {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Domain name is reserved or restricted',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
} else {
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Domain name is reserved or restricted');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($registrationYears && (($registrationYears < 1) || ($registrationYears > 10))) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Domain period must be from 1 to 10',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Domain period must be from 1 to 10');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
} elseif (!$registrationYears) {
|
||||
$registrationYears = 1;
|
||||
}
|
||||
|
@ -323,23 +335,13 @@ class DomainsController extends Controller
|
|||
$price = $returnValue['price'];
|
||||
|
||||
if (!$price) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The price, period and currency for such TLD are not declared',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The price, period and currency for such TLD are not declared');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (($registrar_balance + $creditLimit) < $price) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Low credit: minimum threshold reached',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Low credit: minimum threshold reached');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$nameservers = array_filter($data['nameserver'] ?? [], function($value) {
|
||||
|
@ -354,34 +356,19 @@ class DomainsController extends Controller
|
|||
|
||||
if (!empty($nameservers)) {
|
||||
if (count($nameservers) !== count(array_unique($nameservers))) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Duplicate nameservers detected. Please provide unique nameservers.',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Duplicate nameservers detected. Please provide unique nameservers.');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
foreach ($nameservers as $index => $nameserver) {
|
||||
if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid hostName',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid hostName');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!preg_match('/^([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9]){0,1}\.){1,125}[A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])$/i', $nameserver) && strlen($nameserver) < 254) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid hostName',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid hostName');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -391,23 +378,13 @@ class DomainsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Registrant does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Registrant does not exist');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -416,23 +393,13 @@ class DomainsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Admin contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Admin contact does not exist');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -441,23 +408,13 @@ class DomainsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Tech contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Tech contact does not exist');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -466,54 +423,29 @@ class DomainsController extends Controller
|
|||
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]);
|
||||
|
||||
if (!$row) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Billing contact does not exist',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Billing contact does not exist');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($clid != $row['clid']) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'The contact requested in the command does NOT belong to the current registrar',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$authInfo) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Missing domain authinfo',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Missing domain authinfo');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (strlen($authInfo) < 6 || strlen($authInfo) > 16) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Password needs to be at least 6 and up to 16 characters long',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Password needs to be at least 6 and up to 16 characters long');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!preg_match('/[A-Z]/', $authInfo)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Password should have both upper and lower case characters',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Password should have both upper and lower case characters');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$registrant_id = $db->selectValue(
|
||||
|
@ -617,47 +549,27 @@ class DomainsController extends Controller
|
|||
// Validate keyTag
|
||||
if (!empty($dsKeyTag)) {
|
||||
if (!is_int($dsKeyTag)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Incomplete key tag provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete key tag provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($dsKeyTag < 0 || $dsKeyTag > 65535) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Incomplete key tag provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete key tag provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
// Validate alg
|
||||
$validAlgorithms = [8, 13, 14, 15, 16];
|
||||
if (!empty($dsAlg) && !in_array($dsAlg, $validAlgorithms)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Incomplete algorithm provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete algorithm provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Validate digestType and digest
|
||||
if (!empty($dsDigestType) && !is_int($dsDigestType)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Incomplete digest type provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete digest type provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
$validDigests = [
|
||||
2 => 64, // SHA-256
|
||||
|
@ -665,13 +577,8 @@ class DomainsController extends Controller
|
|||
];
|
||||
if (!empty($dsDigest)) {
|
||||
if (strlen($dsDigest) != $validDigests[$dsDigestType] || !ctype_xdigit($dsDigest)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid digest length or format',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid digest length or format');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -679,46 +586,26 @@ class DomainsController extends Controller
|
|||
// Validate flags
|
||||
$validFlags = [256, 257];
|
||||
if (!empty($dnskeyFlags) && !in_array($dnskeyFlags, $validFlags)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid flags provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid flags provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Validate protocol
|
||||
if (!empty($dnskeyProtocol) && $dnskeyProtocol != 3) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid protocol provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid protocol provided');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Validate algKeyData
|
||||
if (!empty($dnskeyAlg)) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid algorithm encoding',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid algorithm encoding');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
// Validate pubKey
|
||||
if (!empty($dnskeyPubKey) && base64_encode(base64_decode($dnskeyPubKey, true)) !== $dnskeyPubKey) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Invalid public key encoding',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid public key encoding');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (!empty($dsKeyTag)) {
|
||||
|
@ -874,13 +761,8 @@ class DomainsController extends Controller
|
|||
|
||||
if ($internal_host) {
|
||||
if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) {
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Error: No IPv4 or IPv6 addresses provided for internal host',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating domain: No IPv4 or IPv6 addresses provided for internal host');
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) {
|
||||
|
@ -965,22 +847,12 @@ class DomainsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Database failure: ' . $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
} catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/domains/createDomain.twig', [
|
||||
'domainName' => $domainName,
|
||||
'error' => 'Database failure: ' . $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/domain/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$crdate = $db->selectValue(
|
||||
|
@ -1020,7 +892,8 @@ class DomainsController extends Controller
|
|||
'currencySymbol' => $symbol,
|
||||
'currencyPosition' => $position,
|
||||
'registrar' => $registrar,
|
||||
'launch_phases' => $launch_phases
|
||||
'launch_phases' => $launch_phases,
|
||||
'currency' => $currency,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -2000,7 +1873,8 @@ class DomainsController extends Controller
|
|||
'maxYears' => $maxYears,
|
||||
'currentUri' => $uri,
|
||||
'currencySymbol' => $symbol,
|
||||
'currencyPosition' => $position
|
||||
'currencyPosition' => $position,
|
||||
'currency' => $currency
|
||||
]);
|
||||
} else {
|
||||
// Domain does not exist, redirect to the domains view
|
||||
|
@ -2635,6 +2509,7 @@ class DomainsController extends Controller
|
|||
'registrars' => $registrars,
|
||||
'currencySymbol' => $symbol,
|
||||
'currencyPosition' => $position,
|
||||
'currency' => $currency
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -105,9 +105,13 @@ class FinancialsController extends Controller
|
|||
$balance = $db->selectRow('SELECT name, accountBalance, creditLimit FROM registrar WHERE id = ?',
|
||||
[ $_SESSION["auth_registrar_id"] ]
|
||||
);
|
||||
$currency = $_SESSION['_currency'];
|
||||
$stripe_key = envi('STRIPE_PUBLISHABLE_KEY');
|
||||
|
||||
return view($response,'admin/financials/deposit-registrar.twig', [
|
||||
'balance' => $balance
|
||||
'balance' => $balance,
|
||||
'currency' => $currency,
|
||||
'stripe_key' => $stripe_key
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -163,29 +167,25 @@ class FinancialsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/financials/deposit.twig', [
|
||||
'error' => $e->getMessage(),
|
||||
'registrars' => $registrars
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: '.$e->getMessage());
|
||||
return $response->withHeader('Location', '/deposit')->withStatus(302);
|
||||
}
|
||||
|
||||
return view($response, 'admin/financials/deposit.twig', [
|
||||
'deposit' => $amount,
|
||||
'registrars' => $registrars
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('success', 'Deposit successfully added. The registrar\'s account balance has been updated.');
|
||||
return $response->withHeader('Location', '/deposit')->withStatus(302);
|
||||
} else {
|
||||
return view($response, 'admin/financials/deposit.twig', [
|
||||
'error' => 'Invalid entry: Deposit amount must be positive. Please enter a valid amount.',
|
||||
'registrars' => $registrars
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Invalid entry: Deposit amount must be positive. Please enter a valid amount.');
|
||||
return $response->withHeader('Location', '/deposit')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
$db = $this->container->get('db');
|
||||
$registrars = $db->select("SELECT id, clid, name FROM registrar");
|
||||
$currency = $_SESSION['_currency'];
|
||||
|
||||
return view($response,'admin/financials/deposit.twig', [
|
||||
'registrars' => $registrars
|
||||
'registrars' => $registrars,
|
||||
'currency' => $currency
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,20 +37,12 @@ class HostsController extends Controller
|
|||
if (preg_match('/^([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9]){0,1}\.){1,125}[A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])$/i', $hostName) && strlen($hostName) < 254) {
|
||||
$host_id_already_exist = $hostModel->getHostByNom($hostName);
|
||||
if ($host_id_already_exist) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'host name already exists',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: host name ' . $hostName . ' already exists');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
} else {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'Invalid host name',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host name');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$result = $db->selectRow('SELECT registrar_id FROM registrar_users WHERE user_id = ?', [$_SESSION['auth_user_id']]);
|
||||
|
@ -64,24 +56,16 @@ class HostsController extends Controller
|
|||
if ($ipv4) {
|
||||
$ipv4 = normalize_v4_address($ipv4);
|
||||
if (!filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'Invalid host addr v4',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host addr v4');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
if ($ipv6) {
|
||||
$ipv6 = normalize_v6_address($ipv6);
|
||||
if (!filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'Invalid host addr v6',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host addr v6');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,22 +98,14 @@ class HostsController extends Controller
|
|||
}
|
||||
|
||||
if (!$domain_exist) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'A host name object can NOT be created in a repository for which no superordinate domain name object exists',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: A host name object can NOT be created in a repository for which no superordinate domain name object exists');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($_SESSION['auth_roles'] !== 0) {
|
||||
if ($clid != $clid_domain) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'The domain name belongs to another registrar, you are not allowed to create hosts for it',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: The domain name belongs to another registrar, you are not allowed to create hosts for it');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,12 +127,8 @@ class HostsController extends Controller
|
|||
$host_id = $db->getLastInsertId();
|
||||
|
||||
if (!$ipv4 && !$ipv6) {
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => 'At least one of IPv4 or IPv6 must be provided',
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating host: At least one of IPv4 or IPv6 must be provided');
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
|
||||
if ($ipv4) {
|
||||
|
@ -195,12 +167,8 @@ class HostsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'error' => $e->getMessage(),
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/host/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$crdate = $db->selectValue(
|
||||
|
@ -208,12 +176,8 @@ class HostsController extends Controller
|
|||
[$hostName]
|
||||
);
|
||||
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'crdate' => $crdate,
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('success', 'Host ' . $hostName . ' has been created successfully on ' . $crdate);
|
||||
return $response->withHeader('Location', '/hosts')->withStatus(302);
|
||||
} else {
|
||||
$currentDateTime = new \DateTime();
|
||||
$crdate = $currentDateTime->format('Y-m-d H:i:s.v');
|
||||
|
@ -242,12 +206,8 @@ class HostsController extends Controller
|
|||
[$hostName]
|
||||
);
|
||||
|
||||
return view($response, 'admin/hosts/createHost.twig', [
|
||||
'hostName' => $hostName,
|
||||
'crdate' => $crdate,
|
||||
'registrars' => $registrars,
|
||||
'registrar' => $registrar,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('success', 'Host ' . $hostName . ' has been created successfully on ' . $crdate);
|
||||
return $response->withHeader('Location', '/hosts')->withStatus(302);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,12 +73,16 @@ class ProfileController extends Controller
|
|||
'SELECT * FROM users_webauthn WHERE user_id = ?',
|
||||
[$userId]
|
||||
);
|
||||
$user_audit = $db->select(
|
||||
'SELECT * FROM users_audit WHERE user_id = ? ORDER BY event_time DESC',
|
||||
[$userId]
|
||||
);
|
||||
if ($is_2fa_activated) {
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue]);
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue, 'userAudit' => $user_audit]);
|
||||
} else if ($is_weba_activated) {
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'qrcodeDataUri' => $qrcodeDataUri, 'secret' => $secret, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue, 'weba' => $is_weba_activated]);
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'qrcodeDataUri' => $qrcodeDataUri, 'secret' => $secret, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue, 'weba' => $is_weba_activated, 'userAudit' => $user_audit]);
|
||||
} else {
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'qrcodeDataUri' => $qrcodeDataUri, 'secret' => $secret, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue]);
|
||||
return view($response,'admin/profile/profile.twig',['email' => $email, 'username' => $username, 'status' => $status, 'role' => $role, 'qrcodeDataUri' => $qrcodeDataUri, 'secret' => $secret, 'csrf_name' => $csrfName, 'csrf_value' => $csrfValue, 'userAudit' => $user_audit]);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -114,6 +118,21 @@ class ProfileController extends Controller
|
|||
}
|
||||
|
||||
try {
|
||||
$currentDateTime = new \DateTime();
|
||||
$currentDate = $currentDateTime->format('Y-m-d H:i:s.v'); // Current timestamp
|
||||
$db->insert(
|
||||
'users_audit',
|
||||
[
|
||||
'user_id' => $_SESSION['auth_user_id'],
|
||||
'user_event' => 'user.enable.2fa',
|
||||
'user_resource' => 'control.panel',
|
||||
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
|
||||
'user_ip' => get_client_ip(),
|
||||
'user_location' => get_client_location(),
|
||||
'event_time' => $currentDate,
|
||||
'user_data' => null
|
||||
]
|
||||
);
|
||||
$db->update(
|
||||
'users',
|
||||
[
|
||||
|
|
|
@ -98,10 +98,8 @@ class RegistrarsController extends Controller
|
|||
// Trim the final semicolon and space
|
||||
$errorText = rtrim($errorText, '; ');
|
||||
|
||||
return view($response, 'admin/registrars/create.twig', [
|
||||
'countries' => $countries,
|
||||
'error' => $errorText,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Error creating registrar: ' . $errorText);
|
||||
return $response->withHeader('Location', '/registrar/create')->withStatus(302);
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
|
@ -270,16 +268,12 @@ class RegistrarsController extends Controller
|
|||
$db->commit();
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
return view($response, 'admin/registrars/create.twig', [
|
||||
'error' => $e->getMessage(),
|
||||
'countries' => $countries,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
return $response->withHeader('Location', '/registrar/create')->withStatus(302);
|
||||
}
|
||||
|
||||
return view($response,'admin/registrars/create.twig', [
|
||||
'registrar' => $data['name'],
|
||||
'countries' => $countries,
|
||||
]);
|
||||
$this->container->get('flash')->addMessage('success', 'Registrar ' . $data['name'] . ' successfully created and is now active.');
|
||||
return $response->withHeader('Location', '/registrars')->withStatus(302);
|
||||
}
|
||||
|
||||
$iso3166 = new ISO3166();
|
||||
|
@ -334,7 +328,7 @@ class RegistrarsController extends Controller
|
|||
$registrarWhitelist = $db->select('SELECT addr FROM registrar_whitelist WHERE registrar_id = ?',
|
||||
[ $registrar['id'] ]);
|
||||
// Check if RegistrarOTE is not empty
|
||||
if (!empty($registrarOte)) {
|
||||
if (is_array($registrarOte) && !empty($registrarOte)) {
|
||||
// Split the results into two groups
|
||||
$firstHalf = array_slice($registrarOte, 0, 5);
|
||||
$secondHalf = array_slice($registrarOte, 5);
|
||||
|
|
|
@ -72,12 +72,9 @@ class SupportController extends Controller
|
|||
'categories' => $categories
|
||||
]);
|
||||
}
|
||||
|
||||
return view($response, 'admin/support/view.twig', [
|
||||
'categories' => $categories,
|
||||
'subject' => $subject,
|
||||
]);
|
||||
|
||||
|
||||
$this->container->get('flash')->addMessage('success', 'Support ticket ' . $subject . ' has been created successfully!');
|
||||
return $response->withHeader('Location', '/support')->withStatus(302);
|
||||
}
|
||||
|
||||
$db = $this->container->get('db');
|
||||
|
|
|
@ -6,6 +6,7 @@ use Psr\Http\Message\ResponseInterface as Response;
|
|||
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Respect\Validation\Validator as v;
|
||||
use League\ISO3166\ISO3166;
|
||||
|
||||
class SystemController extends Controller
|
||||
{
|
||||
|
@ -142,8 +143,19 @@ class SystemController extends Controller
|
|||
'name' => "rdap_server"
|
||||
]
|
||||
);
|
||||
|
||||
$db->update(
|
||||
'settings',
|
||||
[
|
||||
'value' => $data['currency']
|
||||
],
|
||||
[
|
||||
'name' => "currency"
|
||||
]
|
||||
);
|
||||
|
||||
$db->commit();
|
||||
$_SESSION['_currency'] = $data['currency'];
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
|
||||
|
@ -154,7 +166,9 @@ class SystemController extends Controller
|
|||
return $response->withHeader('Location', '/registry')->withStatus(302);
|
||||
|
||||
}
|
||||
|
||||
|
||||
$iso3166 = new ISO3166();
|
||||
$countries = $iso3166->all();
|
||||
$db = $this->container->get('db');
|
||||
$company_name = $db->selectValue("SELECT value FROM settings WHERE name = 'company_name'");
|
||||
$vat_number = $db->selectValue("SELECT value FROM settings WHERE name = 'vat_number'");
|
||||
|
@ -166,6 +180,17 @@ class SystemController extends Controller
|
|||
$launch_phases = $db->selectValue("SELECT value FROM settings WHERE name = 'launch_phases'");
|
||||
$whois_server = $db->selectValue("SELECT value FROM settings WHERE name = 'whois_server'");
|
||||
$rdap_server = $db->selectValue("SELECT value FROM settings WHERE name = 'rdap_server'");
|
||||
$currency = $db->selectValue("SELECT value FROM settings WHERE name = 'currency'");
|
||||
|
||||
$uniqueCurrencies = [];
|
||||
foreach ($countries as $country) {
|
||||
// Assuming each country has a 'currency' field with an array of currencies
|
||||
foreach ($country['currency'] as $currencyCode) {
|
||||
if (!array_key_exists($currencyCode, $uniqueCurrencies)) {
|
||||
$uniqueCurrencies[$currencyCode] = $currencyCode; // Or any other currency detail you have
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return view($response,'admin/system/registry.twig', [
|
||||
'company_name' => $company_name,
|
||||
|
@ -177,7 +202,9 @@ class SystemController extends Controller
|
|||
'handle' => $handle,
|
||||
'launch_phases' => $launch_phases,
|
||||
'whois_server' => $whois_server,
|
||||
'rdap_server' => $rdap_server
|
||||
'rdap_server' => $rdap_server,
|
||||
'uniqueCurrencies' => $uniqueCurrencies,
|
||||
'currency' => $currency
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -930,19 +957,29 @@ class SystemController extends Controller
|
|||
return $response->withHeader('Location', '/registry/reserved')->withStatus(302);
|
||||
|
||||
}
|
||||
|
||||
|
||||
$db = $this->container->get('db');
|
||||
$types = $db->select("SELECT DISTINCT type FROM reserved_domain_names");
|
||||
// Get the current URI
|
||||
$uri = $request->getUri()->getPath();
|
||||
|
||||
// Set default types if $types is empty
|
||||
if (empty($types)) {
|
||||
$types = [
|
||||
['type' => 'reserved'],
|
||||
['type' => 'restricted']
|
||||
];
|
||||
}
|
||||
|
||||
$categories = [];
|
||||
foreach ($types as $type) {
|
||||
$typeNames = $db->select(
|
||||
'SELECT name FROM reserved_domain_names WHERE type = ?',
|
||||
[ $type['type'] ]
|
||||
);
|
||||
$categories[$type['type']] = array_column($typeNames, 'name');
|
||||
);
|
||||
|
||||
// Initialize the type with an empty array if no names are found
|
||||
$categories[$type['type']] = $typeNames ? array_column($typeNames, 'name') : [];
|
||||
}
|
||||
|
||||
return view($response,'admin/system/manageReserved.twig', [
|
||||
|
|
|
@ -6,6 +6,7 @@ $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
|
|||
$dotenv->load();
|
||||
|
||||
// Retrieve database connection details from environment variables
|
||||
$dbDriver = $_ENV['DB_DRIVER'];
|
||||
$dbHost = $_ENV['DB_HOST'];
|
||||
$dbName = $_ENV['DB_DATABASE'];
|
||||
$dbUser = $_ENV['DB_USERNAME'];
|
||||
|
@ -26,12 +27,17 @@ $hashedPassword = password_hash($newPW, PASSWORD_ARGON2ID, $options);
|
|||
|
||||
try {
|
||||
// Create PDO instance
|
||||
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
|
||||
if ($dbDriver == 'mysql') {
|
||||
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
|
||||
} elseif ($dbDriver == 'pgsql') {
|
||||
$dsn = "pgsql:host=$dbHost;dbname=$dbName";
|
||||
}
|
||||
$pdo = new PDO($dsn, $dbUser, $dbPass);
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
|
||||
// SQL query
|
||||
$sql = "INSERT INTO users (email, password, username, status, verified, resettable, roles_mask, registered, last_login, force_logout, tfa_secret, tfa_enabled, auth_method, backup_codes)
|
||||
VALUES (:email, :password, :username, 0, 1, 1, 0, 1, NULL, 0, NULL, 0, 'password', NULL)";
|
||||
VALUES (:email, :password, :username, 0, 1, 1, 0, 1, NULL, 0, NULL, false, 'password', NULL)";
|
||||
|
||||
// Prepare and execute SQL statement
|
||||
$stmt = $pdo->prepare($sql);
|
||||
|
|
34
cp/bin/generate_translation.php
Normal file
34
cp/bin/generate_translation.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
$directory = '../resources/views';
|
||||
$poFile = 'messages.po'; // Output .po file
|
||||
$copyMsgIdToMsgStr = true; // Set to true to copy msgid to msgstr
|
||||
|
||||
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
|
||||
$regex = new RegexIterator($iterator, '/^.+\.twig$/i', RecursiveRegexIterator::GET_MATCH);
|
||||
|
||||
$translations = [];
|
||||
|
||||
foreach ($regex as $file) {
|
||||
$content = file_get_contents($file[0]);
|
||||
preg_match_all("/\{\{\s*__\('((?:[^'\\\\]|\\\\.)*)'\)\s*\}\}/", $content, $matches);
|
||||
|
||||
if (!empty($matches[1])) {
|
||||
$translations = array_merge($translations, $matches[1]);
|
||||
}
|
||||
}
|
||||
|
||||
$translations = array_unique($translations); // Remove duplicates
|
||||
|
||||
$poContent = "";
|
||||
|
||||
foreach ($translations as $translation) {
|
||||
// Handle the escaped single quotes correctly
|
||||
$translation = str_replace("\\'", "'", $translation);
|
||||
$poContent .= "msgid \"" . $translation . "\"\n";
|
||||
$poContent .= "msgstr \"" . ($copyMsgIdToMsgStr ? $translation : '') . "\"\n\n";
|
||||
}
|
||||
|
||||
file_put_contents($poFile, $poContent);
|
||||
|
||||
echo "Extraction complete. Check the $poFile file.".PHP_EOL;
|
|
@ -12,9 +12,17 @@ use Gettext\Loader\PoLoader;
|
|||
use Gettext\Translations;
|
||||
use Punic\Language;
|
||||
|
||||
if (session_status() == PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
// Enable for debug
|
||||
// if (session_status() == PHP_SESSION_NONE) {
|
||||
// session_start();
|
||||
// }
|
||||
|
||||
ini_set('session.cookie_secure', '1');
|
||||
ini_set('session.cookie_httponly', '1');
|
||||
ini_set('session.cookie_samesite', 'Strict');
|
||||
ini_set('session.cookie_lifetime', '0');
|
||||
ini_set('session.hash_function', 'sha256');
|
||||
ini_set('session.entropy_length', '32');
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
require __DIR__ . '/helper.php';
|
||||
|
@ -45,37 +53,6 @@ $routeParser = $app->getRouteCollector()->getRouteParser();
|
|||
|
||||
require_once __DIR__ . '/database.php';
|
||||
|
||||
// Known set of languages
|
||||
$allowedLanguages = ['en_US', 'uk_UA', 'es_ES']; // Add more as needed
|
||||
|
||||
if (isset($_SESSION['_lang']) && in_array($_SESSION['_lang'], $allowedLanguages)) {
|
||||
// Use regex to validate the format: two letters, underscore, two letters
|
||||
if (preg_match('/^[a-z]{2}_[A-Z]{2}$/', $_SESSION['_lang'])) {
|
||||
$desiredLanguage = $_SESSION['_lang'];
|
||||
$parts = explode('_', $_SESSION['_lang']);
|
||||
if (isset($parts[1])) {
|
||||
$uiLang = strtolower($parts[1]);
|
||||
}
|
||||
} else {
|
||||
$desiredLanguage = 'en_US';
|
||||
$uiLang = 'us';
|
||||
}
|
||||
} else {
|
||||
$desiredLanguage = 'en_US';
|
||||
$uiLang = 'us';
|
||||
}
|
||||
$lang_full = Language::getName($desiredLanguage, 'en');
|
||||
$lang = trim(strstr($lang_full, ' (', true));
|
||||
|
||||
$languageFile = '../lang/' . $desiredLanguage . '/messages.po';
|
||||
if (!file_exists($languageFile)) {
|
||||
$desiredLanguage = 'en_US'; // Fallback
|
||||
$languageFile = '../lang/en_US/messages.po';
|
||||
}
|
||||
|
||||
$loader = new PoLoader();
|
||||
$translations = $loader->loadFile($languageFile);
|
||||
|
||||
$container->set('router', function () use ($routeParser) {
|
||||
return $routeParser;
|
||||
});
|
||||
|
@ -89,6 +66,11 @@ $container->set('pdo', function () use ($pdo) {
|
|||
});
|
||||
|
||||
$container->set('auth', function() {
|
||||
//$responseFactory = new \Nyholm\Psr7\Factory\Psr17Factory();
|
||||
//$response = $responseFactory->createResponse();
|
||||
//$autoLogout = new \Pinga\Auth\AutoLogout();
|
||||
//$autoLogout->watch(900, '/', null, 301, $response);
|
||||
|
||||
return new \App\Auth\Auth;
|
||||
});
|
||||
|
||||
|
@ -96,7 +78,7 @@ $container->set('flash', function() {
|
|||
return new \Slim\Flash\Messages;
|
||||
});
|
||||
|
||||
$container->set('view', function ($container) use ($translations, $uiLang, $lang) {
|
||||
$container->set('view', function ($container) {
|
||||
$view = Twig::create(__DIR__ . '/../resources/views', [
|
||||
'cache' => false,
|
||||
]);
|
||||
|
@ -104,6 +86,38 @@ $container->set('view', function ($container) use ($translations, $uiLang, $lang
|
|||
'isLogin' => $container->get('auth')->isLogin(),
|
||||
'user' => $container->get('auth')->user(),
|
||||
]);
|
||||
|
||||
// Known set of languages
|
||||
$allowedLanguages = ['en_US', 'uk_UA', 'es_ES']; // Add more as needed
|
||||
|
||||
if (isset($_SESSION['_lang']) && in_array($_SESSION['_lang'], $allowedLanguages)) {
|
||||
// Use regex to validate the format: two letters, underscore, two letters
|
||||
if (preg_match('/^[a-z]{2}_[A-Z]{2}$/', $_SESSION['_lang'])) {
|
||||
$desiredLanguage = $_SESSION['_lang'];
|
||||
$parts = explode('_', $_SESSION['_lang']);
|
||||
if (isset($parts[1])) {
|
||||
$uiLang = strtolower($parts[1]);
|
||||
}
|
||||
} else {
|
||||
$desiredLanguage = 'en_US';
|
||||
$uiLang = 'us';
|
||||
}
|
||||
} else {
|
||||
$desiredLanguage = 'en_US';
|
||||
$uiLang = 'us';
|
||||
}
|
||||
$lang_full = Language::getName($desiredLanguage, 'en');
|
||||
$lang = trim(strstr($lang_full, ' (', true));
|
||||
|
||||
$languageFile = '../lang/' . $desiredLanguage . '/messages.po';
|
||||
if (!file_exists($languageFile)) {
|
||||
$desiredLanguage = 'en_US'; // Fallback
|
||||
$languageFile = '../lang/en_US/messages.po';
|
||||
}
|
||||
|
||||
$loader = new PoLoader();
|
||||
$translations = $loader->loadFile($languageFile);
|
||||
|
||||
$view->getEnvironment()->addGlobal('uiLang', $uiLang);
|
||||
$view->getEnvironment()->addGlobal('lang', $lang);
|
||||
$view->getEnvironment()->addGlobal('flash', $container->get('flash'));
|
||||
|
@ -117,22 +131,20 @@ $container->set('view', function ($container) use ($translations, $uiLang, $lang
|
|||
}
|
||||
|
||||
$db = $container->get('db');
|
||||
$query = 'SELECT r.currency, ru.registrar_id
|
||||
$user_data = 'SELECT ru.registrar_id
|
||||
FROM registrar_users ru
|
||||
JOIN registrar r ON ru.registrar_id = r.id
|
||||
WHERE ru.user_id = ?';
|
||||
$currency_data = "SELECT value FROM settings WHERE name = 'currency'";
|
||||
|
||||
if (isset($_SESSION['auth_user_id'])) {
|
||||
$result = $db->select($query, [$_SESSION['auth_user_id']]);
|
||||
$result = $db->select($user_data, [$_SESSION['auth_user_id']]);
|
||||
$db_currency = $db->select($currency_data);
|
||||
|
||||
// Default values
|
||||
$_SESSION['_currency'] = 'USD';
|
||||
$_SESSION['_currency'] = $db_currency[0]['value'];
|
||||
$_SESSION['auth_registrar_id'] = null; // Default registrar_id
|
||||
|
||||
if ($result !== null && count($result) > 0) {
|
||||
if (isset($result[0]['currency'])) {
|
||||
$_SESSION['_currency'] = $result[0]['currency'];
|
||||
}
|
||||
if (isset($result[0]['registrar_id'])) {
|
||||
$_SESSION['auth_registrar_id'] = $result[0]['registrar_id'];
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ elseif (config('default') == 'sqlite') {
|
|||
}
|
||||
// PostgreSQL Connection
|
||||
elseif (config('default') == 'pgsql') {
|
||||
$pdo = new \PDO($config['pgsql']['driver'].':dbname='.$config['pgsql']['database'].';host='.$config['pgsql']['host'].';charset='.$config['pgsql']['charset'].'', $config['pgsql']['username'], $config['pgsql']['password']);
|
||||
$pdo = new \PDO($config['pgsql']['driver'].':dbname='.$config['pgsql']['database'].';host='.$config['pgsql']['host'].';', $config['pgsql']['username'], $config['pgsql']['password']);
|
||||
$db = \Pinga\Db\PdoDatabase::fromPdo($pdo);
|
||||
}
|
||||
// SQL Server Connection
|
||||
|
|
|
@ -396,4 +396,33 @@ function createUuidFromId($id) {
|
|||
// Handle exception
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Function to get the client IP address
|
||||
function get_client_ip() {
|
||||
$ipaddress = '';
|
||||
if (getenv('HTTP_CLIENT_IP'))
|
||||
$ipaddress = getenv('HTTP_CLIENT_IP');
|
||||
else if(getenv('HTTP_X_FORWARDED_FOR'))
|
||||
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
|
||||
else if(getenv('HTTP_X_FORWARDED'))
|
||||
$ipaddress = getenv('HTTP_X_FORWARDED');
|
||||
else if(getenv('HTTP_FORWARDED_FOR'))
|
||||
$ipaddress = getenv('HTTP_FORWARDED_FOR');
|
||||
else if(getenv('HTTP_FORWARDED'))
|
||||
$ipaddress = getenv('HTTP_FORWARDED');
|
||||
else if(getenv('REMOTE_ADDR'))
|
||||
$ipaddress = getenv('REMOTE_ADDR');
|
||||
else
|
||||
$ipaddress = 'UNKNOWN';
|
||||
return $ipaddress;
|
||||
}
|
||||
|
||||
function get_client_location() {
|
||||
$PublicIP = get_client_ip();
|
||||
$json = file_get_contents("http://ipinfo.io/$PublicIP/geo");
|
||||
$json = json_decode($json, true);
|
||||
$country = $json['country'];
|
||||
|
||||
return $country;
|
||||
}
|
|
@ -16,17 +16,15 @@
|
|||
"ext-pdo": "*",
|
||||
"slim/slim": "4.12.0",
|
||||
"slim/twig-view": "^3.3.0",
|
||||
"monolog/monolog": "^3.4.0",
|
||||
"monolog/monolog": "^3.5.0",
|
||||
"respect/validation": "^2.2.4",
|
||||
"slim/csrf": "^1.3",
|
||||
"slim/flash": "^0.4",
|
||||
"vlucas/phpdotenv": "^5.5",
|
||||
"php-di/php-di": "^7.0.5",
|
||||
"nyholm/psr7": "^1.8",
|
||||
"nyholm/psr7-server": "^1.0.2",
|
||||
"pinga/auth": "^0.2.1",
|
||||
"phpmailer/phpmailer": "^6.8.1",
|
||||
"utopia-php/messaging": "^0.3.0",
|
||||
"vlucas/phpdotenv": "^5.6",
|
||||
"php-di/php-di": "^7.0.6",
|
||||
"nyholm/psr7": "^1.8.1",
|
||||
"nyholm/psr7-server": "^1.1.0",
|
||||
"pinga/auth": "^0.3.3",
|
||||
"filp/whoops": "^2.15.3",
|
||||
"imefisto/psr-swoole-native": "^1.1.2",
|
||||
"chubbyphp/chubbyphp-static-file": "^1.2",
|
||||
|
@ -43,12 +41,13 @@
|
|||
"matthiasmullie/scrapbook": "^1.5",
|
||||
"guzzlehttp/guzzle": "^7.8",
|
||||
"league/flysystem": "^3.23",
|
||||
"mpociot/vat-calculator": "^3.6",
|
||||
"ramsey/uuid": "^4.7"
|
||||
"mpociot/vat-calculator": "^3.7",
|
||||
"ramsey/uuid": "^4.7",
|
||||
"selective/xmldsig": "^3.1"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "app/"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ return [
|
|||
'database' => $_ENV['DB_DATABASE'] ?? 'db_username',
|
||||
'username' => $_ENV['DB_USERNAME'] ?? 'db_password',
|
||||
'password' => $_ENV['DB_PASSWORD'] ?? '',
|
||||
'charset' => 'utf8',
|
||||
'prefix' => '',
|
||||
'schema' => 'public',
|
||||
'sslmode' => 'prefer',
|
||||
|
|
|
@ -25,5 +25,6 @@ MAIL_API_KEY='test-api-key'
|
|||
MAIL_API_PROVIDER='sendgrid'
|
||||
|
||||
STRIPE_SECRET_KEY='stripe-secret-key'
|
||||
STRIPE_PUBLISHABLE_KEY='stripe-publishable-key'
|
||||
|
||||
TEST_TLDS=.test,.com.test
|
File diff suppressed because it is too large
Load diff
1346
cp/lang/messages_template.po
Normal file
1346
cp/lang/messages_template.po
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Create Contact') }}
|
||||
|
@ -24,31 +24,7 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if contactID is defined and crdate 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Contact') }} <strong>{{ contactID }}</strong> {{ __('has been created successfully on') }} <strong>{{ crdate|date("Y-m-d H:i:s") }}!</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Contact') }} <strong>{{ contactID }}</strong> {{ __('can not be created') }}: <strong>{{ error }}</strong>
|
||||
</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">
|
||||
<form action="/contact/create" method="post">
|
||||
|
@ -56,21 +32,21 @@
|
|||
<div class="row">
|
||||
<!-- First Column: General & Internationalized Info -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">General & Internationalized Info</h6>
|
||||
<h6 class="mb-3">{{ __('General & Internationalized Info') }}</h6>
|
||||
|
||||
<!-- Internationalized Name -->
|
||||
<div class="mb-3">
|
||||
<label for="intName" class="form-label required">Name</label>
|
||||
<label for="intName" class="form-label required">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="intName" name="intName" required="required">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseNameInt" name="disclose_name_int">
|
||||
<span class="form-check-label" for="discloseNameInt">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseNameInt">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{% if registrars and not registrar %}
|
||||
<div class="form-group mb-3">
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}:</label>
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}</label>
|
||||
<select id="registrarDropdown" name="registrar" class="form-control">
|
||||
{% for registrar in registrars %}
|
||||
<option value="{{ registrar.id }}">{{ registrar.name }}</option>
|
||||
|
@ -81,43 +57,43 @@
|
|||
|
||||
<!-- Internationalized Organization -->
|
||||
<div class="mb-3">
|
||||
<label for="intOrg" class="form-label required">Organization</label>
|
||||
<label for="intOrg" class="form-label required">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="intOrg" name="org" required="required">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseOrgInt" name="disclose_org_int">
|
||||
<span class="form-check-label" for="discloseOrgInt">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseOrgInt">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Internationalized Address: Street Details -->
|
||||
<div class="mb-3">
|
||||
<label for="street1" class="form-label required">Street 1</label>
|
||||
<label for="street1" class="form-label required">{{ __('Street') }} 1</label>
|
||||
<input type="text" class="form-control" id="street1" name="street1" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="street2" class="form-label">Street 2</label>
|
||||
<label for="street2" class="form-label">{{ __('Street') }} 2</label>
|
||||
<input type="text" class="form-control" id="street2" name="street2">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="street3" class="form-label">Street 3</label>
|
||||
<label for="street3" class="form-label">{{ __('Street') }} 3</label>
|
||||
<input type="text" class="form-control" id="street3" name="street3">
|
||||
</div>
|
||||
|
||||
<!-- Internationalized Address: City, SP, PC, CC -->
|
||||
<div class="mb-3">
|
||||
<label for="city" class="form-label required">City</label>
|
||||
<label for="city" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="city" name="city" required="required">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="sp" class="form-label">State/Province</label>
|
||||
<label for="sp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="sp" name="sp">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="pc" class="form-label">Postal Code</label>
|
||||
<label for="pc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="pc" name="pc">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="cc" class="form-label required">Country</label>
|
||||
<label for="cc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="cc" name="cc" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
|
||||
|
@ -126,60 +102,60 @@
|
|||
</div>
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseAddrInt" name="disclose_addr_int">
|
||||
<span class="form-check-label" for="discloseAddrInt">Disclose Address in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseAddrInt">{{ __('Disclose Address in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Second Column: Voice, Fax, Email, and other details -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Contact Details</h6>
|
||||
<h6 class="mb-3">{{ __('Contact Details') }}</h6>
|
||||
|
||||
<!-- Contact ID -->
|
||||
<div class="mb-3">
|
||||
<label for="contactid" class="form-label required">Contact ID</label>
|
||||
<label for="contactid" class="form-label required">{{ __('Contact ID') }}</label>
|
||||
<input type="text" class="form-control" id="contactid" name="contactid" required="required">
|
||||
</div>
|
||||
|
||||
<!-- Voice -->
|
||||
<div class="mb-3">
|
||||
<label for="voice" class="form-label required">Voice</label>
|
||||
<label for="voice" class="form-label required">{{ __('Voice') }}</label>
|
||||
<input type="tel" class="form-control" id="voice" name="voice" required="required">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseVoice" name="disclose_voice">
|
||||
<span class="form-check-label" for="discloseVoice">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseVoice">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Fax -->
|
||||
<div class="mb-3">
|
||||
<label for="fax" class="form-label">Fax</label>
|
||||
<label for="fax" class="form-label">{{ __('Fax') }}</label>
|
||||
<input type="tel" class="form-control" id="fax" name="fax">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseFax" name="disclose_fax">
|
||||
<span class="form-check-label" for="discloseFax">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseFax">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Email -->
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label required">Email</label>
|
||||
<label for="email" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" required="required" autocapitalize="none">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseEmail" name="disclose_email">
|
||||
<span class="form-check-label" for="discloseEmail">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseEmail">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- AuthInfo for Contact -->
|
||||
<div class="mb-3">
|
||||
<label for="authInfo" class="form-label required">Contact AuthInfo</label>
|
||||
<label for="authInfo" class="form-label required">{{ __('Contact AuthInfo') }}</label>
|
||||
<input type="text" class="form-control" id="authInfo" name="authInfo" readonly>
|
||||
<small class="form-text text-muted">Auto-generated authentication information for the contact.</small>
|
||||
<small class="form-text text-muted">{{ __('Auto-generated authentication information for the contact') }}.</small>
|
||||
</div>
|
||||
|
||||
<!-- NIN - National Identification Number -->
|
||||
<div class="mb-3">
|
||||
<label for="nin" class="form-label">NIN - National Identification Number</label>
|
||||
<label for="nin" class="form-label">{{ __('NIN - National Identification Number') }}</label>
|
||||
<input type="text" class="form-control" id="nin" name="nin">
|
||||
</div>
|
||||
|
||||
|
@ -187,7 +163,7 @@
|
|||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="isBusiness" name="isBusiness">
|
||||
<label class="form-check-label" for="isBusiness">This is a Business Contact</label>
|
||||
<label class="form-check-label" for="isBusiness">{{ __('This is a Business Contact') }}</label>
|
||||
</div>
|
||||
<!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' -->
|
||||
</div>
|
||||
|
@ -195,15 +171,15 @@
|
|||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyPhone" name="verifyPhone">
|
||||
<label class="form-check-label" for="verifyPhone">Verify by Phone</label>
|
||||
<label class="form-check-label" for="verifyPhone">{{ __('Verify by Phone') }}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyEmail" name="verifyEmail">
|
||||
<label class="form-check-label" for="verifyEmail">Verify by Email</label>
|
||||
<label class="form-check-label" for="verifyEmail">{{ __('Verify by Email') }}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyPostal" name="verifyPostal">
|
||||
<label class="form-check-label" for="verifyPostal">Verify by Postal Mail</label>
|
||||
<label class="form-check-label" for="verifyPostal">{{ __('Verify by Postal Mail') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -214,7 +190,7 @@
|
|||
<div class="mb-3">
|
||||
<label class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="toggleLoc">
|
||||
<span class="form-check-label" for="toggleLoc">Include Localized Info</span>
|
||||
<span class="form-check-label" for="toggleLoc">{{ __('Include Localized Info') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
@ -222,64 +198,64 @@
|
|||
<div class="row" id="localizedInfo" style="display: none;">
|
||||
<!-- Localized Postal Info: First Column -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Localized Postal Info: Personal Details</h6>
|
||||
<h6 class="mb-3">{{ __('Localized Postal Info: Personal Details') }}</h6>
|
||||
|
||||
<!-- Localized Name -->
|
||||
<div class="mb-3">
|
||||
<label for="locName" class="form-label">Name</label>
|
||||
<label for="locName" class="form-label">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="locName" name="locName">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseNameLoc" name="disclose_name_loc">
|
||||
<span class="form-check-label" for="discloseNameLoc">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseNameLoc">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Localized Organization -->
|
||||
<div class="mb-3">
|
||||
<label for="locOrg" class="form-label">Organization</label>
|
||||
<label for="locOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="locOrg" name="locOrg">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseOrgLoc" name="disclose_org_loc">
|
||||
<span class="form-check-label" for="discloseOrgLoc">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseOrgLoc">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Localized Street Details -->
|
||||
<div class="mb-3">
|
||||
<label for="locStreet1" class="form-label">Street 1</label>
|
||||
<label for="locStreet1" class="form-label">{{ __('Street') }} 1</label>
|
||||
<input type="text" class="form-control" id="locStreet1" name="locStreet1">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locStreet2" class="form-label">Street 2</label>
|
||||
<label for="locStreet2" class="form-label">{{ __('Street') }} 2</label>
|
||||
<input type="text" class="form-control" id="locStreet2" name="locStreet2">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Localized Postal Info: Second Column -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Localized Postal Info: Address Details</h6>
|
||||
<h6 class="mb-3">{{ __('Localized Postal Info: Address Details') }}</h6>
|
||||
|
||||
<!-- Continued Localized Street Detail -->
|
||||
<div class="mb-3">
|
||||
<label for="locStreet3" class="form-label">Street 3</label>
|
||||
<label for="locStreet3" class="form-label">{{ __('Street') }} 3</label>
|
||||
<input type="text" class="form-control" id="locStreet3" name="locStreet3">
|
||||
</div>
|
||||
|
||||
<!-- Localized City, SP, PC, CC -->
|
||||
<div class="mb-3">
|
||||
<label for="locCity" class="form-label">City</label>
|
||||
<label for="locCity" class="form-label">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="locCity" name="locCity">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locSP" class="form-label">State/Province</label>
|
||||
<label for="locSP" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="locSP" name="locSP">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locPC" class="form-label">Postal Code</label>
|
||||
<label for="locPC" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="locPC" name="locPC">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locCC" class="form-label">Country</label>
|
||||
<label for="locCC" class="form-label">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="locCC" name="locCC">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
|
||||
|
@ -288,7 +264,7 @@
|
|||
</div>
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseAddrLoc" name="disclose_addr_loc">
|
||||
<span class="form-check-label" for="discloseAddrLoc">Disclose Address in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseAddrLoc">{{ __('Disclose Address in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -296,7 +272,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create Contact</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Create Contact') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -304,19 +280,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
|
|
@ -47,9 +47,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search contacts">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search contacts') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,18 +61,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Update Contact') }} {{ contact.identifier }}
|
||||
|
@ -42,57 +42,57 @@
|
|||
<div class="row">
|
||||
<!-- First Column: General & Internationalized Info -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">General & Internationalized Info</h6>
|
||||
<h6 class="mb-3">{{ __('General & Internationalized Info') }}</h6>
|
||||
|
||||
<!-- Internationalized Name -->
|
||||
<div class="mb-3">
|
||||
<label for="intName" class="form-label required">Name</label>
|
||||
<label for="intName" class="form-label required">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="intName" name="intName" required="required" value="{{ postal_int.name }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseNameInt" name="disclose_name_int" {% if postal_int.disclose_name_int == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseNameInt">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseNameInt">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Internationalized Organization -->
|
||||
<div class="mb-3">
|
||||
<label for="intOrg" class="form-label required">Organization</label>
|
||||
<label for="intOrg" class="form-label required">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="intOrg" name="org" required="required" value="{{ postal_int.org }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseOrgInt" name="disclose_org_int" {% if postal_int.disclose_org_int == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseOrgInt">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseOrgInt">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Internationalized Address: Street Details -->
|
||||
<div class="mb-3">
|
||||
<label for="street1" class="form-label required">Street 1</label>
|
||||
<label for="street1" class="form-label required">{{ __('Street') }} 1</label>
|
||||
<input type="text" class="form-control" id="street1" name="street1" required="required" value="{{ postal_int.street1 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="street2" class="form-label">Street 2</label>
|
||||
<label for="street2" class="form-label">{{ __('Street') }} 2</label>
|
||||
<input type="text" class="form-control" id="street2" name="street2" value="{{ postal_int.street2 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="street3" class="form-label">Street 3</label>
|
||||
<label for="street3" class="form-label">{{ __('Street') }} 3</label>
|
||||
<input type="text" class="form-control" id="street3" name="street3" value="{{ postal_int.street3 }}">
|
||||
</div>
|
||||
|
||||
<!-- Internationalized Address: City, SP, PC, CC -->
|
||||
<div class="mb-3">
|
||||
<label for="city" class="form-label required">City</label>
|
||||
<label for="city" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="city" name="city" required="required" value="{{ postal_int.city }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="sp" class="form-label">State/Province</label>
|
||||
<label for="sp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="sp" name="sp" value="{{ postal_int.sp }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="pc" class="form-label">Postal Code</label>
|
||||
<label for="pc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="pc" name="pc" value="{{ postal_int.pc }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="cc" class="form-label required">Country</label>
|
||||
<label for="cc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="cc" name="cc" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2 }}" {% if postal_int.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option>
|
||||
|
@ -101,54 +101,54 @@
|
|||
</div>
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseAddrInt" name="disclose_addr_int" {% if postal_int.disclose_addr_int == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseAddrInt">Disclose Address in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseAddrInt">{{ __('Disclose Address in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Second Column: Voice, Fax, Email, and other details -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Contact Details</h6>
|
||||
<h6 class="mb-3">{{ __('Contact Details') }}</h6>
|
||||
|
||||
<!-- Voice -->
|
||||
<div class="mb-3">
|
||||
<label for="voice" class="form-label required">Voice</label>
|
||||
<label for="voice" class="form-label required">{{ __('Voice') }}</label>
|
||||
<input type="tel" class="form-control" id="voice" name="voice" required="required" value="{{ contact.voice }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseVoice" name="disclose_voice" {% if contact.disclose_voice == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseVoice">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseVoice">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Fax -->
|
||||
<div class="mb-3">
|
||||
<label for="fax" class="form-label">Fax</label>
|
||||
<label for="fax" class="form-label">{{ __('Fax') }}</label>
|
||||
<input type="tel" class="form-control" id="fax" name="fax" value="{{ contact.fax }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseFax" name="disclose_fax" {% if contact.disclose_fax == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseFax">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseFax">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Email -->
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label required">Email</label>
|
||||
<label for="email" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" required="required" autocapitalize="none" value="{{ contact.email }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseEmail" name="disclose_email" {% if contact.disclose_email == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseEmail">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseEmail">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- AuthInfo for Contact -->
|
||||
<div class="mb-3">
|
||||
<label for="authInfo" class="form-label required">Contact AuthInfo</label>
|
||||
<label for="authInfo" class="form-label required">{{ __('Contact AuthInfo') }}</label>
|
||||
<input type="text" class="form-control" id="authInfo" name="authInfo" value="{{ contactAuth.authinfo }}">
|
||||
<small class="form-text text-muted">Authentication information for the contact.</small>
|
||||
<small class="form-text text-muted">{{ __('Authentication information for the contact') }}.</small>
|
||||
</div>
|
||||
|
||||
<!-- NIN - National Identification Number -->
|
||||
<div class="mb-3">
|
||||
<label for="nin" class="form-label">NIN - National Identification Number</label>
|
||||
<label for="nin" class="form-label">{{ __('NIN - National Identification Number') }}</label>
|
||||
<input type="text" class="form-control" id="nin" name="nin" value="{{ contact.nin }}">
|
||||
</div>
|
||||
|
||||
|
@ -156,7 +156,7 @@
|
|||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="isBusiness" name="isBusiness" {% if contact.nin_type == 'business' %}checked{% endif %}>
|
||||
<label class="form-check-label" for="isBusiness">This is a Business Contact</label>
|
||||
<label class="form-check-label" for="isBusiness">{{ __('This is a Business Contact') }}</label>
|
||||
</div>
|
||||
<!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' -->
|
||||
</div>
|
||||
|
@ -164,15 +164,15 @@
|
|||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyPhone" name="verifyPhone">
|
||||
<label class="form-check-label" for="verifyPhone">Verify by Phone</label>
|
||||
<label class="form-check-label" for="verifyPhone">{{ __('Verify by Phone') }}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyEmail" name="verifyEmail">
|
||||
<label class="form-check-label" for="verifyEmail">Verify by Email</label>
|
||||
<label class="form-check-label" for="verifyEmail">{{ __('Verify by Email') }}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="verifyPostal" name="verifyPostal">
|
||||
<label class="form-check-label" for="verifyPostal">Verify by Postal Mail</label>
|
||||
<label class="form-check-label" for="verifyPostal">{{ __('Verify by Postal Mail') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -183,7 +183,7 @@
|
|||
<div class="mb-3">
|
||||
<label class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="toggleLoc" {% if postal_loc.cc %}checked{% endif %}>
|
||||
<span class="form-check-label" for="toggleLoc">Include Localized Info</span>
|
||||
<span class="form-check-label" for="toggleLoc">{{ __('Include Localized Info') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
@ -191,64 +191,64 @@
|
|||
<div class="row" id="localizedInfo" style="display: none;">
|
||||
<!-- Localized Postal Info: First Column -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Localized Postal Info: Personal Details</h6>
|
||||
<h6 class="mb-3">{{ __('Localized Postal Info: Personal Details') }}</h6>
|
||||
|
||||
<!-- Localized Name -->
|
||||
<div class="mb-3">
|
||||
<label for="locName" class="form-label">Name</label>
|
||||
<label for="locName" class="form-label">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="locName" name="locName" value="{{ postal_loc.name }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseNameLoc" name="disclose_name_loc" {% if postal_loc.disclose_name_loc == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseNameLoc">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseNameLoc">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Localized Organization -->
|
||||
<div class="mb-3">
|
||||
<label for="locOrg" class="form-label">Organization</label>
|
||||
<label for="locOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="locOrg" name="locOrg" value="{{ postal_loc.org }}">
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseOrgLoc" name="disclose_org_loc" {% if postal_loc.disclose_org_loc == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseOrgLoc">Disclose in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseOrgLoc">{{ __('Disclose in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Localized Street Details -->
|
||||
<div class="mb-3">
|
||||
<label for="locStreet1" class="form-label">Street 1</label>
|
||||
<label for="locStreet1" class="form-label">{{ __('Street') }} 1</label>
|
||||
<input type="text" class="form-control" id="locStreet1" name="locStreet1" value="{{ postal_loc.street1 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locStreet2" class="form-label">Street 2</label>
|
||||
<label for="locStreet2" class="form-label">{{ __('Street') }} 2</label>
|
||||
<input type="text" class="form-control" id="locStreet2" name="locStreet2" value="{{ postal_loc.street2 }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Localized Postal Info: Second Column -->
|
||||
<div class="col-md-6">
|
||||
<h6 class="mb-3">Localized Postal Info: Address Details</h6>
|
||||
<h6 class="mb-3">{{ __('Localized Postal Info: Address Details') }}</h6>
|
||||
|
||||
<!-- Continued Localized Street Detail -->
|
||||
<div class="mb-3">
|
||||
<label for="locStreet3" class="form-label">Street 3</label>
|
||||
<label for="locStreet3" class="form-label">{{ __('Street') }} 3</label>
|
||||
<input type="text" class="form-control" id="locStreet3" name="locStreet3" value="{{ postal_loc.street3 }}">
|
||||
</div>
|
||||
|
||||
<!-- Localized City, SP, PC, CC -->
|
||||
<div class="mb-3">
|
||||
<label for="locCity" class="form-label">City</label>
|
||||
<label for="locCity" class="form-label">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="locCity" name="locCity" value="{{ postal_loc.city }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locSP" class="form-label">State/Province</label>
|
||||
<label for="locSP" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="locSP" name="locSP" value="{{ postal_loc.sp }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locPC" class="form-label">Postal Code</label>
|
||||
<label for="locPC" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="locPC" name="locPC" value="{{ postal_loc.pc }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="locCC" class="form-label">Country</label>
|
||||
<label for="locCC" class="form-label">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="locCC" name="locCC">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2 }}" {% if postal_loc.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option>
|
||||
|
@ -257,7 +257,7 @@
|
|||
</div>
|
||||
<label class="form-check form-switch mt-1">
|
||||
<input class="form-check-input" type="checkbox" id="discloseAddrLoc" name="disclose_addr_loc" {% if postal_loc.disclose_addr_loc == '1' %}checked{% endif %}>
|
||||
<span class="form-check-label" for="discloseAddrLoc">Disclose Address in WHOIS</span>
|
||||
<span class="form-check-label" for="discloseAddrLoc">{{ __('Disclose Address in WHOIS') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -265,7 +265,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Contact</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Contact') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -273,19 +273,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
|
|
@ -26,24 +26,24 @@
|
|||
<div class="col-12">
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Contact {{ contact.identifier }} <span class="status status-green">{{ contactStatus.status }}</span>{% if contactLinked is not null %} <span class="status status-info">linked</span>{% endif %}</h3>
|
||||
<h3 class="card-title">{{ __('Contact') }} {{ contact.identifier }} <span class="status status-green">{{ contactStatus.status }}</span>{% if contactLinked is not null %} <span class="status status-info">{{ __('linked') }}</span>{% endif %}</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Email</div>
|
||||
<div class="datagrid-content">{{ contact.email }} {% if contact.disclose_email == '1' %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>{% else %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>{% endif %}</div>
|
||||
<div class="datagrid-title">{{ __('Email') }}</div>
|
||||
<div class="datagrid-content">{{ contact.email }} {% if contact.disclose_email == '1' %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>{% else %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Phone</div>
|
||||
<div class="datagrid-content">{{ contact.voice }} {% if contact.disclose_voice == '1' %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>{% else %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>{% endif %}</div>
|
||||
<div class="datagrid-title">{{ __('Phone') }}</div>
|
||||
<div class="datagrid-content">{{ contact.voice }} {% if contact.disclose_voice == '1' %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>{% else %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Creation Date</div>
|
||||
<div class="datagrid-title">{{ __('Creation Date') }}</div>
|
||||
<div class="datagrid-content">{{ contact.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrars.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -53,10 +53,10 @@
|
|||
<div class="card-header">
|
||||
<ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
|
||||
<li class="nav-item">
|
||||
<a href="#tabs-int" class="nav-link active" data-bs-toggle="tab">International</a>
|
||||
<a href="#tabs-int" class="nav-link active" data-bs-toggle="tab">{{ __('International') }}</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tabs-loc" class="nav-link" data-bs-toggle="tab">Localized</a>
|
||||
<a href="#tabs-loc" class="nav-link" data-bs-toggle="tab">{{ __('Localized') }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -69,70 +69,70 @@
|
|||
{% if postal.type == 'int' %}
|
||||
{% set intExists = true %}
|
||||
<div class="tab-pane active show" id="tabs-int">
|
||||
<h4>International Contact Details</h4>
|
||||
<h4>{{ __('International Contact Details') }}</h4>
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Name</div>
|
||||
<div class="datagrid-title">{{ __('Name') }}</div>
|
||||
<div class="datagrid-content">{{ postal.name }} {% if postal.disclose_name_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Organization</div>
|
||||
<div class="datagrid-title">{{ __('Organization') }}</div>
|
||||
<div class="datagrid-content">{{ postal.org }} {% if postal.disclose_org_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Street 1</div>
|
||||
<div class="datagrid-title">{{ __('Street') }} 1</div>
|
||||
<div class="datagrid-content">{{ postal.street1 }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Street 2</div>
|
||||
<div class="datagrid-title">{{ __('Street') }} 2</div>
|
||||
<div class="datagrid-content">{{ postal.street2 }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">City</div>
|
||||
<div class="datagrid-title">{{ __('City') }}</div>
|
||||
<div class="datagrid-content">{{ postal.city }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">State/Province</div>
|
||||
<div class="datagrid-title">{{ __('State/Province') }}</div>
|
||||
<div class="datagrid-content">{{ postal.sp }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Postal Code</div>
|
||||
<div class="datagrid-title">{{ __('Postal Code') }}</div>
|
||||
<div class="datagrid-content">{{ postal.pc }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Country</div>
|
||||
<div class="datagrid-title">{{ __('Country') }}</div>
|
||||
<div class="datagrid-content">{{ postal.cc }} {% if postal.disclose_addr_int == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -146,70 +146,70 @@
|
|||
{% for postal in contactPostal %}
|
||||
{% if postal.type == 'loc' %}
|
||||
<div class="tab-pane" id="tabs-loc">
|
||||
<h4>Localized Contact Details</h4>
|
||||
<h4>{{ __('Localized Contact Details') }}</h4>
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Name</div>
|
||||
<div class="datagrid-title">{{ __('Name') }}</div>
|
||||
<div class="datagrid-content">{{ postal.name }} {% if postal.disclose_name_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Organization</div>
|
||||
<div class="datagrid-title">{{ __('Organization') }}</div>
|
||||
<div class="datagrid-content">{{ postal.org }} {% if postal.disclose_org_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Street 1</div>
|
||||
<div class="datagrid-title">{{ __('Street') }} 1</div>
|
||||
<div class="datagrid-content">{{ postal.street1 }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Street 2</div>
|
||||
<div class="datagrid-title">{{ __('Street') }} 2</div>
|
||||
<div class="datagrid-content">{{ postal.street2 }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">City</div>
|
||||
<div class="datagrid-title">{{ __('City') }}</div>
|
||||
<div class="datagrid-content">{{ postal.city }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">State/Province</div>
|
||||
<div class="datagrid-title">{{ __('State/Province') }}</div>
|
||||
<div class="datagrid-content">{{ postal.sp }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Postal Code</div>
|
||||
<div class="datagrid-title">{{ __('Postal Code') }}</div>
|
||||
<div class="datagrid-content">{{ postal.pc }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Country</div>
|
||||
<div class="datagrid-title">{{ __('Country') }}</div>
|
||||
<div class="datagrid-content">{{ postal.cc }} {% if postal.disclose_addr_loc == '1' %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Visible in Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-green" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Visible in Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /><path d="M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" /></svg>
|
||||
{% else %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>Hidden from Public</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon text-orange" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><title>{{ __('Hidden from Public') }}</title><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10.585 10.587a2 2 0 0 0 2.829 2.828" /><path d="M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" /><path d="M3 3l18 18" /></svg>
|
||||
{% endif %}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -218,8 +218,8 @@
|
|||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="tab-pane" id="tabs-loc">
|
||||
<h4>Localized Contact Details</h4>
|
||||
<div>No Localized Contact Information Available</div>
|
||||
<h4>{{ __('Localized Contact Details') }}</h4>
|
||||
<div>{{ __('No Localized Contact Information Available') }}</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
@ -229,18 +229,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -170,18 +170,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Check Domain') }}
|
||||
|
@ -35,12 +35,12 @@
|
|||
<button type="submit" class="btn btn-primary">{{ __('Check Availability') }}</button>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<input type="text" class="form-control" placeholder="Allocation token" name="token" autocapitalize="none">
|
||||
<input type="text" class="form-control" placeholder="{{ __('Allocation token') }}" name="token" autocapitalize="none">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="claims">
|
||||
<span class="form-check-label">Check claims</span>
|
||||
<span class="form-check-label">{{ __('Check claims') }}</span>
|
||||
</label>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -49,18 +49,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Create Application') }}
|
||||
|
@ -24,31 +24,7 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if domainName is defined and crdate 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Application') }} <strong>{{ domainName }}</strong> {{ __('has been created successfully on') }} <strong>{{ crdate|date("Y-m-d H:i:s") }}!</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Application') }} <strong>{{ domainName }}</strong> {{ __('can not be created') }}: <strong>{{ error }}</strong>
|
||||
</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">
|
||||
<form id="domainCreateForm" action="/application/create" method="post">
|
||||
|
@ -59,7 +35,7 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="phaseType" class="form-label required">Phase Type</label>
|
||||
<label for="phaseType" class="form-label required">{{ __('Phase Type') }}</label>
|
||||
<select class="form-select" id="phaseType" name="phaseType" required>
|
||||
<option value="sunrise">Sunrise</option>
|
||||
<option value="landrush">Landrush</option>
|
||||
|
@ -70,14 +46,14 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="phaseName" class="form-label">Phase Name</label>
|
||||
<label for="phaseName" class="form-label">{{ __('Phase Name') }}</label>
|
||||
<input type="text" class="form-control" id="phaseName" name="phaseName" placeholder="Enter phase name">
|
||||
<small class="form-hint">The "Phase name" field is required only if the "Type" is set to "Custom".</small>
|
||||
</div>
|
||||
|
||||
{% if registrars and not registrar %}
|
||||
<div class="form-group mb-3">
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}:</label>
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}</label>
|
||||
<select id="registrarDropdown" name="registrar" class="form-control">
|
||||
{% for registrar in registrars %}
|
||||
<option value="{{ registrar.id }}">{{ registrar.name }}</option>
|
||||
|
@ -131,8 +107,8 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Signed Mark Information</label>
|
||||
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="Paste SMD contents…"></textarea>
|
||||
<label class="form-label">{{ __('Signed Mark Information') }}</label>
|
||||
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="{{ __('Paste SMD contents') }}…"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
|
@ -163,19 +139,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Create Domain') }}
|
||||
|
@ -25,31 +25,6 @@
|
|||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% include 'partials/flash.twig' %}
|
||||
{% if domainName is defined and crdate 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Domain') }} <strong>{{ domainName }}</strong> {{ __('has been created successfully on') }} <strong>{{ crdate|date("Y-m-d H:i:s") }}!</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Domain') }} <strong>{{ domainName }}</strong> {{ __('can not be created') }}: <strong>{{ error }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form id="domainCreateForm" action="/domain/create" method="post">
|
||||
|
@ -61,7 +36,7 @@
|
|||
|
||||
{% if registrars and not registrar %}
|
||||
<div class="form-group mb-3">
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}:</label>
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Select Registrar') }}</label>
|
||||
<select id="registrarDropdown" name="registrar" class="form-control">
|
||||
{% for registrar in registrars %}
|
||||
<option value="{{ registrar.id }}">{{ registrar.name }}</option>
|
||||
|
@ -79,7 +54,7 @@
|
|||
|
||||
<!-- Placeholder for displaying domain price -->
|
||||
<div class="mb-3" id="domainPriceDisplay" style="display:none;">
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">$0.00</span>
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">{{ currency }} 0.00</span>
|
||||
</div>
|
||||
|
||||
<!-- Fields for 4 contacts with roles -->
|
||||
|
@ -222,7 +197,7 @@
|
|||
|
||||
{% if launch_phases == 'on' %}
|
||||
<div class="mb-3">
|
||||
<label for="phaseType" class="form-label">Phase Type</label>
|
||||
<label for="phaseType" class="form-label">{{ __('Phase Type') }}</label>
|
||||
<select class="form-select" id="phaseType" name="phaseType">
|
||||
<option value="none">N/A</option>
|
||||
<option value="sunrise">Sunrise</option>
|
||||
|
@ -234,8 +209,8 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Signed Mark Information</label>
|
||||
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="Paste SMD contents…"></textarea>
|
||||
<label class="form-label">{{ __('Signed Mark Information') }}</label>
|
||||
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="{{ __('Paste SMD contents') }}…"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
|
@ -256,7 +231,7 @@
|
|||
|
||||
<div class="mb-3">
|
||||
<label for="token" class="form-label">{{ __('Allocation Token') }}</label>
|
||||
<input type="text" class="form-control" placeholder="Allocation token" name="token" autocapitalize="none">
|
||||
<input type="text" class="form-control" placeholder="{{ __('Allocation token') }}" name="token" autocapitalize="none">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -272,19 +247,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
@ -455,9 +418,9 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
function formatPrice(price) {
|
||||
switch(window.currencyPosition) {
|
||||
case 'before':
|
||||
return `${window.currencySymbol}${price.toFixed(2)}`;
|
||||
return `{{ currency }} ${price.toFixed(2)}`;
|
||||
case 'after':
|
||||
return `${price.toFixed(2)} ${window.currencySymbol}`;
|
||||
return `${price.toFixed(2)} {{ currency }}`;
|
||||
default:
|
||||
return price.toFixed(2);
|
||||
}
|
||||
|
|
|
@ -47,9 +47,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()" title="Export page"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search applications" autocapitalize="none">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search applications') }}" autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,18 +61,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -52,9 +52,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()" title="Export page"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search domains" autocapitalize="none">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search domains') }}" autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -66,18 +66,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -47,9 +47,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search transfers">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search transfers') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,18 +61,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -44,12 +44,12 @@
|
|||
|
||||
<!-- Placeholder for displaying domain price -->
|
||||
<div class="mb-3" id="domainPriceDisplay" style="display:none;">
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">$0.00</span>
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">{{ currency }} 0.00</span>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="mb-3">
|
||||
<label for="renewalYears" class="form-label">{{ 'Renewal Years' }}</label>
|
||||
<div class="form-control-plaintext">Your domain is currently renewed to its maximum term. At this time, no additional renewal is possible.</div>
|
||||
<div class="form-control-plaintext">{{ __('Your domain is currently renewed to its maximum term. At this time, no additional renewal is possible.') }}</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -67,19 +67,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
@ -170,9 +158,9 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
function formatPrice(price) {
|
||||
switch(window.currencyPosition) {
|
||||
case 'before':
|
||||
return `${window.currencySymbol}${price.toFixed(2)}`;
|
||||
return `{{ currency }} ${price.toFixed(2)}`;
|
||||
case 'after':
|
||||
return `${price.toFixed(2)} ${window.currencySymbol}`;
|
||||
return `${price.toFixed(2)} {{ currency }}`;
|
||||
default:
|
||||
return price.toFixed(2);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
{% if registrars and not registrar %}
|
||||
<div class="form-group mb-3">
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Gaining Registrar') }}:</label>
|
||||
<label for="registrarDropdown" class="form-label required">{{ __('Gaining Registrar') }}</label>
|
||||
<select id="registrarDropdown" name="registrar" class="form-control">
|
||||
{% for registrar in registrars %}
|
||||
<option value="{{ registrar.id }}">{{ registrar.name }}</option>
|
||||
|
@ -60,12 +60,12 @@
|
|||
|
||||
<!-- Placeholder for displaying domain price -->
|
||||
<div class="mb-3" id="domainPriceDisplay" style="display:none;">
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">$0.00</span>
|
||||
<strong>{{ __('Estimated Price') }}: </strong><span id="domainPrice">{{ currency }} 0.00</span>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="token" class="form-label">{{ __('Allocation Token') }}</label>
|
||||
<input type="text" class="form-control" placeholder="Allocation token" name="token" autocapitalize="none">
|
||||
<input type="text" class="form-control" placeholder="{{ __('Allocation token') }}" name="token" autocapitalize="none">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -81,19 +81,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
@ -180,9 +168,9 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
function formatPrice(price) {
|
||||
switch(window.currencyPosition) {
|
||||
case 'before':
|
||||
return `${window.currencySymbol}${price.toFixed(2)}`;
|
||||
return `{{ currency }} ${price.toFixed(2)}`;
|
||||
case 'after':
|
||||
return `${price.toFixed(2)} ${window.currencySymbol}`;
|
||||
return `${price.toFixed(2)} {{ currency }}`;
|
||||
default:
|
||||
return price.toFixed(2);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
Domain {{ domain.name }} <input type="hidden" name="domainName" value="{{ domain.name }}">
|
||||
{{ __('Domain') }} {{ domain.name }} <input type="hidden" name="domainName" value="{{ domain.name }}">
|
||||
{% if domainStatus %}
|
||||
{% if domainStatus is iterable %}
|
||||
{% for status in domainStatus %}
|
||||
|
@ -50,23 +50,23 @@
|
|||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Created On</div>
|
||||
<div class="datagrid-title">{{ __('Created On') }}</div>
|
||||
<div class="datagrid-content">{{ domain.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Launch Phase</div>
|
||||
<div class="datagrid-title">{{ __('Launch Phase') }}</div>
|
||||
<div class="datagrid-content">{{ domain.phase_type|capitalize }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Phase Name</div>
|
||||
<div class="datagrid-title">{{ __('Phase Name') }}</div>
|
||||
<div class="datagrid-content">{{ domain.phase_name|default('N/A') }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.name }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Application ID</div>
|
||||
<div class="datagrid-title">{{ __('Application ID') }}</div>
|
||||
<div class="datagrid-content">{{ domain.application_id }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -103,19 +103,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
var csrfTokenName = "{{ csrfTokenName }}";
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
Domain {{ domain.name }} <input type="hidden" name="domainName" value="{{ domain.name }}">
|
||||
{{ __('Domain') }} {{ domain.name }} <input type="hidden" name="domainName" value="{{ domain.name }}">
|
||||
{% if domainStatus.status or domain.rgpstatus %}
|
||||
{% if domainStatus is iterable %}
|
||||
{% for status in domainStatus %}
|
||||
|
@ -52,19 +52,19 @@
|
|||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registered On</div>
|
||||
<div class="datagrid-title">{{ __('Registered On') }}</div>
|
||||
<div class="datagrid-content">{{ domain.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Last Updated</div>
|
||||
<div class="datagrid-title">{{ __('Last Updated') }}</div>
|
||||
<div class="datagrid-content">{{ domain.lastupdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Expiration Date</div>
|
||||
<div class="datagrid-title">{{ __('Expiration Date') }}</div>
|
||||
<div class="datagrid-content">{{ domain.exdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -299,19 +299,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
var csrfTokenName = "{{ csrfTokenName }}";
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
Application for {{ domain.name }}
|
||||
{{ __('Application for') }} {{ domain.name }}
|
||||
{% if domainStatus %}
|
||||
{% if domainStatus is iterable %}
|
||||
{% for status in domainStatus %}
|
||||
|
@ -46,37 +46,37 @@
|
|||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Created On</div>
|
||||
<div class="datagrid-title">{{ __('Created On') }}</div>
|
||||
<div class="datagrid-content">{{ domain.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Application ID</div>
|
||||
<div class="datagrid-title">{{ __('Application ID') }}</div>
|
||||
<div class="datagrid-content">{{ domain.application_id }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Launch Phase</div>
|
||||
<div class="datagrid-title">{{ __('Launch Phase') }}</div>
|
||||
<div class="datagrid-content">{{ domain.phase_type|capitalize }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Phase Name</div>
|
||||
<div class="datagrid-title">{{ __('Phase Name') }}</div>
|
||||
<div class="datagrid-content">{{ domain.phase_name|default('N/A') }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrars.name }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrant</div>
|
||||
<div class="datagrid-title">{{ __('Registrant') }}</div>
|
||||
<div class="datagrid-content">{{ domainRegistrant.identifier }}</div>
|
||||
</div>
|
||||
{% for contact in domainContacts %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">{{ contact.type }} contact</div>
|
||||
<div class="datagrid-title">{{ contact.type }} {{ __('contact') }}</div>
|
||||
<div class="datagrid-content">{{ contact.identifier }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Auth Type</div>
|
||||
<div class="datagrid-title">{{ __('Auth Type') }}</div>
|
||||
<div class="datagrid-content">
|
||||
{% if domain.authtype == 'pw' %}
|
||||
Regular
|
||||
|
@ -88,7 +88,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Auth Info</div>
|
||||
<div class="datagrid-title">{{ __('Auth Info') }}</div>
|
||||
<div class="datagrid-content blur" id="authInfo" onclick="toggleBlur()">
|
||||
{{ domain.authinfo }}
|
||||
</div>
|
||||
|
@ -101,11 +101,11 @@
|
|||
<div class="col-md-12">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Nameservers</h5>
|
||||
<h5 class="card-title">{{ __('Nameservers') }}</h5>
|
||||
<div class="datagrid">
|
||||
{% for host in domainHosts %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Nameserver {{ loop.index }}</div>
|
||||
<div class="datagrid-title">{{ __('Nameserver') }} {{ loop.index }}</div>
|
||||
<div class="datagrid-content">
|
||||
{{ host.name }}
|
||||
</div>
|
||||
|
@ -118,19 +118,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<style>
|
||||
.blur {
|
||||
|
@ -139,7 +127,7 @@
|
|||
}
|
||||
|
||||
.blur:hover {
|
||||
filter: blur(2px); /* Slightly clearer on hover for a hint to the user */
|
||||
filter: blur(2px);
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
Domain {{ domain.name }}
|
||||
{{ __('Domain') }} {{ domain.name }}
|
||||
{% if domainStatus.status or domain.rgpstatus %}
|
||||
{% if domainStatus is iterable %}
|
||||
{% for status in domainStatus %}
|
||||
|
@ -49,33 +49,33 @@
|
|||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registered On</div>
|
||||
<div class="datagrid-title">{{ __('Registered On') }}</div>
|
||||
<div class="datagrid-content">{{ domain.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Last Updated</div>
|
||||
<div class="datagrid-title">{{ __('Last Updated') }}</div>
|
||||
<div class="datagrid-content">{{ domain.lastupdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Expiration Date</div>
|
||||
<div class="datagrid-title">{{ __('Expiration Date') }}</div>
|
||||
<div class="datagrid-content">{{ domain.exdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrars.name }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrant</div>
|
||||
<div class="datagrid-title">{{ __('Registrant') }}</div>
|
||||
<div class="datagrid-content">{{ domainRegistrant.identifier }}</div>
|
||||
</div>
|
||||
{% for contact in domainContacts %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">{{ contact.type }} contact</div>
|
||||
<div class="datagrid-title">{{ contact.type }} {{ __('contact') }}</div>
|
||||
<div class="datagrid-content">{{ contact.identifier }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Auth Type</div>
|
||||
<div class="datagrid-title">{{ __('Auth Type') }}</div>
|
||||
<div class="datagrid-content">
|
||||
{% if domainAuth.authtype == 'pw' %}
|
||||
Regular
|
||||
|
@ -87,7 +87,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Auth Info</div>
|
||||
<div class="datagrid-title">{{ __('Auth Info') }}</div>
|
||||
<div class="datagrid-content blur" id="authInfo" onclick="toggleBlur()">
|
||||
{{ domainAuth.authinfo }}
|
||||
</div>
|
||||
|
@ -100,11 +100,11 @@
|
|||
<div class="col-md-12">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Nameservers</h5>
|
||||
<h5 class="card-title">{{ __('Nameservers') }}</h5>
|
||||
<div class="datagrid">
|
||||
{% for host in domainHosts %}
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Nameserver {{ loop.index }}</div>
|
||||
<div class="datagrid-title">{{ __('Nameserver') }} {{ loop.index }}</div>
|
||||
<div class="datagrid-content">
|
||||
{{ host.name }}
|
||||
</div>
|
||||
|
@ -181,19 +181,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<style>
|
||||
.blur {
|
||||
|
@ -202,7 +190,7 @@
|
|||
}
|
||||
|
||||
.blur:hover {
|
||||
filter: blur(2px); /* Slightly clearer on hover for a hint to the user */
|
||||
filter: blur(2px);
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
|
|
|
@ -26,26 +26,14 @@
|
|||
<div class="col-12">
|
||||
<div class="card bg-orange-lt">
|
||||
<div class="card-body">
|
||||
<p class="text-secondary">We've noticed that your deposit payment process was not completed. It appears that the payment was either cancelled or failed during the transaction. If this was an error, or if you have any questions, please don't hesitate to contact us. We're here to help ensure your transaction is smooth and secure.</p>
|
||||
<p class="text-secondary">Ready to try again? When you're set to proceed with your deposit, simply return to the <a href="{{route('deposit')}}">Deposit Page</a> to initiate a new payment. We value your partnership and are committed to assisting you every step of the way.</p>
|
||||
<p class="text-secondary">{{ __('We\'ve noticed that your deposit payment process was not completed. It appears that the payment was either cancelled or failed during the transaction. If this was an error, or if you have any questions, please don\'t hesitate to contact us. We're here to help ensure your transaction is smooth and secure.') }}</p>
|
||||
<p class="text-secondary">{{ __('Ready to try again? When you\'re set to proceed with your deposit, simply return to the') }} <a href="{{route('deposit')}}">{{ __('Deposit Page') }}</a> {{ __('to initiate a new payment. We value your partnership and are committed to assisting you every step of the way.') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -24,54 +24,30 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if deposit 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Deposit successfully added. The registrar\'s account balance has been updated.') }}
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Unable to process the deposit due to a system error. Please retry or contact support for help') }}: <strong>{{ error }}</strong>
|
||||
</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">
|
||||
<form id="depositForm" action="/deposit" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<div class="deposit-info">
|
||||
<h5>Current Balance for {{ balance.name }}</h5>
|
||||
<p class="fs-4">${{ balance.accountBalance }}</p>
|
||||
<h5>{{ __('Current Balance for') }} {{ balance.name }}</h5>
|
||||
<p class="fs-4">{{ currency }} {{ balance.accountBalance }}</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="amount" class="form-label">Amount</label>
|
||||
<input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="Enter deposit amount" required>
|
||||
<label for="amount" class="form-label">{{ __('Amount') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="{{ __('Enter deposit amount') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="description" class="form-label">Description</label>
|
||||
<textarea class="form-control" id="description" name="description" rows="3" placeholder="Optional deposit description"></textarea>
|
||||
<label for="description" class="form-label">{{ __('Description') }}</label>
|
||||
<textarea class="form-control" id="description" name="description" rows="3" placeholder="{{ __('Optional deposit description') }}"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-stripe" 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="M11.453 8.056c0 -.623 .518 -.979 1.442 -.979c1.69 0 3.41 .343 4.605 .923l.5 -4c-.948 -.449 -2.82 -1 -5.5 -1c-1.895 0 -3.373 .087 -4.5 1c-1.172 .956 -2 2.33 -2 4c0 3.03 1.958 4.906 5 6c1.961 .69 3 .743 3 1.5c0 .735 -.851 1.5 -2 1.5c-1.423 0 -3.963 -.609 -5.5 -1.5l-.5 4c1.321 .734 3.474 1.5 6 1.5c2 0 3.957 -.468 5.084 -1.36c1.263 -.979 1.916 -2.268 1.916 -4.14c0 -3.096 -1.915 -4.547 -5 -5.637c-1.646 -.605 -2.544 -1.07 -2.544 -1.807z" /></svg> Deposit with Stripe</button>
|
||||
<button type="submit" class="btn btn-primary"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-stripe" 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="M11.453 8.056c0 -.623 .518 -.979 1.442 -.979c1.69 0 3.41 .343 4.605 .923l.5 -4c-.948 -.449 -2.82 -1 -5.5 -1c-1.895 0 -3.373 .087 -4.5 1c-1.172 .956 -2 2.33 -2 4c0 3.03 1.958 4.906 5 6c1.961 .69 3 .743 3 1.5c0 .735 -.851 1.5 -2 1.5c-1.423 0 -3.963 -.609 -5.5 -1.5l-.5 4c1.321 .734 3.474 1.5 6 1.5c2 0 3.957 -.468 5.084 -1.36c1.263 -.979 1.916 -2.268 1.916 -4.14c0 -3.096 -1.915 -4.547 -5 -5.637c-1.646 -.605 -2.544 -1.07 -2.544 -1.807z" /></svg> {{ __('Deposit with Stripe') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -81,23 +57,11 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<script type="text/javascript">
|
||||
var stripe = Stripe('YOUR_PUBLISHABLE_KEY'); // Replace with your publishable key
|
||||
var stripe = Stripe('{{ stripe_key }}');
|
||||
|
||||
document.getElementById('depositForm').addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
|
|
|
@ -24,39 +24,15 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if deposit 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Deposit successfully added. The registrar\'s account balance has been updated.') }}
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Unable to process the deposit due to a system error. Please retry or contact support for help') }}: <strong>{{ error }}</strong>
|
||||
</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">
|
||||
<form id="depositForm" action="/deposit" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<div class="mb-3">
|
||||
<label for="registrarSelect" class="form-label">Registrar</label>
|
||||
<label for="registrarSelect" class="form-label">{{ __('Registrar') }}</label>
|
||||
<select class="form-select" id="registrarSelect" name="registrar" required>
|
||||
<option selected disabled value="">Choose Registrar...</option>
|
||||
<option selected disabled value="">{{ __('Choose Registrar...') }}</option>
|
||||
{% for registrar in registrars %}
|
||||
<option value="{{ registrar.id }}">{{ registrar.name }}</option>
|
||||
{% endfor %}
|
||||
|
@ -64,24 +40,24 @@
|
|||
</div>
|
||||
|
||||
<div class="deposit-info">
|
||||
<h5>Current Balance for <span id="registrarName"></span></h5>
|
||||
<p class="fs-4">$<span id="currentFunds">0.00</span></p>
|
||||
<h5>{{ __('Current Balance for') }} <span id="registrarName"></span></h5>
|
||||
<p class="fs-4">{{ currency }} <span id="currentFunds">0.00</span></p>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="amount" class="form-label">Amount</label>
|
||||
<input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="Enter deposit amount" required>
|
||||
<label for="amount" class="form-label">{{ __('Amount') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="{{ __('Enter deposit amount') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="description" class="form-label">Description</label>
|
||||
<textarea class="form-control" id="description" name="description" rows="3" placeholder="Optional deposit description"></textarea>
|
||||
<label for="description" class="form-label">{{ __('Description') }}</label>
|
||||
<textarea class="form-control" id="description" name="description" rows="3" placeholder="{{ __('Optional deposit description') }}"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Add Deposit</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Add Deposit') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -113,18 +89,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -35,9 +35,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search invoices">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search invoices') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -49,18 +49,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search account">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search account') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search transactions">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search transactions') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -10,15 +10,14 @@
|
|||
<div class="row g-2 align-items-center">
|
||||
<div class="col">
|
||||
<h2 class="page-title">
|
||||
Invoice {{ invoice_details.invoice_number }}
|
||||
{{ __('Invoice') }} {{ invoice_details.invoice_number }}
|
||||
</h2>
|
||||
</div>
|
||||
<!-- Page title actions -->
|
||||
<div class="col-auto ms-auto d-print-none">
|
||||
<button type="button" class="btn btn-primary" onclick="javascript:window.print();">
|
||||
<!-- Download SVG icon from http://tabler-icons.io/i/printer -->
|
||||
<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="M17 17h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-14a2 2 0 0 0 -2 2v4a2 2 0 0 0 2 2h2" /><path d="M17 9v-4a2 2 0 0 0 -2 -2h-6a2 2 0 0 0 -2 2v4" /><path d="M7 13m0 2a2 2 0 0 1 2 -2h6a2 2 0 0 1 2 2v4a2 2 0 0 1 -2 2h-6a2 2 0 0 1 -2 -2z" /></svg>
|
||||
Print Invoice
|
||||
{{ __('Print Invoice') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -31,7 +30,7 @@
|
|||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<p class="h3">Provider / Registry</p>
|
||||
<p class="h3">{{ __('Provider') }} / {{ __('Registry') }}</p>
|
||||
<address>
|
||||
{{ company_name }}<br>
|
||||
{{ vat_number }}<br>
|
||||
|
@ -42,7 +41,7 @@
|
|||
</address>
|
||||
</div>
|
||||
<div class="col-6 text-end">
|
||||
<p class="h3">Client / Registrar</p>
|
||||
<p class="h3">{{ __('Client') }} / {{ __('Registrar') }}</p>
|
||||
<address>
|
||||
{{ billing.org }}<br>
|
||||
{{ billing_vat }} {% if validVAT %}<svg xmlns="http://www.w3.org/2000/svg" class="icon text-success" 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="M5 12l5 5l10 -10" /></svg>{% endif %}<br>
|
||||
|
@ -53,13 +52,13 @@
|
|||
</address>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<p class="h3">Invoice Issued On: {{ invoice_details.issue_date|date("Y-m-d") }}</p>
|
||||
<p class="h3">{{ __('Invoice Issued On') }}: {{ invoice_details.issue_date|date("Y-m-d") }}</p>
|
||||
</div>
|
||||
<div class="col-6 text-end">
|
||||
<p class="h3">Due Date: {{ invoice_details.due_date|date("Y-m-d") }}</p>
|
||||
<p class="h3">{{ __('Due Date') }}: {{ invoice_details.due_date|date("Y-m-d") }}</p>
|
||||
</div>
|
||||
<div class="col-12 my-5">
|
||||
<h1>Invoice {{ invoice_details.invoice_number }} {% set status = invoice_details.payment_status %}
|
||||
<h1>{{ __('Invoice') }} {{ invoice_details.invoice_number }} {% set status = invoice_details.payment_status %}
|
||||
<span class="badge
|
||||
{% if status == 'unpaid' %}bg-red text-red-fg
|
||||
{% elseif status == 'paid' %}bg-green text-green-fg
|
||||
|
@ -76,8 +75,8 @@
|
|||
<thead>
|
||||
<tr>
|
||||
<th class="text-center" style="width: 1%"></th>
|
||||
<th>Product</th>
|
||||
<th class="text-end" style="width: 1%">Amount</th>
|
||||
<th>{{ __('Product') }}</th>
|
||||
<th class="text-end" style="width: 1%">{{ __('Amount') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% if statement is not empty %}
|
||||
|
@ -94,45 +93,32 @@
|
|||
{% endfor %}
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="2" class="text-center">No items found.</td>
|
||||
<td colspan="2" class="text-center">{{ __('No items found.') }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td colspan="2" class="strong text-end">Subtotal</td>
|
||||
<td colspan="2" class="strong text-end">{{ __('Subtotal') }}</td>
|
||||
<td class="text-end">{{ netPrice }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="strong text-end">Vat Rate</td>
|
||||
<td colspan="2" class="strong text-end">{{ __('Vat Rate') }}</td>
|
||||
<td class="text-end">{{ vatRate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="strong text-end">Vat Due</td>
|
||||
<td colspan="2" class="strong text-end">{{ __('Vat Due') }}</td>
|
||||
<td class="text-end">{{ vatAmount }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="font-weight-bold text-uppercase text-end">Total Due</td>
|
||||
<td colspan="2" class="font-weight-bold text-uppercase text-end">{{ __('Total Due') }}</td>
|
||||
<td class="font-weight-bold text-end">{{ total }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="text-secondary text-center mt-5">Notes: {{ invoice_details.notes }}</p>
|
||||
<p class="text-secondary text-center mt-5">Thank you very much for doing business with us. We look forward to working with
|
||||
you again!</p>
|
||||
<p class="text-secondary text-center mt-5">{{ __('Notes') }}: {{ invoice_details.notes }}</p>
|
||||
<p class="text-secondary text-center mt-5">{{ __('Thank you very much for doing business with us. We look forward to working with you again!') }}</p>
|
||||
</div>
|
||||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Create Host') }}
|
||||
|
@ -24,31 +24,7 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if hostName is defined and crdate 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Host') }} <strong>{{ hostName }}</strong> {{ __('has been created successfully on') }} <strong>{{ crdate|date("Y-m-d H:i:s") }}!</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Host') }} <strong>{{ hostName }}</strong> {{ __('is not available') }}: <strong>{{ error }}</strong>
|
||||
</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">
|
||||
<form action="/host/create" method="post">
|
||||
|
@ -84,7 +60,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create Host</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Create Host') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -93,18 +69,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -47,9 +47,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search hosts" autocapitalize="none">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search hosts') }}" autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,18 +61,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Update Host') }} {{ host.name }}
|
||||
|
@ -44,7 +44,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Host</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Host') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -53,18 +53,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Update Host') }} {{ host.name }}
|
||||
|
@ -27,24 +27,12 @@
|
|||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="alert alert-important alert-info" role="alert">
|
||||
The host you're trying to update, <strong>{{ host.name }}</strong>, is external to the registry. Consequently, it does not store any IP addresses within our system, and therefore, does not require any updates from your end. This means there are no associated IP addresses under our management that need your attention.
|
||||
{{ __('The host you\'re trying to update') }}, <strong>{{ host.name }}</strong>, {{ __('is external to the registry. Consequently, it does not store any IP addresses within our system, and therefore, does not require any updates from your end. This means there are no associated IP addresses under our management that need your attention.') }}
|
||||
</div>
|
||||
</div>
|
||||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -26,7 +26,7 @@
|
|||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">{{ host.name }} <span class="status status-green">{{ hostStatus.status }}</span>{% if hostLinked is not null %} <span class="status status-info">linked</span>{% endif %}</h3>
|
||||
<h3 class="card-title">{{ host.name }} <span class="status status-green">{{ hostStatus.status }}</span>{% if hostLinked is not null %} <span class="status status-info">{{ __('linked') }}</span>{% endif %}</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
|
@ -55,11 +55,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Creation Date</div>
|
||||
<div class="datagrid-title">{{ __('Creation Date') }}</div>
|
||||
<div class="datagrid-content">{{ host.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Registrar</div>
|
||||
<div class="datagrid-title">{{ __('Registrar') }}</div>
|
||||
<div class="datagrid-content">{{ registrars.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -68,18 +68,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search logs">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search logs') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search logs">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search logs') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search queue">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search queue') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -28,7 +28,7 @@
|
|||
<div class="card-header">
|
||||
<ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
|
||||
<li class="nav-item">
|
||||
<a href="#tabs-details" class="nav-link active" data-bs-toggle="tab">Details</a>
|
||||
<a href="#tabs-details" class="nav-link active" data-bs-toggle="tab">{{ __('Details') }}</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tabs-2fa" class="nav-link" data-bs-toggle="tab">2FA</a>
|
||||
|
@ -36,6 +36,9 @@
|
|||
<li class="nav-item">
|
||||
<a href="#tabs-webauthn" class="nav-link" data-bs-toggle="tab">WebAuthn</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#tabs-log" class="nav-link" data-bs-toggle="tab">{{ __('Log') }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
@ -96,35 +99,35 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="tabs-2fa">
|
||||
<h4 class="card-title">Two-Factor Authentication (2FA)</h4>
|
||||
<h4 class="card-title">{{ __('Two-Factor Authentication') }} (2FA)</h4>
|
||||
<div class="card">
|
||||
{% if secret is defined %}
|
||||
<form action="{{route('activate2fa')}}" name="2fa" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<div class="card-body">
|
||||
<p>Set up 2FA for additional security. Scan the QR code with your authentication app and enter the provided code below to verify.</p>
|
||||
<p>{{ __('Set up 2FA for additional security. Scan the QR code with your authentication app and enter the provided code below to verify.') }}</p>
|
||||
<!-- QR Code -->
|
||||
<div class="mb-3">
|
||||
<img src="{{ qrcodeDataUri }}" alt="2FA QR Code" class="img-fluid">
|
||||
</div>
|
||||
<!-- Secret for Manual Entry -->
|
||||
<div class="mb-3">
|
||||
<p class="font-weight-bold">Manual Entry Secret</p>
|
||||
<p class="font-weight-bold">{{ __('Manual Entry Secret') }}</p>
|
||||
<code>{{ secret|split(4)|join(' ') }}</code>
|
||||
<small class="form-text text-muted">
|
||||
If you're unable to scan the QR code, enter this secret manually into your authentication app. The secret is case-sensitive and should be entered exactly as shown.
|
||||
{{ __('If you\'re unable to scan the QR code, enter this secret manually into your authentication app. The secret is case-sensitive and should be entered exactly as shown.') }}
|
||||
</small>
|
||||
</div>
|
||||
<!-- Verification Code Input -->
|
||||
<div class="mb-3">
|
||||
<label for="verificationCode" class="form-label required">Verification Code</label>
|
||||
<input type="number" class="form-control" id="verificationCode" name="verificationCode" placeholder="Enter code" required="required">
|
||||
<label for="verificationCode" class="form-label required">{{ __('Verification Code') }}</label>
|
||||
<input type="number" class="form-control" id="verificationCode" name="verificationCode" placeholder="{{ __('Enter code') }}" required="required">
|
||||
<small class="form-text text-muted">
|
||||
Enter the code generated by your authentication app. This code verifies that your 2FA setup is working correctly. Once entered, click 'Save 2FA Settings' to activate two-factor authentication for your account.
|
||||
{{ __('Enter the code generated by your authentication app. This code verifies that your 2FA setup is working correctly. Once entered, click') }} {{ __('Save 2FA Settings') }} {{ __('to activate two-factor authentication for your account.') }}
|
||||
</small>
|
||||
</div>
|
||||
<!-- Save Button -->
|
||||
<button type="submit" class="btn btn-primary">Save 2FA Settings</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Save 2FA Settings') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
{% else %}
|
||||
|
@ -132,8 +135,8 @@
|
|||
<div class="d-flex align-items-center">
|
||||
<span class="badge bg-green text-green-fg me-3"><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="M12 3a12 12 0 0 0 8.5 3a12 12 0 0 1 -8.5 15a12 12 0 0 1 -8.5 -15a12 12 0 0 0 8.5 -3" /><path d="M12 11m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" /><path d="M12 12l0 2.5" /></svg></span>
|
||||
<div>
|
||||
<h5 class="card-title mb-1">Your account is secured with an additional layer of protection.</h5>
|
||||
<p class="text-muted mb-2">2FA is currently <strong>enabled</strong> for your account. If you encounter any issues or need to disable 2FA, please contact our support team for assistance.</p>
|
||||
<h5 class="card-title mb-1">{{ __('Your account is secured with an additional layer of protection.') }}</h5>
|
||||
<p class="text-muted mb-2">{{ __('2FA is currently') }} <strong>{{ __('enabled') }}</strong> {{ __('for your account. If you encounter any issues or need to disable 2FA, please contact our support team for assistance.') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -141,36 +144,72 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="tabs-webauthn">
|
||||
<h4 class="card-title">WebAuthn Authentication</h4>
|
||||
<h4 class="card-title">{{ __('WebAuthn Authentication') }}</h4>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<p>Secure your account with WebAuthn. Click the button below to register your device for passwordless sign-in.</p>
|
||||
<p>{{ __('Secure your account with WebAuthn. Click the button below to register your device for passwordless sign-in.') }}</p>
|
||||
<!-- Connect WebAuthn Button -->
|
||||
<button type="button" class="btn btn-success" id="connectWebAuthnButton">Connect WebAuthn Device</button>
|
||||
<button type="button" class="btn btn-success" id="connectWebAuthnButton">{{ __('Connect WebAuthn Device') }}</button>
|
||||
<!-- WebAuthn Devices Table -->
|
||||
<div class="table-responsive mt-4">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Device/Browser Info</th>
|
||||
<th>Registration Date</th>
|
||||
<th>Action</th>
|
||||
<th>{{ __('Device/Browser Info') }}</th>
|
||||
<th>{{ __('Registration Date') }}</th>
|
||||
<th>{{ __('Action') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for device in weba %}
|
||||
<tr>
|
||||
<td>{{ device.user_agent }}</td>
|
||||
<td>{{ device.created_at }}</td>
|
||||
<td>
|
||||
<a href="/path/to/action?deviceId={{ device.id }}">Edit</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="3">No devices found.</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for device in weba %}
|
||||
<tr>
|
||||
<td>{{ device.user_agent }}</td>
|
||||
<td>{{ device.created_at }}</td>
|
||||
<td>
|
||||
<a href="/path/to/action?deviceId={{ device.id }}">{{ __('Edit') }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="3">{{ __('No devices found.') }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane" id="tabs-log">
|
||||
<h4 class="card-title">{{ __('User Audit Log') }}</h4>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<p>{{ __('Track and review all user activities in your account below. Monitor logins, profile changes, and other key actions to ensure security and transparency.') }}</p>
|
||||
<div class="table-responsive mt-4">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ __('Event') }}</th>
|
||||
<th>{{ __('User Agent') }}</th>
|
||||
<th>IP</th>
|
||||
<th>{{ __('Location') }}</th>
|
||||
<th>{{ __('Timestamp') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user in userAudit %}
|
||||
<tr>
|
||||
<td>{{ user.user_event }}</td>
|
||||
<td>{{ user.user_agent }}</td>
|
||||
<td>{{ user.user_ip }}</td>
|
||||
<td>{{ user.user_location }}</td>
|
||||
<td>{{ user.event_time }}</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="5">{{ __('No log data for user.') }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
@ -181,19 +220,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://getpinga.com" class="link-secondary">Pinga</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
|
|
@ -24,83 +24,59 @@
|
|||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% if registrar 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="M5 12l5 5l10 -10" /></svg>
|
||||
</div>
|
||||
<div>
|
||||
{{ __('Registrar') }} <strong>{{ registrar }}</strong> {{ __('successfully created and is now active.') }}
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% elseif error is defined %}
|
||||
<div class="alert alert-important alert-danger 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>
|
||||
{{ __('Error creating the registrar') }}: <strong>{{ error }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% include 'partials/flash.twig' %}
|
||||
<form action="/registrar/create" method="post" autocomplete="off">
|
||||
{{ csrf.field | raw }}
|
||||
<!-- Registrar Details Card -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar Details</h5>
|
||||
<h5 class="card-title">{{ __('Registrar Details') }}</h5>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label required">Name</label>
|
||||
<label for="name" class="form-label required">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="name" name="name" required>
|
||||
<small class="text-muted">The official name of the registrar.</small>
|
||||
<small class="text-muted">{{ __('The official name of the registrar.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ianaId" class="form-label">IANA ID</label>
|
||||
<input type="number" class="form-control" id="ianaId" name="ianaId">
|
||||
<small class="text-muted">Unique identifier assigned by IANA.</small>
|
||||
<small class="text-muted">{{ __('Unique identifier assigned by IANA.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label required">Email</label>
|
||||
<label for="email" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" required autocapitalize="none">
|
||||
<small class="text-muted">Primary contact email of the registrar.</small>
|
||||
<small class="text-muted">{{ __('Primary contact email of the registrar.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="url" class="form-label required">URL</label>
|
||||
<label for="url" class="form-label required">{{ __('URL') }}</label>
|
||||
<input type="url" class="form-control" id="url" name="url" required autocapitalize="none">
|
||||
<small class="text-muted">Registrar's official website URL.</small>
|
||||
<small class="text-muted">{{ __('Registrar\'s official website URL.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="whoisServer" class="form-label required">WHOIS Server</label>
|
||||
<label for="whoisServer" class="form-label required">{{ __('WHOIS Server') }}</label>
|
||||
<input type="text" class="form-control" id="whoisServer" name="whoisServer" required autocapitalize="none">
|
||||
<small class="text-muted">Address of the registrar's WHOIS server.</small>
|
||||
<small class="text-muted">{{ __('Address of the registrar\'s WHOIS server.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="rdapServer" class="form-label required">RDAP Server</label>
|
||||
<label for="rdapServer" class="form-label required">{{ __('RDAP Server') }}</label>
|
||||
<input type="text" class="form-control" id="rdapServer" name="rdapServer" required autocapitalize="none">
|
||||
<small class="text-muted">Address of the registrar's RDAP server.</small>
|
||||
<small class="text-muted">{{ __('Address of the registrar\'s RDAP server.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseEmail" class="form-label required">Abuse Email</label>
|
||||
<label for="abuseEmail" class="form-label required">{{ __('Abuse Email') }}</label>
|
||||
<input type="email" class="form-control" id="abuseEmail" name="abuseEmail" required autocapitalize="none">
|
||||
<small class="text-muted">Email address for reporting abuse.</small>
|
||||
<small class="text-muted">{{ __('Email address for reporting abuse.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abusePhone" class="form-label required">Abuse Phone</label>
|
||||
<label for="abusePhone" class="form-label required">{{ __('Abuse Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="abusePhone" name="abusePhone" required>
|
||||
<small class="text-muted">Phone number for reporting abuse.</small>
|
||||
<small class="text-muted">{{ __('Phone number for reporting abuse.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -110,36 +86,36 @@
|
|||
<!-- Financial Information Card -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Financial Information</h5>
|
||||
<h5 class="card-title">{{ __('Financial Information') }}</h5>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="accountBalance" class="form-label required">Account Balance</label>
|
||||
<label for="accountBalance" class="form-label required">{{ __('Account Balance') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="accountBalance" name="accountBalance" required>
|
||||
<small class="text-muted">Current balance in the registrar's account.</small>
|
||||
<small class="text-muted">{{ __('Current balance in the registrar\'s account.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="creditLimit" class="form-label required">Credit Limit</label>
|
||||
<label for="creditLimit" class="form-label required">{{ __('Credit Limit') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="creditLimit" name="creditLimit" required>
|
||||
<small class="text-muted">Maximum credit limit for the registrar.</small>
|
||||
<small class="text-muted">{{ __('Maximum credit limit for the registrar.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="creditThreshold" class="form-label required">Credit Threshold</label>
|
||||
<label for="creditThreshold" class="form-label required">{{ __('Credit Threshold') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="creditThreshold" name="creditThreshold" required>
|
||||
<small class="text-muted">Credit threshold triggering alerts or actions.</small>
|
||||
<small class="text-muted">{{ __('Credit threshold triggering alerts or actions.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="thresholdType" class="form-label required">Threshold Type</label>
|
||||
<label for="thresholdType" class="form-label required">{{ __('Threshold Type') }}</label>
|
||||
<select class="form-select" id="thresholdType" name="thresholdType" required>
|
||||
<option value="fixed">Fixed</option>
|
||||
<option value="percent">Percent</option>
|
||||
<option value="fixed">{{ __('Fixed') }}</option>
|
||||
<option value="percent">{{ __('Percent') }}</option>
|
||||
</select>
|
||||
<small class="text-muted">Type of threshold: fixed value or percentage.</small>
|
||||
<small class="text-muted">{{ __('Type of threshold: fixed value or percentage.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -149,17 +125,17 @@
|
|||
<!-- Registrar Contacts Section with Tabs -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar Contacts</h5>
|
||||
<h5 class="card-title">{{ __('Registrar Contacts') }}</h5>
|
||||
<ul class="nav nav-tabs nav-fill" id="contactTabs" role="tablist">
|
||||
<!-- Tab Headers -->
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="owner-tab" data-bs-toggle="tab" data-bs-target="#owner" type="button" role="tab" aria-controls="owner" aria-selected="true">Owner</button>
|
||||
<button class="nav-link active" id="owner-tab" data-bs-toggle="tab" data-bs-target="#owner" type="button" role="tab" aria-controls="owner" aria-selected="true">{{ __('Owner') }}</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="billing-tab" data-bs-toggle="tab" data-bs-target="#billing" type="button" role="tab" aria-controls="billing" aria-selected="false">Billing</button>
|
||||
<button class="nav-link" id="billing-tab" data-bs-toggle="tab" data-bs-target="#billing" type="button" role="tab" aria-controls="billing" aria-selected="false">{{ __('Billing') }}</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="abuse-tab" data-bs-toggle="tab" data-bs-target="#abuse" type="button" role="tab" aria-controls="abuse" aria-selected="false">Abuse</button>
|
||||
<button class="nav-link" id="abuse-tab" data-bs-toggle="tab" data-bs-target="#abuse" type="button" role="tab" aria-controls="abuse" aria-selected="false">{{ __('Abuse') }}</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
@ -170,30 +146,30 @@
|
|||
<div class="form-check mb-3">
|
||||
<input class="form-check-input" type="checkbox" value="" id="copyOwnerData">
|
||||
<label class="form-check-label" for="copyOwnerData">
|
||||
<strong>Copy data to other contacts</strong>
|
||||
<strong>{{ __('Copy data to other contacts') }}</strong>
|
||||
</label>
|
||||
</div>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="ownerFirstName" class="form-label required">First Name</label>
|
||||
<label for="ownerFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="ownerFirstName" name="owner[first_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerLastName" class="form-label required">Last Name</label>
|
||||
<label for="ownerLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="ownerLastName" name="owner[last_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerOrg" class="form-label">Organization</label>
|
||||
<label for="ownerOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="ownerOrg" name="owner[org]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerStreet1" class="form-label">Street Address</label>
|
||||
<label for="ownerStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="ownerStreet1" name="owner[street1]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerCity" class="form-label required">City</label>
|
||||
<label for="ownerCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="ownerCity" name="owner[city]" required>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -201,15 +177,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="ownerSp" class="form-label">State/Province</label>
|
||||
<label for="ownerSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="ownerSp" name="owner[sp]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerPc" class="form-label">Postal Code</label>
|
||||
<label for="ownerPc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="ownerPc" name="owner[pc]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerCc" class="form-label required">Country</label>
|
||||
<label for="ownerCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="ownerCc" name="owner[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
|
||||
|
@ -217,11 +193,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerVoice" class="form-label">Phone</label>
|
||||
<label for="ownerVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="ownerVoice" name="owner[voice]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerEmail" class="form-label required">Email</label>
|
||||
<label for="ownerEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="ownerEmail" name="owner[email]" required autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -236,23 +212,23 @@
|
|||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="billingFirstName" class="form-label required">First Name</label>
|
||||
<label for="billingFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="billingFirstName" name="billing[first_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingLastName" class="form-label required">Last Name</label>
|
||||
<label for="billingLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="billingLastName" name="billing[last_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingOrg" class="form-label">Organization</label>
|
||||
<label for="billingOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="billingOrg" name="billing[org]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingStreet1" class="form-label">Street Address</label>
|
||||
<label for="billingStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="billingStreet1" name="billing[street1]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingCity" class="form-label required">City</label>
|
||||
<label for="billingCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="billingCity" name="billing[city]" required>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -260,15 +236,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="billingSp" class="form-label">State/Province</label>
|
||||
<label for="billingSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="billingSp" name="billing[sp]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingPc" class="form-label">Postal Code</label>
|
||||
<label for="billingPc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="billingPc" name="billing[pc]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingCc" class="form-label required">Country</label>
|
||||
<label for="billingCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="billingCc" name="billing[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
|
||||
|
@ -276,11 +252,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingVoice" class="form-label">Phone</label>
|
||||
<label for="billingVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="billingVoice" name="billing[voice]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingEmail" class="form-label required">Email</label>
|
||||
<label for="billingEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="billingEmail" name="billing[email]" required autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -295,23 +271,23 @@
|
|||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="abuseFirstName" class="form-label required">First Name</label>
|
||||
<label for="abuseFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="abuseFirstName" name="abuse[first_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseLastName" class="form-label required">Last Name</label>
|
||||
<label for="abuseLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="abuseLastName" name="abuse[last_name]" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseOrg" class="form-label">Organization</label>
|
||||
<label for="abuseOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="abuseOrg" name="abuse[org]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseStreet1" class="form-label">Street Address</label>
|
||||
<label for="abuseStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="abuseStreet1" name="abuse[street1]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseCity" class="form-label required">City</label>
|
||||
<label for="abuseCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="abuseCity" name="abuse[city]" required>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -319,15 +295,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="abuseSp" class="form-label">State/Province</label>
|
||||
<label for="abuseSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="abuseSp" name="abuse[sp]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abusePc" class="form-label">Postal Code</label>
|
||||
<label for="abusePc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="abusePc" name="abuse[pc]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseCc" class="form-label required">Country</label>
|
||||
<label for="abuseCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="abuseCc" name="abuse[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
|
||||
|
@ -335,11 +311,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseVoice" class="form-label">Phone</label>
|
||||
<label for="abuseVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="abuseVoice" name="abuse[voice]">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseEmail" class="form-label required">Email</label>
|
||||
<label for="abuseEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="abuseEmail" name="abuse[email]" required autocapitalize="none">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -355,9 +331,9 @@
|
|||
<div class="col-md-6">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">IP Whitelisting <span class="text-red">*</span></h5>
|
||||
<h5 class="card-title">{{ __('IP Whitelisting') }} <span class="text-red">*</span></h5>
|
||||
<p class="card-text">
|
||||
Whitelist IP addresses for secure access. Up to 5 IP addresses (IPv4 or IPv6) can be added.
|
||||
{{ __('Whitelist IP addresses for secure access. Up to 5 IP addresses (IPv4 or IPv6) can be added.') }}
|
||||
</p>
|
||||
<div id="ipWhitelistForm">
|
||||
<div id="ipAddressFields">
|
||||
|
@ -375,18 +351,18 @@
|
|||
<div class="col-md-6">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar User</h5>
|
||||
<h5 class="card-title">{{ __('Registrar User') }}</h5>
|
||||
<p class="card-text">
|
||||
Create a registrar user by specifying the username (also known as CLID), email, and passwords for EPP and panel access.
|
||||
{{ __('Create a registrar user by specifying the username (also known as CLID), email, and passwords for EPP and panel access.') }}
|
||||
</p>
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col required">Username/CLID <span class="text-red">*</span></th>
|
||||
<th scope="col">Login Email <span class="text-red">*</span></th>
|
||||
<th scope="col">Panel Password <span class="text-red">*</span></th>
|
||||
<th scope="col">EPP Password <span class="text-red">*</span></th>
|
||||
<th scope="col required">{{ __('Username/CLID') }} <span class="text-red">*</span></th>
|
||||
<th scope="col">{{ __('Login Email') }} <span class="text-red">*</span></th>
|
||||
<th scope="col">{{ __('Panel Password') }} <span class="text-red">*</span></th>
|
||||
<th scope="col">{{ __('EPP Password') }} <span class="text-red">*</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -415,9 +391,9 @@
|
|||
<!-- OTE Section -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Operational Test and Evaluation (OTE)</h5>
|
||||
<h5 class="card-title">{{ __('Operational Test and Evaluation (OTE)') }}</h5>
|
||||
<p class="card-text">
|
||||
Operational Test and Evaluation (OTE) assesses the functionality of EPP commands in a simulated environment, ensuring effective communication between the registrar's system and the registry. Below are key EPP commands and their test statuses:
|
||||
{{ __('Operational Test and Evaluation (OTE) assesses the functionality of EPP commands in a simulated environment, ensuring effective communication between the registrar\'s system and the registry. Below are key EPP commands and their test statuses:') }}
|
||||
</p>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
|
@ -425,23 +401,23 @@
|
|||
<ul class="list-group">
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
contact:create
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:check
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:info
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:renew
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:transfer
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -451,23 +427,23 @@
|
|||
<ul class="list-group">
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
host:create
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
host:info
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
contact:update
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:delete
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
poll:request
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -476,7 +452,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create Registrar</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Create Registrar') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -485,19 +461,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
|
|
@ -47,9 +47,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search registrars">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search registrars') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,18 +61,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -30,53 +30,53 @@
|
|||
<!-- Registrar Details Card -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar Details</h5>
|
||||
<h5 class="card-title">{{ __('Registrar Details') }}</h5>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label required">Name</label>
|
||||
<label for="name" class="form-label required">{{ __('Name') }}</label>
|
||||
<input type="text" class="form-control" id="name" name="name" required value="{{ registrar.name }}">
|
||||
<small class="text-muted">The official name of the registrar.</small>
|
||||
<small class="text-muted">{{ __('The official name of the registrar.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ianaId" class="form-label">IANA ID</label>
|
||||
<input type="number" class="form-control" id="ianaId" name="ianaId" value="{{ registrar.iana_id }}">
|
||||
<small class="text-muted">Unique identifier assigned by IANA.</small>
|
||||
<small class="text-muted">{{ __('Unique identifier assigned by IANA.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label required">Email</label>
|
||||
<label for="email" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" required autocapitalize="none" value="{{ registrar.email }}">
|
||||
<small class="text-muted">Primary contact email of the registrar.</small>
|
||||
<small class="text-muted">{{ __('Primary contact email of the registrar.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="url" class="form-label required">URL</label>
|
||||
<label for="url" class="form-label required">{{ __('URL') }}</label>
|
||||
<input type="url" class="form-control" id="url" name="url" required autocapitalize="none" value="{{ registrar.url }}">
|
||||
<small class="text-muted">Registrar's official website URL.</small>
|
||||
<small class="text-muted">{{ __('Registrar\'s official website URL.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="whoisServer" class="form-label required">WHOIS Server</label>
|
||||
<label for="whoisServer" class="form-label required">{{ __('WHOIS Server') }}</label>
|
||||
<input type="text" class="form-control" id="whoisServer" name="whoisServer" required autocapitalize="none" value="{{ registrar.whois_server }}">
|
||||
<small class="text-muted">Address of the registrar's WHOIS server.</small>
|
||||
<small class="text-muted">{{ __('Address of the registrar\'s WHOIS server.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="rdapServer" class="form-label required">RDAP Server</label>
|
||||
<label for="rdapServer" class="form-label required">{{ __('RDAP Server') }}</label>
|
||||
<input type="text" class="form-control" id="rdapServer" name="rdapServer" required autocapitalize="none" value="{{ registrar.rdap_server }}">
|
||||
<small class="text-muted">Address of the registrar's RDAP server.</small>
|
||||
<small class="text-muted">{{ __('Address of the registrar\'s RDAP server.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseEmail" class="form-label required">Abuse Email</label>
|
||||
<label for="abuseEmail" class="form-label required">{{ __('Abuse Email') }}</label>
|
||||
<input type="email" class="form-control" id="abuseEmail" name="abuseEmail" required autocapitalize="none" value="{{ registrar.abuse_email }}">
|
||||
<small class="text-muted">Email address for reporting abuse.</small>
|
||||
<small class="text-muted">{{ __('Email address for reporting abuse.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abusePhone" class="form-label required">Abuse Phone</label>
|
||||
<label for="abusePhone" class="form-label required">{{ __('Abuse Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="abusePhone" name="abusePhone" required value="{{ registrar.abuse_phone }}">
|
||||
<small class="text-muted">Phone number for reporting abuse.</small>
|
||||
<small class="text-muted">{{ __('Phone number for reporting abuse.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -86,33 +86,33 @@
|
|||
<!-- Financial Information Card -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Financial Information</h5>
|
||||
<h5 class="card-title">{{ __('Financial Information') }}</h5>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="accountBalance" class="form-label">Account Balance</label>
|
||||
<label for="accountBalance" class="form-label">{{ __('Account Balance') }}</label>
|
||||
<div class="form-control-plaintext">{{ currency }} {{ registrar.accountBalance }}</div>
|
||||
<small class="text-muted">Current balance in the registrar's account.</small>
|
||||
<small class="text-muted">{{ __('Current balance in the registrar\'s account.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="creditLimit" class="form-label required">Credit Limit</label>
|
||||
<label for="creditLimit" class="form-label required">{{ __('Credit Limit') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="creditLimit" name="creditLimit" required value="{{ registrar.creditLimit }}">
|
||||
<small class="text-muted">Maximum credit limit for the registrar.</small>
|
||||
<small class="text-muted">{{ __('Maximum credit limit for the registrar.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="creditThreshold" class="form-label required">Credit Threshold</label>
|
||||
<label for="creditThreshold" class="form-label required">{{ __('Credit Threshold') }}</label>
|
||||
<input type="number" step="0.01" class="form-control" id="creditThreshold" name="creditThreshold" required value="{{ registrar.creditThreshold }}">
|
||||
<small class="text-muted">Credit threshold triggering alerts or actions.</small>
|
||||
<small class="text-muted">{{ __('Credit threshold triggering alerts or actions.') }}</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="thresholdType" class="form-label">Threshold Type</label>
|
||||
<label for="thresholdType" class="form-label">{{ __('Threshold Type') }}</label>
|
||||
<div class="form-control-plaintext">{{ registrar.thresholdType|slice(0, 1)|upper ~ registrar.thresholdType|slice(1) }}</div>
|
||||
<small class="text-muted">Type of threshold: fixed value or percentage.</small>
|
||||
<small class="text-muted">{{ __('Type of threshold: fixed value or percentage.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -122,17 +122,17 @@
|
|||
<!-- Registrar Contacts Section with Tabs -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar Contacts</h5>
|
||||
<h5 class="card-title">{{ __('Registrar Contacts') }}</h5>
|
||||
<ul class="nav nav-tabs nav-fill" id="contactTabs" role="tablist">
|
||||
<!-- Tab Headers -->
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="owner-tab" data-bs-toggle="tab" data-bs-target="#owner" type="button" role="tab" aria-controls="owner" aria-selected="true">Owner</button>
|
||||
<button class="nav-link active" id="owner-tab" data-bs-toggle="tab" data-bs-target="#owner" type="button" role="tab" aria-controls="owner" aria-selected="true">{{ __('Owner') }}</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="billing-tab" data-bs-toggle="tab" data-bs-target="#billing" type="button" role="tab" aria-controls="billing" aria-selected="false">Billing</button>
|
||||
<button class="nav-link" id="billing-tab" data-bs-toggle="tab" data-bs-target="#billing" type="button" role="tab" aria-controls="billing" aria-selected="false">{{ __('Billing') }}</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="abuse-tab" data-bs-toggle="tab" data-bs-target="#abuse" type="button" role="tab" aria-controls="abuse" aria-selected="false">Abuse</button>
|
||||
<button class="nav-link" id="abuse-tab" data-bs-toggle="tab" data-bs-target="#abuse" type="button" role="tab" aria-controls="abuse" aria-selected="false">{{ __('Abuse') }}</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
@ -143,7 +143,7 @@
|
|||
<div class="form-check mb-3">
|
||||
<input class="form-check-input" type="checkbox" value="" id="copyOwnerData">
|
||||
<label class="form-check-label" for="copyOwnerData">
|
||||
<strong>Copy data to other contacts</strong>
|
||||
<strong>{{ __('Copy data to other contacts') }}</strong>
|
||||
</label>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
@ -152,23 +152,23 @@
|
|||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="ownerFirstName" class="form-label required">First Name</label>
|
||||
<label for="ownerFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="ownerFirstName" name="owner[first_name]" value="{{ contact.first_name }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerLastName" class="form-label required">Last Name</label>
|
||||
<label for="ownerLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="ownerLastName" name="owner[last_name]" value="{{ contact.last_name }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerOrg" class="form-label">Organization</label>
|
||||
<label for="ownerOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="ownerOrg" name="owner[org]" value="{{ contact.org }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerStreet1" class="form-label">Street Address</label>
|
||||
<label for="ownerStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="ownerStreet1" name="owner[street1]" value="{{ contact.street1 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerCity" class="form-label required">City</label>
|
||||
<label for="ownerCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="ownerCity" name="owner[city]" value="{{ contact.city }}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -176,15 +176,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="ownerSp" class="form-label">State/Province</label>
|
||||
<label for="ownerSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="ownerSp" name="owner[sp]" value="{{ contact.sp }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerPc" class="form-label">Postal Code</label>
|
||||
<label for="ownerPc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="ownerPc" name="owner[pc]" value="{{ contact.pc }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerCc" class="form-label required">Country</label>
|
||||
<label for="ownerCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="ownerCc" name="owner[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
|
||||
|
@ -192,11 +192,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerVoice" class="form-label">Phone</label>
|
||||
<label for="ownerVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="ownerVoice" name="owner[voice]" value="{{ contact.voice }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ownerEmail" class="form-label required">Email</label>
|
||||
<label for="ownerEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="ownerEmail" name="owner[email]" required autocapitalize="none" value="{{ contact.email }}">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -215,23 +215,23 @@
|
|||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="billingFirstName" class="form-label required">First Name</label>
|
||||
<label for="billingFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="billingFirstName" name="billing[first_name]" value="{{ contact.first_name }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingLastName" class="form-label required">Last Name</label>
|
||||
<label for="billingLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="billingLastName" name="billing[last_name]" value="{{ contact.last_name }}"required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingOrg" class="form-label">Organization</label>
|
||||
<label for="billingOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="billingOrg" name="billing[org]" value="{{ contact.org }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingStreet1" class="form-label">Street Address</label>
|
||||
<label for="billingStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="billingStreet1" name="billing[street1]" value="{{ contact.street1 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingCity" class="form-label required">City</label>
|
||||
<label for="billingCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="billingCity" name="billing[city]" value="{{ contact.city }}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -239,15 +239,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="billingSp" class="form-label">State/Province</label>
|
||||
<label for="billingSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="billingSp" name="billing[sp]" value="{{ contact.sp }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingPc" class="form-label">Postal Code</label>
|
||||
<label for="billingPc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="billingPc" name="billing[pc]" value="{{ contact.pc }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingCc" class="form-label required">Country</label>
|
||||
<label for="billingCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="billingCc" name="billing[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
|
||||
|
@ -255,11 +255,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingVoice" class="form-label">Phone</label>
|
||||
<label for="billingVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="billingVoice" name="billing[voice]" value="{{ contact.voice }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="billingEmail" class="form-label required">Email</label>
|
||||
<label for="billingEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="billingEmail" name="billing[email]" required autocapitalize="none" value="{{ contact.email }}">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -278,23 +278,23 @@
|
|||
<!-- First Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="abuseFirstName" class="form-label required">First Name</label>
|
||||
<label for="abuseFirstName" class="form-label required">{{ __('First Name') }}</label>
|
||||
<input type="text" class="form-control" id="abuseFirstName" name="abuse[first_name]" value="{{ contact.first_name }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseLastName" class="form-label required">Last Name</label>
|
||||
<label for="abuseLastName" class="form-label required">{{ __('Last Name') }}</label>
|
||||
<input type="text" class="form-control" id="abuseLastName" name="abuse[last_name]" value="{{ contact.last_name }}" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseOrg" class="form-label">Organization</label>
|
||||
<label for="abuseOrg" class="form-label">{{ __('Organization') }}</label>
|
||||
<input type="text" class="form-control" id="abuseOrg" name="abuse[org]" value="{{ contact.org }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseStreet1" class="form-label">Street Address</label>
|
||||
<label for="abuseStreet1" class="form-label">{{ __('Street Address') }}</label>
|
||||
<input type="text" class="form-control" id="abuseStreet1" name="abuse[street1]" value="{{ contact.street1 }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseCity" class="form-label required">City</label>
|
||||
<label for="abuseCity" class="form-label required">{{ __('City') }}</label>
|
||||
<input type="text" class="form-control" id="abuseCity" name="abuse[city]" required value="{{ contact.city }}">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -302,15 +302,15 @@
|
|||
<!-- Second Column -->
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="abuseSp" class="form-label">State/Province</label>
|
||||
<label for="abuseSp" class="form-label">{{ __('State/Province') }}</label>
|
||||
<input type="text" class="form-control" id="abuseSp" name="abuse[sp]" value="{{ contact.sp }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abusePc" class="form-label">Postal Code</label>
|
||||
<label for="abusePc" class="form-label">{{ __('Postal Code') }}</label>
|
||||
<input type="text" class="form-control" id="abusePc" name="abuse[pc]" value="{{ contact.pc }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseCc" class="form-label required">Country</label>
|
||||
<label for="abuseCc" class="form-label required">{{ __('Country') }}</label>
|
||||
<select class="form-select" id="abuseCc" name="abuse[cc]" required="required">
|
||||
{% for country in countries %}
|
||||
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
|
||||
|
@ -318,11 +318,11 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseVoice" class="form-label">Phone</label>
|
||||
<label for="abuseVoice" class="form-label">{{ __('Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="abuseVoice" name="abuse[voice]" value="{{ contact.voice }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="abuseEmail" class="form-label required">Email</label>
|
||||
<label for="abuseEmail" class="form-label required">{{ __('Email') }}</label>
|
||||
<input type="email" class="form-control" id="abuseEmail" name="abuse[email]" required autocapitalize="none" value="{{ contact.email }}">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -340,9 +340,9 @@
|
|||
<div class="col-md-6 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">IP Whitelisting <span class="text-red">*</span></h5>
|
||||
<h5 class="card-title">{{ __('IP Whitelisting') }} <span class="text-red">*</span></h5>
|
||||
<p class="card-text">
|
||||
Whitelist IP addresses for secure access. Up to 5 IP addresses (IPv4 or IPv6) can be added.
|
||||
{{ __('Whitelist IP addresses for secure access. Up to 5 IP addresses (IPv4 or IPv6) can be added.') }}
|
||||
</p>
|
||||
<div id="ipWhitelistForm">
|
||||
<div id="ipAddressFields">
|
||||
|
@ -369,18 +369,18 @@
|
|||
<div class="col-md-6 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar User</h5>
|
||||
<h5 class="card-title">{{ __('Registrar User') }}</h5>
|
||||
<p class="card-text">
|
||||
For an existing registrar user, you can view the current EPP username (also known as CLID) and panel access email. Additionally, you have the option to reset the passwords for EPP and panel access as needed.
|
||||
{{ __('For an existing registrar user, you can view the current EPP username (also known as CLID) and panel access email. Additionally, you have the option to reset the passwords for EPP and panel access as needed.') }}
|
||||
</p>
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col required">Username/CLID</th>
|
||||
<th scope="col">Login Email</th><input type="hidden" name="reg_email" value="{{ user.email }}">
|
||||
<th scope="col">Panel Password <span class="text-red">*</span></th>
|
||||
<th scope="col">EPP Password <span class="text-red">*</span></th>
|
||||
<th scope="col required">{{ __('Username/CLID') }}</th>
|
||||
<th scope="col">{{ __('Login Email') }}</th><input type="hidden" name="reg_email" value="{{ user.email }}">
|
||||
<th scope="col">{{ __('Panel Password') }} <span class="text-red">*</span></th>
|
||||
<th scope="col">{{ __('EPP Password') }} <span class="text-red">*</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -395,7 +395,7 @@
|
|||
<div class="d-flex align-items-center">
|
||||
<input type="password" class="form-control form-control-sm me-2" name="panelPassword" id="panelPassword" autocomplete="off" disabled>
|
||||
<div class="form-check mb-0">
|
||||
<input class="form-check-input" type="checkbox" id="updatePanelPassword" title="Update Panel Password">
|
||||
<input class="form-check-input" type="checkbox" id="updatePanelPassword" title="{{ __('Update Panel Password') }}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -403,7 +403,7 @@
|
|||
<div class="d-flex align-items-center">
|
||||
<input type="password" class="form-control form-control-sm me-2" name="eppPassword" id="eppPassword" autocomplete="off" disabled>
|
||||
<div class="form-check mb-0">
|
||||
<input class="form-check-input" type="checkbox" id="updateEppPassword" title="Update EPP Password">
|
||||
<input class="form-check-input" type="checkbox" id="updateEppPassword" title="{{ __('Update EPP Password') }}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -419,9 +419,9 @@
|
|||
<!-- OTE Section -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Operational Test and Evaluation (OTE)</h5>
|
||||
<h5 class="card-title">{{ __('Operational Test and Evaluation (OTE)') }}</h5>
|
||||
<p class="card-text">
|
||||
Operational Test and Evaluation (OTE) assesses the functionality of EPP commands in a simulated environment, ensuring effective communication between the registrar's system and the registry. Below are key EPP commands and their test statuses:
|
||||
{{ __('Operational Test and Evaluation (OTE) assesses the functionality of EPP commands in a simulated environment, ensuring effective communication between the registrar\'s system and the registry. Below are key EPP commands and their test statuses:') }}
|
||||
</p>
|
||||
<div class="row">
|
||||
<!-- First Column -->
|
||||
|
@ -429,23 +429,23 @@
|
|||
<ul class="list-group">
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
contact:create
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:check
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:info
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:renew
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:transfer
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -455,23 +455,23 @@
|
|||
<ul class="list-group">
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
host:create
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
host:info
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
contact:update
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
domain:delete
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
poll:request
|
||||
<span class="badge bg-orange text-orange-fg">Pending</span>
|
||||
<span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -480,7 +480,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Registrar</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Registrar') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -489,19 +489,7 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
|
|
@ -26,56 +26,56 @@
|
|||
<div class="col-12">
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Registrar {{ registrar.name }} <span class="status status-green" title="Prefix">{{ registrar.prefix }}</span> <span class="status status-info" title="IANA ID">{{ registrar.iana_id|default('N/A') }}</span></h3>
|
||||
<h3 class="card-title">{{ __('Registrar') }} {{ registrar.name }} <span class="status status-green" title="Prefix">{{ registrar.prefix }}</span> <span class="status status-info" title="IANA ID">{{ registrar.iana_id|default('N/A') }}</span></h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="datagrid">
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Contact Email</div>
|
||||
<div class="datagrid-title">{{ __('Contact Email') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.email }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Website</div>
|
||||
<div class="datagrid-title">{{ __('Website') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.url }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Abuse Phone</div>
|
||||
<div class="datagrid-title">{{ __('Abuse Phone') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.abuse_phone }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Abuse Email</div>
|
||||
<div class="datagrid-title">{{ __('Abuse Email') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.abuse_email }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">WHOIS Server</div>
|
||||
<div class="datagrid-title">{{ __('WHOIS Server') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.whois_server }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">RDAP Server</div>
|
||||
<div class="datagrid-title">{{ __('RDAP Server') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.rdap_server }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Creation Date</div>
|
||||
<div class="datagrid-title">{{ __('Creation Date') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.crdate }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Currency</div>
|
||||
<div class="datagrid-title">{{ __('Currency') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.currency }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Account Balance</div>
|
||||
<div class="datagrid-title">{{ __('Account Balance') }}</div>
|
||||
<div class="datagrid-content">{{ currency }} {{ registrar.accountBalance }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Credit Limit</div>
|
||||
<div class="datagrid-title">{{ __('Credit Limit') }}</div>
|
||||
<div class="datagrid-content">{{ currency }} {{ registrar.creditLimit }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Credit Threshold</div>
|
||||
<div class="datagrid-title">{{ __('Credit Threshold') }}</div>
|
||||
<div class="datagrid-content">{{ currency }} {{ registrar.creditThreshold }}</div>
|
||||
</div>
|
||||
<div class="datagrid-item">
|
||||
<div class="datagrid-title">Threshold Type</div>
|
||||
<div class="datagrid-title">{{ __('Threshold Type') }}</div>
|
||||
<div class="datagrid-content">{{ registrar.thresholdType|capitalize }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -86,7 +86,7 @@
|
|||
<div class="col-md-6 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">IP Whitelisting</h5>
|
||||
<h5 class="card-title">{{ __('IP Whitelisting') }}</h5>
|
||||
<ul class="list-group">
|
||||
{% if registrarWhitelist is not empty %}
|
||||
{% for ip in registrarWhitelist %}
|
||||
|
@ -95,7 +95,7 @@
|
|||
</li>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<li class="list-group-item">No data available.</li>
|
||||
<li class="list-group-item">{{ __('No data available.') }}</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -104,13 +104,13 @@
|
|||
<div class="col-md-6 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Registrar User</h5>
|
||||
<h5 class="card-title">{{ __('Registrar User') }}</h5>
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col required">EPP Username/CLID</th>
|
||||
<th scope="col">Panel Login Email</th>
|
||||
<th scope="col required">{{ __('EPP Username/CLID') }}</th>
|
||||
<th scope="col">{{ __('Panel Login Email') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -131,9 +131,9 @@
|
|||
</div>
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Operational Test and Evaluation (OTE)</h5>
|
||||
<h5 class="card-title">{{ __('Operational Test and Evaluation (OTE)') }}</h5>
|
||||
<p class="card-text">
|
||||
Successfully passing the Operational Test and Evaluation (OTE) is a mandatory requirement for registrars. The OTE process evaluates the interaction and compliance of the registrar's system with registry operations through a series of EPP command tests in a controlled environment. Below you can find the results of these essential EPP command tests for your account:
|
||||
{{ __('Successfully passing the Operational Test and Evaluation (OTE) is a mandatory requirement for registrars. The OTE process evaluates the interaction and compliance of the registrar\'s system with registry operations through a series of EPP command tests in a controlled environment. Below you can find the results of these essential EPP command tests for your account:') }}
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
|
@ -142,7 +142,7 @@
|
|||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
{{ item.command }}
|
||||
<span class="badge {% if item.result == 0 %}bg-green{% elseif item.result == 9 %}bg-orange{% elseif item.result == 1 %}bg-red{% endif %} text-white">
|
||||
{% if item.result == 0 %}Completed{% elseif item.result == 9 %}Pending{% elseif item.result == 1 %}Failed{% endif %}
|
||||
{% if item.result == 0 %}{{ __('Completed') }}{% elseif item.result == 9 %}{{ __('Pending') }}{% elseif item.result == 1 %}{{ __('Failed') }}{% endif %}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
@ -155,7 +155,7 @@
|
|||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
{{ item.command }}
|
||||
<span class="badge {% if item.result == 0 %}bg-green{% elseif item.result == 9 %}bg-orange{% elseif item.result == 1 %}bg-red{% endif %} text-white">
|
||||
{% if item.result == 0 %}Completed{% elseif item.result == 9 %}Pending{% elseif item.result == 1 %}Failed{% endif %}
|
||||
{% if item.result == 0 %}{{ __('Completed') }}{% elseif item.result == 9 %}{{ __('Pending') }}{% elseif item.result == 1 %}{{ __('Failed') }}{% endif %}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
@ -166,18 +166,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search reports">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search reports') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Documentation') }}
|
||||
|
@ -26,7 +26,7 @@
|
|||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-body border-bottom py-3">
|
||||
<h2>Documentation</h2>
|
||||
<h2>{{ __('Documentation') }}</h2>
|
||||
<p>{{ documentation_intro|default('Replace this section with a brief introduction about your documentation.') }}</p>
|
||||
|
||||
<h3>Getting Started</h3>
|
||||
|
@ -45,18 +45,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -11,7 +11,7 @@
|
|||
<div class="col">
|
||||
<!-- Page pre-title -->
|
||||
<div class="page-pretitle">
|
||||
Overview
|
||||
{{ __('Overview') }}
|
||||
</div>
|
||||
<h2 class="page-title">
|
||||
{{ __('Media Kit') }}
|
||||
|
@ -26,13 +26,13 @@
|
|||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-body border-bottom py-3">
|
||||
<h2>Media Kit</h2>
|
||||
<h2>{{ __('Media Kit') }}</h2>
|
||||
<p>{{ media_kit_intro|default('Replace this section with an introduction about the media kit contents and its intended audience.') }}</p>
|
||||
|
||||
<h3>Logos</h3>
|
||||
<p>{{ logos_intro|default('Provide guidelines on how to use your registry logos correctly.') }}</p>
|
||||
<!-- Placeholder for logos. You can use a loop in Twig to iterate through and display multiple logos. -->
|
||||
<img src="{{ logo_image_path|default('/static/logo.svg') }}" alt="Registry Logo" class="img-fluid mb-3">
|
||||
<img src="{{ logo_image_path|default('/static/logo.svg') }}" alt="Registry Logo" class="img-fluid mb-3" style="max-width:50%;">
|
||||
|
||||
<h3>Branding Guidelines</h3>
|
||||
<p>{{ branding_guidelines|default('Detail any color schemes, typography, or design patterns related to your TLD registry brand here.') }}</p>
|
||||
|
@ -50,18 +50,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -42,24 +42,24 @@
|
|||
<form action="/support/new" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<div class="mb-3">
|
||||
<label for="category" class="form-label">Category</label>
|
||||
<label for="category" class="form-label">{{ __('Category') }}</label>
|
||||
<select class="form-select" name="category" id="category" required>
|
||||
<option selected disabled value="">Select a category...</option>
|
||||
<option selected disabled value="">{{ __('Select a category') }}...</option>
|
||||
{% for category in categories %}
|
||||
<option value="{{ category.id }}">{{ category.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="subject" class="form-label">Subject</label>
|
||||
<label for="subject" class="form-label">{{ __('Subject') }}</label>
|
||||
<input type="text" class="form-control" id="subject" name="subject" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="message" class="form-label">Message</label>
|
||||
<label for="message" class="form-label">{{ __('Message') }}</label>
|
||||
<textarea class="form-control" id="message" name="message" rows="5" required></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<button type="submit" class="btn btn-primary">Create Ticket</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Create Ticket') }}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -67,18 +67,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -45,19 +45,6 @@
|
|||
<div class="container-xl">
|
||||
<div class="col-12">
|
||||
{% include 'partials/flash.twig' %}
|
||||
{% 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 %}
|
||||
<div class="card">
|
||||
<div class="card-body border-bottom py-3">
|
||||
<div class="d-flex">
|
||||
|
@ -68,9 +55,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search tickets">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search tickets') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -82,18 +69,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -30,7 +30,7 @@
|
|||
<input type="hidden" name="ticket_id" value="{{ ticket.id }}">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Ticket #{{ ticket.id }} - {{ ticket.subject }}</h5>
|
||||
<h5 class="card-title">{{ __('Ticket') }} #{{ ticket.id }} - {{ ticket.subject }}</h5>
|
||||
{% if ticket.status == 'Open' %}
|
||||
<span class="badge bg-success-lt">{{ ticket.status }}</span>
|
||||
{% elseif ticket.status == 'In Progress' %}
|
||||
|
@ -40,18 +40,18 @@
|
|||
{% elseif ticket.status == 'Closed' %}
|
||||
<span class="badge bg-secondary-lt">{{ ticket.status }}</span>
|
||||
{% else %}
|
||||
<span class="badge bg-dark-lt">Unknown Status</span>
|
||||
<span class="badge bg-dark-lt">{{ __('Unknown Status') }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h6 class="card-subtitle mb-2 text-muted">Ticket Details</h6>
|
||||
<p><span>Created on:</span> <strong>{{ ticket.date_created }}</strong></p>
|
||||
<p><span>Category:</span> <strong>{{ category }}</strong></p>
|
||||
<p><span>Priority:</span> <strong>{{ ticket.priority }}</strong></p>
|
||||
<h6 class="card-subtitle mb-2 text-muted">{{ __('Ticket Details') }}</h6>
|
||||
<p><span>{{ __('Created On') }}:</span> <strong>{{ ticket.date_created }}</strong></p>
|
||||
<p><span>{{ __('Category') }}:</span> <strong>{{ category }}</strong></p>
|
||||
<p><span>{{ __('Priority') }}:</span> <strong>{{ ticket.priority }}</strong></p>
|
||||
|
||||
<div class="card mt-3">
|
||||
<div class="card-body">
|
||||
<h6 class="card-subtitle mb-2 text-muted">Conversation</h6>
|
||||
<h6 class="card-subtitle mb-2 text-muted">{{ __('Conversation') }}</h6>
|
||||
{% for reply in replies %}
|
||||
<div class="d-flex align-items-start mb-3">
|
||||
<div class="flex-shrink-0">
|
||||
|
@ -77,14 +77,14 @@
|
|||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<label for="responseText" class="form-label">Your Response</label>
|
||||
<label for="responseText" class="form-label">{{ __('Your Response') }}</label>
|
||||
<textarea class="form-control" id="responseText" name="responseText" rows="3" required></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Submit Response</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Submit Response') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -93,18 +93,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -29,68 +29,68 @@
|
|||
{{ csrf.field | raw }}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">General Details</h5>
|
||||
<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>
|
||||
<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>
|
||||
<small class="form-text text-muted">{{ __('Enter the desired top-level domain (TLD) name, like') }} '.test' {{ __('or') }} '.example'.</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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">Pricing</h5>
|
||||
<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>
|
||||
<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>{{ __('Create') }}</td>
|
||||
<td><input type="number" class="form-control" name="createm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="createm12" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
<td><input type="number" class="form-control" name="createm24" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
|
@ -104,7 +104,7 @@
|
|||
<td><input type="number" class="form-control" name="createm120" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew</td>
|
||||
<td>{{ __('Renew') }}</td>
|
||||
<td><input type="number" class="form-control" name="renewm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="renewm12" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
<td><input type="number" class="form-control" name="renewm24" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
|
@ -118,7 +118,7 @@
|
|||
<td><input type="number" class="form-control" name="renewm120" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Transfer</td>
|
||||
<td>{{ __('Transfer') }}</td>
|
||||
<td><input type="number" class="form-control" name="transferm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="0.00"></td>
|
||||
<td><input type="number" class="form-control" name="transferm12" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
<td><input type="number" class="form-control" name="transferm24" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0"></td>
|
||||
|
@ -133,38 +133,38 @@
|
|||
</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>
|
||||
<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="mb-3 mt-3">
|
||||
<label for="restorePrice" class="form-label required">Restore Price</label>
|
||||
<label for="restorePrice" class="form-label required">{{ __('Restore Price') }}</label>
|
||||
<input type="number" class="form-control" id="restorePrice" name="restorePrice" placeholder="0.00" required step="0.01" pattern="^\d+(\.\d{1,2})?$" min="0">
|
||||
<small class="form-text text-muted">Enter the price for restoring the TLD.</small>
|
||||
<small class="form-text text-muted">{{ __('Enter the price for restoring the TLD.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Premium Names</h5>
|
||||
<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>
|
||||
<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.
|
||||
{{ __('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>
|
||||
<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>
|
||||
<th>{{ __('Category Name') }}</th>
|
||||
<th>{{ __('Price') }}</th>
|
||||
<th>{{ __('Action') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -179,7 +179,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Create TLD</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Create TLD') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -187,19 +187,7 @@
|
|||
</form>
|
||||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
|
|
@ -25,11 +25,16 @@
|
|||
{{ __('Manage Reserved Names') }}
|
||||
</a>
|
||||
</span>
|
||||
<span class="d-sm-none">
|
||||
<a href="{{route('manageReserved')}}" class="btn btn-secondary btn-icon" title="{{ __('Manage Reserved Names') }}" aria-label="{{ __('Manage Reserved Names') }}">
|
||||
<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="M9 20h6" /><path d="M12 14v6" /><path d="M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z" /><path d="M9 9h6" /></svg>
|
||||
</a>
|
||||
</span>
|
||||
<a href="{{route('createTld')}}" class="btn btn-primary d-none d-sm-inline-block">
|
||||
<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"/><line x1="12" y1="5" x2="12" y2="19" /><line x1="5" y1="12" x2="19" y2="12" /></svg>
|
||||
{{ __('Create New TLD') }}
|
||||
</a>
|
||||
<a href="{{route('createTld')}}" class="btn btn-primary d-sm-none btn-icon" aria-label="{{ __('Create New TLD') }}">
|
||||
<a href="{{route('createTld')}}" class="btn btn-primary d-sm-none btn-icon" title="{{ __('Create New TLD') }}" aria-label="{{ __('Create New TLD') }}">
|
||||
<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"/><line x1="12" y1="5" x2="12" y2="19" /><line x1="5" y1="12" x2="19" y2="12" /></svg>
|
||||
</a>
|
||||
</div>
|
||||
|
@ -52,9 +57,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search tickets">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search TLDs') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -66,18 +71,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -29,7 +29,7 @@
|
|||
<form action="/registry/reserved" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Manage Reserved Names</h4>
|
||||
<h4 class="card-title">{{ __('Manage Reserved Names') }}</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% for type, names in categories %}
|
||||
|
@ -48,7 +48,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Reserved Names</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Reserved Names') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -57,18 +57,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -29,11 +29,11 @@
|
|||
{{ csrf.field | raw }}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">General Details</h5>
|
||||
<h5 class="card-title">{{ __('General Details') }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<label for="tldName" class="form-label">TLD Extension</label>
|
||||
<label for="tldName" class="form-label">{{ __('TLD Extension') }}</label>
|
||||
<div class="form-control-plaintext">{{ tld.tld }}</div>
|
||||
<input type="hidden" name="extension" value="{{ tld.tld }}">
|
||||
</div>
|
||||
|
@ -44,11 +44,11 @@
|
|||
</label>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="tldTypeSelector" class="form-label">TLD Type</label>
|
||||
<label for="tldTypeSelector" class="form-label">{{ __('TLD Type') }}</label>
|
||||
<div class="form-control-plaintext">ccTLD/gTLD</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="scriptDropdown" class="form-label">Supported Script</label>
|
||||
<label for="scriptDropdown" class="form-label">{{ __('Supported Script') }}</label>
|
||||
<div class="form-control-plaintext">{{ scriptName }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -56,30 +56,30 @@
|
|||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Pricing</h5>
|
||||
<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>
|
||||
<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>{{ __('Create') }}</td>
|
||||
<td><input type="number" class="form-control" name="createm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m0 }}"></td>
|
||||
<td><input type="number" class="form-control" name="createm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m12 }}"></td>
|
||||
<td><input type="number" class="form-control" name="createm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m24 }}"></td>
|
||||
|
@ -93,7 +93,7 @@
|
|||
<td><input type="number" class="form-control" name="createm120" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m120 }}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew</td>
|
||||
<td>{{ __('Renew') }}</td>
|
||||
<td><input type="number" class="form-control" name="renewm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m0 }}"></td>
|
||||
<td><input type="number" class="form-control" name="renewm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m12 }}"></td>
|
||||
<td><input type="number" class="form-control" name="renewm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m24 }}"></td>
|
||||
|
@ -107,7 +107,7 @@
|
|||
<td><input type="number" class="form-control" name="renewm120" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m120 }}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Transfer</td>
|
||||
<td>{{ __('Transfer') }}</td>
|
||||
<td><input type="number" class="form-control" name="transferm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m0 }}"></td>
|
||||
<td><input type="number" class="form-control" name="transferm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m12 }}"></td>
|
||||
<td><input type="number" class="form-control" name="transferm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m24 }}"></td>
|
||||
|
@ -122,38 +122,38 @@
|
|||
</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>
|
||||
<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="mb-3 mt-3">
|
||||
<label for="restorePrice" class="form-label required">Restore Price</label>
|
||||
<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" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ tld_restore.price }}">
|
||||
<small class="form-text text-muted">Enter the price for restoring the TLD.</small>
|
||||
<small class="form-text text-muted">{{ __('Enter the price for restoring the TLD.') }}</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Premium Names</h5>
|
||||
<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>
|
||||
<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">
|
||||
Please upload a CSV file containing premium names. Each row should include a name and its corresponding pricing category, separated by a comma. Note: If one or more names in the file already exist in our system, they will be overwritten with the new information provided in the upload.
|
||||
{{ __('Please upload a CSV file containing premium names. Each row should include a name and its corresponding pricing category, separated by a comma. Note: If one or more names in the file already exist in our system, they will be overwritten with the new information provided in the upload.') }}
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<h6 class="mt-4 mb-3">Set Premium Name Price Categories</h6>
|
||||
<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>
|
||||
<th>{{ __('Category Name') }}</th>
|
||||
<th>{{ __('Price') }}</th>
|
||||
<th>{{ __('Action') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -178,13 +178,13 @@
|
|||
</tbody>
|
||||
</table>
|
||||
<small class="form-text text-muted">
|
||||
Update existing premium categories as needed. Please note: currently, deletion of categories is not available. All updates will modify existing information without removing any categories.
|
||||
{{ __('Update existing premium categories as needed. Please note: currently, deletion of categories is not available. All updates will modify existing information without removing any categories.') }}
|
||||
</small>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update TLD {{ tld.tld }}</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update TLD') }} {{ tld.tld }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -193,19 +193,19 @@
|
|||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Manage Promotions</h5>
|
||||
<h5 class="card-title">{{ __('Manage Promotions') }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive mb-3">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Promotion Name</th>
|
||||
<th>Start Date</th>
|
||||
<th>End Date</th>
|
||||
<th>Discount (%)</th>
|
||||
<th>Discount Amount</th>
|
||||
<th>Description</th>
|
||||
<th>{{ __('Promotion Name') }}</th>
|
||||
<th>{{ __('Start Date') }}</th>
|
||||
<th>{{ __('End Date') }}</th>
|
||||
<th>{{ __('Discount') }} (%)</th>
|
||||
<th>{{ __('Discount Amount') }}</th>
|
||||
<th>{{ __('Description') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -220,64 +220,64 @@
|
|||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="8">No promotions found.</td>
|
||||
<td colspan="8">{{ __('No promotions found.') }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h4 class="card-subtitle mt-3 mb-3">Create New Promotion</h4>
|
||||
<h4 class="card-subtitle mt-3 mb-3">{{ __('Create New Promotion') }}</h4>
|
||||
<form action="/registry/promotions" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}">
|
||||
<div class="mb-3">
|
||||
<label for="promotionName" class="form-label required">Promotion Name</label>
|
||||
<label for="promotionName" class="form-label required">{{ __('Promotion Name') }}</label>
|
||||
<input type="text" class="form-control" id="promotionName" name="promotionName" placeholder="Enter promotion name" required>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="promotionStart" class="form-label required">Promotion Start Date</label>
|
||||
<label for="promotionStart" class="form-label required">{{ __('Promotion Start Date') }}</label>
|
||||
<input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="promotionStart" name="promotionStart" required>
|
||||
<small class="form-text text-muted"><strong>Please Note:</strong> All times displayed are in <strong>Coordinated Universal Time (UTC)</strong></small>
|
||||
<small class="form-text text-muted"><strong>{{ __('Please Note:') }}</strong> {{ __('All times displayed are in') }} <strong>Coordinated Universal Time (UTC)</strong></small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="promotionEnd" class="form-label">Promotion End Date</label>
|
||||
<label for="promotionEnd" class="form-label">{{ __('Promotion End Date') }}</label>
|
||||
<input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="promotionEnd" name="promotionEnd">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="discountType" class="form-label required">Discount Type</label>
|
||||
<label for="discountType" class="form-label required">{{ __('Discount Type') }}</label>
|
||||
<select class="form-select" id="discountType" name="discountType" required>
|
||||
<option value="percentage">Percentage</option>
|
||||
<option value="fixed">Fixed Amount</option>
|
||||
<option value="free">Free Domains</option>
|
||||
<option value="percentage">{{ __('Percentage') }}</option>
|
||||
<option value="fixed">{{ __('Fixed Amount') }}</option>
|
||||
<option value="free">{{ __('Free Domains') }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="discountValue" class="form-label">Discount Value</label>
|
||||
<input type="text" class="form-control" id="discountValue" name="discountValue" placeholder="Enter discount value">
|
||||
<label for="discountValue" class="form-label">{{ __('Discount Value') }}</label>
|
||||
<input type="text" class="form-control" id="discountValue" name="discountValue" placeholder="{{ __('Enter discount value') }}">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="max_count" class="form-label">Maximum Discounted Items</label>
|
||||
<label for="max_count" class="form-label">{{ __('Maximum Discounted Items') }}</label>
|
||||
<input type="text" class="form-control" id="max_count" name="max_count">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="promotionConditions" class="form-label">Conditions</label>
|
||||
<textarea class="form-control" id="promotionConditions" name="promotionConditions" rows="3" placeholder="Enter conditions"></textarea>
|
||||
<label for="promotionConditions" class="form-label">{{ __('Conditions') }}</label>
|
||||
<textarea class="form-control" id="promotionConditions" name="promotionConditions" rows="3" placeholder="{{ __('Enter conditions') }}"></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="promotionDescription" class="form-label">Description</label>
|
||||
<textarea class="form-control" id="promotionDescription" name="promotionDescription" rows="3" placeholder="Enter description"></textarea>
|
||||
<label for="promotionDescription" class="form-label">{{ __('Description') }}</label>
|
||||
<textarea class="form-control" id="promotionDescription" name="promotionDescription" rows="3" placeholder="{{ __('Enter description') }}"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Promotions</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Promotions') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -286,19 +286,19 @@
|
|||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Manage Launch Phases</h5>
|
||||
<h5 class="card-title">{{ __('Manage Launch Phases') }}</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive mb-3">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Phase Type</th>
|
||||
<th>Phase Name</th>
|
||||
<th>Phase Category</th>
|
||||
<th>Phase Description</th>
|
||||
<th>Start Date</th>
|
||||
<th>End Date</th>
|
||||
<th>{{ __('Phase Type') }}</th>
|
||||
<th>{{ __('Phase Name') }}</th>
|
||||
<th>{{ __('Phase Category') }}</th>
|
||||
<th>{{ __('Phase Description') }}</th>
|
||||
<th>{{ __('Start Date') }}</th>
|
||||
<th>{{ __('End Date') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -313,18 +313,18 @@
|
|||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="7">No launch phases found.</td>
|
||||
<td colspan="7">{{ __('No launch phases found.') }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h4 class="card-subtitle mt-3 mb-3">Create New Phase</h4>
|
||||
<h4 class="card-subtitle mt-3 mb-3">{{ __('Create New Phase') }}</h4>
|
||||
<form action="/registry/phases" method="post">
|
||||
{{ csrf.field | raw }}
|
||||
<input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}">
|
||||
<div class="mb-3">
|
||||
<label for="phaseType" class="form-label required">Phase Type</label>
|
||||
<label for="phaseType" class="form-label required">{{ __('Phase Type') }}</label>
|
||||
<select class="form-select" id="phaseType" name="phaseType" required>
|
||||
<option value="sunrise">Sunrise</option>
|
||||
<option value="landrush">Landrush</option>
|
||||
|
@ -334,40 +334,40 @@
|
|||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="phaseName" class="form-label">Phase Name</label>
|
||||
<label for="phaseName" class="form-label">{{ __('Phase Name') }}</label>
|
||||
<input type="text" class="form-control" id="phaseName" name="phaseName" placeholder="Enter phase name">
|
||||
<small class="form-hint">The "Phase Name" field is required only if the "Type" is set to "Custom".</small>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="form-label">Phase Category</div>
|
||||
<div class="form-label">{{ __('Phase Category') }}</div>
|
||||
<div>
|
||||
<label class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="phaseCategory" id="First-Come-First-Serve" value="First-Come-First-Serve" checked>
|
||||
<span class="form-check-label">First-Come-First-Serve</span>
|
||||
<small class="form-hint">Single application only.</small>
|
||||
<small class="form-hint">{{ __('Single application only.') }}</small>
|
||||
</label>
|
||||
<label class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="phaseCategory" id="Application" value="Application">
|
||||
<span class="form-check-label">Application</span>
|
||||
<small class="form-hint">Multiple applications allowed.</small>
|
||||
<small class="form-hint">{{ __('Multiple applications allowed.') }}</small>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="phaseDescription" class="form-label required">Phase Description</label>
|
||||
<textarea class="form-control" id="phaseDescription" name="phaseDescription" rows="3" placeholder="Enter phase description" required></textarea>
|
||||
<label for="phaseDescription" class="form-label required">{{ __('Phase Description') }}</label>
|
||||
<textarea class="form-control" id="phaseDescription" name="phaseDescription" rows="3" placeholder="{{ __('Enter phase description') }}" required></textarea>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="phaseStart" class="form-label required">Phase Start Date</label>
|
||||
<label for="phaseStart" class="form-label required">{{ __('Phase Start Date') }}</label>
|
||||
<input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="phaseStart" name="phaseStart" required>
|
||||
<small class="form-text text-muted"><strong>Please Note:</strong> All times displayed are in <strong>Coordinated Universal Time (UTC)</strong></small>
|
||||
<small class="form-text text-muted"><strong>{{ __('Please Note:') }}</strong> {{ __('All times displayed are in') }} <strong>Coordinated Universal Time (UTC)</strong></small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="phaseEnd" class="form-label">Phase End Date</label>
|
||||
<label for="phaseEnd" class="form-label">{{ __('Phase End Date') }}</label>
|
||||
<input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="phaseEnd" name="phaseEnd">
|
||||
</div>
|
||||
</div>
|
||||
|
@ -376,7 +376,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Phases</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Phases') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -385,19 +385,7 @@
|
|||
|
||||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
|
|
@ -31,38 +31,48 @@
|
|||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h3 class="mb-3">System Settings</h3>
|
||||
<h3 class="mb-3">{{ __('System Settings') }}</h3>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="registryOperator" class="form-label required">Registry Operator Name</label>
|
||||
<input type="text" class="form-control" id="registryOperator" name="registryOperator" placeholder="Enter registry operator's name" value="{{ company_name }}" required>
|
||||
<small class="form-hint">The official name of the organization operating the registry.</small>
|
||||
<label for="registryOperator" class="form-label required">{{ __('Registry Operator Name') }}</label>
|
||||
<input type="text" class="form-control" id="registryOperator" name="registryOperator" placeholder="{{ __('Enter registry operator\'s name') }}" value="{{ company_name }}" required>
|
||||
<small class="form-hint">{{ __('The official name of the organization operating the registry.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="rdapServer" class="form-label required">{{ __('RDAP Server') }}</label>
|
||||
<input type="text" class="form-control" id="rdapServer" name="rdapServer" placeholder="{{ __('Enter registry RDAP server') }}" value="{{ rdap_server }}" required>
|
||||
<small class="form-hint">{{ __('Enter the URL of the registry\'s RDAP server. Example:') }} https://rdap.example.com</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="registryHandle" class="form-label required">Registry Handle</label>
|
||||
<input type="text" class="form-control" id="registryHandle" name="registryHandle" placeholder="Enter registry handle" value="{{ handle }}" required>
|
||||
<small class="form-hint">A unique identifier for the registry which will be appended to each object handle.</small>
|
||||
<label for="whoisServer" class="form-label required">{{ __('WHOIS Server') }}</label>
|
||||
<input type="text" class="form-control" id="whoisServer" name="whoisServer" placeholder="{{ __('Enter registry whois server') }}" value="{{ whois_server }}" required>
|
||||
<small class="form-hint">{{ __('Enter the URL of the registry\'s WHOIS server. Example:') }} whois.example.com</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="registryHandle" class="form-label required">{{ __('Registry Handle') }}</label>
|
||||
<input type="text" class="form-control" id="registryHandle" name="registryHandle" placeholder="{{ __('Enter registry handle') }}" value="{{ handle }}" required>
|
||||
<small class="form-hint">{{ __('A unique identifier for the registry which will be appended to each object handle.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="whoisServer" class="form-label required">WHOIS Server</label>
|
||||
<input type="text" class="form-control" id="whoisServer" name="whoisServer" placeholder="Enter registry whois server" value="{{ whois_server }}" required>
|
||||
<small class="form-hint">Enter the URL of the registry's WHOIS server. Example: whois.example.com</small>
|
||||
<label for="registryCurrency" class="form-label required">{{ __('Registry Currency') }}</label>
|
||||
<select class="form-select" id="registryCurrency" name="currency" required="required">
|
||||
{% for currencyCode, currencyName in uniqueCurrencies %}
|
||||
<option value="{{ currencyCode }}" {% if currency == currencyCode %}selected{% endif %}>{{ currencyName }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<small class="form-hint">{{ __('Choose the currency for all transactions. This impacts billing and financial reports. Inform stakeholders of changes.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="rdapServer" class="form-label required">RDAP Server</label>
|
||||
<input type="text" class="form-control" id="rdapServer" name="rdapServer" placeholder="Enter registry RDAP server" value="{{ rdap_server }}" required>
|
||||
<small class="form-hint">Enter the URL of the registry's RDAP server. Example: https://rdap.example.com</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Features</label>
|
||||
<label class="form-label">{{ __('Features') }}</label>
|
||||
<div class="divide-y">
|
||||
<div>
|
||||
<label class="row">
|
||||
<span class="col">Require Launch Phases</span>
|
||||
<span class="col">{{ __('Require Launch Phases') }}</span>
|
||||
<span class="col-auto">
|
||||
<label class="form-check form-check-single form-switch">
|
||||
<input class="form-check-input" type="checkbox" name="launchPhases" {% if launch_phases == 'on' %}checked{% endif %}>
|
||||
|
@ -76,36 +86,36 @@
|
|||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h3 class="mb-3">Operator Details</h3>
|
||||
<h3 class="mb-3">{{ __('Operator Details') }}</h3>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="registryOperatorVat" class="form-label required">Registry VAT/Company Number</label>
|
||||
<input type="text" class="form-control" id="registryOperatorVat" name="registryOperatorVat" placeholder="Enter registry operator's VAT number" value="{{ vat_number }}" required>
|
||||
<small class="form-hint">Enter the VAT number of the organization operating the registry, or company number if VAT is unavailable.</small>
|
||||
<label for="registryOperatorVat" class="form-label required">{{ __('Registry VAT/Company Number') }}</label>
|
||||
<input type="text" class="form-control" id="registryOperatorVat" name="registryOperatorVat" placeholder="{{ __('Enter registry operator\'s VAT number') }}" value="{{ vat_number }}" required>
|
||||
<small class="form-hint">{{ __('Enter the VAT number of the organization operating the registry, or company number if VAT is unavailable.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="contactAddress" class="form-label required">Contact Address</label>
|
||||
<input type="text" class="form-control" id="contactAddress" name="contactAddress" placeholder="Enter contact address" value="{{ address }}" required>
|
||||
<small class="form-hint">The contact address of the registry.</small>
|
||||
<label for="contactAddress" class="form-label required">{{ __('Contact Address') }}</label>
|
||||
<input type="text" class="form-control" id="contactAddress" name="contactAddress" placeholder="{{ __('Enter contact address') }}" value="{{ address }}" required>
|
||||
<small class="form-hint">{{ __('The contact address of the registry.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="contactAddress2" class="form-label required">Contact Address (Line 2)</label>
|
||||
<input type="text" class="form-control" id="contactAddress2" name="contactAddress2" placeholder="Enter contact address" value="{{ address2 }}" required>
|
||||
<small class="form-hint">The contact address of the registry. (Line 2)</small>
|
||||
<label for="contactAddress2" class="form-label required">{{ __('Contact Address') }} (Line 2)</label>
|
||||
<input type="text" class="form-control" id="contactAddress2" name="contactAddress2" placeholder="{{ __('Enter contact address') }}" value="{{ address2 }}" required>
|
||||
<small class="form-hint">{{ __('The contact address of the registry.') }} (Line 2)</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="contactEmail" class="form-label required">Contact Email</label>
|
||||
<input type="email" class="form-control" id="contactEmail" name="contactEmail" placeholder="Enter contact email" value="{{ email }}" required>
|
||||
<small class="form-hint">The email address for general inquiries to the registry.</small>
|
||||
<label for="contactEmail" class="form-label required">{{ __('Contact Email') }}</label>
|
||||
<input type="email" class="form-control" id="contactEmail" name="contactEmail" placeholder="{{ __('Enter contact email') }}" value="{{ email }}" required>
|
||||
<small class="form-hint">{{ __('The email address for general inquiries to the registry.') }}</small>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="contactPhone" class="form-label required">Contact Phone</label>
|
||||
<input type="tel" class="form-control" id="contactPhone" name="contactPhone" placeholder="Enter contact phone" value="{{ phone }}" required>
|
||||
<small class="form-hint">The phone number for general inquiries to the registry.</small>
|
||||
<label for="contactPhone" class="form-label required">{{ __('Contact Phone') }}</label>
|
||||
<input type="tel" class="form-control" id="contactPhone" name="contactPhone" placeholder="{{ __('Enter contact phone') }}" value="{{ phone }}" required>
|
||||
<small class="form-hint">{{ __('The phone number for general inquiries to the registry.') }}</small>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -115,7 +125,7 @@
|
|||
<div class="card-footer">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary">Update Details</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Update Details') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -124,18 +134,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -34,9 +34,9 @@
|
|||
<button class="btn btn-red btn-icon" onclick="downloadPDF()"><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><path d="M10 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z"></path><path d="M3 12h2a2 2 0 1 0 0 -4h-2v8"></path><path d="M17 12h3"></path><path d="M21 8h-4v8"></path></svg></button>
|
||||
</div>
|
||||
<div class="ms-auto text-secondary">
|
||||
Search:
|
||||
{{ __('Search') }}:
|
||||
<div class="ms-2 d-inline-block">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="Search users">
|
||||
<input id="search-input" type="text" class="form-control" aria-label="{{ __('Search users') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -48,18 +48,6 @@
|
|||
</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">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © 2023
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
{% include 'partials/footer.twig' %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -6,11 +6,7 @@
|
|||
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
|
||||
<title>{% block title %}{% endblock %} | Namingo</title>
|
||||
<!-- CSS files -->
|
||||
{% if route_is('domains') or route_is('applications') or route_is('contacts') or route_is('hosts') or route_is('epphistory') or route_is('registrars') or route_is('transactions') or route_is('overview') or route_is('reports') or route_is('transfers') or route_is('users') or route_is('support') or route_is('poll') or route_is('log') or route_is('invoices') or route_is('registry/tlds') %}
|
||||
{% include 'partials/css-tables.twig' %}
|
||||
{% else %}
|
||||
{% include 'partials/css.twig' %}
|
||||
{% endif %}
|
||||
{% if route_is('domains') or route_is('applications') or route_is('contacts') or route_is('hosts') or route_is('epphistory') or route_is('registrars') or route_is('transactions') or route_is('overview') or route_is('reports') or route_is('transfers') or route_is('users') or route_is('support') or route_is('poll') or route_is('log') or route_is('invoices') or route_is('registry/tlds') %}{% include 'partials/css-tables.twig' %}{% else %}{% include 'partials/css.twig' %}{% endif %}
|
||||
<style>
|
||||
@import url('https://rsms.me/inter/inter.css');
|
||||
:root {
|
||||
|
@ -32,13 +28,13 @@
|
|||
</a>
|
||||
</h1>
|
||||
<div class="navbar-nav flex-row order-md-last">
|
||||
<div class="nav-item d-none d-md-flex me-3">
|
||||
<div class="nav-item d-md-flex me-3">
|
||||
<div class="btn-list">
|
||||
<div class="dropdown small-dropdown">
|
||||
<a href="#" class="btn dropdown-toggle" data-bs-toggle="dropdown"><span class="flag flag-country-{{ uiLang }}"></span> {{ lang }}</a>
|
||||
<div class="dropdown-menu">
|
||||
<a href="/lang?en_US" class="dropdown-item"><span class="flag flag-country-us"></span> English</a>
|
||||
<a href="/lang?uk_UA" class="dropdown-item"><span class="flag flag-country-ua"></span> Ukrainian</a>
|
||||
<a href="/lang?uk_UA" class="dropdown-item"><span class="flag flag-country-ua"></span> Українська</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
<link href="/assets/css/tabler.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-flags.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-payments.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
|
||||
{% if screen_mode == 'dark' %}
|
||||
<link href="/assets/css/tabulator-dark.min.css" rel="stylesheet">
|
||||
{% else %}
|
||||
<link href="/assets/css/tabulator.min.css" rel="stylesheet">
|
||||
{% endif %}
|
||||
<link href="/assets/css/sweetalert2.min.css" rel="stylesheet">
|
||||
<style>
|
||||
.small-dropdown .dropdown-item {
|
||||
padding: 0.25rem 1.5rem;
|
||||
}
|
||||
<link href="/assets/css/tabler.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-flags.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-payments.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
|
||||
{% if screen_mode == 'dark' %}
|
||||
<link href="/assets/css/tabulator-dark.min.css" rel="stylesheet">
|
||||
{% else %}
|
||||
<link href="/assets/css/tabulator.min.css" rel="stylesheet">
|
||||
{% endif %}
|
||||
<link href="/assets/css/sweetalert2.min.css" rel="stylesheet">
|
||||
<style>
|
||||
.small-dropdown .dropdown-item {
|
||||
padding: 0.25rem 1.5rem;
|
||||
}
|
||||
|
||||
.small-dropdown .flag {
|
||||
width: 20px;
|
||||
height: 15px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
.small-dropdown .flag {
|
||||
width: 20px;
|
||||
height: 15px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
<link href="/assets/css/tabler.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-flags.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-payments.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
|
||||
<style>
|
||||
.small-dropdown .dropdown-item {
|
||||
padding: 0.25rem 1.5rem;
|
||||
}
|
||||
<link href="/assets/css/tabler.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-flags.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-payments.min.css" rel="stylesheet"/>
|
||||
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
|
||||
<style>
|
||||
.small-dropdown .dropdown-item {
|
||||
padding: 0.25rem 1.5rem;
|
||||
}
|
||||
|
||||
.small-dropdown .flag {
|
||||
width: 20px;
|
||||
height: 15px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
.small-dropdown .flag {
|
||||
width: 20px;
|
||||
height: 15px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
|
|
23
cp/resources/views/partials/footer.twig
Normal file
23
cp/resources/views/partials/footer.twig
Normal file
|
@ -0,0 +1,23 @@
|
|||
<footer class="footer footer-transparent d-print-none">
|
||||
<div class="container-xl">
|
||||
<div class="row text-center align-items-center flex-row-reverse">
|
||||
<div class="col-lg-auto ms-lg-auto">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item"><a href="https://github.com/getnamingo/registry/blob/main/LICENSE" target="_blank" class="link-secondary" rel="noopener">License</a></li>
|
||||
<li class="list-inline-item"><a href="https://github.com/getnamingo/registry" target="_blank" class="link-secondary" rel="noopener">Source code</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-12 col-lg-auto mt-3 mt-lg-0">
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
Copyright © {{ 'now' | date('Y') }}
|
||||
<a href="https://namingo.org" target="_blank" class="link-secondary" rel="noopener">Namingo</a>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
v1.0.0-beta4
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
|
@ -115,18 +115,18 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"name", width:250, headerSort:false, formatter: domainLinkFormatter, responsive:0},
|
||||
{title:"Applicant", width:150, field:"registrant.identifier", headerSort:false, responsive:2},
|
||||
{title:"Creation Date", width:250, minWidth:150, field:"crdate", headerSort:false, responsive:2},
|
||||
{title:"Phase", width:150, minWidth:100, field:"phase_type", formatter: phaseFormatter, headerSort:false, responsive:2},
|
||||
{title:"Status", width:200, field:"application_status", formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
{title:"{{ __('Name') }}", field:"name", width:250, headerSort:false, formatter: domainLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Applicant') }}", width:150, field:"registrant.identifier", headerSort:false, responsive:2},
|
||||
{title:"{{ __('Creation Date') }}", width:250, minWidth:150, field:"crdate", headerSort:false, responsive:2},
|
||||
{title:"{{ __('Phase') }}", width:150, minWidth:100, field:"phase_type", formatter: phaseFormatter, headerSort:false, responsive:2},
|
||||
{title:"{{ __('Status') }}", width:200, field:"application_status", formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
if (e.target.closest('.delete-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to delete this application?",
|
||||
title: "{{ __('Are you sure you want to delete this application?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
|
||||
|
@ -137,7 +137,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -94,17 +94,17 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Identifier", field:"identifier", width:250, headerSort:false, formatter: contactLinkFormatter, responsive:0},
|
||||
{title:"Email", field:"email", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"Phone", field:"voice", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"Status", field:"contact_status", width:200, minWidth:100, formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
{title:"{{ __('Identifier') }}", field:"identifier", width:250, headerSort:false, formatter: contactLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Email') }}", field:"email", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"{{ __('Phone') }}", field:"voice", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"{{ __('Status') }}", field:"contact_status", width:200, minWidth:100, formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
if (e.target.closest('.delete-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to delete this contact?",
|
||||
title: "{{ __('Are you sure you want to delete this contact?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
|
||||
|
@ -115,7 +115,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -112,18 +112,18 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"name", width:200, headerSort:false, formatter: domainLinkFormatter, responsive:0},
|
||||
{title:"Registrant", width:200, field:"registrant.identifier", headerSort:false, responsive:2},
|
||||
{title:"Creation Date", width:250, minWidth:150, field:"crdate", headerSort:false, responsive:2},
|
||||
{title:"Expiration Date", width:250, minWidth:150, field:"exdate", headerSort:false, responsive:2},
|
||||
{title:"Status", width:150, field:"domain_status", formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
{title:"{{ __('Name') }}", field:"name", width:200, headerSort:false, formatter: domainLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Registrant') }}", width:200, field:"registrant.identifier", headerSort:false, responsive:2},
|
||||
{title:"{{ __('Creation Date') }}", width:250, minWidth:150, field:"crdate", headerSort:false, responsive:2},
|
||||
{title:"{{ __('Expiration Date') }}", width:250, minWidth:150, field:"exdate", headerSort:false, responsive:2},
|
||||
{title:"{{ __('Status') }}", width:150, field:"domain_status", formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
if (e.target.closest('.delete-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to delete this domain?",
|
||||
title: "{{ __('Are you sure you want to delete this domain?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
|
||||
|
@ -133,9 +133,9 @@
|
|||
} else if (e.target.closest('.restore-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to restore this domain?",
|
||||
title: "{{ __('Are you sure you want to restore this domain?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let restoreUrl = e.target.closest('.restore-btn').getAttribute('data-restore-url');
|
||||
|
@ -145,9 +145,9 @@
|
|||
} else if (e.target.closest('.report-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to submit restore report for this domain?",
|
||||
title: "{{ __('Are you sure you want to submit restore report for this domain?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let reportUrl = e.target.closest('.report-btn').getAttribute('data-report-url');
|
||||
|
@ -158,7 +158,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -93,16 +93,16 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"name", width:300, headerSort:false, formatter: hostLinkFormatter, responsive:0},
|
||||
{title:"Creation Date", field:"crdate", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"Status", field:"host_status", width:300, minWidth:200, formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
{title:"{{ __('Host Name') }}", field:"name", width:300, headerSort:false, formatter: hostLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Creation Date') }}", field:"crdate", width:300, minWidth:200, headerSort:false, responsive:2},
|
||||
{title:"{{ __('Status') }}", field:"host_status", width:300, minWidth:200, formatter: statusFormatter, headerSort:false, download:false, responsive:2},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
if (e.target.closest('.delete-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to delete this host?",
|
||||
title: "{{ __('Are you sure you want to delete this host?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
|
||||
|
@ -113,7 +113,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -37,19 +37,19 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Number", field:"invoice_number", width:200, headerSort:true, formatter: invoiceLinkFormatter, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id.name", width:300, headerSort:true, responsive:0},
|
||||
{title:"Date", field:"issue_date", width:300, headerSort:true, responsive:0},
|
||||
{title:"Amount", field:"total_amount", width:200, headerSort:true, responsive:0, formatter:"money", formatterParams:{
|
||||
{title:"{{ __('Number') }}", field:"invoice_number", width:200, headerSort:true, formatter: invoiceLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id.name", width:300, headerSort:true, responsive:0},
|
||||
{title:"{{ __('Date') }}", field:"issue_date", width:300, headerSort:true, responsive:0},
|
||||
{title:"{{ __('Amount') }}", field:"total_amount", width:200, headerSort:true, responsive:0, formatter:"money", formatterParams:{
|
||||
decimal:".",
|
||||
thousand:" ",
|
||||
symbol:currency,
|
||||
negativeSign:true,
|
||||
}},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -24,12 +24,12 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"Date", field:"date", headerSort:true, responsive:0},
|
||||
{title:"Log", field:"log", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Log') }}", field:"log", headerSort:true, responsive:2},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -24,18 +24,18 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Date", field:"cldate", headerSort:true, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id", headerSort:true, responsive:2},
|
||||
{title:"Command", field:"cmd", headerSort:true, responsive:0},
|
||||
{title:"Object Type", field:"obj_type", headerSort:true, responsive:0},
|
||||
{title:"Object", field:"obj_id", headerSort:true, responsive:2},
|
||||
{title:"Result", field:"code", headerSort:true, responsive:2},
|
||||
{title:"Message", field:"msg", headerSort:true, responsive:2, download:false},
|
||||
{title:"clTRID", field:"clTRID", headerSort:true, responsive:2, download:false},
|
||||
{title:"Milliseconds", field:"svmicrosecond", headerSort:false, download:false, responsive:2},
|
||||
{title:"{{ __('Date') }}", field:"cldate", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Command') }}", field:"cmd", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Object Type') }}", field:"obj_type", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Object') }}", field:"obj_id", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Result') }}", field:"code", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Message') }}", field:"msg", headerSort:true, responsive:2, download:false},
|
||||
{title:"{{ __('clTRID') }}", field:"clTRID", headerSort:true, responsive:2, download:false},
|
||||
{title:"{{ __('Milliseconds') }}", field:"svmicrosecond", headerSort:false, download:false, responsive:2},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"Date", field:"date", headerSort:true, responsive:2},
|
||||
{title:"Description", field:"description", headerSort:true, responsive:2},
|
||||
{title:"Amount", field:"amount", headerSort:true, download:false, responsive:0, formatter:"money", formatterParams:{
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Description') }}", field:"description", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Amount') }}", field:"amount", headerSort:true, download:false, responsive:0, formatter:"money", formatterParams:{
|
||||
decimal:".",
|
||||
thousand:" ",
|
||||
symbol:currency,
|
||||
|
@ -37,7 +37,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -24,14 +24,14 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id.name", headerSort:true, responsive:2},
|
||||
{title:"Date", field:"qdate", headerSort:true, responsive:0},
|
||||
{title:"Message", field:"msg", headerSort:true, responsive:0},
|
||||
{title:"Message Type", field:"msg_type", headerSort:true, responsive:0},
|
||||
{title:"Object", field:"obj_name_or_id", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Date') }}", field:"qdate", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Message') }}", field:"msg", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Message Type') }}", field:"msg_type", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Object') }}", field:"obj_name_or_id", headerSort:true, responsive:2},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -41,19 +41,19 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"name", width:200, headerSort:true, formatter: registrarLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Name') }}", field:"name", width:200, headerSort:true, formatter: registrarLinkFormatter, responsive:0},
|
||||
{title:"IANA ID", field:"iana_id", width:300, headerSort:true, responsive:2},
|
||||
{title:"Email", field:"email", width:300, headerSort:true, responsive:2},
|
||||
{title:"Balance", field:"accountBalance", width:300, headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
|
||||
{title:"{{ __('Email') }}", field:"email", width:300, headerSort:true, responsive:2},
|
||||
{title:"{{ __('Balance') }}", field:"accountBalance", width:300, headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
|
||||
decimal:".",
|
||||
thousand:" ",
|
||||
symbol:currency,
|
||||
negativeSign:true,
|
||||
}},
|
||||
{title: "Actions", formatter: actionsFormatter, responsive:0, headerSort: false, download:false, hozAlign: "center", cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, responsive:0, headerSort: false, download:false, hozAlign: "center", cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -24,16 +24,16 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Date", field:"date", headerSort:true, responsive:0},
|
||||
{title:"Total Domains", field:"total_domains", headerSort:true, responsive:0},
|
||||
{title:"Created Domains", field:"created_domains", headerSort:true, responsive:2},
|
||||
{title:"Renewed Domains", field:"renewed_domains", headerSort:true, responsive:2},
|
||||
{title:"Transferred Domains", field:"transfered_domains", headerSort:true, responsive:2},
|
||||
{title:"Deleted Domains", field:"deleted_domains", headerSort:true, responsive:2},
|
||||
{title:"Restored Domains", field:"restored_domains", headerSort:true, responsive:2, download:false}
|
||||
{title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Total Domains') }}", field:"total_domains", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Created Domains') }}", field:"created_domains", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Renewed Domains') }}", field:"renewed_domains", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Transferred Domains') }}", field:"transfered_domains", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Deleted Domains') }}", field:"deleted_domains", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Restored Domains') }}", field:"restored_domains", headerSort:true, responsive:2, download:false}
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -76,14 +76,14 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Subject", field:"subject", width:350, minWidth:100, headerSort:true, formatter: ticketLinkFormatter, responsive:0},
|
||||
{title:"Category", field:"category_id.name", width:250, minWidth:80, headerSort:true, responsive:0},
|
||||
{title:"Status", field:"status", headerSort:true, width:250, minWidth:100, formatter: statusFormatter, responsive:2},
|
||||
{title:"Priority", field:"priority", headerSort:true, width:250, minWidth:100, formatter: priorityFormatter, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
{title:"{{ __('Subject') }}", field:"subject", width:350, minWidth:100, headerSort:true, formatter: ticketLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Category') }}", field:"category_id.name", width:250, minWidth:80, headerSort:true, responsive:0},
|
||||
{title:"{{ __('Status') }}", field:"status", headerSort:true, width:250, minWidth:100, formatter: statusFormatter, responsive:2},
|
||||
{title:"{{ __('Priority') }}", field:"priority", headerSort:true, width:250, minWidth:100, formatter: priorityFormatter, responsive:2},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -67,12 +67,12 @@
|
|||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"TLD", field:"tld", width:350, minWidth:50, headerSort:true, resizable:false, formatter: tldLinkFormatter, responsive:0},
|
||||
{ title: "Script", field: "idn_table", width:250, minWidth:80, headerSort:true, resizable:false, formatter: scriptNameFormatter, responsive:2},
|
||||
{ title: "{{ __('Script') }}", field: "idn_table", width:250, minWidth:80, headerSort:true, resizable:false, formatter: scriptNameFormatter, responsive:2},
|
||||
{title:"DNSSEC", field:"secure", width:250, minWidth:80, headerSort:true, resizable:false, formatter: secureFormatter, responsive:2},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, resizable:false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, resizable:false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -25,14 +25,14 @@
|
|||
],
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Registrar", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"Date", field:"date", headerSort:true, responsive:2},
|
||||
{title:"Command", field:"command", headerSort:true, responsive:2},
|
||||
{title:"Domain", field:"domain_name", headerSort:false, download:false, responsive:0},
|
||||
{title:"Length", field:"length_in_months", headerSort:true, responsive:2},
|
||||
{title:"From", field:"fromS", headerSort:true, responsive:2},
|
||||
{title:"To", field:"toS", headerSort:true, responsive:2},
|
||||
{title:"Amount", field:"amount", headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
|
||||
{title:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
|
||||
{title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Command') }}", field:"command", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Domain') }}", field:"domain_name", headerSort:false, download:false, responsive:0},
|
||||
{title:"{{ __('Length') }}", field:"length_in_months", headerSort:true, responsive:2},
|
||||
{title:"{{ __('From') }}", field:"fromS", headerSort:true, responsive:2},
|
||||
{title:"{{ __('To') }}", field:"toS", headerSort:true, responsive:2},
|
||||
{title:"{{ __('Amount') }}", field:"amount", headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
|
||||
decimal:".",
|
||||
thousand:" ",
|
||||
symbol:currency,
|
||||
|
@ -40,7 +40,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -21,16 +21,16 @@
|
|||
var clidValue = document.getElementById('clid').value;
|
||||
|
||||
if (hasPendingStatus && clidValue === '0') {
|
||||
actionButtons += `<a class="btn btn-success btn-icon approve-btn" id="approve-btn" href="javascript:void(0);" data-approve-url="transfer/approve/${cell.getRow().getData().name}" title="Approve Transfer"><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="M9 11l3 3l8 -8" /><path d="M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-dark btn-icon cancel-btn" id="cancel-btn" href="javascript:void(0);" data-cancel-url="transfer/cancel/${cell.getRow().getData().name}" title="Cancel Transfer"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M10 10l4 4m0 -4l-4 4" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-danger btn-icon reject-btn" id="reject-btn" href="javascript:void(0);" data-reject-url="transfer/reject/${cell.getRow().getData().name}" title="Reject Transfer"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M5.7 5.7l12.6 12.6" /></svg></a>`;
|
||||
actionButtons += `<a class="btn btn-success btn-icon approve-btn" id="approve-btn" href="javascript:void(0);" data-approve-url="transfer/approve/${cell.getRow().getData().name}" title="{{ __('Approve Transfer') }}"><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="M9 11l3 3l8 -8" /><path d="M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-dark btn-icon cancel-btn" id="cancel-btn" href="javascript:void(0);" data-cancel-url="transfer/cancel/${cell.getRow().getData().name}" title="{{ __('Cancel Transfer') }}"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M10 10l4 4m0 -4l-4 4" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-danger btn-icon reject-btn" id="reject-btn" href="javascript:void(0);" data-reject-url="transfer/reject/${cell.getRow().getData().name}" title="{{ __('Reject Transfer') }}"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M5.7 5.7l12.6 12.6" /></svg></a>`;
|
||||
} else if (clidValue === rowData.reid) {
|
||||
actionButtons += `<a class="btn btn-dark btn-icon cancel-btn" id="cancel-btn" href="javascript:void(0);" data-cancel-url="transfer/cancel/${cell.getRow().getData().name}" title="Cancel Transfer"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M10 10l4 4m0 -4l-4 4" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-dark btn-icon cancel-btn" id="cancel-btn" href="javascript:void(0);" data-cancel-url="transfer/cancel/${cell.getRow().getData().name}" title="{{ __('Cancel Transfer') }}"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M10 10l4 4m0 -4l-4 4" /></svg></a> `;
|
||||
} else if (clidValue === rowData.acid) {
|
||||
actionButtons += `<a class="btn btn-success btn-icon approve-btn" id="approve-btn" href="javascript:void(0);" data-approve-url="transfer/approve/${cell.getRow().getData().name}" title="Approve Transfer"><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="M9 11l3 3l8 -8" /><path d="M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-danger btn-icon reject-btn" id="reject-btn" href="javascript:void(0);" data-reject-url="transfer/reject/${cell.getRow().getData().name}" title="Reject Transfer"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M5.7 5.7l12.6 12.6" /></svg></a>`;
|
||||
actionButtons += `<a class="btn btn-success btn-icon approve-btn" id="approve-btn" href="javascript:void(0);" data-approve-url="transfer/approve/${cell.getRow().getData().name}" title="{{ __('Approve Transfer') }}"><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="M9 11l3 3l8 -8" /><path d="M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9" /></svg></a> `;
|
||||
actionButtons += `<a class="btn btn-danger btn-icon reject-btn" id="reject-btn" href="javascript:void(0);" data-reject-url="transfer/reject/${cell.getRow().getData().name}" title="{{ __('Reject Transfer') }}"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M5.7 5.7l12.6 12.6" /></svg></a>`;
|
||||
} else {
|
||||
actionButtons += `<strong class="text-success"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M9 12l2 2l4 -4" /></svg> Completed</strong>`;
|
||||
actionButtons += `<strong class="text-success"><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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M9 12l2 2l4 -4" /></svg> {{ __('Completed') }}</strong>`;
|
||||
}
|
||||
|
||||
return actionButtons;
|
||||
|
@ -78,17 +78,17 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"name", width:300, minWidth:200, formatter: domainLinkFormatter, headerSort:true, responsive:0},
|
||||
{title:"Initiated Date", field:"redate", width:250, minWidth:150, headerSort:true, responsive:2},
|
||||
{title:"Expiry Date", field:"acdate", width:250, minWidth:150, headerSort:true, responsive:2},
|
||||
{title:"Status", field:"trstatus", width:200, minWidth:150, headerSort:false, download:false, formatter: statusFormatter, responsive:0},
|
||||
{title: "Actions", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
{title:"{{ __('Name') }}", field:"name", width:300, minWidth:200, formatter: domainLinkFormatter, headerSort:true, responsive:0},
|
||||
{title:"{{ __('Initiated Date') }}", field:"redate", width:250, minWidth:150, headerSort:true, responsive:2},
|
||||
{title:"{{ __('Expiry Date') }}", field:"acdate", width:250, minWidth:150, headerSort:true, responsive:2},
|
||||
{title:"{{ __('Status') }}", field:"trstatus", width:200, minWidth:150, headerSort:false, download:false, formatter: statusFormatter, responsive:0},
|
||||
{title: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
|
||||
if (e.target.closest('.approve-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to approve this transfer?",
|
||||
title: "{{ __('Are you sure you want to approve this transfer?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let approveUrl = e.target.closest('.approve-btn').getAttribute('data-approve-url');
|
||||
|
@ -98,9 +98,9 @@
|
|||
} else if (e.target.closest('.cancel-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to cancel this transfer?",
|
||||
title: "{{ __('Are you sure you want to cancel this transfer?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let cancelUrl = e.target.closest('.cancel-btn').getAttribute('data-cancel-url');
|
||||
|
@ -110,9 +110,9 @@
|
|||
} else if (e.target.closest('.reject-btn')) {
|
||||
e.preventDefault(); // Prevent the default link behavior
|
||||
Swal.fire({
|
||||
title: "Are you sure you want to reject this transfer?",
|
||||
title: "{{ __('Are you sure you want to reject this transfer?') }}",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Confirm"
|
||||
confirmButtonText: "{{ __('Confirm') }}"
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
let rejectUrl = e.target.closest('.reject-btn').getAttribute('data-reject-url');
|
||||
|
@ -123,7 +123,7 @@
|
|||
}},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
|
@ -65,14 +65,14 @@
|
|||
resizableColumns:false,
|
||||
columns:[
|
||||
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
|
||||
{title:"Name", field:"username", width:200, headerSort:true, formatter: userLinkFormatter, responsive:0},
|
||||
{title:"Email", field:"email", width:300, headerSort:true, responsive:2},
|
||||
{title:"Roles", field:"roles_mask", width:200, headerSort:true, formatter: roleLabelFormatter, responsive:2},
|
||||
{title:"Verified", field:"verified", width:200, headerSort:true, formatter: verifiedFormatter, responsive:2},
|
||||
{title:"Status", field:"status", width:200, headerSort:true, formatter: statusBadgeFormatter, responsive:2},
|
||||
{title:"{{ __('Name') }}", field:"username", width:200, headerSort:true, formatter: userLinkFormatter, responsive:0},
|
||||
{title:"{{ __('Email') }}", field:"email", width:300, headerSort:true, responsive:2},
|
||||
{title:"{{ __('Roles') }}", field:"roles_mask", width:200, headerSort:true, formatter: roleLabelFormatter, responsive:2},
|
||||
{title:"{{ __('Verified') }}", field:"verified", width:200, headerSort:true, formatter: verifiedFormatter, responsive:2},
|
||||
{title:"{{ __('Status') }}", field:"status", width:200, headerSort:true, formatter: statusBadgeFormatter, responsive:2},
|
||||
],
|
||||
placeholder:function(){
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "No Data"; //set placeholder based on if there are currently any header filters
|
||||
return this.getHeaderFilters().length ? "No Matching Data" : "{{ __('No Data') }}"; //set placeholder based on if there are currently any header filters
|
||||
}
|
||||
});
|
||||
var searchInput = document.getElementById("search-input");
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue