Merge branch 'getnamingo:main' into main-lang

This commit is contained in:
wvro-org 2024-01-12 21:34:31 +03:00 committed by GitHub
commit 9497da26c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
115 changed files with 6563 additions and 3112 deletions

11
.github/dependabot.yml vendored Normal file
View 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"

View file

@ -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. - **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 ## Support

37
SECURITY.md Normal file
View 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.

View file

@ -204,6 +204,10 @@
"audit": true, "audit": true,
"skip": null "skip": null
}, },
"users_audit": {
"audit": true,
"skip": null
},
"users_confirmations": { "users_confirmations": {
"audit": null, "audit": null,
"skip": null "skip": null

View file

@ -6,6 +6,7 @@
"setbased/php-audit": "^1.9", "setbased/php-audit": "^1.9",
"monolog/monolog": "^3.5", "monolog/monolog": "^3.5",
"league/flysystem": "^3.23", "league/flysystem": "^3.23",
"league/flysystem-sftp-v3": "^3.22" "league/flysystem-sftp-v3": "^3.22",
"peppeocchi/php-cron-scheduler": "^4.0"
} }
} }

View file

@ -5,7 +5,7 @@ return [
'db_type' => 'mysql', 'db_type' => 'mysql',
'db_host' => 'localhost', 'db_host' => 'localhost',
'db_port' => 3306, 'db_port' => 3306,
'db_database' => 'your_database_name', 'db_database' => 'registry',
'db_username' => 'your_username', 'db_username' => 'your_username',
'db_password' => 'your_password', 'db_password' => 'your_password',
@ -50,7 +50,7 @@ return [
'urs_imap_username' => 'your_username', 'urs_imap_username' => 'your_username',
'urs_imap_password' => 'your_password', 'urs_imap_password' => 'your_password',
// Notifications Configuration // Message Broker Configuration
'mailer' => 'phpmailer', // sendgrid, mailgun are also available 'mailer' => 'phpmailer', // sendgrid, mailgun are also available
'mailer_api_key' => 'YOUR_API_KEY', 'mailer_api_key' => 'YOUR_API_KEY',
'mailer_domain' => 'example.com', 'mailer_domain' => 'example.com',

48
automation/cron.php Normal file
View 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();

View file

@ -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 <----------------------------#

View file

@ -140,14 +140,14 @@ Coroutine::create(function () use ($pool, $log, $c) {
$completed_zone = $builder->build($zone); $completed_zone = $builder->build($zone);
if ($c['dns_server'] == 'bind') { if ($c['dns_server'] == 'bind') {
$basePath = '/etc/bind/zones'; $basePath = '/var/lib/bind';
} elseif ($c['dns_server'] == 'nsd') { } elseif ($c['dns_server'] == 'nsd') {
$basePath = '/etc/nsd'; $basePath = '/etc/nsd';
} elseif ($c['dns_server'] == 'knot') { } elseif ($c['dns_server'] == 'knot') {
$basePath = '/etc/knot'; $basePath = '/etc/knot';
} else { } else {
// Default path // Default path
$basePath = '/etc/bind/zones'; $basePath = '/var/lib/bind';
} }
file_put_contents("{$basePath}/{$cleanedTld}.zone", $completed_zone); file_put_contents("{$basePath}/{$cleanedTld}.zone", $completed_zone);

View file

@ -277,6 +277,23 @@ class Auth
public static function changeCurrentPassword($oldPassword, $newPassword){ public static function changeCurrentPassword($oldPassword, $newPassword){
$auth = self::$auth; $auth = self::$auth;
try { 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); $auth->changePassword($oldPassword, $newPassword);
redirect()->route('profile')->with('success','Password has been changed'); redirect()->route('profile')->with('success','Password has been changed');
} }

View file

@ -5,6 +5,9 @@ namespace App\Controllers;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Selective\XmlDSig\PublicKeyStore;
use Selective\XmlDSig\CryptoVerifier;
use Selective\XmlDSig\XmlSignatureVerifier;
class ApplicationsController extends Controller class ApplicationsController extends Controller
{ {
@ -65,12 +68,8 @@ class ApplicationsController extends Controller
$invalid_domain = validate_label($domainName, $db); $invalid_domain = validate_label($domainName, $db);
if ($invalid_domain) { if ($invalid_domain) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Invalid domain name');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Invalid domain name in application',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$valid_tld = false; $valid_tld = false;
@ -85,12 +84,8 @@ class ApplicationsController extends Controller
} }
if (!$valid_tld) { if (!$valid_tld) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Invalid domain extension');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Invalid domain extension in application',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$domain_already_exist = $db->selectValue( $domain_already_exist = $db->selectValue(
@ -99,12 +94,8 @@ class ApplicationsController extends Controller
); );
if ($domain_already_exist) { if ($domain_already_exist) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Application already exists');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Application already exists',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$currentDateTime = new \DateTime(); $currentDateTime = new \DateTime();
@ -122,25 +113,16 @@ class ApplicationsController extends Controller
); );
if ($phase_details !== 'Application') { if ($phase_details !== 'Application') {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($phaseType === 'claims') { if ($phaseType === 'claims') {
if (!isset($data['noticeid']) || $data['noticeid'] === '' || if (!isset($data['noticeid']) || $data['noticeid'] === '' ||
!isset($data['notafter']) || $data['notafter'] === '' || !isset($data['notafter']) || $data['notafter'] === '' ||
!isset($data['accepted']) || $data['accepted'] === '') { !isset($data['accepted']) || $data['accepted'] === '') {
// Trigger an error or handle the situation as needed $this->container->get('flash')->addMessage('error', "Error creating application: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'");
return view($response, 'admin/domains/createApplication.twig', [ return $response->withHeader('Location', '/application/create')->withStatus(302);
'domainName' => $domainName,
'error' => "Error: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'",
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$noticeid = $data['noticeid']; $noticeid = $data['noticeid'];
@ -151,6 +133,66 @@ class ApplicationsController extends Controller
$notafter = null; $notafter = null;
$accepted = 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( $domain_already_reserved = $db->selectValue(
'SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1', 'SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1',
@ -158,12 +200,8 @@ class ApplicationsController extends Controller
); );
if ($domain_already_reserved) { if ($domain_already_reserved) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Domain name in application is reserved or restricted');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Domain name in application is reserved or restricted',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$date_add = 12; $date_add = 12;
@ -177,21 +215,13 @@ class ApplicationsController extends Controller
$price = $returnValue['price']; $price = $returnValue['price'];
if (!$price) { if (!$price) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The price, period and currency for such TLD are not declared');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The price, period and currency for such TLD are not declared',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if (($registrar_balance + $creditLimit) < $price) { if (($registrar_balance + $creditLimit) < $price) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Low credit: minimum threshold reached');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Low credit: minimum threshold reached',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$nameservers = array_filter($data['nameserver'] ?? [], function($value) { $nameservers = array_filter($data['nameserver'] ?? [], function($value) {
@ -206,31 +236,19 @@ class ApplicationsController extends Controller
if (!empty($nameservers)) { if (!empty($nameservers)) {
if (count($nameservers) !== count(array_unique($nameservers))) { if (count($nameservers) !== count(array_unique($nameservers))) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Duplicate nameservers detected. Please provide unique nameservers.');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Duplicate nameservers detected. Please provide unique nameservers.',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
foreach ($nameservers as $index => $nameserver) { foreach ($nameservers as $index => $nameserver) {
if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) { if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Invalid hostName');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Invalid hostName',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
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) { 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', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Invalid hostName');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Invalid hostName',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
} }
@ -240,21 +258,13 @@ class ApplicationsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Registrant does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Registrant does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
@ -263,21 +273,13 @@ class ApplicationsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Admin contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Admin contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
@ -286,21 +288,13 @@ class ApplicationsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Tech contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Tech contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
@ -309,49 +303,29 @@ class ApplicationsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Billing contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Billing contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
if (!$authInfo) { if (!$authInfo) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Missing application authinfo');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Missing application authinfo',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if (strlen($authInfo) < 6 || strlen($authInfo) > 16) { if (strlen($authInfo) < 6 || strlen($authInfo) > 16) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Password needs to be at least 6 and up to 16 characters long');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Password needs to be at least 6 and up to 16 characters long',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if (!preg_match('/[A-Z]/', $authInfo)) { if (!preg_match('/[A-Z]/', $authInfo)) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: Password should have both upper and lower case characters');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Password should have both upper and lower case characters',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$registrant_id = $db->selectValue( $registrant_id = $db->selectValue(
@ -535,12 +509,8 @@ class ApplicationsController extends Controller
if ($internal_host) { if ($internal_host) {
if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) { if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) {
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating application: No IPv4 or IPv6 addresses provided for internal host');
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Error: No IPv4 or IPv6 addresses provided for internal host',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) { if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) {
@ -604,20 +574,12 @@ class ApplicationsController extends Controller
$db->commit(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Database failure: ' . $e->getMessage(),
'registrars' => $registrars,
'registrar' => $registrar,
]);
} catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) { } catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/domains/createApplication.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'domainName' => $domainName, return $response->withHeader('Location', '/application/create')->withStatus(302);
'error' => 'Database failure: ' . $e->getMessage(),
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$crdate = $db->selectValue( $crdate = $db->selectValue(

View file

@ -59,6 +59,8 @@ class AuthController extends Controller
* @throws \Pinga\Auth\AuthError * @throws \Pinga\Auth\AuthError
*/ */
public function login(Request $request, Response $response){ public function login(Request $request, Response $response){
global $container;
$data = $request->getParsedBody(); $data = $request->getParsedBody();
if(isset($data['remember'])){ if(isset($data['remember'])){
$remember = $data['remember']; $remember = $data['remember'];
@ -71,8 +73,25 @@ class AuthController extends Controller
$code = null; $code = null;
} }
$login = Auth::login($data['email'], $data['password'], $remember, $code); $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'); redirect()->route('home');
}
} }
/** /**
@ -80,6 +99,23 @@ class AuthController extends Controller
*/ */
public function logout() 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(); Auth::logout();
redirect()->route('login'); redirect()->route('login');
} }

View file

@ -58,36 +58,21 @@ class ContactsController extends Controller
$authInfo_pw = $data['authInfo'] ?? null; $authInfo_pw = $data['authInfo'] ?? null;
if (!$contactID) { if (!$contactID) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Please provide a contact ID');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Please provide a contact ID',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
// Validation for contact ID // Validation for contact ID
$invalid_identifier = validate_identifier($contactID); $invalid_identifier = validate_identifier($contactID);
if ($invalid_identifier) { if ($invalid_identifier) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: ' . $invalid_identifier);
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => $invalid_identifier,
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
$contact = $db->select('SELECT * FROM contact WHERE identifier = ?', [$contactID]); $contact = $db->select('SELECT * FROM contact WHERE identifier = ?', [$contactID]);
if ($contact) { if ($contact) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Contact ID already exists');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Contact ID already exists',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
$result = $db->selectRow('SELECT registrar_id FROM registrar_users WHERE user_id = ?', [$_SESSION['auth_user_id']]); $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) {
if (!$postalInfoIntName) { if (!$postalInfoIntName) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Missing contact name');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Missing contact name',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntName)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntName)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact name');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact name',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ($postalInfoIntOrg) { if ($postalInfoIntOrg) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntOrg)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntOrg)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact org');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact org',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoIntStreet1) { if ($postalInfoIntStreet1) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet1)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet1)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoIntStreet2) { if ($postalInfoIntStreet2) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet2)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet2)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street 2');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoIntStreet3) { if ($postalInfoIntStreet3) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet3)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet3)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact street 3');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoIntCity)) { if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoIntCity)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact city');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact city',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ($postalInfoIntSp) { if ($postalInfoIntSp) {
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoIntSp)) { if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoIntSp)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact state/province');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact state/province',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoIntPc) { if ($postalInfoIntPc) {
if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoIntPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoIntPc)) { if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoIntPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoIntPc)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid contact postal code');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid contact postal code',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
@ -205,167 +145,92 @@ class ContactsController extends Controller
if ($postalInfoLocName) { if ($postalInfoLocName) {
if (!$postalInfoLocName) { if (!$postalInfoLocName) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Missing loc contact name');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Missing loc contact name',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocName)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocName)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact name');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact name',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ($postalInfoLocOrg) { if ($postalInfoLocOrg) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocOrg)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocOrg)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact org');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact org',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoLocStreet1) { if ($postalInfoLocStreet1) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet1)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet1)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoLocStreet2) { if ($postalInfoLocStreet2) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet2)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet2)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street 2');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoLocStreet3) { if ($postalInfoLocStreet3) {
if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet3)) { if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet3)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact street 3');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact street',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoLocCity)) { if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoLocCity)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact city');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact city',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ($postalInfoLocSp) { if ($postalInfoLocSp) {
if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoLocSp)) { if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoLocSp)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact state/province');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact state/province',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
if ($postalInfoLocPc) { if ($postalInfoLocPc) {
if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoLocPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoLocPc)) { if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoLocPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoLocPc)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Invalid loc contact postal code');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Invalid loc contact postal code',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
} }
if ($voice && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $voice) || strlen($voice) > 17)) { if ($voice && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $voice) || strlen($voice) > 17)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Voice must be (\+[0-9]{1,3}\.[0-9]{1,14})');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Voice must be (\+[0-9]{1,3}\.[0-9]{1,14})',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ($fax && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $fax) || strlen($fax) > 17)) { if ($fax && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $fax) || strlen($fax) > 17)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Fax must be (\+[0-9]{1,3}\.[0-9]{1,14})');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Fax must be (\+[0-9]{1,3}\.[0-9]{1,14})',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Email address failed check');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Email address failed check',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if (!$authInfo_pw) { if (!$authInfo_pw) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Email contact authinfo missing');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Email contact authinfo',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if ((strlen($authInfo_pw) < 6) || (strlen($authInfo_pw) > 16)) { if ((strlen($authInfo_pw) < 6) || (strlen($authInfo_pw) > 16)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Password needs to be at least 6 and up to 16 characters long');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Password needs to be at least 6 and up to 16 characters long',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
if (!preg_match('/[A-Z]/', $authInfo_pw)) { if (!preg_match('/[A-Z]/', $authInfo_pw)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: Password should have both upper and lower case characters');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'Password should have both upper and lower case characters',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
$disclose_voice = isset($data['disclose_voice']) ? 1 : 0; $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'; $nin_type = (isset($data['isBusiness']) && $data['isBusiness'] === 'on') ? 'business' : 'personal';
if (!preg_match('/\d/', $nin)) { if (!preg_match('/\d/', $nin)) {
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Unable to create contact: NIN should contain one or more numbers');
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => 'NIN should contain one or more numbers',
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
} }
@ -480,13 +340,8 @@ class ContactsController extends Controller
$db->commit(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'contactID' => $contactID, return $response->withHeader('Location', '/contact/create')->withStatus(302);
'error' => $e->getMessage(),
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
$crdate = $db->selectValue( $crdate = $db->selectValue(
@ -494,13 +349,8 @@ class ContactsController extends Controller
[$contact_id] [$contact_id]
); );
return view($response, 'admin/contacts/createContact.twig', [ $this->container->get('flash')->addMessage('success', 'Contact ' . $contactID . ' has been created successfully on ' . $crdate);
'contactID' => $contactID, return $response->withHeader('Location', '/contacts')->withStatus(302);
'crdate' => $crdate,
'registrars' => $registrars,
'countries' => $countries,
'registrar' => $registrar,
]);
} }
$iso3166 = new ISO3166(); $iso3166 = new ISO3166();

View file

@ -6,6 +6,9 @@ use App\Models\Domain;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Selective\XmlDSig\PublicKeyStore;
use Selective\XmlDSig\CryptoVerifier;
use Selective\XmlDSig\XmlSignatureVerifier;
class DomainsController extends Controller class DomainsController extends Controller
{ {
@ -145,13 +148,8 @@ class DomainsController extends Controller
$invalid_domain = validate_label($domainName, $db); $invalid_domain = validate_label($domainName, $db);
if ($invalid_domain) { if ($invalid_domain) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid domain name');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid domain name',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$valid_tld = false; $valid_tld = false;
@ -166,13 +164,8 @@ class DomainsController extends Controller
} }
if (!$valid_tld) { if (!$valid_tld) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid domain extension');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid domain extension',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$domain_already_exist = $db->selectValue( $domain_already_exist = $db->selectValue(
@ -181,13 +174,8 @@ class DomainsController extends Controller
); );
if ($domain_already_exist) { if ($domain_already_exist) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Domain name already exists');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Domain name already exists',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$currentDateTime = new \DateTime(); $currentDateTime = new \DateTime();
@ -207,40 +195,20 @@ class DomainsController extends Controller
if ($phase_details !== 'First-Come-First-Serve') { if ($phase_details !== 'First-Come-First-Serve') {
if ($phaseType !== 'none') { if ($phaseType !== 'none') {
if ($phaseType == null && $phaseType == '') { if ($phaseType == null && $phaseType == '') {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} else if ($phase_details == null) { } else if ($phase_details == null) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is currently not active.');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The launch phase ' . $phaseType . ' is currently not active.',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
} else if ($phaseType !== 'none') { } else if ($phaseType !== 'none') {
if ($phaseType == null && $phaseType == '') { if ($phaseType == null && $phaseType == '') {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The launch phase ' . $phaseType . ' is improperly configured. Please check the settings or contact support.',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} else if ($phase_details == null) { } else if ($phase_details == null) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The launch phase ' . $phaseType . ' is currently not active.');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The launch phase ' . $phaseType . ' is currently not active.',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
@ -248,14 +216,8 @@ class DomainsController extends Controller
if (!isset($data['noticeid']) || $data['noticeid'] === '' || if (!isset($data['noticeid']) || $data['noticeid'] === '' ||
!isset($data['notafter']) || $data['notafter'] === '' || !isset($data['notafter']) || $data['notafter'] === '' ||
!isset($data['accepted']) || $data['accepted'] === '') { !isset($data['accepted']) || $data['accepted'] === '') {
// Trigger an error or handle the situation as needed $this->container->get('flash')->addMessage('error', "Error creating domain: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'");
return view($response, 'admin/domains/createDomain.twig', [ return $response->withHeader('Location', '/domain/create')->withStatus(302);
'domainName' => $domainName,
'error' => "Error: 'noticeid', 'notafter', or 'accepted' cannot be empty when phaseType is 'claims'",
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$noticeid = $data['noticeid']; $noticeid = $data['noticeid'];
@ -266,6 +228,66 @@ class DomainsController extends Controller
$notafter = null; $notafter = null;
$accepted = 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( $domain_already_reserved = $db->selectValue(
'SELECT id FROM reserved_domain_names WHERE name = ? LIMIT 1', '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'); $this->container->get('flash')->addMessage('error', 'Domain ' . $domainName . ' is not available: Allocation Token mismatch');
return $response->withHeader('Location', '/domain/create')->withStatus(302); return $response->withHeader('Location', '/domain/create')->withStatus(302);
} }
} else { } else {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Domain name is reserved or restricted');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Domain name is reserved or restricted',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
if ($registrationYears && (($registrationYears < 1) || ($registrationYears > 10))) { if ($registrationYears && (($registrationYears < 1) || ($registrationYears > 10))) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Domain period must be from 1 to 10');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Domain period must be from 1 to 10',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} elseif (!$registrationYears) { } elseif (!$registrationYears) {
$registrationYears = 1; $registrationYears = 1;
} }
@ -323,23 +335,13 @@ class DomainsController extends Controller
$price = $returnValue['price']; $price = $returnValue['price'];
if (!$price) { if (!$price) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The price, period and currency for such TLD are not declared');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The price, period and currency for such TLD are not declared',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if (($registrar_balance + $creditLimit) < $price) { if (($registrar_balance + $creditLimit) < $price) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Low credit: minimum threshold reached');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Low credit: minimum threshold reached',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$nameservers = array_filter($data['nameserver'] ?? [], function($value) { $nameservers = array_filter($data['nameserver'] ?? [], function($value) {
@ -354,34 +356,19 @@ class DomainsController extends Controller
if (!empty($nameservers)) { if (!empty($nameservers)) {
if (count($nameservers) !== count(array_unique($nameservers))) { if (count($nameservers) !== count(array_unique($nameservers))) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Duplicate nameservers detected. Please provide unique nameservers.');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Duplicate nameservers detected. Please provide unique nameservers.',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
foreach ($nameservers as $index => $nameserver) { foreach ($nameservers as $index => $nameserver) {
if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) { if (preg_match("/^-|^\.-|-\.$|^\.$/", $nameserver)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid hostName');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid hostName',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
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) { 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', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid hostName');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid hostName',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
} }
@ -391,23 +378,13 @@ class DomainsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactRegistrant]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Registrant does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Registrant does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
@ -416,23 +393,13 @@ class DomainsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactAdmin]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Admin contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Admin contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
@ -441,23 +408,13 @@ class DomainsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactTech]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Tech contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Tech contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
@ -466,54 +423,29 @@ class DomainsController extends Controller
$row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]); $row = $db->selectRow('SELECT id, clid FROM contact WHERE identifier = ?', [$contactBilling]);
if (!$row) { if (!$row) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Billing contact does not exist');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Billing contact does not exist',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if ($clid != $row['clid']) { if ($clid != $row['clid']) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: The contact requested in the command does NOT belong to the current registrar');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'The contact requested in the command does NOT belong to the current registrar',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
if (!$authInfo) { if (!$authInfo) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Missing domain authinfo');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Missing domain authinfo',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if (strlen($authInfo) < 6 || strlen($authInfo) > 16) { if (strlen($authInfo) < 6 || strlen($authInfo) > 16) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Password needs to be at least 6 and up to 16 characters long');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Password needs to be at least 6 and up to 16 characters long',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if (!preg_match('/[A-Z]/', $authInfo)) { if (!preg_match('/[A-Z]/', $authInfo)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Password should have both upper and lower case characters');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Password should have both upper and lower case characters',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$registrant_id = $db->selectValue( $registrant_id = $db->selectValue(
@ -617,47 +549,27 @@ class DomainsController extends Controller
// Validate keyTag // Validate keyTag
if (!empty($dsKeyTag)) { if (!empty($dsKeyTag)) {
if (!is_int($dsKeyTag)) { if (!is_int($dsKeyTag)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete key tag provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Incomplete key tag provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if ($dsKeyTag < 0 || $dsKeyTag > 65535) { if ($dsKeyTag < 0 || $dsKeyTag > 65535) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete key tag provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Incomplete key tag provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
// Validate alg // Validate alg
$validAlgorithms = [8, 13, 14, 15, 16]; $validAlgorithms = [8, 13, 14, 15, 16];
if (!empty($dsAlg) && !in_array($dsAlg, $validAlgorithms)) { if (!empty($dsAlg) && !in_array($dsAlg, $validAlgorithms)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete algorithm provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Incomplete algorithm provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
// Validate digestType and digest // Validate digestType and digest
if (!empty($dsDigestType) && !is_int($dsDigestType)) { if (!empty($dsDigestType) && !is_int($dsDigestType)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Incomplete digest type provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Incomplete digest type provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$validDigests = [ $validDigests = [
2 => 64, // SHA-256 2 => 64, // SHA-256
@ -665,13 +577,8 @@ class DomainsController extends Controller
]; ];
if (!empty($dsDigest)) { if (!empty($dsDigest)) {
if (strlen($dsDigest) != $validDigests[$dsDigestType] || !ctype_xdigit($dsDigest)) { if (strlen($dsDigest) != $validDigests[$dsDigestType] || !ctype_xdigit($dsDigest)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid digest length or format');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid digest length or format',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
} }
@ -679,46 +586,26 @@ class DomainsController extends Controller
// Validate flags // Validate flags
$validFlags = [256, 257]; $validFlags = [256, 257];
if (!empty($dnskeyFlags) && !in_array($dnskeyFlags, $validFlags)) { if (!empty($dnskeyFlags) && !in_array($dnskeyFlags, $validFlags)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid flags provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid flags provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
// Validate protocol // Validate protocol
if (!empty($dnskeyProtocol) && $dnskeyProtocol != 3) { if (!empty($dnskeyProtocol) && $dnskeyProtocol != 3) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid protocol provided');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid protocol provided',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
// Validate algKeyData // Validate algKeyData
if (!empty($dnskeyAlg)) { if (!empty($dnskeyAlg)) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid algorithm encoding');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid algorithm encoding',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
// Validate pubKey // Validate pubKey
if (!empty($dnskeyPubKey) && base64_encode(base64_decode($dnskeyPubKey, true)) !== $dnskeyPubKey) { if (!empty($dnskeyPubKey) && base64_encode(base64_decode($dnskeyPubKey, true)) !== $dnskeyPubKey) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: Invalid public key encoding');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Invalid public key encoding',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if (!empty($dsKeyTag)) { if (!empty($dsKeyTag)) {
@ -874,13 +761,8 @@ class DomainsController extends Controller
if ($internal_host) { if ($internal_host) {
if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) { if (empty($nameserver_ipv4[$index]) && empty($nameserver_ipv6[$index])) {
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating domain: No IPv4 or IPv6 addresses provided for internal host');
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Error: No IPv4 or IPv6 addresses provided for internal host',
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) { if (isset($nameserver_ipv4[$index]) && !empty($nameserver_ipv4[$index])) {
@ -965,22 +847,12 @@ class DomainsController extends Controller
$db->commit(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Database failure: ' . $e->getMessage(),
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) { } catch (\Pinga\Db\Throwable\IntegrityConstraintViolationException $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/domains/createDomain.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'domainName' => $domainName, return $response->withHeader('Location', '/domain/create')->withStatus(302);
'error' => 'Database failure: ' . $e->getMessage(),
'registrars' => $registrars,
'registrar' => $registrar,
'launch_phases' => $launch_phases
]);
} }
$crdate = $db->selectValue( $crdate = $db->selectValue(
@ -1020,7 +892,8 @@ class DomainsController extends Controller
'currencySymbol' => $symbol, 'currencySymbol' => $symbol,
'currencyPosition' => $position, 'currencyPosition' => $position,
'registrar' => $registrar, 'registrar' => $registrar,
'launch_phases' => $launch_phases 'launch_phases' => $launch_phases,
'currency' => $currency,
]); ]);
} }
@ -2000,7 +1873,8 @@ class DomainsController extends Controller
'maxYears' => $maxYears, 'maxYears' => $maxYears,
'currentUri' => $uri, 'currentUri' => $uri,
'currencySymbol' => $symbol, 'currencySymbol' => $symbol,
'currencyPosition' => $position 'currencyPosition' => $position,
'currency' => $currency
]); ]);
} else { } else {
// Domain does not exist, redirect to the domains view // Domain does not exist, redirect to the domains view
@ -2635,6 +2509,7 @@ class DomainsController extends Controller
'registrars' => $registrars, 'registrars' => $registrars,
'currencySymbol' => $symbol, 'currencySymbol' => $symbol,
'currencyPosition' => $position, 'currencyPosition' => $position,
'currency' => $currency
]); ]);
} }

View file

@ -105,9 +105,13 @@ class FinancialsController extends Controller
$balance = $db->selectRow('SELECT name, accountBalance, creditLimit FROM registrar WHERE id = ?', $balance = $db->selectRow('SELECT name, accountBalance, creditLimit FROM registrar WHERE id = ?',
[ $_SESSION["auth_registrar_id"] ] [ $_SESSION["auth_registrar_id"] ]
); );
$currency = $_SESSION['_currency'];
$stripe_key = envi('STRIPE_PUBLISHABLE_KEY');
return view($response,'admin/financials/deposit-registrar.twig', [ 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(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/financials/deposit.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: '.$e->getMessage());
'error' => $e->getMessage(), return $response->withHeader('Location', '/deposit')->withStatus(302);
'registrars' => $registrars
]);
} }
return view($response, 'admin/financials/deposit.twig', [ $this->container->get('flash')->addMessage('success', 'Deposit successfully added. The registrar\'s account balance has been updated.');
'deposit' => $amount, return $response->withHeader('Location', '/deposit')->withStatus(302);
'registrars' => $registrars
]);
} else { } else {
return view($response, 'admin/financials/deposit.twig', [ $this->container->get('flash')->addMessage('error', 'Invalid entry: Deposit amount must be positive. Please enter a valid amount.');
'error' => 'Invalid entry: Deposit amount must be positive. Please enter a valid amount.', return $response->withHeader('Location', '/deposit')->withStatus(302);
'registrars' => $registrars
]);
} }
} }
$db = $this->container->get('db'); $db = $this->container->get('db');
$registrars = $db->select("SELECT id, clid, name FROM registrar"); $registrars = $db->select("SELECT id, clid, name FROM registrar");
$currency = $_SESSION['_currency'];
return view($response,'admin/financials/deposit.twig', [ return view($response,'admin/financials/deposit.twig', [
'registrars' => $registrars 'registrars' => $registrars,
'currency' => $currency
]); ]);
} }

View file

@ -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) { 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); $host_id_already_exist = $hostModel->getHostByNom($hostName);
if ($host_id_already_exist) { if ($host_id_already_exist) {
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating host: host name ' . $hostName . ' already exists');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'host name already exists',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} else { } else {
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host name');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'Invalid host name',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$result = $db->selectRow('SELECT registrar_id FROM registrar_users WHERE user_id = ?', [$_SESSION['auth_user_id']]); $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) { if ($ipv4) {
$ipv4 = normalize_v4_address($ipv4); $ipv4 = normalize_v4_address($ipv4);
if (!filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if (!filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host addr v4');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'Invalid host addr v4',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
if ($ipv6) { if ($ipv6) {
$ipv6 = normalize_v6_address($ipv6); $ipv6 = normalize_v6_address($ipv6);
if (!filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { if (!filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating host: Invalid host addr v6');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'Invalid host addr v6',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
@ -114,22 +98,14 @@ class HostsController extends Controller
} }
if (!$domain_exist) { if (!$domain_exist) {
return view($response, 'admin/hosts/createHost.twig', [ $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');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'A host name object can NOT be created in a repository for which no superordinate domain name object exists',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($_SESSION['auth_roles'] !== 0) { if ($_SESSION['auth_roles'] !== 0) {
if ($clid != $clid_domain) { if ($clid != $clid_domain) {
return view($response, 'admin/hosts/createHost.twig', [ $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');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'The domain name belongs to another registrar, you are not allowed to create hosts for it',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
@ -151,12 +127,8 @@ class HostsController extends Controller
$host_id = $db->getLastInsertId(); $host_id = $db->getLastInsertId();
if (!$ipv4 && !$ipv6) { if (!$ipv4 && !$ipv6) {
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating host: At least one of IPv4 or IPv6 must be provided');
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => 'At least one of IPv4 or IPv6 must be provided',
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
if ($ipv4) { if ($ipv4) {
@ -195,12 +167,8 @@ class HostsController extends Controller
$db->commit(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'hostName' => $hostName, return $response->withHeader('Location', '/host/create')->withStatus(302);
'error' => $e->getMessage(),
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
$crdate = $db->selectValue( $crdate = $db->selectValue(
@ -208,12 +176,8 @@ class HostsController extends Controller
[$hostName] [$hostName]
); );
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('success', 'Host ' . $hostName . ' has been created successfully on ' . $crdate);
'hostName' => $hostName, return $response->withHeader('Location', '/hosts')->withStatus(302);
'crdate' => $crdate,
'registrars' => $registrars,
'registrar' => $registrar,
]);
} else { } else {
$currentDateTime = new \DateTime(); $currentDateTime = new \DateTime();
$crdate = $currentDateTime->format('Y-m-d H:i:s.v'); $crdate = $currentDateTime->format('Y-m-d H:i:s.v');
@ -242,12 +206,8 @@ class HostsController extends Controller
[$hostName] [$hostName]
); );
return view($response, 'admin/hosts/createHost.twig', [ $this->container->get('flash')->addMessage('success', 'Host ' . $hostName . ' has been created successfully on ' . $crdate);
'hostName' => $hostName, return $response->withHeader('Location', '/hosts')->withStatus(302);
'crdate' => $crdate,
'registrars' => $registrars,
'registrar' => $registrar,
]);
} }
} }
} }

View file

@ -73,12 +73,16 @@ class ProfileController extends Controller
'SELECT * FROM users_webauthn WHERE user_id = ?', 'SELECT * FROM users_webauthn WHERE user_id = ?',
[$userId] [$userId]
); );
$user_audit = $db->select(
'SELECT * FROM users_audit WHERE user_id = ? ORDER BY event_time DESC',
[$userId]
);
if ($is_2fa_activated) { 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) { } 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 { } 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 { 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( $db->update(
'users', 'users',
[ [

View file

@ -98,10 +98,8 @@ class RegistrarsController extends Controller
// Trim the final semicolon and space // Trim the final semicolon and space
$errorText = rtrim($errorText, '; '); $errorText = rtrim($errorText, '; ');
return view($response, 'admin/registrars/create.twig', [ $this->container->get('flash')->addMessage('error', 'Error creating registrar: ' . $errorText);
'countries' => $countries, return $response->withHeader('Location', '/registrar/create')->withStatus(302);
'error' => $errorText,
]);
} }
$db->beginTransaction(); $db->beginTransaction();
@ -270,16 +268,12 @@ class RegistrarsController extends Controller
$db->commit(); $db->commit();
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
return view($response, 'admin/registrars/create.twig', [ $this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage());
'error' => $e->getMessage(), return $response->withHeader('Location', '/registrar/create')->withStatus(302);
'countries' => $countries,
]);
} }
return view($response,'admin/registrars/create.twig', [ $this->container->get('flash')->addMessage('success', 'Registrar ' . $data['name'] . ' successfully created and is now active.');
'registrar' => $data['name'], return $response->withHeader('Location', '/registrars')->withStatus(302);
'countries' => $countries,
]);
} }
$iso3166 = new ISO3166(); $iso3166 = new ISO3166();
@ -334,7 +328,7 @@ class RegistrarsController extends Controller
$registrarWhitelist = $db->select('SELECT addr FROM registrar_whitelist WHERE registrar_id = ?', $registrarWhitelist = $db->select('SELECT addr FROM registrar_whitelist WHERE registrar_id = ?',
[ $registrar['id'] ]); [ $registrar['id'] ]);
// Check if RegistrarOTE is not empty // Check if RegistrarOTE is not empty
if (!empty($registrarOte)) { if (is_array($registrarOte) && !empty($registrarOte)) {
// Split the results into two groups // Split the results into two groups
$firstHalf = array_slice($registrarOte, 0, 5); $firstHalf = array_slice($registrarOte, 0, 5);
$secondHalf = array_slice($registrarOte, 5); $secondHalf = array_slice($registrarOte, 5);

View file

@ -72,12 +72,9 @@ class SupportController extends Controller
'categories' => $categories 'categories' => $categories
]); ]);
} }
return view($response, 'admin/support/view.twig', [ $this->container->get('flash')->addMessage('success', 'Support ticket ' . $subject . ' has been created successfully!');
'categories' => $categories, return $response->withHeader('Location', '/support')->withStatus(302);
'subject' => $subject,
]);
} }
$db = $this->container->get('db'); $db = $this->container->get('db');

View file

@ -6,6 +6,7 @@ use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Respect\Validation\Validator as v; use Respect\Validation\Validator as v;
use League\ISO3166\ISO3166;
class SystemController extends Controller class SystemController extends Controller
{ {
@ -142,8 +143,19 @@ class SystemController extends Controller
'name' => "rdap_server" 'name' => "rdap_server"
] ]
); );
$db->update(
'settings',
[
'value' => $data['currency']
],
[
'name' => "currency"
]
);
$db->commit(); $db->commit();
$_SESSION['_currency'] = $data['currency'];
} catch (Exception $e) { } catch (Exception $e) {
$db->rollBack(); $db->rollBack();
$this->container->get('flash')->addMessage('error', 'Database failure: ' . $e->getMessage()); $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); return $response->withHeader('Location', '/registry')->withStatus(302);
} }
$iso3166 = new ISO3166();
$countries = $iso3166->all();
$db = $this->container->get('db'); $db = $this->container->get('db');
$company_name = $db->selectValue("SELECT value FROM settings WHERE name = 'company_name'"); $company_name = $db->selectValue("SELECT value FROM settings WHERE name = 'company_name'");
$vat_number = $db->selectValue("SELECT value FROM settings WHERE name = 'vat_number'"); $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'"); $launch_phases = $db->selectValue("SELECT value FROM settings WHERE name = 'launch_phases'");
$whois_server = $db->selectValue("SELECT value FROM settings WHERE name = 'whois_server'"); $whois_server = $db->selectValue("SELECT value FROM settings WHERE name = 'whois_server'");
$rdap_server = $db->selectValue("SELECT value FROM settings WHERE name = 'rdap_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', [ return view($response,'admin/system/registry.twig', [
'company_name' => $company_name, 'company_name' => $company_name,
@ -177,7 +202,9 @@ class SystemController extends Controller
'handle' => $handle, 'handle' => $handle,
'launch_phases' => $launch_phases, 'launch_phases' => $launch_phases,
'whois_server' => $whois_server, '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); return $response->withHeader('Location', '/registry/reserved')->withStatus(302);
} }
$db = $this->container->get('db'); $db = $this->container->get('db');
$types = $db->select("SELECT DISTINCT type FROM reserved_domain_names"); $types = $db->select("SELECT DISTINCT type FROM reserved_domain_names");
// Get the current URI // Get the current URI
$uri = $request->getUri()->getPath(); $uri = $request->getUri()->getPath();
// Set default types if $types is empty
if (empty($types)) {
$types = [
['type' => 'reserved'],
['type' => 'restricted']
];
}
$categories = []; $categories = [];
foreach ($types as $type) { foreach ($types as $type) {
$typeNames = $db->select( $typeNames = $db->select(
'SELECT name FROM reserved_domain_names WHERE type = ?', 'SELECT name FROM reserved_domain_names WHERE type = ?',
[ $type['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', [ return view($response,'admin/system/manageReserved.twig', [

View file

@ -6,6 +6,7 @@ $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
$dotenv->load(); $dotenv->load();
// Retrieve database connection details from environment variables // Retrieve database connection details from environment variables
$dbDriver = $_ENV['DB_DRIVER'];
$dbHost = $_ENV['DB_HOST']; $dbHost = $_ENV['DB_HOST'];
$dbName = $_ENV['DB_DATABASE']; $dbName = $_ENV['DB_DATABASE'];
$dbUser = $_ENV['DB_USERNAME']; $dbUser = $_ENV['DB_USERNAME'];
@ -26,12 +27,17 @@ $hashedPassword = password_hash($newPW, PASSWORD_ARGON2ID, $options);
try { try {
// Create PDO instance // 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); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL query // 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) $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 // Prepare and execute SQL statement
$stmt = $pdo->prepare($sql); $stmt = $pdo->prepare($sql);

View 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;

View file

@ -12,9 +12,17 @@ use Gettext\Loader\PoLoader;
use Gettext\Translations; use Gettext\Translations;
use Punic\Language; use Punic\Language;
if (session_status() == PHP_SESSION_NONE) { // Enable for debug
session_start(); // 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__ . '/../vendor/autoload.php';
require __DIR__ . '/helper.php'; require __DIR__ . '/helper.php';
@ -45,37 +53,6 @@ $routeParser = $app->getRouteCollector()->getRouteParser();
require_once __DIR__ . '/database.php'; 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) { $container->set('router', function () use ($routeParser) {
return $routeParser; return $routeParser;
}); });
@ -89,6 +66,11 @@ $container->set('pdo', function () use ($pdo) {
}); });
$container->set('auth', function() { $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; return new \App\Auth\Auth;
}); });
@ -96,7 +78,7 @@ $container->set('flash', function() {
return new \Slim\Flash\Messages; 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', [ $view = Twig::create(__DIR__ . '/../resources/views', [
'cache' => false, 'cache' => false,
]); ]);
@ -104,6 +86,38 @@ $container->set('view', function ($container) use ($translations, $uiLang, $lang
'isLogin' => $container->get('auth')->isLogin(), 'isLogin' => $container->get('auth')->isLogin(),
'user' => $container->get('auth')->user(), '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('uiLang', $uiLang);
$view->getEnvironment()->addGlobal('lang', $lang); $view->getEnvironment()->addGlobal('lang', $lang);
$view->getEnvironment()->addGlobal('flash', $container->get('flash')); $view->getEnvironment()->addGlobal('flash', $container->get('flash'));
@ -117,22 +131,20 @@ $container->set('view', function ($container) use ($translations, $uiLang, $lang
} }
$db = $container->get('db'); $db = $container->get('db');
$query = 'SELECT r.currency, ru.registrar_id $user_data = 'SELECT ru.registrar_id
FROM registrar_users ru FROM registrar_users ru
JOIN registrar r ON ru.registrar_id = r.id JOIN registrar r ON ru.registrar_id = r.id
WHERE ru.user_id = ?'; WHERE ru.user_id = ?';
$currency_data = "SELECT value FROM settings WHERE name = 'currency'";
if (isset($_SESSION['auth_user_id'])) { 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'] = $db_currency[0]['value'];
$_SESSION['_currency'] = 'USD';
$_SESSION['auth_registrar_id'] = null; // Default registrar_id $_SESSION['auth_registrar_id'] = null; // Default registrar_id
if ($result !== null && count($result) > 0) { if ($result !== null && count($result) > 0) {
if (isset($result[0]['currency'])) {
$_SESSION['_currency'] = $result[0]['currency'];
}
if (isset($result[0]['registrar_id'])) { if (isset($result[0]['registrar_id'])) {
$_SESSION['auth_registrar_id'] = $result[0]['registrar_id']; $_SESSION['auth_registrar_id'] = $result[0]['registrar_id'];
} }

View file

@ -13,7 +13,7 @@ elseif (config('default') == 'sqlite') {
} }
// PostgreSQL Connection // PostgreSQL Connection
elseif (config('default') == 'pgsql') { 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); $db = \Pinga\Db\PdoDatabase::fromPdo($pdo);
} }
// SQL Server Connection // SQL Server Connection

View file

@ -396,4 +396,33 @@ function createUuidFromId($id) {
// Handle exception // Handle exception
return null; 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;
} }

View file

@ -16,17 +16,15 @@
"ext-pdo": "*", "ext-pdo": "*",
"slim/slim": "4.12.0", "slim/slim": "4.12.0",
"slim/twig-view": "^3.3.0", "slim/twig-view": "^3.3.0",
"monolog/monolog": "^3.4.0", "monolog/monolog": "^3.5.0",
"respect/validation": "^2.2.4", "respect/validation": "^2.2.4",
"slim/csrf": "^1.3", "slim/csrf": "^1.3",
"slim/flash": "^0.4", "slim/flash": "^0.4",
"vlucas/phpdotenv": "^5.5", "vlucas/phpdotenv": "^5.6",
"php-di/php-di": "^7.0.5", "php-di/php-di": "^7.0.6",
"nyholm/psr7": "^1.8", "nyholm/psr7": "^1.8.1",
"nyholm/psr7-server": "^1.0.2", "nyholm/psr7-server": "^1.1.0",
"pinga/auth": "^0.2.1", "pinga/auth": "^0.3.3",
"phpmailer/phpmailer": "^6.8.1",
"utopia-php/messaging": "^0.3.0",
"filp/whoops": "^2.15.3", "filp/whoops": "^2.15.3",
"imefisto/psr-swoole-native": "^1.1.2", "imefisto/psr-swoole-native": "^1.1.2",
"chubbyphp/chubbyphp-static-file": "^1.2", "chubbyphp/chubbyphp-static-file": "^1.2",
@ -43,12 +41,13 @@
"matthiasmullie/scrapbook": "^1.5", "matthiasmullie/scrapbook": "^1.5",
"guzzlehttp/guzzle": "^7.8", "guzzlehttp/guzzle": "^7.8",
"league/flysystem": "^3.23", "league/flysystem": "^3.23",
"mpociot/vat-calculator": "^3.6", "mpociot/vat-calculator": "^3.7",
"ramsey/uuid": "^4.7" "ramsey/uuid": "^4.7",
"selective/xmldsig": "^3.1"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"App\\": "app/" "App\\": "app/"
} }
} }
} }

View file

@ -43,7 +43,6 @@ return [
'database' => $_ENV['DB_DATABASE'] ?? 'db_username', 'database' => $_ENV['DB_DATABASE'] ?? 'db_username',
'username' => $_ENV['DB_USERNAME'] ?? 'db_password', 'username' => $_ENV['DB_USERNAME'] ?? 'db_password',
'password' => $_ENV['DB_PASSWORD'] ?? '', 'password' => $_ENV['DB_PASSWORD'] ?? '',
'charset' => 'utf8',
'prefix' => '', 'prefix' => '',
'schema' => 'public', 'schema' => 'public',
'sslmode' => 'prefer', 'sslmode' => 'prefer',

View file

@ -25,5 +25,6 @@ MAIL_API_KEY='test-api-key'
MAIL_API_PROVIDER='sendgrid' MAIL_API_PROVIDER='sendgrid'
STRIPE_SECRET_KEY='stripe-secret-key' STRIPE_SECRET_KEY='stripe-secret-key'
STRIPE_PUBLISHABLE_KEY='stripe-publishable-key'
TEST_TLDS=.test,.com.test TEST_TLDS=.test,.com.test

File diff suppressed because it is too large Load diff

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

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Create Contact') }} {{ __('Create Contact') }}
@ -24,31 +24,7 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if contactID is defined and crdate is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form action="/contact/create" method="post"> <form action="/contact/create" method="post">
@ -56,21 +32,21 @@
<div class="row"> <div class="row">
<!-- First Column: General & Internationalized Info --> <!-- First Column: General & Internationalized Info -->
<div class="col-md-6"> <div class="col-md-6">
<h6 class="mb-3">General & Internationalized Info</h6> <h6 class="mb-3">{{ __('General & Internationalized Info') }}</h6>
<!-- Internationalized Name --> <!-- Internationalized Name -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="intName" name="intName" required="required">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseNameInt" name="disclose_name_int"> <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> </label>
</div> </div>
{% if registrars and not registrar %} {% if registrars and not registrar %}
<div class="form-group mb-3"> <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"> <select id="registrarDropdown" name="registrar" class="form-control">
{% for registrar in registrars %} {% for registrar in registrars %}
<option value="{{ registrar.id }}">{{ registrar.name }}</option> <option value="{{ registrar.id }}">{{ registrar.name }}</option>
@ -81,43 +57,43 @@
<!-- Internationalized Organization --> <!-- Internationalized Organization -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="intOrg" name="org" required="required">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseOrgInt" name="disclose_org_int"> <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> </label>
</div> </div>
<!-- Internationalized Address: Street Details --> <!-- Internationalized Address: Street Details -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="street1" name="street1" required="required">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="street2" name="street2">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="street3" name="street3">
</div> </div>
<!-- Internationalized Address: City, SP, PC, CC --> <!-- Internationalized Address: City, SP, PC, CC -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="city" name="city" required="required">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="sp" name="sp">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="pc" name="pc">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="cc" name="cc" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option> <option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
@ -126,60 +102,60 @@
</div> </div>
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseAddrInt" name="disclose_addr_int"> <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> </label>
</div> </div>
<!-- Second Column: Voice, Fax, Email, and other details --> <!-- Second Column: Voice, Fax, Email, and other details -->
<div class="col-md-6"> <div class="col-md-6">
<h6 class="mb-3">Contact Details</h6> <h6 class="mb-3">{{ __('Contact Details') }}</h6>
<!-- Contact ID --> <!-- Contact ID -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="contactid" name="contactid" required="required">
</div> </div>
<!-- Voice --> <!-- Voice -->
<div class="mb-3"> <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"> <input type="tel" class="form-control" id="voice" name="voice" required="required">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseVoice" name="disclose_voice"> <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> </label>
</div> </div>
<!-- Fax --> <!-- Fax -->
<div class="mb-3"> <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"> <input type="tel" class="form-control" id="fax" name="fax">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseFax" name="disclose_fax"> <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> </label>
</div> </div>
<!-- Email --> <!-- Email -->
<div class="mb-3"> <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"> <input type="email" class="form-control" id="email" name="email" required="required" autocapitalize="none">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseEmail" name="disclose_email"> <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> </label>
</div> </div>
<!-- AuthInfo for Contact --> <!-- AuthInfo for Contact -->
<div class="mb-3"> <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> <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> </div>
<!-- NIN - National Identification Number --> <!-- NIN - National Identification Number -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="nin" name="nin">
</div> </div>
@ -187,7 +163,7 @@
<div class="mb-3"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="isBusiness" name="isBusiness"> <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> </div>
<!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' --> <!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' -->
</div> </div>
@ -195,15 +171,15 @@
<div class="mb-3"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyPhone" name="verifyPhone"> <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>
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyEmail" name="verifyEmail"> <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>
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyPostal" name="verifyPostal"> <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>
</div> </div>
@ -214,7 +190,7 @@
<div class="mb-3"> <div class="mb-3">
<label class="form-check form-switch"> <label class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="toggleLoc"> <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> </label>
</div> </div>
@ -222,64 +198,64 @@
<div class="row" id="localizedInfo" style="display: none;"> <div class="row" id="localizedInfo" style="display: none;">
<!-- Localized Postal Info: First Column --> <!-- Localized Postal Info: First Column -->
<div class="col-md-6"> <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 --> <!-- Localized Name -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locName" name="locName">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseNameLoc" name="disclose_name_loc"> <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> </label>
</div> </div>
<!-- Localized Organization --> <!-- Localized Organization -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locOrg" name="locOrg">
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseOrgLoc" name="disclose_org_loc"> <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> </label>
</div> </div>
<!-- Localized Street Details --> <!-- Localized Street Details -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locStreet1" name="locStreet1">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locStreet2" name="locStreet2">
</div> </div>
</div> </div>
<!-- Localized Postal Info: Second Column --> <!-- Localized Postal Info: Second Column -->
<div class="col-md-6"> <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 --> <!-- Continued Localized Street Detail -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locStreet3" name="locStreet3">
</div> </div>
<!-- Localized City, SP, PC, CC --> <!-- Localized City, SP, PC, CC -->
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locCity" name="locCity">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locSP" name="locSP">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="locPC" name="locPC">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="locCC" name="locCC">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option> <option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
@ -288,7 +264,7 @@
</div> </div>
<label class="form-check form-switch mt-1"> <label class="form-check form-switch mt-1">
<input class="form-check-input" type="checkbox" id="discloseAddrLoc" name="disclose_addr_loc"> <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> </label>
</div> </div>
</div> </div>
@ -296,7 +272,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -304,19 +280,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -61,18 +61,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Update Contact') }} {{ contact.identifier }} {{ __('Update Contact') }} {{ contact.identifier }}
@ -42,57 +42,57 @@
<div class="row"> <div class="row">
<!-- First Column: General & Internationalized Info --> <!-- First Column: General & Internationalized Info -->
<div class="col-md-6"> <div class="col-md-6">
<h6 class="mb-3">General & Internationalized Info</h6> <h6 class="mb-3">{{ __('General & Internationalized Info') }}</h6>
<!-- Internationalized Name --> <!-- Internationalized Name -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="intName" name="intName" required="required" value="{{ postal_int.name }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Internationalized Organization --> <!-- Internationalized Organization -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="intOrg" name="org" required="required" value="{{ postal_int.org }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Internationalized Address: Street Details --> <!-- Internationalized Address: Street Details -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="street1" name="street1" required="required" value="{{ postal_int.street1 }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="street2" name="street2" value="{{ postal_int.street2 }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="street3" name="street3" value="{{ postal_int.street3 }}">
</div> </div>
<!-- Internationalized Address: City, SP, PC, CC --> <!-- Internationalized Address: City, SP, PC, CC -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="city" name="city" required="required" value="{{ postal_int.city }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="sp" name="sp" value="{{ postal_int.sp }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="pc" name="pc" value="{{ postal_int.pc }}">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="cc" name="cc" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2 }}" {% if postal_int.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option> <option value="{{ country.alpha2 }}" {% if postal_int.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option>
@ -101,54 +101,54 @@
</div> </div>
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Second Column: Voice, Fax, Email, and other details --> <!-- Second Column: Voice, Fax, Email, and other details -->
<div class="col-md-6"> <div class="col-md-6">
<h6 class="mb-3">Contact Details</h6> <h6 class="mb-3">{{ __('Contact Details') }}</h6>
<!-- Voice --> <!-- Voice -->
<div class="mb-3"> <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 }}"> <input type="tel" class="form-control" id="voice" name="voice" required="required" value="{{ contact.voice }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Fax --> <!-- Fax -->
<div class="mb-3"> <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 }}"> <input type="tel" class="form-control" id="fax" name="fax" value="{{ contact.fax }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Email --> <!-- Email -->
<div class="mb-3"> <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 }}"> <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"> <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 %}> <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> </label>
</div> </div>
<!-- AuthInfo for Contact --> <!-- AuthInfo for Contact -->
<div class="mb-3"> <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 }}"> <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> </div>
<!-- NIN - National Identification Number --> <!-- NIN - National Identification Number -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="nin" name="nin" value="{{ contact.nin }}">
</div> </div>
@ -156,7 +156,7 @@
<div class="mb-3"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="isBusiness" name="isBusiness" {% if contact.nin_type == 'business' %}checked{% endif %}> <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> </div>
<!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' --> <!-- You can invert the logic if you prefer the default to be 'Personal' instead of 'Business' -->
</div> </div>
@ -164,15 +164,15 @@
<div class="mb-3"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyPhone" name="verifyPhone"> <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>
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyEmail" name="verifyEmail"> <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>
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="verifyPostal" name="verifyPostal"> <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>
</div> </div>
@ -183,7 +183,7 @@
<div class="mb-3"> <div class="mb-3">
<label class="form-check form-switch"> <label class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="toggleLoc" {% if postal_loc.cc %}checked{% endif %}> <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> </label>
</div> </div>
@ -191,64 +191,64 @@
<div class="row" id="localizedInfo" style="display: none;"> <div class="row" id="localizedInfo" style="display: none;">
<!-- Localized Postal Info: First Column --> <!-- Localized Postal Info: First Column -->
<div class="col-md-6"> <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 --> <!-- Localized Name -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locName" name="locName" value="{{ postal_loc.name }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Localized Organization --> <!-- Localized Organization -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locOrg" name="locOrg" value="{{ postal_loc.org }}">
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
<!-- Localized Street Details --> <!-- Localized Street Details -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locStreet1" name="locStreet1" value="{{ postal_loc.street1 }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locStreet2" name="locStreet2" value="{{ postal_loc.street2 }}">
</div> </div>
</div> </div>
<!-- Localized Postal Info: Second Column --> <!-- Localized Postal Info: Second Column -->
<div class="col-md-6"> <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 --> <!-- Continued Localized Street Detail -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locStreet3" name="locStreet3" value="{{ postal_loc.street3 }}">
</div> </div>
<!-- Localized City, SP, PC, CC --> <!-- Localized City, SP, PC, CC -->
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locCity" name="locCity" value="{{ postal_loc.city }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locSP" name="locSP" value="{{ postal_loc.sp }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="locPC" name="locPC" value="{{ postal_loc.pc }}">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="locCC" name="locCC">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2 }}" {% if postal_loc.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option> <option value="{{ country.alpha2 }}" {% if postal_loc.cc == country.alpha2 %}selected{% endif %}>{{ country.name }}</option>
@ -257,7 +257,7 @@
</div> </div>
<label class="form-check form-switch mt-1"> <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 %}> <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> </label>
</div> </div>
</div> </div>
@ -265,7 +265,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -273,19 +273,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {

View file

@ -26,24 +26,24 @@
<div class="col-12"> <div class="col-12">
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Contact {{ contact.identifier }}&nbsp;<span class="status status-green">{{ contactStatus.status }}</span>{% if contactLinked is not null %}&nbsp;<span class="status status-info">linked</span>{% endif %}</h3> <h3 class="card-title">{{ __('Contact') }} {{ contact.identifier }}&nbsp;<span class="status status-green">{{ contactStatus.status }}</span>{% if contactLinked is not null %}&nbsp;<span class="status status-info">{{ __('linked') }}</span>{% endif %}</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Email</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 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>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Phone</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 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>
<div class="datagrid-item"> <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 class="datagrid-content">{{ contact.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrars.name }}</div> <div class="datagrid-content">{{ registrars.name }}</div>
</div> </div>
</div> </div>
@ -53,10 +53,10 @@
<div class="card-header"> <div class="card-header">
<ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs"> <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
<li class="nav-item"> <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>
<li class="nav-item"> <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> </li>
</ul> </ul>
</div> </div>
@ -69,70 +69,70 @@
{% if postal.type == 'int' %} {% if postal.type == 'int' %}
{% set intExists = true %} {% set intExists = true %}
<div class="tab-pane active show" id="tabs-int"> <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">
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
</div> </div>
@ -146,70 +146,70 @@
{% for postal in contactPostal %} {% for postal in contactPostal %}
{% if postal.type == 'loc' %} {% if postal.type == 'loc' %}
<div class="tab-pane" id="tabs-loc"> <div class="tab-pane" id="tabs-loc">
<h4>Localized Contact Details</h4> <h4>{{ __('Localized Contact Details') }}</h4>
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
<div class="datagrid-item"> <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' %} <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 %} {% 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> {% endif %}</div>
</div> </div>
</div> </div>
@ -218,8 +218,8 @@
{% endfor %} {% endfor %}
{% else %} {% else %}
<div class="tab-pane" id="tabs-loc"> <div class="tab-pane" id="tabs-loc">
<h4>Localized Contact Details</h4> <h4>{{ __('Localized Contact Details') }}</h4>
<div>No Localized Contact Information Available</div> <div>{{ __('No Localized Contact Information Available') }}</div>
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}
@ -229,18 +229,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -170,18 +170,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Check Domain') }} {{ __('Check Domain') }}
@ -35,12 +35,12 @@
<button type="submit" class="btn btn-primary">{{ __('Check Availability') }}</button> <button type="submit" class="btn btn-primary">{{ __('Check Availability') }}</button>
</div> </div>
<div class="mb-3"> <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>
<div class="mb-3"> <div class="mb-3">
<label class="form-check"> <label class="form-check">
<input class="form-check-input" type="checkbox" name="claims"> <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> </label>
</div> </div>
</form> </form>
@ -49,18 +49,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Create Application') }} {{ __('Create Application') }}
@ -24,31 +24,7 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if domainName is defined and crdate is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form id="domainCreateForm" action="/application/create" method="post"> <form id="domainCreateForm" action="/application/create" method="post">
@ -59,7 +35,7 @@
</div> </div>
<div class="mb-3"> <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> <select class="form-select" id="phaseType" name="phaseType" required>
<option value="sunrise">Sunrise</option> <option value="sunrise">Sunrise</option>
<option value="landrush">Landrush</option> <option value="landrush">Landrush</option>
@ -70,14 +46,14 @@
</div> </div>
<div class="mb-3"> <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"> <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> <small class="form-hint">The "Phase name" field is required only if the "Type" is set to "Custom".</small>
</div> </div>
{% if registrars and not registrar %} {% if registrars and not registrar %}
<div class="form-group mb-3"> <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"> <select id="registrarDropdown" name="registrar" class="form-control">
{% for registrar in registrars %} {% for registrar in registrars %}
<option value="{{ registrar.id }}">{{ registrar.name }}</option> <option value="{{ registrar.id }}">{{ registrar.name }}</option>
@ -131,8 +107,8 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Signed Mark Information</label> <label class="form-label">{{ __('Signed Mark Information') }}</label>
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="Paste SMD contents…"></textarea> <textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="{{ __('Paste SMD contents') }}…"></textarea>
</div> </div>
<div class="mb-3"> <div class="mb-3">
@ -163,19 +139,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Create Domain') }} {{ __('Create Domain') }}
@ -25,31 +25,6 @@
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% include 'partials/flash.twig' %} {% 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>
&nbsp;{{ __('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>
&nbsp;{{ __('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">
<div class="card-body"> <div class="card-body">
<form id="domainCreateForm" action="/domain/create" method="post"> <form id="domainCreateForm" action="/domain/create" method="post">
@ -61,7 +36,7 @@
{% if registrars and not registrar %} {% if registrars and not registrar %}
<div class="form-group mb-3"> <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"> <select id="registrarDropdown" name="registrar" class="form-control">
{% for registrar in registrars %} {% for registrar in registrars %}
<option value="{{ registrar.id }}">{{ registrar.name }}</option> <option value="{{ registrar.id }}">{{ registrar.name }}</option>
@ -79,7 +54,7 @@
<!-- Placeholder for displaying domain price --> <!-- Placeholder for displaying domain price -->
<div class="mb-3" id="domainPriceDisplay" style="display:none;"> <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>
<!-- Fields for 4 contacts with roles --> <!-- Fields for 4 contacts with roles -->
@ -222,7 +197,7 @@
{% if launch_phases == 'on' %} {% if launch_phases == 'on' %}
<div class="mb-3"> <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"> <select class="form-select" id="phaseType" name="phaseType">
<option value="none">N/A</option> <option value="none">N/A</option>
<option value="sunrise">Sunrise</option> <option value="sunrise">Sunrise</option>
@ -234,8 +209,8 @@
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Signed Mark Information</label> <label class="form-label">{{ __('Signed Mark Information') }}</label>
<textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="Paste SMD contents…"></textarea> <textarea class="form-control" data-bs-toggle="autosize" name="smd" placeholder="{{ __('Paste SMD contents') }}…"></textarea>
</div> </div>
<div class="mb-3"> <div class="mb-3">
@ -256,7 +231,7 @@
<div class="mb-3"> <div class="mb-3">
<label for="token" class="form-label">{{ __('Allocation Token') }}</label> <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>
</div> </div>
@ -272,19 +247,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
@ -455,9 +418,9 @@ document.addEventListener("DOMContentLoaded", function() {
function formatPrice(price) { function formatPrice(price) {
switch(window.currencyPosition) { switch(window.currencyPosition) {
case 'before': case 'before':
return `${window.currencySymbol}${price.toFixed(2)}`; return `{{ currency }} ${price.toFixed(2)}`;
case 'after': case 'after':
return `${price.toFixed(2)} ${window.currencySymbol}`; return `${price.toFixed(2)} {{ currency }}`;
default: default:
return price.toFixed(2); return price.toFixed(2);
} }

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -61,18 +61,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -66,18 +66,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -61,18 +61,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -44,12 +44,12 @@
<!-- Placeholder for displaying domain price --> <!-- Placeholder for displaying domain price -->
<div class="mb-3" id="domainPriceDisplay" style="display:none;"> <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>
{% else %} {% else %}
<div class="mb-3"> <div class="mb-3">
<label for="renewalYears" class="form-label">{{ 'Renewal Years' }}</label> <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> </div>
{% endif %} {% endif %}
</div> </div>
@ -67,19 +67,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
@ -170,9 +158,9 @@ document.addEventListener("DOMContentLoaded", function() {
function formatPrice(price) { function formatPrice(price) {
switch(window.currencyPosition) { switch(window.currencyPosition) {
case 'before': case 'before':
return `${window.currencySymbol}${price.toFixed(2)}`; return `{{ currency }} ${price.toFixed(2)}`;
case 'after': case 'after':
return `${price.toFixed(2)} ${window.currencySymbol}`; return `${price.toFixed(2)} {{ currency }}`;
default: default:
return price.toFixed(2); return price.toFixed(2);
} }

View file

@ -36,7 +36,7 @@
{% if registrars and not registrar %} {% if registrars and not registrar %}
<div class="form-group mb-3"> <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"> <select id="registrarDropdown" name="registrar" class="form-control">
{% for registrar in registrars %} {% for registrar in registrars %}
<option value="{{ registrar.id }}">{{ registrar.name }}</option> <option value="{{ registrar.id }}">{{ registrar.name }}</option>
@ -60,12 +60,12 @@
<!-- Placeholder for displaying domain price --> <!-- Placeholder for displaying domain price -->
<div class="mb-3" id="domainPriceDisplay" style="display:none;"> <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>
<div class="mb-3"> <div class="mb-3">
<label for="token" class="form-label">{{ __('Allocation Token') }}</label> <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>
</div> </div>
@ -81,19 +81,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
@ -180,9 +168,9 @@ document.addEventListener("DOMContentLoaded", function() {
function formatPrice(price) { function formatPrice(price) {
switch(window.currencyPosition) { switch(window.currencyPosition) {
case 'before': case 'before':
return `${window.currencySymbol}${price.toFixed(2)}`; return `{{ currency }} ${price.toFixed(2)}`;
case 'after': case 'after':
return `${price.toFixed(2)} ${window.currencySymbol}`; return `${price.toFixed(2)} {{ currency }}`;
default: default:
return price.toFixed(2); return price.toFixed(2);
} }

View file

@ -31,7 +31,7 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"> <h3 class="card-title">
Domain {{ domain.name }}&nbsp;<input type="hidden" name="domainName" value="{{ domain.name }}"> {{ __('Domain') }} {{ domain.name }}&nbsp;<input type="hidden" name="domainName" value="{{ domain.name }}">
{% if domainStatus %} {% if domainStatus %}
{% if domainStatus is iterable %} {% if domainStatus is iterable %}
{% for status in domainStatus %} {% for status in domainStatus %}
@ -50,23 +50,23 @@
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.phase_type|capitalize }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.phase_name|default('N/A') }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrar.name }}</div> <div class="datagrid-content">{{ registrar.name }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.application_id }}</div>
</div> </div>
</div> </div>
@ -103,19 +103,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
var csrfTokenName = "{{ csrfTokenName }}"; var csrfTokenName = "{{ csrfTokenName }}";

View file

@ -30,7 +30,7 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"> <h3 class="card-title">
Domain {{ domain.name }}&nbsp;<input type="hidden" name="domainName" value="{{ domain.name }}"> {{ __('Domain') }} {{ domain.name }}&nbsp;<input type="hidden" name="domainName" value="{{ domain.name }}">
{% if domainStatus.status or domain.rgpstatus %} {% if domainStatus.status or domain.rgpstatus %}
{% if domainStatus is iterable %} {% if domainStatus is iterable %}
{% for status in domainStatus %} {% for status in domainStatus %}
@ -52,19 +52,19 @@
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.lastupdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.exdate }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrar.name }}</div> <div class="datagrid-content">{{ registrar.name }}</div>
</div> </div>
</div> </div>
@ -299,19 +299,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
var csrfTokenName = "{{ csrfTokenName }}"; var csrfTokenName = "{{ csrfTokenName }}";

View file

@ -27,7 +27,7 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"> <h3 class="card-title">
Application for {{ domain.name }}&nbsp; {{ __('Application for') }} {{ domain.name }}&nbsp;
{% if domainStatus %} {% if domainStatus %}
{% if domainStatus is iterable %} {% if domainStatus is iterable %}
{% for status in domainStatus %} {% for status in domainStatus %}
@ -46,37 +46,37 @@
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.application_id }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.phase_type|capitalize }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.phase_name|default('N/A') }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrars.name }}</div> <div class="datagrid-content">{{ registrars.name }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrant</div> <div class="datagrid-title">{{ __('Registrant') }}</div>
<div class="datagrid-content">{{ domainRegistrant.identifier }}</div> <div class="datagrid-content">{{ domainRegistrant.identifier }}</div>
</div> </div>
{% for contact in domainContacts %} {% for contact in domainContacts %}
<div class="datagrid-item"> <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 class="datagrid-content">{{ contact.identifier }}</div>
</div> </div>
{% endfor %} {% endfor %}
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Auth Type</div> <div class="datagrid-title">{{ __('Auth Type') }}</div>
<div class="datagrid-content"> <div class="datagrid-content">
{% if domain.authtype == 'pw' %} {% if domain.authtype == 'pw' %}
Regular Regular
@ -88,7 +88,7 @@
</div> </div>
</div> </div>
<div class="datagrid-item"> <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()"> <div class="datagrid-content blur" id="authInfo" onclick="toggleBlur()">
{{ domain.authinfo }} {{ domain.authinfo }}
</div> </div>
@ -101,11 +101,11 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Nameservers</h5> <h5 class="card-title">{{ __('Nameservers') }}</h5>
<div class="datagrid"> <div class="datagrid">
{% for host in domainHosts %} {% for host in domainHosts %}
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Nameserver {{ loop.index }}</div> <div class="datagrid-title">{{ __('Nameserver') }} {{ loop.index }}</div>
<div class="datagrid-content"> <div class="datagrid-content">
{{ host.name }} {{ host.name }}
</div> </div>
@ -118,19 +118,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<style> <style>
.blur { .blur {
@ -139,7 +127,7 @@
} }
.blur:hover { .blur:hover {
filter: blur(2px); /* Slightly clearer on hover for a hint to the user */ filter: blur(2px);
} }
</style> </style>
<script> <script>

View file

@ -27,7 +27,7 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"> <h3 class="card-title">
Domain {{ domain.name }}&nbsp; {{ __('Domain') }} {{ domain.name }}&nbsp;
{% if domainStatus.status or domain.rgpstatus %} {% if domainStatus.status or domain.rgpstatus %}
{% if domainStatus is iterable %} {% if domainStatus is iterable %}
{% for status in domainStatus %} {% for status in domainStatus %}
@ -49,33 +49,33 @@
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.lastupdate }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ domain.exdate }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrars.name }}</div> <div class="datagrid-content">{{ registrars.name }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrant</div> <div class="datagrid-title">{{ __('Registrant') }}</div>
<div class="datagrid-content">{{ domainRegistrant.identifier }}</div> <div class="datagrid-content">{{ domainRegistrant.identifier }}</div>
</div> </div>
{% for contact in domainContacts %} {% for contact in domainContacts %}
<div class="datagrid-item"> <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 class="datagrid-content">{{ contact.identifier }}</div>
</div> </div>
{% endfor %} {% endfor %}
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Auth Type</div> <div class="datagrid-title">{{ __('Auth Type') }}</div>
<div class="datagrid-content"> <div class="datagrid-content">
{% if domainAuth.authtype == 'pw' %} {% if domainAuth.authtype == 'pw' %}
Regular Regular
@ -87,7 +87,7 @@
</div> </div>
</div> </div>
<div class="datagrid-item"> <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()"> <div class="datagrid-content blur" id="authInfo" onclick="toggleBlur()">
{{ domainAuth.authinfo }} {{ domainAuth.authinfo }}
</div> </div>
@ -100,11 +100,11 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Nameservers</h5> <h5 class="card-title">{{ __('Nameservers') }}</h5>
<div class="datagrid"> <div class="datagrid">
{% for host in domainHosts %} {% for host in domainHosts %}
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Nameserver {{ loop.index }}</div> <div class="datagrid-title">{{ __('Nameserver') }} {{ loop.index }}</div>
<div class="datagrid-content"> <div class="datagrid-content">
{{ host.name }} {{ host.name }}
</div> </div>
@ -181,19 +181,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<style> <style>
.blur { .blur {
@ -202,7 +190,7 @@
} }
.blur:hover { .blur:hover {
filter: blur(2px); /* Slightly clearer on hover for a hint to the user */ filter: blur(2px);
} }
</style> </style>
<script> <script>

View file

@ -26,26 +26,14 @@
<div class="col-12"> <div class="col-12">
<div class="card bg-orange-lt"> <div class="card bg-orange-lt">
<div class="card-body"> <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">{{ __('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">{{ __('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>
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -24,54 +24,30 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if deposit is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form id="depositForm" action="/deposit" method="post"> <form id="depositForm" action="/deposit" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="deposit-info"> <div class="deposit-info">
<h5>Current Balance for {{ balance.name }}</h5> <h5>{{ __('Current Balance for') }} {{ balance.name }}</h5>
<p class="fs-4">${{ balance.accountBalance }}</p> <p class="fs-4">{{ currency }} {{ balance.accountBalance }}</p>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="amount" class="form-label">Amount</label> <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> <input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="{{ __('Enter deposit amount') }}" required>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="description" class="form-label">Description</label> <label for="description" class="form-label">{{ __('Description') }}</label>
<textarea class="form-control" id="description" name="description" rows="3" placeholder="Optional deposit description"></textarea> <textarea class="form-control" id="description" name="description" rows="3" placeholder="{{ __('Optional deposit description') }}"></textarea>
</div> </div>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -81,23 +57,11 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script src="https://js.stripe.com/v3/"></script> <script src="https://js.stripe.com/v3/"></script>
<script type="text/javascript"> <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) { document.getElementById('depositForm').addEventListener('submit', function (e) {
e.preventDefault(); e.preventDefault();

View file

@ -24,39 +24,15 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if deposit is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form id="depositForm" action="/deposit" method="post"> <form id="depositForm" action="/deposit" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="mb-3"> <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> <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 %} {% for registrar in registrars %}
<option value="{{ registrar.id }}">{{ registrar.name }}</option> <option value="{{ registrar.id }}">{{ registrar.name }}</option>
{% endfor %} {% endfor %}
@ -64,24 +40,24 @@
</div> </div>
<div class="deposit-info"> <div class="deposit-info">
<h5>Current Balance for <span id="registrarName"></span></h5> <h5>{{ __('Current Balance for') }} <span id="registrarName"></span></h5>
<p class="fs-4">$<span id="currentFunds">0.00</span></p> <p class="fs-4">{{ currency }} <span id="currentFunds">0.00</span></p>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="amount" class="form-label">Amount</label> <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> <input type="number" step="0.01" class="form-control" id="amount" name="amount" placeholder="{{ __('Enter deposit amount') }}" required>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="description" class="form-label">Description</label> <label for="description" class="form-label">{{ __('Description') }}</label>
<textarea class="form-control" id="description" name="description" rows="3" placeholder="Optional deposit description"></textarea> <textarea class="form-control" id="description" name="description" rows="3" placeholder="{{ __('Optional deposit description') }}"></textarea>
</div> </div>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -113,18 +89,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -49,18 +49,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -10,15 +10,14 @@
<div class="row g-2 align-items-center"> <div class="row g-2 align-items-center">
<div class="col"> <div class="col">
<h2 class="page-title"> <h2 class="page-title">
Invoice {{ invoice_details.invoice_number }} {{ __('Invoice') }} {{ invoice_details.invoice_number }}
</h2> </h2>
</div> </div>
<!-- Page title actions --> <!-- Page title actions -->
<div class="col-auto ms-auto d-print-none"> <div class="col-auto ms-auto d-print-none">
<button type="button" class="btn btn-primary" onclick="javascript:window.print();"> <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> <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> </button>
</div> </div>
</div> </div>
@ -31,7 +30,7 @@
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<p class="h3">Provider / Registry</p> <p class="h3">{{ __('Provider') }} / {{ __('Registry') }}</p>
<address> <address>
{{ company_name }}<br> {{ company_name }}<br>
{{ vat_number }}<br> {{ vat_number }}<br>
@ -42,7 +41,7 @@
</address> </address>
</div> </div>
<div class="col-6 text-end"> <div class="col-6 text-end">
<p class="h3">Client / Registrar</p> <p class="h3">{{ __('Client') }} / {{ __('Registrar') }}</p>
<address> <address>
{{ billing.org }}<br> {{ 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> {{ 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> </address>
</div> </div>
<div class="col-6"> <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>
<div class="col-6 text-end"> <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>
<div class="col-12 my-5"> <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 <span class="badge
{% if status == 'unpaid' %}bg-red text-red-fg {% if status == 'unpaid' %}bg-red text-red-fg
{% elseif status == 'paid' %}bg-green text-green-fg {% elseif status == 'paid' %}bg-green text-green-fg
@ -76,8 +75,8 @@
<thead> <thead>
<tr> <tr>
<th class="text-center" style="width: 1%"></th> <th class="text-center" style="width: 1%"></th>
<th>Product</th> <th>{{ __('Product') }}</th>
<th class="text-end" style="width: 1%">Amount</th> <th class="text-end" style="width: 1%">{{ __('Amount') }}</th>
</tr> </tr>
</thead> </thead>
{% if statement is not empty %} {% if statement is not empty %}
@ -94,45 +93,32 @@
{% endfor %} {% endfor %}
{% else %} {% else %}
<tr> <tr>
<td colspan="2" class="text-center">No items found.</td> <td colspan="2" class="text-center">{{ __('No items found.') }}</td>
</tr> </tr>
{% endif %} {% endif %}
<tr> <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> <td class="text-end">{{ netPrice }}</td>
</tr> </tr>
<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> <td class="text-end">{{ vatRate }}</td>
</tr> </tr>
<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> <td class="text-end">{{ vatAmount }}</td>
</tr> </tr>
<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> <td class="font-weight-bold text-end">{{ total }}</td>
</tr> </tr>
</table> </table>
<p class="text-secondary text-center mt-5">Notes: {{ invoice_details.notes }}</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 <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>
you again!</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Create Host') }} {{ __('Create Host') }}
@ -24,31 +24,7 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if hostName is defined and crdate is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('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 %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<form action="/host/create" method="post"> <form action="/host/create" method="post">
@ -84,7 +60,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -93,18 +69,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -61,18 +61,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Update Host') }} {{ host.name }} {{ __('Update Host') }} {{ host.name }}
@ -44,7 +44,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -53,18 +53,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Update Host') }} {{ host.name }} {{ __('Update Host') }} {{ host.name }}
@ -27,24 +27,12 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="alert alert-important alert-info" role="alert"> <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> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -26,7 +26,7 @@
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">{{ host.name }}&nbsp;<span class="status status-green">{{ hostStatus.status }}</span>{% if hostLinked is not null %}&nbsp;<span class="status status-info">linked</span>{% endif %}</h3> <h3 class="card-title">{{ host.name }}&nbsp;<span class="status status-green">{{ hostStatus.status }}</span>{% if hostLinked is not null %}&nbsp;<span class="status status-info">{{ __('linked') }}</span>{% endif %}</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
@ -55,11 +55,11 @@
</div> </div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ host.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Registrar</div> <div class="datagrid-title">{{ __('Registrar') }}</div>
<div class="datagrid-content">{{ registrars.name }}</div> <div class="datagrid-content">{{ registrars.name }}</div>
</div> </div>
</div> </div>
@ -68,18 +68,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -28,7 +28,7 @@
<div class="card-header"> <div class="card-header">
<ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs"> <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
<li class="nav-item"> <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>
<li class="nav-item"> <li class="nav-item">
<a href="#tabs-2fa" class="nav-link" data-bs-toggle="tab">2FA</a> <a href="#tabs-2fa" class="nav-link" data-bs-toggle="tab">2FA</a>
@ -36,6 +36,9 @@
<li class="nav-item"> <li class="nav-item">
<a href="#tabs-webauthn" class="nav-link" data-bs-toggle="tab">WebAuthn</a> <a href="#tabs-webauthn" class="nav-link" data-bs-toggle="tab">WebAuthn</a>
</li> </li>
<li class="nav-item">
<a href="#tabs-log" class="nav-link" data-bs-toggle="tab">{{ __('Log') }}</a>
</li>
</ul> </ul>
</div> </div>
<div class="card-body"> <div class="card-body">
@ -96,35 +99,35 @@
</div> </div>
</div> </div>
<div class="tab-pane" id="tabs-2fa"> <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"> <div class="card">
{% if secret is defined %} {% if secret is defined %}
<form action="{{route('activate2fa')}}" name="2fa" method="post"> <form action="{{route('activate2fa')}}" name="2fa" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="card-body"> <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 --> <!-- QR Code -->
<div class="mb-3"> <div class="mb-3">
<img src="{{ qrcodeDataUri }}" alt="2FA QR Code" class="img-fluid"> <img src="{{ qrcodeDataUri }}" alt="2FA QR Code" class="img-fluid">
</div> </div>
<!-- Secret for Manual Entry --> <!-- Secret for Manual Entry -->
<div class="mb-3"> <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> <code>{{ secret|split(4)|join(' ') }}</code>
<small class="form-text text-muted"> <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> </small>
</div> </div>
<!-- Verification Code Input --> <!-- Verification Code Input -->
<div class="mb-3"> <div class="mb-3">
<label for="verificationCode" class="form-label required">Verification Code</label> <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"> <input type="number" class="form-control" id="verificationCode" name="verificationCode" placeholder="{{ __('Enter code') }}" required="required">
<small class="form-text text-muted"> <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> </small>
</div> </div>
<!-- Save Button --> <!-- 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> </div>
</form> </form>
{% else %} {% else %}
@ -132,8 +135,8 @@
<div class="d-flex align-items-center"> <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> <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> <div>
<h5 class="card-title mb-1">Your account is secured with an additional layer of protection.</h5> <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> <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> </div>
</div> </div>
@ -141,36 +144,72 @@
</div> </div>
</div> </div>
<div class="tab-pane" id="tabs-webauthn"> <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">
<div class="card-body"> <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 --> <!-- 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 --> <!-- WebAuthn Devices Table -->
<div class="table-responsive mt-4"> <div class="table-responsive mt-4">
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>Device/Browser Info</th> <th>{{ __('Device/Browser Info') }}</th>
<th>Registration Date</th> <th>{{ __('Registration Date') }}</th>
<th>Action</th> <th>{{ __('Action') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for device in weba %} {% for device in weba %}
<tr> <tr>
<td>{{ device.user_agent }}</td> <td>{{ device.user_agent }}</td>
<td>{{ device.created_at }}</td> <td>{{ device.created_at }}</td>
<td> <td>
<a href="/path/to/action?deviceId={{ device.id }}">Edit</a> <a href="/path/to/action?deviceId={{ device.id }}">{{ __('Edit') }}</a>
</td> </td>
</tr> </tr>
{% else %} {% else %}
<tr> <tr>
<td colspan="3">No devices found.</td> <td colspan="3">{{ __('No devices found.') }}</td>
</tr> </tr>
{% endfor %} {% 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> </tbody>
</table> </table>
</div> </div>
@ -181,19 +220,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://getpinga.com" class="link-secondary">Pinga</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {

View file

@ -24,83 +24,59 @@
<div class="page-body"> <div class="page-body">
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% if registrar is defined %} {% include 'partials/flash.twig' %}
<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>
&nbsp;{{ __('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>
&nbsp;{{ __('Error creating the registrar') }}: <strong>{{ error }}</strong>
</div>
</div>
<a class="btn-close" data-bs-dismiss="alert" aria-label="close"></a>
</div>
{% endif %}
<form action="/registrar/create" method="post" autocomplete="off"> <form action="/registrar/create" method="post" autocomplete="off">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<!-- Registrar Details Card --> <!-- Registrar Details Card -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Registrar Details</h5> <h5 class="card-title">{{ __('Registrar Details') }}</h5>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <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>
<div class="mb-3"> <div class="mb-3">
<label for="ianaId" class="form-label">IANA ID</label> <label for="ianaId" class="form-label">IANA ID</label>
<input type="number" class="form-control" id="ianaId" name="ianaId"> <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>
<div class="mb-3"> <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"> <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>
<div class="mb-3"> <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"> <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>
</div> </div>
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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"> <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>
<div class="mb-3"> <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"> <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>
<div class="mb-3"> <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"> <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>
<div class="mb-3"> <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> <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> </div>
</div> </div>
@ -110,36 +86,36 @@
<!-- Financial Information Card --> <!-- Financial Information Card -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Financial Information</h5> <h5 class="card-title">{{ __('Financial Information') }}</h5>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <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>
<div class="mb-3"> <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> <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>
</div> </div>
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <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>
<div class="mb-3"> <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> <select class="form-select" id="thresholdType" name="thresholdType" required>
<option value="fixed">Fixed</option> <option value="fixed">{{ __('Fixed') }}</option>
<option value="percent">Percent</option> <option value="percent">{{ __('Percent') }}</option>
</select> </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> </div>
</div> </div>
@ -149,17 +125,17 @@
<!-- Registrar Contacts Section with Tabs --> <!-- Registrar Contacts Section with Tabs -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <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"> <ul class="nav nav-tabs nav-fill" id="contactTabs" role="tablist">
<!-- Tab Headers --> <!-- Tab Headers -->
<li class="nav-item" role="presentation"> <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>
<li class="nav-item" role="presentation"> <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>
<li class="nav-item" role="presentation"> <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> </li>
</ul> </ul>
@ -170,30 +146,30 @@
<div class="form-check mb-3"> <div class="form-check mb-3">
<input class="form-check-input" type="checkbox" value="" id="copyOwnerData"> <input class="form-check-input" type="checkbox" value="" id="copyOwnerData">
<label class="form-check-label" for="copyOwnerData"> <label class="form-check-label" for="copyOwnerData">
<strong>Copy data to other contacts</strong> <strong>{{ __('Copy data to other contacts') }}</strong>
</label> </label>
</div> </div>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerFirstName" name="owner[first_name]" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerLastName" name="owner[last_name]" required>
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="ownerOrg" name="owner[org]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="ownerStreet1" name="owner[street1]">
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerCity" name="owner[city]" required>
</div> </div>
</div> </div>
@ -201,15 +177,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="ownerSp" name="owner[sp]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="ownerPc" name="owner[pc]">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="ownerCc" name="owner[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option> <option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
@ -217,11 +193,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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]"> <input type="tel" class="form-control" id="ownerVoice" name="owner[voice]">
</div> </div>
<div class="mb-3"> <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"> <input type="email" class="form-control" id="ownerEmail" name="owner[email]" required autocapitalize="none">
</div> </div>
</div> </div>
@ -236,23 +212,23 @@
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingFirstName" name="billing[first_name]" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingLastName" name="billing[last_name]" required>
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="billingOrg" name="billing[org]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="billingStreet1" name="billing[street1]">
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingCity" name="billing[city]" required>
</div> </div>
</div> </div>
@ -260,15 +236,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="billingSp" name="billing[sp]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="billingPc" name="billing[pc]">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="billingCc" name="billing[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option> <option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
@ -276,11 +252,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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]"> <input type="tel" class="form-control" id="billingVoice" name="billing[voice]">
</div> </div>
<div class="mb-3"> <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"> <input type="email" class="form-control" id="billingEmail" name="billing[email]" required autocapitalize="none">
</div> </div>
</div> </div>
@ -295,23 +271,23 @@
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="abuseFirstName" name="abuse[first_name]" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="abuseLastName" name="abuse[last_name]" required>
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="abuseOrg" name="abuse[org]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="abuseStreet1" name="abuse[street1]">
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="abuseCity" name="abuse[city]" required>
</div> </div>
</div> </div>
@ -319,15 +295,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="abuseSp" name="abuse[sp]">
</div> </div>
<div class="mb-3"> <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]"> <input type="text" class="form-control" id="abusePc" name="abuse[pc]">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="abuseCc" name="abuse[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2|lower }}">{{ country.name }}</option> <option value="{{ country.alpha2|lower }}">{{ country.name }}</option>
@ -335,11 +311,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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]"> <input type="tel" class="form-control" id="abuseVoice" name="abuse[voice]">
</div> </div>
<div class="mb-3"> <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"> <input type="email" class="form-control" id="abuseEmail" name="abuse[email]" required autocapitalize="none">
</div> </div>
</div> </div>
@ -355,9 +331,9 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <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"> <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> </p>
<div id="ipWhitelistForm"> <div id="ipWhitelistForm">
<div id="ipAddressFields"> <div id="ipAddressFields">
@ -375,18 +351,18 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Registrar User</h5> <h5 class="card-title">{{ __('Registrar User') }}</h5>
<p class="card-text"> <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> </p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th scope="col required">Username/CLID <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">{{ __('Login Email') }} <span class="text-red">*</span></th>
<th scope="col">Panel Password <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">{{ __('EPP Password') }} <span class="text-red">*</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -415,9 +391,9 @@
<!-- OTE Section --> <!-- OTE Section -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <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"> <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> </p>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
@ -425,23 +401,23 @@
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
contact:create contact:create
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:check domain:check
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:info domain:info
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:renew domain:renew
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:transfer domain:transfer
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
</ul> </ul>
</div> </div>
@ -451,23 +427,23 @@
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
host:create host:create
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
host:info host:info
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
contact:update contact:update
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:delete domain:delete
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
poll:request poll:request
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
</ul> </ul>
</div> </div>
@ -476,7 +452,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -485,19 +461,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -61,18 +61,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -30,53 +30,53 @@
<!-- Registrar Details Card --> <!-- Registrar Details Card -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Registrar Details</h5> <h5 class="card-title">{{ __('Registrar Details') }}</h5>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <div class="mb-3">
<label for="ianaId" class="form-label">IANA ID</label> <label for="ianaId" class="form-label">IANA ID</label>
<input type="number" class="form-control" id="ianaId" name="ianaId" value="{{ registrar.iana_id }}"> <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>
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <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 }}"> <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>
</div> </div>
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <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 }}"> <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> </div>
</div> </div>
@ -86,33 +86,33 @@
<!-- Financial Information Card --> <!-- Financial Information Card -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Financial Information</h5> <h5 class="card-title">{{ __('Financial Information') }}</h5>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <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>
<div class="mb-3"> <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 }}"> <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>
</div> </div>
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <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>
<div class="mb-3"> <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> <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> </div>
</div> </div>
@ -122,17 +122,17 @@
<!-- Registrar Contacts Section with Tabs --> <!-- Registrar Contacts Section with Tabs -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <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"> <ul class="nav nav-tabs nav-fill" id="contactTabs" role="tablist">
<!-- Tab Headers --> <!-- Tab Headers -->
<li class="nav-item" role="presentation"> <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>
<li class="nav-item" role="presentation"> <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>
<li class="nav-item" role="presentation"> <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> </li>
</ul> </ul>
@ -143,7 +143,7 @@
<div class="form-check mb-3"> <div class="form-check mb-3">
<input class="form-check-input" type="checkbox" value="" id="copyOwnerData"> <input class="form-check-input" type="checkbox" value="" id="copyOwnerData">
<label class="form-check-label" for="copyOwnerData"> <label class="form-check-label" for="copyOwnerData">
<strong>Copy data to other contacts</strong> <strong>{{ __('Copy data to other contacts') }}</strong>
</label> </label>
</div> </div>
<div class="row"> <div class="row">
@ -152,23 +152,23 @@
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerFirstName" name="owner[first_name]" value="{{ contact.first_name }}" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerLastName" name="owner[last_name]" value="{{ contact.last_name }}" required>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="ownerOrg" name="owner[org]" value="{{ contact.org }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="ownerStreet1" name="owner[street1]" value="{{ contact.street1 }}">
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="ownerCity" name="owner[city]" value="{{ contact.city }}" required>
</div> </div>
</div> </div>
@ -176,15 +176,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="ownerSp" name="owner[sp]" value="{{ contact.sp }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="ownerPc" name="owner[pc]" value="{{ contact.pc }}">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="ownerCc" name="owner[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option> <option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
@ -192,11 +192,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="tel" class="form-control" id="ownerVoice" name="owner[voice]" value="{{ contact.voice }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="email" class="form-control" id="ownerEmail" name="owner[email]" required autocapitalize="none" value="{{ contact.email }}">
</div> </div>
</div> </div>
@ -215,23 +215,23 @@
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingFirstName" name="billing[first_name]" value="{{ contact.first_name }}" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingLastName" name="billing[last_name]" value="{{ contact.last_name }}"required>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="billingOrg" name="billing[org]" value="{{ contact.org }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="billingStreet1" name="billing[street1]" value="{{ contact.street1 }}">
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="billingCity" name="billing[city]" value="{{ contact.city }}" required>
</div> </div>
</div> </div>
@ -239,15 +239,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="billingSp" name="billing[sp]" value="{{ contact.sp }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="billingPc" name="billing[pc]" value="{{ contact.pc }}">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="billingCc" name="billing[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option> <option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
@ -255,11 +255,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="tel" class="form-control" id="billingVoice" name="billing[voice]" value="{{ contact.voice }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="email" class="form-control" id="billingEmail" name="billing[email]" required autocapitalize="none" value="{{ contact.email }}">
</div> </div>
</div> </div>
@ -278,23 +278,23 @@
<!-- First Column --> <!-- First Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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> <input type="text" class="form-control" id="abuseFirstName" name="abuse[first_name]" value="{{ contact.first_name }}" required>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="abuseLastName" name="abuse[last_name]" value="{{ contact.last_name }}" required>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="abuseOrg" name="abuse[org]" value="{{ contact.org }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="abuseStreet1" name="abuse[street1]" value="{{ contact.street1 }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="abuseCity" name="abuse[city]" required value="{{ contact.city }}">
</div> </div>
</div> </div>
@ -302,15 +302,15 @@
<!-- Second Column --> <!-- Second Column -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="abuseSp" name="abuse[sp]" value="{{ contact.sp }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="text" class="form-control" id="abusePc" name="abuse[pc]" value="{{ contact.pc }}">
</div> </div>
<div class="mb-3"> <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"> <select class="form-select" id="abuseCc" name="abuse[cc]" required="required">
{% for country in countries %} {% for country in countries %}
<option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option> <option value="{{ country.alpha2 }}" {% if country.alpha2|lower == contact.cc %}selected{% endif %}>{{ country.name }}</option>
@ -318,11 +318,11 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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 }}"> <input type="tel" class="form-control" id="abuseVoice" name="abuse[voice]" value="{{ contact.voice }}">
</div> </div>
<div class="mb-3"> <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 }}"> <input type="email" class="form-control" id="abuseEmail" name="abuse[email]" required autocapitalize="none" value="{{ contact.email }}">
</div> </div>
</div> </div>
@ -340,9 +340,9 @@
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <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"> <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> </p>
<div id="ipWhitelistForm"> <div id="ipWhitelistForm">
<div id="ipAddressFields"> <div id="ipAddressFields">
@ -369,18 +369,18 @@
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Registrar User</h5> <h5 class="card-title">{{ __('Registrar User') }}</h5>
<p class="card-text"> <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> </p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th scope="col required">Username/CLID</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">{{ __('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">{{ __('Panel Password') }} <span class="text-red">*</span></th>
<th scope="col">EPP Password <span class="text-red">*</span></th> <th scope="col">{{ __('EPP Password') }} <span class="text-red">*</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -395,7 +395,7 @@
<div class="d-flex align-items-center"> <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> <input type="password" class="form-control form-control-sm me-2" name="panelPassword" id="panelPassword" autocomplete="off" disabled>
<div class="form-check mb-0"> <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>
</div> </div>
</td> </td>
@ -403,7 +403,7 @@
<div class="d-flex align-items-center"> <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> <input type="password" class="form-control form-control-sm me-2" name="eppPassword" id="eppPassword" autocomplete="off" disabled>
<div class="form-check mb-0"> <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>
</div> </div>
</td> </td>
@ -419,9 +419,9 @@
<!-- OTE Section --> <!-- OTE Section -->
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <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"> <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> </p>
<div class="row"> <div class="row">
<!-- First Column --> <!-- First Column -->
@ -429,23 +429,23 @@
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
contact:create contact:create
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:check domain:check
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:info domain:info
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:renew domain:renew
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:transfer domain:transfer
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
</ul> </ul>
</div> </div>
@ -455,23 +455,23 @@
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
host:create host:create
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
host:info host:info
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
contact:update contact:update
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
domain:delete domain:delete
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
poll:request poll:request
<span class="badge bg-orange text-orange-fg">Pending</span> <span class="badge bg-orange text-orange-fg">{{ __('Pending') }}</span>
</li> </li>
</ul> </ul>
</div> </div>
@ -480,7 +480,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -489,19 +489,7 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {

View file

@ -26,56 +26,56 @@
<div class="col-12"> <div class="col-12">
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h3 class="card-title">Registrar {{ registrar.name }}&nbsp;<span class="status status-green" title="Prefix">{{ registrar.prefix }}</span>&nbsp;<span class="status status-info" title="IANA ID">{{ registrar.iana_id|default('N/A') }}</span></h3> <h3 class="card-title">{{ __('Registrar') }} {{ registrar.name }}&nbsp;<span class="status status-green" title="Prefix">{{ registrar.prefix }}</span>&nbsp;<span class="status status-info" title="IANA ID">{{ registrar.iana_id|default('N/A') }}</span></h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="datagrid"> <div class="datagrid">
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.email }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Website</div> <div class="datagrid-title">{{ __('Website') }}</div>
<div class="datagrid-content">{{ registrar.url }}</div> <div class="datagrid-content">{{ registrar.url }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.abuse_phone }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.abuse_email }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.whois_server }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.rdap_server }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.crdate }}</div>
</div> </div>
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">Currency</div> <div class="datagrid-title">{{ __('Currency') }}</div>
<div class="datagrid-content">{{ registrar.currency }}</div> <div class="datagrid-content">{{ registrar.currency }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ currency }} {{ registrar.accountBalance }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ currency }} {{ registrar.creditLimit }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ currency }} {{ registrar.creditThreshold }}</div>
</div> </div>
<div class="datagrid-item"> <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 class="datagrid-content">{{ registrar.thresholdType|capitalize }}</div>
</div> </div>
</div> </div>
@ -86,7 +86,7 @@
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">IP Whitelisting</h5> <h5 class="card-title">{{ __('IP Whitelisting') }}</h5>
<ul class="list-group"> <ul class="list-group">
{% if registrarWhitelist is not empty %} {% if registrarWhitelist is not empty %}
{% for ip in registrarWhitelist %} {% for ip in registrarWhitelist %}
@ -95,7 +95,7 @@
</li> </li>
{% endfor %} {% endfor %}
{% else %} {% else %}
<li class="list-group-item">No data available.</li> <li class="list-group-item">{{ __('No data available.') }}</li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
@ -104,13 +104,13 @@
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<div class="card h-100"> <div class="card h-100">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Registrar User</h5> <h5 class="card-title">{{ __('Registrar User') }}</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th scope="col required">EPP Username/CLID</th> <th scope="col required">{{ __('EPP Username/CLID') }}</th>
<th scope="col">Panel Login Email</th> <th scope="col">{{ __('Panel Login Email') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -131,9 +131,9 @@
</div> </div>
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <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"> <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> </p>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
@ -142,7 +142,7 @@
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
{{ item.command }} {{ 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"> <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> </span>
</li> </li>
{% endfor %} {% endfor %}
@ -155,7 +155,7 @@
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
{{ item.command }} {{ 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"> <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> </span>
</li> </li>
{% endfor %} {% endfor %}
@ -166,18 +166,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Documentation') }} {{ __('Documentation') }}
@ -26,7 +26,7 @@
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-body border-bottom py-3"> <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> <p>{{ documentation_intro|default('Replace this section with a brief introduction about your documentation.') }}</p>
<h3>Getting Started</h3> <h3>Getting Started</h3>
@ -45,18 +45,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -11,7 +11,7 @@
<div class="col"> <div class="col">
<!-- Page pre-title --> <!-- Page pre-title -->
<div class="page-pretitle"> <div class="page-pretitle">
Overview {{ __('Overview') }}
</div> </div>
<h2 class="page-title"> <h2 class="page-title">
{{ __('Media Kit') }} {{ __('Media Kit') }}
@ -26,13 +26,13 @@
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-body border-bottom py-3"> <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> <p>{{ media_kit_intro|default('Replace this section with an introduction about the media kit contents and its intended audience.') }}</p>
<h3>Logos</h3> <h3>Logos</h3>
<p>{{ logos_intro|default('Provide guidelines on how to use your registry logos correctly.') }}</p> <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. --> <!-- 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> <h3>Branding Guidelines</h3>
<p>{{ branding_guidelines|default('Detail any color schemes, typography, or design patterns related to your TLD registry brand here.') }}</p> <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> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -42,24 +42,24 @@
<form action="/support/new" method="post"> <form action="/support/new" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="mb-3"> <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> <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 %} {% for category in categories %}
<option value="{{ category.id }}">{{ category.name }}</option> <option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<div class="mb-3"> <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> <input type="text" class="form-control" id="subject" name="subject" required>
</div> </div>
<div class="mb-3"> <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> <textarea class="form-control" id="message" name="message" rows="5" required></textarea>
</div> </div>
<div class="mb-3"> <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> </div>
</form> </form>
</div> </div>
@ -67,18 +67,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -45,19 +45,6 @@
<div class="container-xl"> <div class="container-xl">
<div class="col-12"> <div class="col-12">
{% include 'partials/flash.twig' %} {% 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>
&nbsp;{{ __('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">
<div class="card-body border-bottom py-3"> <div class="card-body border-bottom py-3">
<div class="d-flex"> <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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -82,18 +69,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -30,7 +30,7 @@
<input type="hidden" name="ticket_id" value="{{ ticket.id }}"> <input type="hidden" name="ticket_id" value="{{ ticket.id }}">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Ticket #{{ ticket.id }} - {{ ticket.subject }}</h5>&nbsp; <h5 class="card-title">{{ __('Ticket') }} #{{ ticket.id }} - {{ ticket.subject }}</h5>&nbsp;
{% if ticket.status == 'Open' %} {% if ticket.status == 'Open' %}
<span class="badge bg-success-lt">{{ ticket.status }}</span> <span class="badge bg-success-lt">{{ ticket.status }}</span>
{% elseif ticket.status == 'In Progress' %} {% elseif ticket.status == 'In Progress' %}
@ -40,18 +40,18 @@
{% elseif ticket.status == 'Closed' %} {% elseif ticket.status == 'Closed' %}
<span class="badge bg-secondary-lt">{{ ticket.status }}</span> <span class="badge bg-secondary-lt">{{ ticket.status }}</span>
{% else %} {% else %}
<span class="badge bg-dark-lt">Unknown Status</span> <span class="badge bg-dark-lt">{{ __('Unknown Status') }}</span>
{% endif %} {% endif %}
</div> </div>
<div class="card-body"> <div class="card-body">
<h6 class="card-subtitle mb-2 text-muted">Ticket Details</h6> <h6 class="card-subtitle mb-2 text-muted">{{ __('Ticket Details') }}</h6>
<p><span>Created on:</span> <strong>{{ ticket.date_created }}</strong></p> <p><span>{{ __('Created On') }}:</span> <strong>{{ ticket.date_created }}</strong></p>
<p><span>Category:</span> <strong>{{ category }}</strong></p> <p><span>{{ __('Category') }}:</span> <strong>{{ category }}</strong></p>
<p><span>Priority:</span> <strong>{{ ticket.priority }}</strong></p> <p><span>{{ __('Priority') }}:</span> <strong>{{ ticket.priority }}</strong></p>
<div class="card mt-3"> <div class="card mt-3">
<div class="card-body"> <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 %} {% for reply in replies %}
<div class="d-flex align-items-start mb-3"> <div class="d-flex align-items-start mb-3">
<div class="flex-shrink-0"> <div class="flex-shrink-0">
@ -77,14 +77,14 @@
</div> </div>
<div class="mt-3"> <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> <textarea class="form-control" id="responseText" name="responseText" rows="3" required></textarea>
</div> </div>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -93,18 +93,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -29,68 +29,68 @@
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">General Details</h5> <h5 class="card-title">{{ __('General Details') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-3"> <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> <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>
<div class="mb-3"> <div class="mb-3">
<label class="form-check form-switch"> <label class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="dnssecToggle" disabled> <input class="form-check-input" type="checkbox" id="dnssecToggle" disabled>
<span class="form-check-label">DNSSEC</span> <span class="form-check-label">DNSSEC</span>
</label> </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>
<div class="mb-3"> <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> <select class="form-select" id="tldTypeSelector" name="tldType" required>
<option value="ccTLD">ccTLD</option> <option value="ccTLD">ccTLD</option>
<option value="gTLD">gTLD</option> <option value="gTLD">gTLD</option>
</select> </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>
<div class="mb-3"> <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> <select class="form-select" id="scriptDropdown" name="script" required>
<option value="ascii" selected>ASCII</option> <option value="ascii" selected>ASCII</option>
<option value="cyrillic">Cyrillic</option> <option value="cyrillic">{{ __('Cyrillic') }}</option>
<option value="japanese">Japanese</option> <option value="japanese">{{ __('Japanese') }}</option>
<option value="korean">Korean</option> <option value="korean">{{ __('Korean') }}</option>
</select> </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>
</div> </div>
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Pricing</h5> <h5 class="card-title">{{ __('Pricing') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-vcenter card-table"> <table class="table table-vcenter card-table">
<thead> <thead>
<tr> <tr>
<th>Command</th> <th>{{ __('Command') }}</th>
<th>Setup Fee</th> <th>{{ __('Setup Fee') }}</th>
<th>1 Year <span class="text-red">*</span></th> <th>1 {{ __('Year') }} <span class="text-red">*</span></th>
<th>2 Years <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>3 {{ __('Years') }} <span class="text-red">*</span></th>
<th>4 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>5 {{ __('Years') }} <span class="text-red">*</span></th>
<th>6 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>7 {{ __('Years') }} <span class="text-red">*</span></th>
<th>8 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>9 {{ __('Years') }} <span class="text-red">*</span></th>
<th>10 Years <span class="text-red">*</span></th> <th>10 {{ __('Years') }} <span class="text-red">*</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <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="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="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> <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> <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>
<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="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="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> <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> <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>
<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="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="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> <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> </tr>
</tbody> </tbody>
</table> </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>
<div class="mb-3 mt-3"> <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"> <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>
</div> </div>
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Premium Names</h5> <h5 class="card-title">{{ __('Premium Names') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-3"> <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"> <input type="file" class="form-control" id="premiumNamesFile" name="premiumNamesFile" accept=".csv">
<small class="form-text text-muted"> <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> </small>
</div> </div>
<hr> <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"> <table class="table" id="categoriesTable">
<thead> <thead>
<tr> <tr>
<th>Category Name</th> <th>{{ __('Category Name') }}</th>
<th>Price</th> <th>{{ __('Price') }}</th>
<th>Action</th> <th>{{ __('Action') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -179,7 +179,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -187,19 +187,7 @@
</form> </form>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {

View file

@ -25,11 +25,16 @@
{{ __('Manage Reserved Names') }} {{ __('Manage Reserved Names') }}
</a> </a>
</span> </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"> <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> <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') }} {{ __('Create New TLD') }}
</a> </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> <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> </a>
</div> </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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -66,18 +71,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -29,7 +29,7 @@
<form action="/registry/reserved" method="post"> <form action="/registry/reserved" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="card-header"> <div class="card-header">
<h4 class="card-title">Manage Reserved Names</h4> <h4 class="card-title">{{ __('Manage Reserved Names') }}</h4>
</div> </div>
<div class="card-body"> <div class="card-body">
{% for type, names in categories %} {% for type, names in categories %}
@ -48,7 +48,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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>
</div> </div>
</form> </form>
@ -57,18 +57,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -29,11 +29,11 @@
{{ csrf.field | raw }} {{ csrf.field | raw }}
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">General Details</h5> <h5 class="card-title">{{ __('General Details') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-3"> <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> <div class="form-control-plaintext">{{ tld.tld }}</div>
<input type="hidden" name="extension" value="{{ tld.tld }}"> <input type="hidden" name="extension" value="{{ tld.tld }}">
</div> </div>
@ -44,11 +44,11 @@
</label> </label>
</div> </div>
<div class="mb-3"> <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 class="form-control-plaintext">ccTLD/gTLD</div>
</div> </div>
<div class="mb-3"> <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 class="form-control-plaintext">{{ scriptName }}</div>
</div> </div>
</div> </div>
@ -56,30 +56,30 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Pricing</h5> <h5 class="card-title">{{ __('Pricing') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-vcenter card-table"> <table class="table table-vcenter card-table">
<thead> <thead>
<tr> <tr>
<th>Command</th> <th>{{ __('Command') }}</th>
<th>Setup Fee</th> <th>{{ __('Setup Fee') }}</th>
<th>1 Year <span class="text-red">*</span></th> <th>1 {{ __('Year') }} <span class="text-red">*</span></th>
<th>2 Years <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>3 {{ __('Years') }} <span class="text-red">*</span></th>
<th>4 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>5 {{ __('Years') }} <span class="text-red">*</span></th>
<th>6 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>7 {{ __('Years') }} <span class="text-red">*</span></th>
<th>8 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>9 {{ __('Years') }} <span class="text-red">*</span></th>
<th>10 Years <span class="text-red">*</span></th> <th>10 {{ __('Years') }} <span class="text-red">*</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <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="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="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> <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> <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>
<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="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="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> <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> <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>
<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="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="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> <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> </tr>
</tbody> </tbody>
</table> </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>
<div class="mb-3 mt-3"> <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 }}"> <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>
</div> </div>
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Premium Names</h5> <h5 class="card-title">{{ __('Premium Names') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-3"> <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"> <input type="file" class="form-control" id="premiumNamesFile" name="premiumNamesFile" accept=".csv">
<small class="form-text text-muted"> <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> </small>
</div> </div>
<hr> <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"> <table class="table" id="categoriesTable">
<thead> <thead>
<tr> <tr>
<th>Category Name</th> <th>{{ __('Category Name') }}</th>
<th>Price</th> <th>{{ __('Price') }}</th>
<th>Action</th> <th>{{ __('Action') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -178,13 +178,13 @@
</tbody> </tbody>
</table> </table>
<small class="form-text text-muted"> <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> </small>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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> </div>
</div> </div>
@ -193,19 +193,19 @@
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Manage Promotions</h5> <h5 class="card-title">{{ __('Manage Promotions') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="table-responsive mb-3"> <div class="table-responsive mb-3">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>Promotion Name</th> <th>{{ __('Promotion Name') }}</th>
<th>Start Date</th> <th>{{ __('Start Date') }}</th>
<th>End Date</th> <th>{{ __('End Date') }}</th>
<th>Discount (%)</th> <th>{{ __('Discount') }} (%)</th>
<th>Discount Amount</th> <th>{{ __('Discount Amount') }}</th>
<th>Description</th> <th>{{ __('Description') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -220,64 +220,64 @@
</tr> </tr>
{% else %} {% else %}
<tr> <tr>
<td colspan="8">No promotions found.</td> <td colspan="8">{{ __('No promotions found.') }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </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"> <form action="/registry/promotions" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}"> <input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}">
<div class="mb-3"> <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> <input type="text" class="form-control" id="promotionName" name="promotionName" placeholder="Enter promotion name" required>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6"> <div class="col-sm-6 col-md-6">
<div class="mb-3"> <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> <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> </div>
<div class="col-sm-6 col-md-6"> <div class="col-sm-6 col-md-6">
<div class="mb-3"> <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"> <input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="promotionEnd" name="promotionEnd">
</div> </div>
</div> </div>
</div> </div>
<div class="mb-3"> <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> <select class="form-select" id="discountType" name="discountType" required>
<option value="percentage">Percentage</option> <option value="percentage">{{ __('Percentage') }}</option>
<option value="fixed">Fixed Amount</option> <option value="fixed">{{ __('Fixed Amount') }}</option>
<option value="free">Free Domains</option> <option value="free">{{ __('Free Domains') }}</option>
</select> </select>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="discountValue" class="form-label">Discount Value</label> <label for="discountValue" class="form-label">{{ __('Discount Value') }}</label>
<input type="text" class="form-control" id="discountValue" name="discountValue" placeholder="Enter discount value"> <input type="text" class="form-control" id="discountValue" name="discountValue" placeholder="{{ __('Enter discount value') }}">
</div> </div>
<div class="mb-3"> <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"> <input type="text" class="form-control" id="max_count" name="max_count">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="promotionConditions" class="form-label">Conditions</label> <label for="promotionConditions" class="form-label">{{ __('Conditions') }}</label>
<textarea class="form-control" id="promotionConditions" name="promotionConditions" rows="3" placeholder="Enter conditions"></textarea> <textarea class="form-control" id="promotionConditions" name="promotionConditions" rows="3" placeholder="{{ __('Enter conditions') }}"></textarea>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="promotionDescription" class="form-label">Description</label> <label for="promotionDescription" class="form-label">{{ __('Description') }}</label>
<textarea class="form-control" id="promotionDescription" name="promotionDescription" rows="3" placeholder="Enter description"></textarea> <textarea class="form-control" id="promotionDescription" name="promotionDescription" rows="3" placeholder="{{ __('Enter description') }}"></textarea>
</div> </div>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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>
</div> </div>
</form> </form>
@ -286,19 +286,19 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h5 class="card-title">Manage Launch Phases</h5> <h5 class="card-title">{{ __('Manage Launch Phases') }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="table-responsive mb-3"> <div class="table-responsive mb-3">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>Phase Type</th> <th>{{ __('Phase Type') }}</th>
<th>Phase Name</th> <th>{{ __('Phase Name') }}</th>
<th>Phase Category</th> <th>{{ __('Phase Category') }}</th>
<th>Phase Description</th> <th>{{ __('Phase Description') }}</th>
<th>Start Date</th> <th>{{ __('Start Date') }}</th>
<th>End Date</th> <th>{{ __('End Date') }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -313,18 +313,18 @@
</tr> </tr>
{% else %} {% else %}
<tr> <tr>
<td colspan="7">No launch phases found.</td> <td colspan="7">{{ __('No launch phases found.') }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </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"> <form action="/registry/phases" method="post">
{{ csrf.field | raw }} {{ csrf.field | raw }}
<input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}"> <input type="hidden" name="tldid" value="{{ tld.id }}"><input type="hidden" name="extension" value="{{ tld.tld }}">
<div class="mb-3"> <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> <select class="form-select" id="phaseType" name="phaseType" required>
<option value="sunrise">Sunrise</option> <option value="sunrise">Sunrise</option>
<option value="landrush">Landrush</option> <option value="landrush">Landrush</option>
@ -334,40 +334,40 @@
</select> </select>
</div> </div>
<div class="mb-3"> <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"> <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> <small class="form-hint">The "Phase Name" field is required only if the "Type" is set to "Custom".</small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<div class="form-label">Phase Category</div> <div class="form-label">{{ __('Phase Category') }}</div>
<div> <div>
<label class="form-check form-check-inline"> <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> <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> <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>
<label class="form-check form-check-inline"> <label class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="phaseCategory" id="Application" value="Application"> <input class="form-check-input" type="radio" name="phaseCategory" id="Application" value="Application">
<span class="form-check-label">Application</span> <span class="form-check-label">Application</span>
<small class="form-hint">Multiple applications allowed.</small> <small class="form-hint">{{ __('Multiple applications allowed.') }}</small>
</label> </label>
</div> </div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="phaseDescription" class="form-label required">Phase Description</label> <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> <textarea class="form-control" id="phaseDescription" name="phaseDescription" rows="3" placeholder="{{ __('Enter phase description') }}" required></textarea>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6"> <div class="col-sm-6 col-md-6">
<div class="mb-3"> <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> <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> </div>
<div class="col-sm-6 col-md-6"> <div class="col-sm-6 col-md-6">
<div class="mb-3"> <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"> <input type="datetime-local" class="form-control" placeholder="e.g., 01/01/2023" id="phaseEnd" name="phaseEnd">
</div> </div>
</div> </div>
@ -376,7 +376,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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>
</div> </div>
</form> </form>
@ -385,19 +385,7 @@
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {

View file

@ -31,38 +31,48 @@
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<h3 class="mb-3">System Settings</h3> <h3 class="mb-3">{{ __('System Settings') }}</h3>
<div class="mb-3"> <div class="mb-3">
<label for="registryOperator" class="form-label required">Registry Operator Name</label> <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> <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> <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>
<div class="mb-3"> <div class="mb-3">
<label for="registryHandle" class="form-label required">Registry Handle</label> <label for="whoisServer" class="form-label required">{{ __('WHOIS Server') }}</label>
<input type="text" class="form-control" id="registryHandle" name="registryHandle" placeholder="Enter registry handle" value="{{ handle }}" required> <input type="text" class="form-control" id="whoisServer" name="whoisServer" placeholder="{{ __('Enter registry whois server') }}" value="{{ whois_server }}" required>
<small class="form-hint">A unique identifier for the registry which will be appended to each object handle.</small> <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>
<div class="mb-3"> <div class="mb-3">
<label for="whoisServer" class="form-label required">WHOIS Server</label> <label for="registryCurrency" class="form-label required">{{ __('Registry Currency') }}</label>
<input type="text" class="form-control" id="whoisServer" name="whoisServer" placeholder="Enter registry whois server" value="{{ whois_server }}" required> <select class="form-select" id="registryCurrency" name="currency" required="required">
<small class="form-hint">Enter the URL of the registry's WHOIS server. Example: whois.example.com</small> {% 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>
<div class="mb-3"> <div class="mb-3">
<label for="rdapServer" class="form-label required">RDAP Server</label> <label class="form-label">{{ __('Features') }}</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>
<div class="divide-y"> <div class="divide-y">
<div> <div>
<label class="row"> <label class="row">
<span class="col">Require Launch Phases</span> <span class="col">{{ __('Require Launch Phases') }}</span>
<span class="col-auto"> <span class="col-auto">
<label class="form-check form-check-single form-switch"> <label class="form-check form-check-single form-switch">
<input class="form-check-input" type="checkbox" name="launchPhases" {% if launch_phases == 'on' %}checked{% endif %}> <input class="form-check-input" type="checkbox" name="launchPhases" {% if launch_phases == 'on' %}checked{% endif %}>
@ -76,36 +86,36 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<h3 class="mb-3">Operator Details</h3> <h3 class="mb-3">{{ __('Operator Details') }}</h3>
<div class="mb-3"> <div class="mb-3">
<label for="registryOperatorVat" class="form-label required">Registry VAT/Company Number</label> <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> <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> <small class="form-hint">{{ __('Enter the VAT number of the organization operating the registry, or company number if VAT is unavailable.') }}</small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="contactAddress" class="form-label required">Contact Address</label> <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> <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> <small class="form-hint">{{ __('The contact address of the registry.') }}</small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="contactAddress2" class="form-label required">Contact Address (Line 2)</label> <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> <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> <small class="form-hint">{{ __('The contact address of the registry.') }} (Line 2)</small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="contactEmail" class="form-label required">Contact Email</label> <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> <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> <small class="form-hint">{{ __('The email address for general inquiries to the registry.') }}</small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="contactPhone" class="form-label required">Contact Phone</label> <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> <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> <small class="form-hint">{{ __('The phone number for general inquiries to the registry.') }}</small>
</div> </div>
</div> </div>
@ -115,7 +125,7 @@
<div class="card-footer"> <div class="card-footer">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-auto"> <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>
</div> </div>
</form> </form>
@ -124,18 +134,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -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> <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>
<div class="ms-auto text-secondary"> <div class="ms-auto text-secondary">
Search: {{ __('Search') }}:
<div class="ms-2 d-inline-block"> <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> </div>
</div> </div>
@ -48,18 +48,6 @@
</div> </div>
</div> </div>
</div> </div>
<footer class="footer footer-transparent d-print-none"> {% include 'partials/footer.twig' %}
<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 &copy; 2023
<a href="https://namingo.org" target="_blank" class="link-secondary">Namingo</a>.
</li>
</ul>
</div>
</div>
</div>
</footer>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -6,11 +6,7 @@
<meta http-equiv="X-UA-Compatible" content="ie=edge"/> <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<title>{% block title %}{% endblock %} | Namingo</title> <title>{% block title %}{% endblock %} | Namingo</title>
<!-- CSS files --> <!-- 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') %} {% 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 %}
{% include 'partials/css-tables.twig' %}
{% else %}
{% include 'partials/css.twig' %}
{% endif %}
<style> <style>
@import url('https://rsms.me/inter/inter.css'); @import url('https://rsms.me/inter/inter.css');
:root { :root {
@ -32,13 +28,13 @@
</a> </a>
</h1> </h1>
<div class="navbar-nav flex-row order-md-last"> <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="btn-list">
<div class="dropdown small-dropdown"> <div class="dropdown small-dropdown">
<a href="#" class="btn dropdown-toggle" data-bs-toggle="dropdown"><span class="flag flag-country-{{ uiLang }}"></span>&nbsp;{{ lang }}</a> <a href="#" class="btn dropdown-toggle" data-bs-toggle="dropdown"><span class="flag flag-country-{{ uiLang }}"></span>&nbsp;{{ lang }}</a>
<div class="dropdown-menu"> <div class="dropdown-menu">
<a href="/lang?en_US" class="dropdown-item"><span class="flag flag-country-us"></span>&nbsp;English</a> <a href="/lang?en_US" class="dropdown-item"><span class="flag flag-country-us"></span>&nbsp;English</a>
<a href="/lang?uk_UA" class="dropdown-item"><span class="flag flag-country-ua"></span>&nbsp;Ukrainian</a> <a href="/lang?uk_UA" class="dropdown-item"><span class="flag flag-country-ua"></span>&nbsp;Українська</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,21 +1,21 @@
<link href="/assets/css/tabler.min.css" rel="stylesheet"/> <link href="/assets/css/tabler.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-flags.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-payments.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/> <link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
{% if screen_mode == 'dark' %} {% if screen_mode == 'dark' %}
<link href="/assets/css/tabulator-dark.min.css" rel="stylesheet"> <link href="/assets/css/tabulator-dark.min.css" rel="stylesheet">
{% else %} {% else %}
<link href="/assets/css/tabulator.min.css" rel="stylesheet"> <link href="/assets/css/tabulator.min.css" rel="stylesheet">
{% endif %} {% endif %}
<link href="/assets/css/sweetalert2.min.css" rel="stylesheet"> <link href="/assets/css/sweetalert2.min.css" rel="stylesheet">
<style> <style>
.small-dropdown .dropdown-item { .small-dropdown .dropdown-item {
padding: 0.25rem 1.5rem; padding: 0.25rem 1.5rem;
} }
.small-dropdown .flag { .small-dropdown .flag {
width: 20px; width: 20px;
height: 15px; height: 15px;
display: inline-block; display: inline-block;
} }
</style> </style>

View file

@ -1,15 +1,15 @@
<link href="/assets/css/tabler.min.css" rel="stylesheet"/> <link href="/assets/css/tabler.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-flags.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-payments.min.css" rel="stylesheet"/>
<link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/> <link href="/assets/css/tabler-vendors.min.css" rel="stylesheet"/>
<style> <style>
.small-dropdown .dropdown-item { .small-dropdown .dropdown-item {
padding: 0.25rem 1.5rem; padding: 0.25rem 1.5rem;
} }
.small-dropdown .flag { .small-dropdown .flag {
width: 20px; width: 20px;
height: 15px; height: 15px;
display: inline-block; display: inline-block;
} }
</style> </style>

View 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 &copy; {{ '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>

View file

@ -115,18 +115,18 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Name') }}", field:"name", width:250, headerSort:false, formatter: domainLinkFormatter, responsive:0},
{title:"Applicant", width:150, field:"registrant.identifier", headerSort:false, responsive:2}, {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:"{{ __('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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
if (e.target.closest('.delete-btn')) { if (e.target.closest('.delete-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to delete this application?", title: "{{ __('Are you sure you want to delete this application?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url'); let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
@ -137,7 +137,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -94,17 +94,17 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Identifier') }}", field:"identifier", width:250, headerSort:false, formatter: contactLinkFormatter, responsive:0},
{title:"Email", field:"email", width:300, minWidth:200, headerSort:false, responsive:2}, {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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
if (e.target.closest('.delete-btn')) { if (e.target.closest('.delete-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to delete this contact?", title: "{{ __('Are you sure you want to delete this contact?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url'); let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
@ -115,7 +115,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -112,18 +112,18 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Name') }}", field:"name", width:200, headerSort:false, formatter: domainLinkFormatter, responsive:0},
{title:"Registrant", width:200, field:"registrant.identifier", headerSort:false, responsive:2}, {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:"{{ __('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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
if (e.target.closest('.delete-btn')) { if (e.target.closest('.delete-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to delete this domain?", title: "{{ __('Are you sure you want to delete this domain?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url'); let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
@ -133,9 +133,9 @@
} else if (e.target.closest('.restore-btn')) { } else if (e.target.closest('.restore-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to restore this domain?", title: "{{ __('Are you sure you want to restore this domain?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let restoreUrl = e.target.closest('.restore-btn').getAttribute('data-restore-url'); let restoreUrl = e.target.closest('.restore-btn').getAttribute('data-restore-url');
@ -145,9 +145,9 @@
} else if (e.target.closest('.report-btn')) { } else if (e.target.closest('.report-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ 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, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let reportUrl = e.target.closest('.report-btn').getAttribute('data-report-url'); let reportUrl = e.target.closest('.report-btn').getAttribute('data-report-url');
@ -158,7 +158,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -93,16 +93,16 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
if (e.target.closest('.delete-btn')) { if (e.target.closest('.delete-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to delete this host?", title: "{{ __('Are you sure you want to delete this host?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url'); let deleteUrl = e.target.closest('.delete-btn').getAttribute('data-delete-url');
@ -113,7 +113,7 @@
}}, }},
], ],
placeholder:function(){ 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
} }
}); });

View file

@ -37,19 +37,19 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('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:"{{ __('Registrar') }}", field:"registrar_id.name", width:300, headerSort:true, responsive:0},
{title:"Date", field:"issue_date", 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:"{{ __('Amount') }}", field:"total_amount", width:200, headerSort:true, responsive:0, formatter:"money", formatterParams:{
decimal:".", decimal:".",
thousand:" ", thousand:" ",
symbol:currency, symbol:currency,
negativeSign:true, 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(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -24,12 +24,12 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
{title:"Date", field:"date", headerSort:true, responsive:0}, {title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:0},
{title:"Log", field:"log", headerSort:true, responsive:2}, {title:"{{ __('Log') }}", field:"log", headerSort:true, responsive:2},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -24,18 +24,18 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
{title:"Date", field:"cldate", headerSort:true, responsive:0}, {title:"{{ __('Date') }}", field:"cldate", headerSort:true, responsive:0},
{title:"Registrar", field:"registrar_id", headerSort:true, responsive:2}, {title:"{{ __('Registrar') }}", field:"registrar_id", headerSort:true, responsive:2},
{title:"Command", field:"cmd", headerSort:true, responsive:0}, {title:"{{ __('Command') }}", field:"cmd", headerSort:true, responsive:0},
{title:"Object Type", field:"obj_type", headerSort:true, responsive:0}, {title:"{{ __('Object Type') }}", field:"obj_type", headerSort:true, responsive:0},
{title:"Object", field:"obj_id", headerSort:true, responsive:2}, {title:"{{ __('Object') }}", field:"obj_id", headerSort:true, responsive:2},
{title:"Result", field:"code", headerSort:true, responsive:2}, {title:"{{ __('Result') }}", field:"code", headerSort:true, responsive:2},
{title:"Message", field:"msg", headerSort:true, responsive:2, download:false}, {title:"{{ __('Message') }}", field:"msg", headerSort:true, responsive:2, download:false},
{title:"clTRID", field:"clTRID", 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:"{{ __('Milliseconds') }}", field:"svmicrosecond", headerSort:false, download:false, responsive:2},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -26,10 +26,10 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
{title:"Date", field:"date", headerSort:true, responsive:2}, {title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:2},
{title:"Description", field:"description", 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:"{{ __('Amount') }}", field:"amount", headerSort:true, download:false, responsive:0, formatter:"money", formatterParams:{
decimal:".", decimal:".",
thousand:" ", thousand:" ",
symbol:currency, symbol:currency,
@ -37,7 +37,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -24,14 +24,14 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:2},
{title:"Date", field:"qdate", headerSort:true, responsive:0}, {title:"{{ __('Date') }}", field:"qdate", headerSort:true, responsive:0},
{title:"Message", field:"msg", headerSort:true, responsive:0}, {title:"{{ __('Message') }}", field:"msg", headerSort:true, responsive:0},
{title:"Message Type", field:"msg_type", 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:"{{ __('Object') }}", field:"obj_name_or_id", headerSort:true, responsive:2},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -41,19 +41,19 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"IANA ID", field:"iana_id", width:300, headerSort:true, responsive:2},
{title:"Email", field:"email", 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:"{{ __('Balance') }}", field:"accountBalance", width:300, headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
decimal:".", decimal:".",
thousand:" ", thousand:" ",
symbol:currency, symbol:currency,
negativeSign:true, 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(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -24,16 +24,16 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0},
{title:"Date", field:"date", headerSort:true, responsive:0}, {title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:0},
{title:"Total Domains", field:"total_domains", 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:"{{ __('Created Domains') }}", field:"created_domains", headerSort:true, responsive:2},
{title:"Renewed Domains", field:"renewed_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:"{{ __('Transferred Domains') }}", field:"transfered_domains", headerSort:true, responsive:2},
{title:"Deleted Domains", field:"deleted_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:"{{ __('Restored Domains') }}", field:"restored_domains", headerSort:true, responsive:2, download:false}
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -76,14 +76,14 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('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:"{{ __('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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick:function(e, cell){ e.stopPropagation(); }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -67,12 +67,12 @@
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"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:"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(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -25,14 +25,14 @@
], ],
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Registrar') }}", field:"registrar_id.name", headerSort:true, responsive:0},
{title:"Date", field:"date", headerSort:true, responsive:2}, {title:"{{ __('Date') }}", field:"date", headerSort:true, responsive:2},
{title:"Command", field:"command", headerSort:true, responsive:2}, {title:"{{ __('Command') }}", field:"command", headerSort:true, responsive:2},
{title:"Domain", field:"domain_name", headerSort:false, download:false, responsive:0}, {title:"{{ __('Domain') }}", field:"domain_name", headerSort:false, download:false, responsive:0},
{title:"Length", field:"length_in_months", headerSort:true, responsive:2}, {title:"{{ __('Length') }}", field:"length_in_months", headerSort:true, responsive:2},
{title:"From", field:"fromS", headerSort:true, responsive:2}, {title:"{{ __('From') }}", field:"fromS", headerSort:true, responsive:2},
{title:"To", field:"toS", 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:"{{ __('Amount') }}", field:"amount", headerSort:false, download:false, responsive:2, formatter:"money", formatterParams:{
decimal:".", decimal:".",
thousand:" ", thousand:" ",
symbol:currency, symbol:currency,
@ -40,7 +40,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -21,16 +21,16 @@
var clidValue = document.getElementById('clid').value; var clidValue = document.getElementById('clid').value;
if (hasPendingStatus && clidValue === '0') { 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-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-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-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) { } 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) { } 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-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-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 { } 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; return actionButtons;
@ -78,17 +78,17 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('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:"{{ __('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:"{{ __('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:"{{ __('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: "{{ __('Actions') }}", formatter: actionsFormatter, headerSort: false, download:false, hozAlign: "center", responsive:0, cellClick: function(e, cell){
if (e.target.closest('.approve-btn')) { if (e.target.closest('.approve-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to approve this transfer?", title: "{{ __('Are you sure you want to approve this transfer?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let approveUrl = e.target.closest('.approve-btn').getAttribute('data-approve-url'); let approveUrl = e.target.closest('.approve-btn').getAttribute('data-approve-url');
@ -98,9 +98,9 @@
} else if (e.target.closest('.cancel-btn')) { } else if (e.target.closest('.cancel-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to cancel this transfer?", title: "{{ __('Are you sure you want to cancel this transfer?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let cancelUrl = e.target.closest('.cancel-btn').getAttribute('data-cancel-url'); let cancelUrl = e.target.closest('.cancel-btn').getAttribute('data-cancel-url');
@ -110,9 +110,9 @@
} else if (e.target.closest('.reject-btn')) { } else if (e.target.closest('.reject-btn')) {
e.preventDefault(); // Prevent the default link behavior e.preventDefault(); // Prevent the default link behavior
Swal.fire({ Swal.fire({
title: "Are you sure you want to reject this transfer?", title: "{{ __('Are you sure you want to reject this transfer?') }}",
showCancelButton: true, showCancelButton: true,
confirmButtonText: "Confirm" confirmButtonText: "{{ __('Confirm') }}"
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let rejectUrl = e.target.closest('.reject-btn').getAttribute('data-reject-url'); let rejectUrl = e.target.closest('.reject-btn').getAttribute('data-reject-url');
@ -123,7 +123,7 @@
}}, }},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

View file

@ -65,14 +65,14 @@
resizableColumns:false, resizableColumns:false,
columns:[ columns:[
{formatter:"responsiveCollapse", width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false, responsive:0}, {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:"{{ __('Name') }}", field:"username", width:200, headerSort:true, formatter: userLinkFormatter, responsive:0},
{title:"Email", field:"email", width:300, headerSort:true, responsive:2}, {title:"{{ __('Email') }}", field:"email", width:300, headerSort:true, responsive:2},
{title:"Roles", field:"roles_mask", width:200, headerSort:true, formatter: roleLabelFormatter, 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:"{{ __('Verified') }}", field:"verified", width:200, headerSort:true, formatter: verifiedFormatter, responsive:2},
{title:"Status", field:"status", width:200, headerSort:true, formatter: statusBadgeFormatter, responsive:2}, {title:"{{ __('Status') }}", field:"status", width:200, headerSort:true, formatter: statusBadgeFormatter, responsive:2},
], ],
placeholder:function(){ 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"); var searchInput = document.getElementById("search-input");

Some files were not shown because too many files have changed in this diff Show more