getnamingo-registry/cp/resources/views/admin/system/manageTld.twig
2025-04-04 23:09:00 +03:00

399 lines
No EOL
27 KiB
Twig

{% extends "layouts/app.twig" %}
{% block title %}{{ __('Manage TLD') }} {{ tld.tld }}{% endblock %}
{% block content %}
<link href="/assets/css/sweetalert2.min.css" rel="stylesheet">
<div class="page-wrapper">
<!-- Page header -->
<div class="page-header d-print-none">
<div class="container-xl">
<div class="row g-2 align-items-center">
<div class="col">
<div class="mb-1">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{route('home')}}"><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" /><polyline points="5 12 3 12 12 3 21 12 19 12" /><path d="M5 12v8a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-8" /><rect x="10" y="12" width="4" height="4" /></svg></a>
</li>
<li class="breadcrumb-item">
<a href="{{route('listTlds')}}">{{ __('TLD Management') }}</a>
</li>
<li class="breadcrumb-item active">
{{ __('Manage TLD') }}
</li>
</ol>
</div>
<h2 class="page-title">
{{ __('Manage TLD') }} {{ tld_u }}
</h2>
</div>
<div class="col-auto ms-auto">
<div class="btn-list">
<a href="/registry/idnexport/{{ tld.tld }}" target="_blank" class="btn btn-outline-orange d-none d-sm-inline-block">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M11.5 21h-4.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v5m-5 6h7m-3 -3l3 3l-3 3" /></svg>
{{ __('Export IDN Table') }}
</a>
<a href="/registry/idnexport/{{ tld.tld }}" target="_blank" class="btn btn-outline-orange d-sm-none btn-icon" aria-label="{{ __('Export IDN Table') }}" title="{{ __('Export IDN Table') }}">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M14 3v4a1 1 0 0 0 1 1h4" /><path d="M11.5 21h-4.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v5m-5 6h7m-3 -3l3 3l-3 3" /></svg>
</a>
{% if secureTld != 1 %}
<a href="/registry/dnssec" class="btn btn-outline-indigo enable-dnssec-link desktop-only d-none d-sm-inline-block">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12.462 20.87c-.153 .047 -.307 .09 -.462 .13a12 12 0 0 1 -8.5 -15a12 12 0 0 0 8.5 -3a12 12 0 0 0 8.5 3a12 12 0 0 1 .11 6.37" /><path d="M16 19h6" /><path d="M19 16v6" /></svg>
{{ __('Enable DNSSEC') }}
</a>
<a href="/registry/dnssec" class="btn btn-outline-indigo enable-dnssec-link mobile-only d-sm-none btn-icon" aria-label="{{ __('Enable DNSSEC') }}" title="{{ __('Enable DNSSEC') }}">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12.462 20.87c-.153 .047 -.307 .09 -.462 .13a12 12 0 0 1 -8.5 -15a12 12 0 0 0 8.5 -3a12 12 0 0 0 8.5 3a12 12 0 0 1 .11 6.37" /><path d="M16 19h6" /><path d="M19 16v6" /></svg>
</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<!-- Page body -->
<div class="page-body">
<div class="container-xl">
<div class="col-12">
{% include 'partials/flash.twig' %}
<form action="/registry/tld/{{ tld.tld }}" method="post" autocomplete="off">
{{ csrf.field | raw }}
<div class="card mb-3">
<div class="card-header">
<h3 class="card-title">{{ __('General Details') }}</h3>
</div>
<div class="card-body">
<div class="datagrid">
<div class="datagrid-item">
<div class="datagrid-title">{{ __('TLD Extension') }}</div>
<div class="datagrid-content">{{ tld_u }}</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">{{ __('TLD Type') }}</div>
<div class="datagrid-content">{{ tld_u|length == 3 ? 'ccTLD' : (tld_u|length > 3 ? 'gTLD' : (tld_u|length == 2 ? 'Test TLD' : '')) }}</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Supported Script') }}</div>
<div class="datagrid-content">{{ scriptName }}</div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">DNSSEC</div>
<div class="datagrid-content">
{% if secureTld == 1 %}
{% if dnssecData.error is defined %}
<span class="status status-red" title="{{ dnssecData.error }}">
{{ __('Issue') }}
</span>
{% else %}
<span class="status status-blue">
{{ __('Signed') }}
</span>
{% endif %}
{% else %}
<span class="status status-secondary">
{{ __('Not signed') }}
</span>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% if dnssecData is defined and dnssecData.keys is defined and dnssecData.keys|length > 0 %}
<div class="card mb-3">
<div class="card-header">
<h3 class="card-title">{{ __('DNSSEC Details') }}
<span class="card-subtitle">{{ __('Last Updated') }}: {{ dnssecData.timestamp }}</span>
</h3>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-vcenter card-table">
<thead>
<tr>
<th>{{ __('DS Record') }}</th>
<th>{{ __('Status') }}</th>
<th>{{ __('Published') }}</th>
<th>{{ __('Next Rollover') }}</th>
<th>{{ __('Parent') }}</th>
</tr>
</thead>
<tbody>
{% for key in dnssecData.keys %}
<tr>
<td>
{% if key.ds_record != 'N/A' %}
<p class="user-select-all tracking-wide mb-0">
<kbd>{{ key.ds_record }}</kbd>
</p>
{% else %}
<span class="text-muted">{{ __('Not Available') }}</span>
{% endif %}
</td>
<td>
{% if key.status == 'Active' %}
<span class="badge bg-success text-success-fg">{{ __('Active') }}</span>
{% elseif key.status == 'Pending Rollover' %}
<span class="badge bg-warning text-warning-fg">{{ __('Pending Rollover') }}</span>
{% else %}
<span class="badge bg-secondary text-secondary-fg">{{ __('Unknown') }}</span>
{% endif %}
</td>
<td>{{ key.published_date }}</td>
<td>{{ key.next_rollover }}</td>
<td>
{% if key.ds_status == 'omnipresent' %}
<span class="status-indicator status-green" title="DS record submitted and active at parent zone">
<span class="status-indicator-circle"></span>
</span>
{% elseif key.ds_status == 'rumoured' %}
<span class="status-indicator status-orange status-indicator-animated" title="DS record needs submission to parent zone">
<span class="status-indicator-circle"></span>
</span>
{% else %}
<span class="status-indicator status-gray" title="DS record status unknown or unavailable">
<span class="status-indicator-circle"></span>
</span>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endif %}
<div class="card mb-3">
<div class="card-header">
<h3 class="card-title">{{ __('Pricing') }}</h3>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-vcenter card-table">
<thead>
<tr>
<th>{{ __('Command') }}</th>
<th>{{ __('Setup Fee') }}</th>
<th>1 {{ __('Year') }} <span class="text-red">*</span></th>
<th>2 {{ __('Years') }} <span class="text-red">*</span></th>
<th>3 {{ __('Years') }} <span class="text-red">*</span></th>
<th>4 {{ __('Years') }} <span class="text-red">*</span></th>
<th>5 {{ __('Years') }} <span class="text-red">*</span></th>
<th>6 {{ __('Years') }} <span class="text-red">*</span></th>
<th>7 {{ __('Years') }} <span class="text-red">*</span></th>
<th>8 {{ __('Years') }} <span class="text-red">*</span></th>
<th>9 {{ __('Years') }} <span class="text-red">*</span></th>
<th>10 {{ __('Years') }} <span class="text-red">*</span></th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ __('Create') }}</td>
<td><input type="number" class="form-control" name="createm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m0 }}"></td>
<td><input type="number" class="form-control" name="createm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m12 }}"></td>
<td><input type="number" class="form-control" name="createm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m24 }}"></td>
<td><input type="number" class="form-control" name="createm36" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m36 }}"></td>
<td><input type="number" class="form-control" name="createm48" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m48 }}"></td>
<td><input type="number" class="form-control" name="createm60" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m60 }}"></td>
<td><input type="number" class="form-control" name="createm72" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m72 }}"></td>
<td><input type="number" class="form-control" name="createm84" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m84 }}"></td>
<td><input type="number" class="form-control" name="createm96" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m96 }}"></td>
<td><input type="number" class="form-control" name="createm108" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ createPrices.m108 }}"></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>
<td>{{ __('Renew') }}</td>
<td><input type="number" class="form-control" name="renewm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m0 }}"></td>
<td><input type="number" class="form-control" name="renewm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m12 }}"></td>
<td><input type="number" class="form-control" name="renewm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m24 }}"></td>
<td><input type="number" class="form-control" name="renewm36" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m36 }}"></td>
<td><input type="number" class="form-control" name="renewm48" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m48 }}"></td>
<td><input type="number" class="form-control" name="renewm60" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m60 }}"></td>
<td><input type="number" class="form-control" name="renewm72" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m72 }}"></td>
<td><input type="number" class="form-control" name="renewm84" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m84 }}"></td>
<td><input type="number" class="form-control" name="renewm96" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m96 }}"></td>
<td><input type="number" class="form-control" name="renewm108" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ renewPrices.m108 }}"></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>
<td>{{ __('Transfer') }}</td>
<td><input type="number" class="form-control" name="transferm0" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m0 }}"></td>
<td><input type="number" class="form-control" name="transferm12" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m12 }}"></td>
<td><input type="number" class="form-control" name="transferm24" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m24 }}"></td>
<td><input type="number" class="form-control" name="transferm36" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m36 }}"></td>
<td><input type="number" class="form-control" name="transferm48" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m48 }}"></td>
<td><input type="number" class="form-control" name="transferm60" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m60 }}"></td>
<td><input type="number" class="form-control" name="transferm72" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m72 }}"></td>
<td><input type="number" class="form-control" name="transferm84" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m84 }}"></td>
<td><input type="number" class="form-control" name="transferm96" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m96 }}"></td>
<td><input type="number" class="form-control" name="transferm108" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m108 }}"></td>
<td><input type="number" class="form-control" name="transferm120" placeholder="0.00" required min="0" step="0.01" pattern="^\d+(\.\d{1,2})?$" value="{{ transferPrices.m120 }}"></td>
</tr>
</tbody>
</table>
<small class="form-text text-muted">{{ __('When you type a price for 1 Year above, it will automatically get multiplied for subsequent years.') }}</small>
</div>
<div class="mb-3 mt-3">
<label for="restorePrice" class="form-label required">{{ __('Restore Price') }}</label>
<input type="number" class="form-control" id="restorePrice" name="restorePrice" placeholder="0.00" required min="0" 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>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-header">
<h5 class="card-title">{{ __('Premium Names') }}</h5>
</div>
<div class="card-body">
<div class="mb-3">
<label for="premiumNamesFile" class="form-label">{{ __('Upload CSV File') }}</label>
<input type="file" class="form-control" id="premiumNamesFile" name="premiumNamesFile" accept=".csv">
<small class="form-text text-muted">
{{ __('Please upload a CSV file containing premium names. Each row should include a name and its corresponding pricing category, separated by a comma. Note: If one or more names in the file already exist in our system, they will be overwritten with the new information provided in the upload.') }}
</small>
</div>
<hr>
<h5 class="card-title mb-3">{{ __('Set Premium Name Price Categories') }}</h5>
<table class="table" id="categoriesTable">
<thead>
<tr>
<th>{{ __('Category Name') }}</th>
<th>{{ __('Price') }}</th>
<th>{{ __('Action') }}</th>
</tr>
</thead>
<tbody>
{% for category in premium_categories %}
<tr>
<td>
<input type="text" class="form-control" name="categoryName{{ category.category_id }}" placeholder="Category Name" value="{{ category.category_name }}" readonly>
</td>
<td>
<input type="number" class="form-control" name="categoryPrice{{ category.category_id }}" placeholder="0.00" min="0" value="{{ category.category_price }}">
</td>
<td>
<button type="button" class="btn btn-danger" disabled>-</button>
</td>
</tr>
{% endfor %}
<tr>
<td><input type="text" class="form-control" name="categoryNameNew1" placeholder="New Category 1"></td>
<td><input type="number" class="form-control" name="categoryPriceNew1" placeholder="0.00" min="0"></td>
<td><button type="button" class="btn btn-success add-category">+</button></td>
</tr>
</tbody>
</table>
<small class="form-text text-muted">
{{ __('Update existing premium categories as needed. Please note: currently, deletion of categories is not available. All updates will modify existing information without removing any categories.') }}
</small>
</div>
<div class="card-footer">
<div class="row align-items-center">
<div class="col-auto">
<button type="submit" class="btn btn-primary">{{ __('Update TLD') }} {{ tld_u }}</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
{% include 'partials/footer.twig' %}
</div>
<script src="/assets/js/sweetalert2.min.js" defer></script>
<script>
document.querySelectorAll('.enable-dnssec-link').forEach(function (el) {
el.addEventListener('click', function (e) {
e.preventDefault();
const link = e.currentTarget.getAttribute('href');
Swal.fire({
title: 'Are you sure?',
text: 'Please ensure DNSSEC has been properly configured for this TLD prior to proceeding, as outlined in section 2.1.3b. of the manual.',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Yes, continue',
cancelButtonText: 'Cancel',
confirmButtonColor: '#4263eb',
cancelButtonColor: '#9ba9be'
}).then((result) => {
if (result.isConfirmed) {
window.location.href = link;
}
});
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const createm12Input = document.querySelector('input[name="createm12"]');
const renewm12Input = document.querySelector('input[name="renewm12"]');
const transferm12Input = document.querySelector('input[name="transferm12"]');
const updateMultiplication = (input, startColumnIndex, baseInputName) => {
const inputValue = parseFloat(input.value);
if (!isNaN(inputValue)) {
for (let i = startColumnIndex; i <= 10; i++) {
const columnName = `${baseInputName}${12 * i}`;
const columnInput = document.querySelector(`input[name="${columnName}"]`);
if (columnInput) {
columnInput.value = (inputValue * i).toFixed(2);
}
}
}
};
createm12Input.addEventListener('input', () => {
updateMultiplication(createm12Input, 2, 'createm');
});
renewm12Input.addEventListener('input', () => {
updateMultiplication(renewm12Input, 2, 'renewm');
});
transferm12Input.addEventListener('input', () => {
updateMultiplication(transferm12Input, 2, 'transferm');
});
const categoriesTable = document.getElementById('categoriesTable');
const addCategoryButton = document.querySelector('.add-category');
const maxCategories = 5;
let categoryCount = 1;
addCategoryButton.addEventListener('click', function() {
if (categoryCount < maxCategories) {
categoryCount++;
const newRow = document.createElement('tr');
newRow.innerHTML = `
<td><input type="text" class="form-control" name="categoryNameNew${categoryCount}" placeholder="New Category ${categoryCount}"></td>
<td><input type="number" class="form-control" name="categoryPriceNew${categoryCount}" placeholder="0.00" min="0"></td>
<td><button type="button" class="btn btn-danger remove-category">-</button></td>
`;
categoriesTable.querySelector('tbody').appendChild(newRow);
}
if (categoryCount >= maxCategories) {
addCategoryButton.style.display = 'none'; // Disable adding more categories after reaching the limit
}
});
categoriesTable.addEventListener('click', function(event) {
if (event.target.classList.contains('remove-category')) {
const row = event.target.closest('tr');
row.remove();
categoryCount--;
addCategoryButton.style.display = 'block'; // Enable adding more categories after removing one
}
});
});
</script>
{% endblock %}