powerdns-admin/powerdnsadmin/templates/domain.html
Kristian Feldsam c03f5c4f9e Dashboard domains table - join actions into single column
Signed-off-by: Kristian Feldsam <feldsam@gmail.com>

dfdas

Signed-off-by: Kristian Feldsam <feldsam@gmail.com>
2023-08-08 00:55:55 +02:00

777 lines
43 KiB
HTML
Executable File

{% extends "base.html" %}
{% block title %}<title>Zone Records - {{ domain.name | pretty_domain_name }} - {{ SITE_NAME }}</title>{% endblock %}
{% block dashboard_stat %}
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark">Zone Records - {{ domain.name | pretty_domain_name }}</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{ url_for('dashboard.dashboard') }}">Dashboard</a></li>
<li class="breadcrumb-item active">Zone Records - {{ domain.name | pretty_domain_name }}</li>
</ol>
</div>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<section class="content">
<div class="container-fluid">
<div class="card" id="unsaved-changes-card" style="display: none; position: sticky; top: 0; z-index: 999;">
<div class="card-header" style="background-color: yellow;">
<h3 class="card-title" style="color: red;">
Warning: Unsaved Changes
</h3>
</div>
<div class="card-body" style="font-size: 1rem; color: black; background-color: yellow;">
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Zone Editor</h3>
<div class="card-tools">
{% if current_user.role.name in ['Administrator', 'Operator'] %}
<button type="button" title="Zone Settings"
class="btn btn-primary btn-danger mt-2 mb-2"
onclick="window.location.href='{{ url_for('domain.setting', domain_name=domain.name) }}'">
<i class="fa-solid fa-toolbox"></i>
&nbsp;Zone Settings
</button>
{% endif %}
{% if current_user.role.name in ['Administrator', 'Operator'] or allow_user_view_history %}
<button type="button" title="Zone Changelog"
class="btn btn-primary ml-2 mt-2 mb-2 button_changelog" id="{{ domain.name }}">
<i class="fa-solid fa-history" aria-hidden="true"></i>
&nbsp;Changelog
</button>
{% endif %}
{% if domain.type != 'Slave' %}
<button type="button" title="Add Record"
class="btn btn-primary ml-2 mt-2 mb-2 button_add_record" id="{{ domain.name }}">
<i class="fa-solid fa-plus"></i>
&nbsp;Add Record
</button>
<button type="button" title="Save Changes"
class="btn btn-primary ml-2 mt-2 mb-2 button_apply_changes"
id="{{ domain.name }}"
value="{{ domain.serial }}">
<i class="fa-solid fa-save"></i>
&nbsp;Save Changes
</button>
{% else %}
<button type="button" title="Update from Primary"
class="btn btn-primary ml-2 mt-2 mb-2 button_update_from_primary"
id="{{ domain.name }}">
<i class="fa-solid fa-sync"></i>
&nbsp;Update from Primary
</button>
{% endif %}
</div>
</div>
<div class="card-body table-responsive">
<table id="tbl_records" class="table table-bordered table-striped table-hover table-sm">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Status</th>
<th>TTL</th>
<th>Data</th>
{% if domain.type != 'Slave' %}
<th>Comment</th>
<th>Actions</th>
{% else %}
<th>Invisible Sorting Column</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for record in records %}
<tr class="odd row_record" id="{{ domain.name }}">
<td>{{ (record.name,domain.name) | display_record_name | pretty_domain_name }}</td>
<td>{{ record.type }}</td>
<td>{{ record.status }}</td>
<td>{{ record.ttl }}</td>
<td>{{ record.data | pretty_domain_name }}</td>
{% if domain.type != 'Slave' %}
<td>{{ record.comment }}</td>
<td>
{% if record.is_allowed_edit() %}
<button type="button" title="Edit" class="btn btn-sm btn-warning button_edit">
<i class="fa-solid fa-edit"></i>
</button>
{% else %}
<button type="button" class="btn btn-sm btn-warning">
<i class="fa-solid fa-exclamation-circle"></i>
</button>
{% endif %}
{% if record.is_allowed_delete() %}
<button type="button" title="Delete" class="btn btn-sm btn-danger button_delete">
<i class="fa-solid fa-trash"></i>
</button>
{% endif %}
{% if current_user.role.name in ['Administrator', 'Operator'] or allow_user_view_history %}
<button type="button" title="Changelog"
onclick="show_record_changelog('{{ record.name }}','{{ record.type }}',event)"
class="btn btn-primary btn-sm">
<i class="fa-solid fa-history" aria-hidden="true"></i>
</button>
{% endif %}
</td>
{% endif %}
<!-- hidden column that we can sort on -->
<td>1</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}
{% block head_styles %}
<style>
/* Page Specific Overrides */
table#tbl_records thead th:nth-child(1),
table#tbl_records thead th:nth-child(2),
table#tbl_records thead th:nth-child(3),
table#tbl_records thead th:nth-child(4) { width: 100px; }
table#tbl_records thead th:nth-child(7) { width: 80px; }
table#tbl_records tbody td { text-align: center; }
table#tbl_records tbody td:nth-child(0n+5),
table#tbl_records tbody td:nth-child(0n+6) { text-align: left; word-break: break-all; }
</style>
{% endblock %}
{% block extrascripts %}
<script>
// superglobals
window.records_allow_edit = {{ editable_records | tojson }};
window.ttl_options = {{ ttl_options | tojson }};
window.nEditing = null;
window.nNew = false;
// set up user data table
$("#tbl_records").DataTable({
"paging": true,
"lengthChange": true,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": false,
{% if SETTING.get('default_record_table_size') | string in ['5','15','20'] %}
"lengthMenu": [[5, 15, 20, -1],
[5, 15, 20, "All"]],
{% else %}
"lengthMenu": [[5, 15, 20, {{ SETTING.get('default_record_table_size') }}, -1],
[5, 15, 20, {{ SETTING.get('default_record_table_size') }}, "All"]],
{% endif %}
"pageLength": {{ SETTING.get('default_record_table_size') }},
"language": {
"lengthMenu": " _MENU_ records"
},
"retrieve": true,
"columnDefs": [
{
type: 'natural',
targets: [0, 4]
},
{
targets: [0, 1, 2, 3, 4, 5],
render: $.fn.dataTable.render.text()
},
{
// hidden column so that we can add new records on top
// regardless of whatever sorting is done. See orderFixed
visible: false,
{% if domain.type != 'Slave' %}
targets: [7]
{% else %}
targets: [5]
{% endif %}
},
{
targets: [0],
className: "text-right",
data: {
'_': "0",
'sort': function (row, _type, _set, _meta) {
const data = row[0] || '';
return data.split('.').reverse().join('.');
},
},
}
],
{% if domain.type != 'Slave' %}
"orderFixed": [[7, 'asc']]
{% else %}
"orderFixed": [[5, 'asc']]
{% endif %}
});
function show_record_changelog(record_name, record_type, e) {
e.stopPropagation();
window.location.href = "/domain/{{domain.name}}/changelog/" + record_name + "./" + record_type;
}
// handle changelog button
$(document.body).on("click", ".button_changelog", function (e) {
e.stopPropagation();
window.location.href = "/domain/{{domain.name}}/changelog";
});
// handle delete button
$(document.body).on("click", ".button_delete", function (e) {
e.stopPropagation();
var modal = $("#modal_delete");
var table = $("#tbl_records").DataTable();
var record = $(this).prop('id');
var nRow = $(this).parents('tr')[0];
var info = "Are you sure you want to delete " + record + "?";
modal.find('.modal-body p').text(info);
modal.modal('show');
$("#button_delete_confirm").unbind().one('click', function (e) {
table.row(nRow).remove().draw();
detectUnsavedChanges(table);
modal.modal('hide');
});
$("#button_delete_cancel").unbind().one('click', function (e) {
modal.modal('hide');
});
});
// handle edit button and record click
{% if domain.type != 'Slave' %}
$(document.body).on("click", ".button_edit{% if quick_edit %}, .row_record{% endif %}", function (e) {
e.stopPropagation();
if ($(this).is('tr')) {
var nRow = $(this)[0];
} else {
var nRow = $(this).parents('tr')[0];
}
var table = $("#tbl_records").DataTable();
if (nEditing == nRow) {
/* click on row already being edited, do nothing */
} else if (nEditing !== null && nEditing != nRow && nNew == false) {
/* Currently editing - but not this row - restore the old before continuing to edit mode */
restoreRow(table, nEditing);
editRow(table, nRow);
nEditing = nRow;
} else if (nNew == true) {
/* adding a new row, delete it and start editing */
table.row(nEditing).remove().draw();
nNew = false;
editRow(table, nRow);
nEditing = nRow;
} else {
/* No edit in progress - let's start one */
editRow(table, nRow);
nEditing = nRow;
}
});
{% endif %}
// handle apply changes button
$(document.body).on("click", ".button_apply_changes", function () {
if (nNew || nEditing) {
showErrorModal("Previous record not saved. Please save it before applying the changes.");
return;
}
var modal = $("#modal_apply_changes");
var table = $("#tbl_records").DataTable();
var domain = $(this).prop('id');
var serial = $(".button_apply_changes").val();
var info = "Are you sure you want to apply your changes?";
modal.find('.modal-body p').text(info);
// following unbind("click") is to avoid multiple times execution
modal.find('#button_apply_confirm').unbind("click").click(function () {
var data = {'serial': serial, 'record': getTableData(table), '_csrf_token': '{{ csrf_token() }}'};
applyRecordChanges(data, domain);
modal.modal('hide');
})
modal.modal('show');
});
// handle add record button
$(document.body).on("click", ".button_add_record", function (e) {
if (nNew || nEditing) {
showErrorModal("Previous record not saved. Please save it before adding more record.");
return;
}
// clear search first
$("#tbl_records").DataTable().search('').columns().search('').draw();
// add new row
var default_type = records_allow_edit[0]
{% if current_user.role.name in ['Administrator', 'Operator'] or allow_user_view_history %}
var nRow = jQuery('#tbl_records').dataTable().fnAddData(['', default_type, 'Active', window.ttl_options[0][0], '', '', '', '', '', '0']);
{% else %}
var nRow = jQuery('#tbl_records').dataTable().fnAddData(['', default_type, 'Active', window.ttl_options[0][0], '', '', '', '', '0']);
{% endif %}
editRow($("#tbl_records").DataTable(), nRow);
document.getElementById("edit-row-focus").focus();
nEditing = nRow;
nNew = true;
});
//handle cancel button
$(document.body).on("click", ".button_cancel", function (e) {
e.stopPropagation();
var oTable = $("#tbl_records").DataTable();
if (nNew) {
oTable.row(nEditing).remove().draw();
nEditing = null;
nNew = false;
} else {
restoreRow(oTable, nEditing);
nEditing = null;
}
});
//handle save button
$(document.body).on("click", ".button_save", function (e) {
e.stopPropagation();
var table = $("#tbl_records").DataTable();
saveRow(table, nEditing);
detectUnsavedChanges(table);
nEditing = null;
nNew = false;
});
//handle update_from_primary button
$(document.body).on("click", ".button_update_from_primary", function (e) {
var domain = $(this).prop('id');
applyChanges({
'domain': domain,
'_csrf_token': '{{ csrf_token() }}'
}, $SCRIPT_ROOT + '/domain/' + domain + '/update', true);
});
var unsavedChanges = false;
function detectUnsavedChanges(table) {
// Reset unsavedChanges to false at the start of the function
unsavedChanges = false;
var index = 0;
var origcount = {{ records|length }};
var count = table.page.info().recordsTotal;
var changes = {}; // Dictionary to store changes
if (count != origcount) {
unsavedChanges = true; //a record was either added or deleted.
} else {
{% for record in records %}
var origrecordname = '{{ (record.name,domain.name) | display_record_name }}';
var origrecordtype = '{{ record.type }}';
var origrecordstatus = '{{ record.status }}';
var origrecordttl = '{{ record.ttl }}';
var origrecorddata = '{{ record.data }}';
origrecorddata = origrecorddata.replace(/&#34;/g, '\"');
var origrecordcomment = '{{ record.comment }}';
if (!table.row(index) || typeof table.row(index) == 'undefined') {
unsavedChanges = true; //sanity check otherwise below code throws error if row at that index doesn't exist.
} else {
var editrecordname = table.row(index).data()[0];
var editrecordtype = table.row(index).data()[1];
var editrecordstatus = table.row(index).data()[2];
var editrecordttl = table.row(index).data()[3];
var editrecorddata = table.row(index).data()[4];
var editrecordcomment = table.row(index).data()[5];
if (origrecordname != editrecordname || origrecordtype != editrecordtype || origrecordstatus != editrecordstatus || origrecordttl != editrecordttl || origrecorddata != editrecorddata || origrecordcomment != editrecordcomment) {
unsavedChanges = true;
}
}
index++;
{% endfor %}
}
unsavedChangesWarning(unsavedChanges);
// Get the modal and the navigation links
var modal = document.getElementById('WarnLeave');
var navLinks = document.querySelectorAll('.nav-link');
// Listen for clicks on navigation links
navLinks.forEach(function(link) {
if (!link.classList.contains('no-prompt')) {
link.addEventListener('click', function(event) {
if (unsavedChanges) {
event.preventDefault(); // Prevent navigation
modal.style.display = "block"; // Show the modal
// Get the buttons
var stayButton = document.getElementById('stay');
var leaveButton = document.getElementById('leave');
// When the user clicks on "Stay", close the modal
stayButton.onclick = function() {
modal.style.display = "none";
}
// When the user clicks on "Leave", navigate away
leaveButton.onclick = function() {
unsavedChanges = false; // No unsaved changes anymore
location.href = link.href; // Navigate to the clicked link
}
}
});
}
});
}
function unsavedChangesWarning(unsavedChanges) {
var card = document.getElementById("unsaved-changes-card");
var cardBody = card.querySelector(".card-body");
if(unsavedChanges){
var message = 'There are unsaved changes for the zone. Please click Save Changes to save all of your changes.';
card.style.display = 'block'; // to show the card
cardBody.innerHTML = message;
return false;
} else {
card.style.display = 'none'; // to hide the card
}
}
{% if SETTING.get('record_helper') %}
//handle wacky record types
$(document.body).on("focus", "#current_edit_record_data", function (e) {
var record_type = $(this).parents("tr").find('#record_type').val();
var record_data = $(this);
if (record_type == "CAA") {
var modal = $("#modal_custom_record");
if (record_data.val() == "") {
var form = " <label for=\"caa_flag\">CAA Flag</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_flag\" id=\"caa_flag\" placeholder=\"0\"> \
<label for=\"caa_tag\">CAA Tag</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_tag\" id=\"caa_tag\" placeholder=\"issue\"> \
<label for=\"caa_value\">CAA Value</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_value\" id=\"caa_value\" placeholder=\"eg. letsencrypt.org\"> \
";
} else {
var parts = record_data.val().split(" ");
var form = " <label for=\"caa_flag\">CAA Flag</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_flag\" id=\"caa_flag\" placeholder=\"0\" value=\"" + parts[0] + "\"> \
<label for=\"caa_tag\">CAA Tag</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_tag\" id=\"caa_tag\" placeholder=\"issue\" value=\"" + parts[1] + "\"> \
<label for=\"caa_value\">CAA Value</label> \
<input type=\"text\" class=\"form-control\" name=\"caa_value\" id=\"caa_value\" placeholder=\"eg. letsencrypt.org\" value=\"" + parts[2] + "\"> \
";
}
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
caa_flag = modal.find('#caa_flag').val();
caa_tag = modal.find('#caa_tag').val();
caa_value = modal.find('#caa_value').val();
data = caa_flag + " " + caa_tag + " " + '"' + caa_value + '"';
record_data.val(data);
modal.modal('hide');
})
modal.modal('show');
} else if (record_type == "MX") {
var modal = $("#modal_custom_record");
if (record_data.val() == "") {
var form = " <label for=\"mx_priority\">MX Priority</label> \
<input type=\"text\" class=\"form-control\" name=\"mx_priority\" id=\"mx_priority\" placeholder=\"eg. 10\"> \
<label for=\"mx_server\">MX Server</label> \
<input type=\"text\" class=\"form-control\" name=\"mx_server\" id=\"mx_server\" placeholder=\"eg. postfix.example.com\"> \
";
} else {
var parts = record_data.val().split(" ");
var form = " <label for=\"mx_priority\">MX Priority</label> \
<input type=\"text\" class=\"form-control\" name=\"mx_priority\" id=\"mx_priority\" placeholder=\"eg. 10\" value=\"" + parts[0] + "\"> \
<label for=\"mx_server\">MX Server</label> \
<input type=\"text\" class=\"form-control\" name=\"mx_server\" id=\"mx_server\" placeholder=\"eg. postfix.example.com\" value=\"" + parts[1] + "\"> \
";
}
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
mx_server = modal.find('#mx_server').val();
mx_priority = modal.find('#mx_priority').val();
data = mx_priority + " " + mx_server;
if (data && !data.endsWith('.')) {
data = data + '.'
}
record_data.val(data);
modal.modal('hide');
})
modal.modal('show');
} else if (record_type == "SRV") {
var modal = $("#modal_custom_record");
if (record_data.val() == "") {
var form = " <label for=\"srv_priority\">SRV Priority</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_priority\" id=\"srv_priority\" placeholder=\"0\"> \
<label for=\"srv_weight\">SRV Weight</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_weight\" id=\"srv_weight\" placeholder=\"10\"> \
<label for=\"srv_port\">SRV Port</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_port\" id=\"srv_port\" placeholder=\"5060\"> \
<label for=\"srv_target\">SRV Target</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_target\" id=\"srv_target\" placeholder=\"sip.example.com\"> \
";
} else {
var parts = record_data.val().split(" ");
var form = " <label for=\"srv_priority\">SRV Priority</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_priority\" id=\"srv_priority\" placeholder=\"0\" value=\"" + parts[0] + "\"> \
<label for=\"srv_weight\">SRV Weight</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_weight\" id=\"srv_weight\" placeholder=\"10\" value=\"" + parts[1] + "\"> \
<label for=\"srv_port\">SRV Port</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_port\" id=\"srv_port\" placeholder=\"5060\" value=\"" + parts[2] + "\"> \
<label for=\"srv_target\">SRV Target</label> \
<input type=\"text\" class=\"form-control\" name=\"srv_target\" id=\"srv_target\" placeholder=\"sip.example.com\" value=\"" + parts[3] + "\"> \
";
}
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
srv_priority = modal.find('#srv_priority').val();
srv_weight = modal.find('#srv_weight').val();
srv_port = modal.find('#srv_port').val();
srv_target = modal.find('#srv_target').val();
data = srv_priority + " " + srv_weight + " " + srv_port + " " + srv_target;
if (data && !data.endsWith('.')) {
data = data + '.'
}
record_data.val(data);
modal.modal('hide');
})
modal.modal('show');
} else if (record_type == "SOA") {
var modal = $("#modal_custom_record");
if (record_data.val() == "") {
var form = " <label for=\"soa_primaryns\">Primary Name Server</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_primaryns\" id=\"soa_primaryns\" placeholder=\"ns1.example.com\"> \
<label for=\"soa_adminemail\">Primary Contact</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_adminemail\" id=\"soa_adminemail\" placeholder=\"admin.example.com\"> \
<label for=\"soa_serial\">Serial</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_serial\" id=\"soa_serial\" placeholder=\"2016010101\"> \
<label for=\"soa_zonerefresh\">Zone refresh timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_zonerefresh\" id=\"soa_zonerefresh\" placeholder=\"86400\"> \
<label for=\"soa_failedzonerefresh\">Failed refresh retry timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_failedzonerefresh\" id=\"soa_failedzonerefresh\" placeholder=\"7200\"> \
<label for=\"soa_zoneexpiry\">Zone expiry timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_zoneexpiry\" id=\"soa_zoneexpiry\" placeholder=\"1209600\"> \
<label for=\"soa_minimumttl\">Minimum TTL</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_minimumttl\" id=\"soa_minimumttl\" placeholder=\"300\"> \
";
} else {
var parts = record_data.val().split(" ");
var form = " <label for=\"soa_primaryns\">Primary Name Server</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_primaryns\" id=\"soa_primaryns\" value=\"" + parts[0] + "\"> \
<label for=\"soa_adminemail\">Primary Contact</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_adminemail\" id=\"soa_adminemail\" value=\"" + parts[1] + "\"> \
<label for=\"soa_serial\">Serial</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_serial\" id=\"soa_serial\" value=\"" + parts[2] + "\"> \
<label for=\"soa_zonerefresh\">Zone refresh timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_zonerefresh\" id=\"soa_zonerefresh\" value=\"" + parts[3] + "\"> \
<label for=\"soa_failedzonerefresh\">Failed refresh retry timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_failedzonerefresh\" id=\"soa_failedzonerefresh\" value=\"" + parts[4] + "\"> \
<label for=\"soa_zoneexpiry\">Zone expiry timer</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_zoneexpiry\" id=\"soa_zoneexpiry\" value=\"" + parts[5] + "\"> \
<label for=\"soa_minimumttl\">Minimum TTL</label> \
<input type=\"text\" class=\"form-control\" name=\"soa_minimumttl\" id=\"soa_minimumttl\" value=\"" + parts[6] + "\"> \
";
}
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
soa_primaryns = modal.find('#soa_primaryns').val();
soa_adminemail = modal.find('#soa_adminemail').val();
soa_serial = modal.find('#soa_serial').val();
soa_zonerefresh = modal.find('#soa_zonerefresh').val();
soa_failedzonerefresh = modal.find('#soa_failedzonerefresh').val();
soa_zoneexpiry = modal.find('#soa_zoneexpiry').val();
soa_minimumttl = modal.find('#soa_minimumttl').val();
data = soa_primaryns + " " + soa_adminemail + " " + soa_serial + " " + soa_zonerefresh + " " + soa_failedzonerefresh + " " + soa_zoneexpiry + " " + soa_minimumttl;
record_data.val(data);
modal.modal('hide');
})
modal.modal('show');
} else if (record_type == "TLSA") {
var modal = $("#modal_custom_record");
if (record_data.val() == "") {
var form = " <label for=\"tlsa_certificate_usage\">TLSA Certificate Usage</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_certificate_usage\" id=\"tlsa_certificate_usage\" placeholder=\"3\"> \
<label for=\"tlsa_selector\">TLSA-Selector</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_selector\" id=\"tlsa_selector\" placeholder=\"1\"> \
<label for=\"tlsa_matching\"> TLSA Matching Type</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_matching\" id=\"tlsa_matching\" placeholder=\"1\"> \
<label for=\"tlsa_hash\">Hash</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_hash\" id=\"tlsa_hash\" placeholder=\"HASH\"> \
";
} else {
var parts = record_data.val().split(" ");
var form = " <label for=\"tlsa_certificate_usage\">TLSA Certificate Usage</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_certificate_usage\" id=\"tlsa_certificate_usage\" value=\"" + parts[0] + "\"> \
<label for=\"tlsa_selector\">TLSA-Selector</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_selector\" id=\"tlsa_selector\" value=\"" + parts[1] + "\"> \
<label for=\"tlsa_matching\"> TLSA Matching Type</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_matching\" id=\"tlsa_matching\" value=\"" + parts[2] + "\"> \
<label for=\"tlsa_hash\">Hash</label> \
<input type=\"text\" class=\"form-control\" name=\"tlsa_hash\" id=\"tlsa_hash\" value=\"" + parts[3] + "\"> \
";
}
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
tlsa_certificate_usage = modal.find('#tlsa_certificate_usage').val();
tlsa_selector = modal.find('#tlsa_selector').val();
tlsa_matching = modal.find('#tlsa_matching').val();
tlsa_hash = modal.find('#tlsa_hash').val();
data = tlsa_certificate_usage + " " + tlsa_selector + " " + tlsa_matching + " " + tlsa_hash;
record_data.val(data);
modal.modal('hide');
})
modal.modal('show');
} else if (record_type == "TXT") {
var txt_data = record_data.val().replace(/"/g, '&quot;');
var modal = $("#modal_custom_record");
var form = " <label for=\"txt_record\">TXT Record Data</label> \
<textarea style=\"min-width: 100%;color: #333;\" placeholder=\"Your TXT record data\" rows=\"5\" id=\"txt_record\" name=\"txt_record\">" + txt_data + "</textarea> \
";
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
data = modal.find('#txt_record').val();
if (!/^".*"$/.test(data)) {
data = '"' + data + '"';
}
record_data.val(data);
modal.modal('hide');
});
modal.modal('show');
} else if (record_type == "LUA") {
var lua_type = record_data.val().split(" ")[0];
var lua_data = record_data.val().substr(record_data.val().indexOf(" ") + 1).replace(/"/g, '&quot;');
var modal = $("#modal_custom_record");
var form = " <label for=\"lua_type\">Lua Record Type</label> \
<input type=\"text\" class=\"form-control\" name=\"lua_type\" id=\"lua_type\" placeholder=\"Initial query type. Example: A, CNAME or PTR \" value=\"" + lua_type + "\"> \
<label for=\"lua_record\">Lua Record Data</label> \
<textarea style=\"min-width: 100%;color: #333;\" placeholder=\"Your LUA snippet\" rows=\"5\" id=\"lua_record\" name=\"lua_record\">" + lua_data + "</textarea> \
";
modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function () {
type = modal.find('#lua_type').val();
data = modal.find('#lua_record').val();
if (!/^".*"$/.test(data)) {
data = '"' + data + '"';
}
data = type + ' ' + data;
record_data.val(data);
modal.modal('hide');
});
modal.modal('show');
}
});
{% endif %}
</script>
{% endblock %}
{% block modals %}
<div class="modal fade" id="modal_delete">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Confirmation</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary pull-left" id="button_delete_cancel"
data-dismiss="modal">
<i class="fa-solid fa-window-close"></i>&nbsp;Close
</button>
<button type="button" class="btn btn-danger" id="button_delete_confirm">
<i class="fa-solid fa-trash"></i>&nbsp;Delete
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_apply_changes">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Confirmation</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
<i class="fa-solid fa-window-close"></i>&nbsp;Close
</button>
<button type="button" class="btn btn-success" id="button_apply_confirm">
<i class="fa-solid fa-save"></i>&nbsp;Apply Changes
</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_custom_record">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Custom Record</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
<i class="fa-solid fa-window-close"></i>&nbsp;Close
</button>
<button type="button" class="btn btn-success" id="button_save">
<i class="fa-solid fa-save"></i>&nbsp;Save
</button>
</div>
</div>
</div>
</div>
<div class="modal" tabindex="-1" id="WarnLeave">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Unsaved Changes</h5>
</div>
<div class="modal-body">
<p>You have unsaved changes. Are you sure you want to navigate away?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" id="stay">Stay</button>
<button type="button" class="btn btn-secondary" id="leave">Leave</button>
</div>
</div>
</div>
</div>
{% endblock %}