Re-formatted base view template to be more in-line with PEP8 standards.

Working on dashboard clean-up and redesign.

Added custom Jinja date/time formatting function to utils.py.
This commit is contained in:
Matt Scott 2023-02-19 08:52:00 -05:00
parent bad36b5e75
commit 58aabacd91
4 changed files with 790 additions and 768 deletions

View File

@ -74,9 +74,9 @@ def create_app(config=None):
app.jinja_env.filters['display_record_name'] = utils.display_record_name app.jinja_env.filters['display_record_name'] = utils.display_record_name
app.jinja_env.filters['display_master_name'] = utils.display_master_name app.jinja_env.filters['display_master_name'] = utils.display_master_name
app.jinja_env.filters['display_second_to_time'] = utils.display_time app.jinja_env.filters['display_second_to_time'] = utils.display_time
app.jinja_env.filters[ app.jinja_env.filters['display_setting_state'] = utils.display_setting_state
'display_setting_state'] = utils.display_setting_state
app.jinja_env.filters['pretty_domain_name'] = utils.pretty_domain_name app.jinja_env.filters['pretty_domain_name'] = utils.pretty_domain_name
app.jinja_env.filters['format_datetime_local'] = utils.format_datetime
# Register context proccessors # Register context proccessors
from .models.setting import Setting from .models.setting import Setting

View File

@ -225,6 +225,7 @@ class customBoxes:
} }
order = ["reverse", "ip6arpa", "inaddrarpa"] order = ["reverse", "ip6arpa", "inaddrarpa"]
def pretty_domain_name(domain_name): def pretty_domain_name(domain_name):
# Add a debugging statement to print out the domain name # Add a debugging statement to print out the domain name
print("Received domain name:", domain_name) print("Received domain name:", domain_name)
@ -258,9 +259,16 @@ def to_idna(value, action):
elif action == 'decode': elif action == 'decode':
for split in splits: for split in splits:
if not split.startswith('_') and not split.startswith('--'): if not split.startswith('_') and not split.startswith('--'):
result.append(idna.decode(split)) result.append(idna.decode(split))
else: else:
result.append(split) result.append(split)
else: else:
raise Exception('No valid action received') raise Exception('No valid action received')
return '.'.join(result) return '.'.join(result)
def format_datetime(value, format_str="%Y-%m-%d %I:%M %p"):
"""Format a date time to (Default): YYYY-MM-DD HH:MM P"""
if value is None:
return ""
return value.strftime(format_str)

View File

@ -1,427 +1,424 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class> <html lang="en" class>
<head> <head>
{% block head %} {% block head %}
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" href="{{ url_for('static', filename='img/favicon.png') }}"> <link rel="icon" href="{{ url_for('static', filename='img/favicon.png') }}">
{% block title %} {% block title %}<title>{{ SITE_NAME }}</title>{% endblock %}
<title> <link rel="stylesheet" href="{{ url_for('static', filename='assets/css/style.css') }}">
{{ SITE_NAME }} <link rel="stylesheet" href="{{ url_for('static', filename='assets/css/source_sans_pro.css') }}">
</title> <link rel="stylesheet" href="{{ url_for('static', filename='assets/css/roboto_mono.css') }}">
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<!-- Tell Safari to not recognise telephone numbers -->
<meta name="format-detection" content="telephone=no">
{% assets "css_main" -%}<link rel="stylesheet" href="{{ ASSET_URL }}">{%- endassets %}
{% if SETTING.get('custom_css') %}
<link rel="stylesheet" href="/static/custom/{{ SETTING.get('custom_css') }}">
{% endif %}
{% endblock %} {% endblock %}
<link rel="stylesheet" href="{{ url_for('static', filename='assets/css/style.css') }}">
<!-- Get Google Fonts we like -->
<link rel="stylesheet" href="{{ url_for('static', filename='assets/css/source_sans_pro.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='assets/css/roboto_mono.css') }}">
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<!-- Tell Safari to not recognise telephone numbers -->
<meta name="format-detection" content="telephone=no">
{% assets "css_main" -%}
<link rel="stylesheet" href="{{ ASSET_URL }}">
{%- endassets %}
{% if SETTING.get('custom_css') %}
<link rel="stylesheet" href="/static/custom/{{ SETTING.get('custom_css') }}">
{% endif %}
{% endblock %}
</head> </head>
<body class="hold-transition sidebar-mini {% if not SETTING.get('fullscreen_layout') %}layout-boxed{% endif %}"> <body class="hold-transition sidebar-mini {% if not SETTING.get('fullscreen_layout') %}layout-boxed{% endif %}">
{% set user_image_url = url_for('user.image', username=current_user.username) %} {% set user_image_url = url_for('user.image', username=current_user.username) %}
<div class="wrapper"> <div class="wrapper">
{% block pageheader %} {% block pageheader %}
<nav class="main-header navbar navbar-expand navbar-white navbar-light"> <nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Header Navbar: style can be found in header.less --> <!-- Header Navbar: style can be found in header.less -->
<!-- Sidebar toggle button--> <!-- Sidebar toggle button-->
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"> <a class="nav-link" data-widget="pushmenu" href="#" role="button">
<i class="fa-solid fa-bars"></i> <i class="fa-solid fa-bars"></i>
</a> </a>
</li> </li>
</ul> </ul>
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ml-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-widget="fullscreen" href="#" role="button"> <a class="nav-link" data-widget="fullscreen" href="#" role="button">
<i class="fa-solid fa-expand-arrows-alt"></i> <i class="fa-solid fa-expand-arrows-alt"></i>
</a> </a>
</li> </li>
</ul> </ul>
</nav> </nav>
{% endblock %} {% endblock %}
<!-- Left side column. contains the logo and sidebar --> <!-- Left side column. contains the logo and sidebar -->
<aside class="main-sidebar sidebar-dark-primary"> <aside class="main-sidebar sidebar-dark-primary">
<!-- Logo --> <!-- Logo -->
<a href="{{ url_for('index.index') }}" class="brand-link"> <a href="{{ url_for('index.index') }}" class="brand-link">
<img src="{{ url_for('static', filename='img/favicon.png') }}" alt="PowerDNS-Admin FavIcon" class="brand-image img-circle elevation-3" style="opacity: .8"> <img src="{{ url_for('static', filename='img/favicon.png') }}" alt="PowerDNS-Admin FavIcon"
<span class="brand-text font-weight-light"> class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">
{% if SETTING.get('site_name') %} {% if SETTING.get('site_name') %}
<b>{{ SITE_NAME }}</b> <b>{{ SITE_NAME }}</b>
{% else %} {% else %}
<b>PowerDNS</b>-Admin <b>PowerDNS</b>-Admin
{% endif %} {% endif %}
</span> </span>
</a> </a>
<!-- sidebar: style can be found in sidebar.less --> <!-- sidebar: style can be found in sidebar.less -->
<div class="sidebar"> <div class="sidebar">
{% if current_user.id is defined %} {% if current_user.id is defined %}
<div class="user-panel mt-3 pb-3 mb-3 d-flex"> <div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image"> <div class="image">
<img src="{{ user_image_url }}" class="img-circle elevation-2" alt="User Image"> <img src="{{ user_image_url }}" class="img-circle elevation-2" alt="User Image">
</div> </div>
<div class="info"> <div class="info">
<a href="{{ url_for('user.profile') }}" class="d-block">{{ current_user.firstname }} {{ current_user.lastname }}</a> <a href="{{ url_for('user.profile') }}"
</div> class="d-block">{{ current_user.firstname }} {{ current_user.lastname }}</a>
</div> </div>
<!-- sidebar menu: : style can be found in sidebar.less --> </div>
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"> <!-- sidebar menu: : style can be found in sidebar.less -->
<li class="{{ 'nav-item active' if active_page == 'user_profile' else 'nav-item' }}"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu">
<a href="{{ url_for('user.profile') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'user_profile' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-user"></i> <a href="{{ url_for('user.profile') }}" class="nav-link">
<p>Profile</p> <i class="nav-icon fa-solid fa-user"></i>
</a> <p>Profile</p>
</li> </a>
<li class="nav-item"> </li>
<a href="{{ url_for('index.logout') }}" class="nav-link"> <li class="nav-item">
<i class="nav-icon fa-solid fa-sign-out-alt"></i> <a href="{{ url_for('index.logout') }}" class="nav-link">
<p>Logout</p> <i class="nav-icon fa-solid fa-sign-out-alt"></i>
</a> <p>Logout</p>
</li> </a>
<li class="nav-header">Zone Management</li> </li>
<li class="{{ 'nav-item active' if active_page == 'nav-item dashboard' else 'nav-item' }}"> <li class="nav-header">Zone Management</li>
<a href="{{ url_for('dashboard.dashboard') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'nav-item dashboard' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-tachometer-alt"></i> <a href="{{ url_for('dashboard.dashboard') }}" class="nav-link">
<p>Dashboard</p> <i class="nav-icon fa-solid fa-tachometer-alt"></i>
</a> <p>Dashboard</p>
</li> </a>
{% if SETTING.get('allow_user_create_domain') or current_user.role.name in ['Administrator', 'Operator'] %} </li>
<li class="{{ 'nav-item active' if active_page == 'nav-item new_domain' else 'nav-item' }}"> {% if SETTING.get('allow_user_create_domain') or current_user.role.name in ['Administrator', 'Operator'] %}
<a href="{{ url_for('domain.add') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'nav-item new_domain' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-plus"></i> <a href="{{ url_for('domain.add') }}" class="nav-link">
<p>New Domain</p> <i class="nav-icon fa-solid fa-plus"></i>
</a> <p>New Domain</p>
</li> </a>
{% endif %} </li>
{% if SETTING.get('allow_user_remove_domain') or current_user.role.name in ['Administrator', 'Operator'] %} {% endif %}
<li class="{{ 'nav-item active' if active_page == 'remove_domain' else 'nav-item' }}"> {% if SETTING.get('allow_user_remove_domain') or current_user.role.name in ['Administrator', 'Operator'] %}
<a href="{{ url_for('domain.remove') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'remove_domain' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-trash-alt"></i> <a href="{{ url_for('domain.remove') }}" class="nav-link">
<p>Remove Domain</p> <i class="nav-icon fa-solid fa-trash-alt"></i>
</a> <p>Remove Domain</p>
</li> </a>
{% endif %} </li>
{% if current_user.role.name in ['Administrator', 'Operator'] %} {% endif %}
<li class="nav-header">Administration</li> {% if current_user.role.name in ['Administrator', 'Operator'] %}
<li class="{{ 'nav-item active' if active_page == 'admin_console' else 'nav-item' }}"> <li class="nav-header">Administration</li>
<a href="{{ url_for('admin.pdns_stats') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_console' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-info-circle"></i> <a href="{{ url_for('admin.pdns_stats') }}" class="nav-link">
<p>PowerDNS Info</p> <i class="nav-icon fa-solid fa-info-circle"></i>
</a> <p>PowerDNS Info</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_global_search' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.global_search') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_global_search' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-search"></i> <a href="{{ url_for('admin.global_search') }}" class="nav-link">
<p>Global Search</p> <i class="nav-icon fa-solid fa-search"></i>
</a> <p>Global Search</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_history' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.history') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_history' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-calendar-alt"></i> <a href="{{ url_for('admin.history') }}" class="nav-link">
<p>History</p> <i class="nav-icon fa-solid fa-calendar-alt"></i>
</a> <p>History</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_domain_template' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.templates') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_domain_template' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-clone"></i> <a href="{{ url_for('admin.templates') }}" class="nav-link">
<p>Domain Templates</p> <i class="nav-icon fa-solid fa-clone"></i>
</a> <p>Domain Templates</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_accounts' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.manage_account') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_accounts' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-industry"></i> <a href="{{ url_for('admin.manage_account') }}" class="nav-link">
<p>Accounts</p> <i class="nav-icon fa-solid fa-industry"></i>
</a> <p>Accounts</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_users' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.manage_user') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_users' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-users"></i> <a href="{{ url_for('admin.manage_user') }}" class="nav-link">
<p>Users</p> <i class="nav-icon fa-solid fa-users"></i>
</a> <p>Users</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_keys' else 'nav-item' }}"> </li>
<a href="{{ url_for('admin.manage_keys') }}" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_keys' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-key"></i> <a href="{{ url_for('admin.manage_keys') }}" class="nav-link">
<p>API Keys</p> <i class="nav-icon fa-solid fa-key"></i>
</a> <p>API Keys</p>
</li> </a>
<li class="{{ 'nav-item active' if active_page == 'admin_settings' else 'nav-item' }}"> </li>
<a href="#" class="nav-link"> <li class="{{ 'nav-item active' if active_page == 'admin_settings' else 'nav-item' }}">
<i class="nav-icon fa-solid fa-cog"></i> <a href="#" class="nav-link">
<p> <i class="nav-icon fa-solid fa-cog"></i>
Settings <p>
<i class="right fa-solid fa-angle-left"></i> Settings
</p> <i class="right fa-solid fa-angle-left"></i>
</a> </p>
<ul class="nav nav-treeview" {% if active_page == 'admin_settings' %}style="display: block;"{% endif %}> </a>
<li class="nav-item"> <ul class="nav nav-treeview"
<a href="{{ url_for('admin.setting_basic') }}" class="nav-link"> {% if active_page == 'admin_settings' %}style="display: block;"{% endif %}>
<i class="nav-icon fa-solid fa-circle"></i> <li class="nav-item">
<p>Basic</p> <a href="{{ url_for('admin.setting_basic') }}" class="nav-link">
</a> <i class="nav-icon fa-solid fa-circle"></i>
</li> <p>Basic</p>
<li class="nav-item"> </a>
<a href="{{ url_for('admin.setting_records') }}" class="nav-link"> </li>
<i class="nav-icon fa-solid fa-circle"></i> <li class="nav-item">
<p>Records</p> <a href="{{ url_for('admin.setting_records') }}" class="nav-link">
</a> <i class="nav-icon fa-solid fa-circle"></i>
</li> <p>Records</p>
{% if current_user.role.name == 'Administrator' %} </a>
<li class="nav-item"> </li>
<a href="{{ url_for('admin.setting_pdns') }}" class="nav-link"> {% if current_user.role.name == 'Administrator' %}
<i class="nav-icon fa-solid fa-circle"></i> <li class="nav-item">
<p>PowerDNS Connection</p> <a href="{{ url_for('admin.setting_pdns') }}" class="nav-link">
</a> <i class="nav-icon fa-solid fa-circle"></i>
</li> <p>PowerDNS Connection</p>
<li class="nav-item"> </a>
<a href="{{ url_for('admin.setting_authentication') }}" class="nav-link"> </li>
<i class="nav-icon fa-solid fa-circle"></i> <li class="nav-item">
<p>Authentication</p> <a href="{{ url_for('admin.setting_authentication') }}" class="nav-link">
</a> <i class="nav-icon fa-solid fa-circle"></i>
</li> <p>Authentication</p>
</a>
</li>
{% endif %}
</ul>
</li>
{% elif SETTING.get('allow_user_view_history') %}
<li class="nav-header">Administration</li>
<li class="{{ 'nav-item active' if active_page == 'admin_history' else 'nav-item' }}">
<a href="{{ url_for('admin.history') }}" class="nav-link">
<i class="nav-icon fa-solid fa-calendar-alt"></i>
<p>History</p>
</a>
</li>
{% endif %}
</ul>
{% endif %} {% endif %}
</ul>
</li>
{% elif SETTING.get('allow_user_view_history') %}
<li class="nav-header">Administration</li>
<li class="{{ 'nav-item active' if active_page == 'admin_history' else 'nav-item' }}">
<a href="{{ url_for('admin.history') }}" class="nav-link">
<i class="nav-icon fa-solid fa-calendar-alt"></i>
<p>History</p>
</a>
</li>
{% endif %}
</ul>
{% endif %}
</div>
<!-- /.sidebar -->
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
{% block dashboard_stat %}
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark">
Dashboard
<small>Control panel</small>
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{ url_for('dashboard.dashboard') }}">Home</a></li>
<li class="breadcrumb-item active">Dashboard</li>
</ol>
</div>
</div> </div>
</div> <!-- /.sidebar -->
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
{% block dashboard_stat %}
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark">
Dashboard
<small>Control panel</small>
</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="{{ url_for('dashboard.dashboard') }}">Home</a></li>
<li class="breadcrumb-item active">Dashboard</li>
</ol>
</div>
</div>
</div>
</div>
{% endblock %}
{% block content %}
{% endblock %}
</div> </div>
{% endblock %} <!-- /.content-wrapper -->
{% block content %} <footer class="main-footer">
{% endblock %} <strong><a href="https://github.com/PowerDNS-Admin/PowerDNS-Admin">PowerDNS-Admin</a></strong> - A PowerDNS web
</div> interface with advanced features.
<!-- /.content-wrapper --> </footer>
<footer class="main-footer">
<strong><a href="https://github.com/PowerDNS-Admin/PowerDNS-Admin">PowerDNS-Admin</a></strong> - A PowerDNS web interface with advanced features.
</footer>
</div> </div>
<!-- ./wrapper --> <!-- ./wrapper -->
<script type="text/javascript"> <script type="text/javascript">
$SCRIPT_ROOT = {{ request.script_root|tojson|safe }}; $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
</script> var PDNS_VERSION = '{{ pdns_version }}';
<script type="text/javascript">
var PDNS_VERSION = '{{ pdns_version }}'
</script> </script>
{% block scripts %} {% block scripts %}
{% assets "js_main" -%} {% assets "js_main" -%}
<script type="text/javascript" src="{{ ASSET_URL }}"></script> <script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% if SETTING.get('warn_session_timeout') and current_user.is_authenticated %} {% if SETTING.get('warn_session_timeout') and current_user.is_authenticated %}
<script> <script>
// close the session warning popup when receive // close the session warning popup when receive
// a boradcast message // a boradcast message
var bc = new BroadcastChannel('powerdnsadmin'); var bc = new BroadcastChannel('powerdnsadmin');
bc.addEventListener('message', function (e) { bc.addEventListener('message', function (e) {
if (e.data == 'close_session_timeout_modal'){ if (e.data == 'close_session_timeout_modal') {
$("#modal_session_warning").modal('hide'); $("#modal_session_warning").modal('hide');
} }
}); });
// Stay Signed In button click event // Stay Signed In button click event
$(document.body).on("click", ".button_stay_signed_in", function (e) { $(document.body).on("click", ".button_stay_signed_in", function (e) {
$.get({ $.get({
url: $.jTimeout().options.extendUrl, url: $.jTimeout().options.extendUrl,
cache: false, cache: false,
success: function(){ success: function () {
$.jTimeout().resetExpiration(); $.jTimeout().resetExpiration();
} }
}); });
$.jTimeout().options.onClickExtend(); $.jTimeout().options.onClickExtend();
}); });
// Sign Out button click event // Sign Out button click event
$(document.body).on("click", ".button_sign_out", function (e) { $(document.body).on("click", ".button_sign_out", function (e) {
window.location.replace("{{ url_for('index.logout') }}"); window.location.replace("{{ url_for('index.logout') }}");
}); });
// Things happen when session warning popup shown // Things happen when session warning popup shown
$(document).on('show.bs.modal','#modal_session_warning', function () { $(document).on('show.bs.modal', '#modal_session_warning', function () {
var secondsLeft = jTimeout.getSecondsTillExpiration(); var secondsLeft = jTimeout.getSecondsTillExpiration();
var t = timer($('#modal-time'), secondsLeft); var t = timer($('#modal-time'), secondsLeft);
$(this).on('hidden.bs.modal', function () { $(this).on('hidden.bs.modal', function () {
clearInterval(t); clearInterval(t);
$('#modal-time').text(""); $('#modal-time').text("");
$(this).off('hidden.bs.modal'); $(this).off('hidden.bs.modal');
}); });
}); });
// jTimeout definition // jTimeout definition
$(function(){ $(function () {
$.jTimeout({ $.jTimeout({
flashTitle: true, flashTitle: true,
flashTitleSpeed: 500, flashTitleSpeed: 500,
flashingTitleText: '**WARNING**', flashingTitleText: '**WARNING**',
originalTitle: document.title, originalTitle: document.title,
timeoutAfter: {{ SETTING.get('session_timeout')|int * 60 }}, timeoutAfter: {{ SETTING.get('session_timeout')|int * 60 }},
secondsPrior: 60, secondsPrior: 60,
heartbeat: 1, heartbeat: 1,
extendOnMouseMove: true, extendOnMouseMove: true,
mouseDebounce: 30, mouseDebounce: 30,
extendUrl: '{{ url_for("index.ping") }}', extendUrl: '{{ url_for("index.ping") }}',
logoutUrl: '{{ url_for("index.logout") }}', logoutUrl: '{{ url_for("index.logout") }}',
loginUrl: '{{ url_for("index.login") }}', loginUrl: '{{ url_for("index.login") }}',
onClickExtend: function(){ onClickExtend: function () {
// broadcast a message to tell other tabes // broadcast a message to tell other tabes
// close the session warning popup // close the session warning popup
var bc = new BroadcastChannel('powerdnsadmin'); var bc = new BroadcastChannel('powerdnsadmin');
bc.postMessage('close_session_timeout_modal'); bc.postMessage('close_session_timeout_modal');
}, },
onMouseMove: function(){ onMouseMove: function () {
// if the mouse is moving while popup is present, we // if the mouse is moving while popup is present, we
// don't extend the session. // don't extend the session.
if (!$('#modal_session_warning').hasClass('in')) { if (!$('#modal_session_warning').hasClass('in')) {
$.get({ $.get({
url: $.jTimeout().options.extendUrl, url: $.jTimeout().options.extendUrl,
cache: false, cache: false,
success: function () { success: function () {
$.jTimeout().resetExpiration(); $.jTimeout().resetExpiration();
} }
}); });
} }
}, },
onTimeout: function(jTimeout){ onTimeout: function (jTimeout) {
window.location.replace("{{ url_for('index.logout') }}"); window.location.replace("{{ url_for('index.logout') }}");
}, },
onPriorCallback: function(jTimeout){ onPriorCallback: function (jTimeout) {
$("#modal_session_warning").modal('show');; $("#modal_session_warning").modal('show');
}, ;
},
onSessionExtended:function(jTimeout){ onSessionExtended: function (jTimeout) {
$("#modal_session_warning").modal('hide'); $("#modal_session_warning").modal('hide');
} }
}); });
}); });
function showErrorModal(message) { function showErrorModal(message) {
var modal = $('#modal_error'); var modal = $('#modal_error');
modal.find('.modal-body p').text(message); modal.find('.modal-body p').text(message);
modal.modal('show'); modal.modal('show');
} }
function showSuccessModal(message) { function showSuccessModal(message) {
var modal = $("#modal_success"); var modal = $("#modal_success");
modal.find('.modal-body p').text(message); modal.find('.modal-body p').text(message);
modal.modal('show'); modal.modal('show');
} }
</script> </script>
{% endif %} {% endif %}
{%- endassets %} {%- endassets %}
{% endblock %} {% endblock %}
{% block extrascripts %} {% block extrascripts %}
{% endblock %} {% endblock %}
{% block defaultmodals %} {% block defaultmodals %}
<div class="modal fade modal-danger" id="modal_error"> <div class="modal fade modal-danger" id="modal_error">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title">Error</h4> <h4 class="modal-title">Error</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p></p> <p></p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal"> <button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close Close
</button> </button>
</div> </div>
</div>
</div>
</div> </div>
</div> <!-- /.modal -->
</div> <div class="modal fade modal-success" id="modal_success">
<!-- /.modal --> <div class="modal-dialog">
<div class="modal fade modal-success" id="modal_success"> <div class="modal-content">
<div class="modal-dialog"> <div class="modal-header">
<div class="modal-content"> <h4 class="modal-title">Success</h4>
<div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<h4 class="modal-title">Success</h4> <span aria-hidden="true">&times;</span>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> </button>
<span aria-hidden="true">&times;</span> </div>
</button> <div class="modal-body">
</div> <p></p>
<div class="modal-body"> </div>
<p></p> <div class="modal-footer">
</div> <button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
<div class="modal-footer"> Close
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal"> </button>
Close </div>
</button> </div>
</div> </div>
</div> </div>
</div> <div class="modal fade modal-warning" data-backdrop="static" id="modal_session_warning">
</div> <div class="modal-dialog">
<div class="modal fade modal-warning" data-backdrop="static" id="modal_session_warning"> <div class="modal-content">
<div class="modal-dialog"> <div class="modal-header">
<div class="modal-content"> <h4 class="modal-title">Session timeout warning</h4>
<div class="modal-header"> </div>
<h4 class="modal-title">Session timeout warning</h4> <div class="modal-body">
</div> <p>Your session is about to expire. You will be automatically signed out in</p>
<div class="modal-body"> <h3><span id="modal-time"></span></h3>
<p>Your session is about to expire. You will be automatically signed out in</p> <p>To coninue your ssession, select <strong>Stay Signed In</strong></p>
<h3><span id="modal-time"></span></h3> </div>
<p>To coninue your ssession, select <strong>Stay Signed In</strong></p> <div class="modal-footer">
</div> <button type="button" class="btn btn-success float-right button_stay_signed_in"
<div class="modal-footer"> data-dismiss="modal">
<button type="button" class="btn btn-success float-right button_stay_signed_in" data-dismiss="modal"> Stay Signed In
Stay Signed In </button>
</button> <button type="button" class="btn btn-danger float-left button_sign_out" data-dismiss="modal">
<button type="button" class="btn btn-danger float-left button_sign_out" data-dismiss="modal"> Sign Out
Sign Out </button>
</button> </div>
</div> </div>
</div>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}
{% block modals %} {% block modals %}
{% endblock %} {% endblock %}

View File

@ -1,418 +1,435 @@
{% extends "base.html" %} {% extends "base.html" %}
{% set active_page = "dashboard" %} {% set active_page = "dashboard" %}
{% block title %}<title>Dashboard - {{ SITE_NAME }}</title>{% endblock %}
{% block title %}
<title>
Dashboard - {{ SITE_NAME }}
</title>
{% endblock %}
{% block dashboard_stat %} {% block dashboard_stat %}
<div class="content-header"> <div class="content-header">
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<h1 class="m-0 text-dark"> <h1 class="m-0 text-dark">
Dashboard Dashboard
<small>Info</small> <small>Info</small>
</h1> </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>
</ol>
</div>
</div>
</div> </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>
</ol>
</div>
</div>
</div> </div>
</div>
{% endblock %} {% endblock %}
{% import 'applied_change_macro.html' as applied_change_macro %} {% import 'applied_change_macro.html' as applied_change_macro %}
{% block content %} {% block content %}
<section class="content"> <section class="content">
<div class="container-fluid"> <div class="container-fluid">
{% if current_user.role.name in ['Administrator', 'Operator'] or SETTING.get('allow_user_view_history') %}
<div class="row">
<div class="col-3">
<div class="card">
<div class="card-header">
<h3 class="card-title">Statistics</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-6">
<!-- small box -->
<div class="small-box bg-info">
<div class="inner">
<h3>{{ domain_count }}</h3>
<p>{% if domain_count > 1 %}Domains{% else %}Domain{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-book"></i>
</div>
</div>
</div>
{% if current_user.role.name in ['Administrator', 'Operator'] %}
<div class="col-6">
<a href="{{ url_for('admin.manage_user') }}">
<div class="small-box bg-green">
<div class="inner">
<h3>{{ user_num }}</h3>
<p>{% if user_num > 1 %}Users{% else %}User{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-users"></i>
</div>
</div>
</a>
</div>
{% endif %}
</div>
<div class="row">
<div class="col-6">
<a href="{{ url_for('admin.history') }}">
<div class="small-box bg-green">
<div class="inner">
<h3>{{ history_number }}</h3>
<p>{% if history_number > 1 %}Histories{% else %}History{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-calendar"></i>
</div>
</div>
</a>
</div>
{% if current_user.role.name in ['Administrator', 'Operator'] %}
<div class="col-6">
<a href="{{ url_for('admin.pdns_stats') }}">
<div class="small-box bg-green">
<div class="inner">
<h3><span style="font-size: 18px">{{ uptime|display_second_to_time }}</span></h3>
<p>Uptime</p>
</div>
<div class="icon">
<i class="fa-solid fa-clock"></i>
</div>
</div>
</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="col-9">
<div class="card">
<div class="card-header">
<h3 class="card-title">Recent History</h3>
</div>
<div class="card-body">
<table id="tbl_history" class="table table-bordered table-striped">
<thead>
<tr>
<th>Changed By</th>
<th>Content</th>
<th>Time</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
{% for history in histories %}
<tr class="odd">
<td>{{ history.history.created_by }}</td>
<td>{{ history.history.msg }}</td>
<td>{{ history.history.created_on }}</td>
<td width="6%">
<div id="history-info-div-{{ loop.index0 }}" style="display: none;">
{{ history.detailed_msg | safe }}
{% if history.change_set %}
<div class="content">
<div id="change_index_definition"></div>
{% call applied_change_macro.applied_change_template(history.change_set) %}
{% endcall %}
</div>
{% endif %}
</div>
<button type="button" class="btn btn-sm btn-primary history-info-button"
{% if history.detailed_msg == "" and history.change_set is none %}
style="visibility: hidden;"
{% endif %} value="{{ loop.index0 }}">
<i class="fa-solid fa-info-circle"></i>&nbsp;Info
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endif %}
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs card-header-tabs" id="custom-content-below-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active" href="#tab_{{custom_boxes.order[0]}}" data-toggle="pill" role="tab">
Hosted Domains <b>{{custom_boxes.boxes[custom_boxes.order[0]][0]}}</b>
</a>
</li>
{% for boxId in custom_boxes.order[1:] %}
<li class="nav-item">
<a class="nav-link" href="#tab_{{boxId}}" data-toggle="pill" role="tab">Hosted Domains <b>{{custom_boxes.boxes[boxId][0]}}</b></a>
</li>
{% endfor %}
</ul>
</div>
</div>
<div class="card-body">
<div class="tab-content">
{% for boxId in custom_boxes.order %}
<div class="tab-pane fade show" id='tab_{{boxId}}'>
<div class="card-header">
<h3 class="card-title">Hosted Domains <b>{{custom_boxes.boxes[boxId][0]}}</b></h3>
{% if show_bg_domain_button %}
<button type="button" class="btn btn-primary refresh-bg-button float-right">
<i class="fa-solid fa-sync"></i>
&nbsp;Sync Domains
</button>
{% endif %}
</div>
<div class="card-body">
<table id='tbl_domain_list_{{boxId}}' class="table table-bordered table-striped">
<thead>
<tr>
<th>Name</th>
<th>DNSSEC</th>
<th>Type</th>
<th>Serial</th>
<th>Primary</th>
<th>Account</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="card card-outline card-secondary">
<div class="card-header">
<h3 class="card-title">Statistics</h3>
</div>
<!-- /.card-header -->
<div class="card-body">
<div class="row">
<div class="col-6 col-sm-3">
<div class="small-box bg-info">
<div class="inner">
<h3>{{ domain_count }}</h3>
<p>{% if domain_count > 1 %}Domains{% else %}Domain{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-book"></i>
</div>
</div>
</div>
<div class="col-6 col-sm-3">
<a href="{{ url_for('admin.history') }}">
<div class="small-box bg-green">
<div class="inner">
<h3>{{ history_number }}</h3>
<p>{% if history_number > 1 %}Histories{% else %}
History{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-calendar"></i>
</div>
</div>
</a>
</div>
{% if current_user.role.name in ['Administrator', 'Operator'] %}
<div class="col-6 col-sm-3">
<a href="{{ url_for('admin.manage_user') }}">
<div class="small-box bg-green">
<div class="inner">
<h3>{{ user_num }}</h3>
<p>{% if user_num > 1 %}Users{% else %}User{% endif %}</p>
</div>
<div class="icon">
<i class="fa-solid fa-users"></i>
</div>
</div>
</a>
</div>
<div class="col-6 col-sm-3">
<a href="{{ url_for('admin.pdns_stats') }}">
<div class="small-box bg-green">
<div class="inner">
<h3><span
style="font-size: 18px">{{ uptime|display_second_to_time }}</span>
</h3>
<p>Uptime</p>
</div>
<div class="icon">
<i class="fa-solid fa-clock"></i>
</div>
</div>
</a>
</div>
{% endif %}
</div>
<!-- /.row -->
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
{% if current_user.role.name in ['Administrator', 'Operator'] or SETTING.get('allow_user_view_history') %}
<div class="row">
<div class="col-12">
<div class="card card-outline card-secondary">
<div class="card-header">
<h3 class="card-title">Recent History</h3>
</div>
<!-- /.card-header -->
<div class="card-body table-responsive p-0">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>User</th>
<th>Log Message</th>
<th>Timestamp</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for history in histories %}
<tr class="odd">
<td>{{ history.history.created_by }}</td>
<td>{{ history.history.msg }}</td>
<td>{{ history.history.created_on | format_datetime_local }}</td>
<td>
<div id="history-info-div-{{ loop.index0 }}" style="display: none;">
{{ history.detailed_msg | safe }}
{% if history.change_set %}
<div class="content">
<div id="change_index_definition"></div>
{% call applied_change_macro.applied_change_template(history.change_set) %}
{% endcall %}
</div>
{% endif %}
</div>
<button type="button" class="btn btn-sm btn-primary history-info-button"
{% if history.detailed_msg == "" and history.change_set is none %}
style="visibility: hidden;"
{% endif %} value="{{ loop.index0 }}">
<i class="fa-solid fa-info-circle"></i>&nbsp;Info
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
{% endif %}
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs card-header-tabs" id="custom-content-below-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active" href="#tab_{{ custom_boxes.order[0] }}"
data-toggle="pill" role="tab">
Hosted Domains <b>{{ custom_boxes.boxes[custom_boxes.order[0]][0] }}</b>
</a>
</li>
{% for boxId in custom_boxes.order[1:] %}
<li class="nav-item">
<a class="nav-link" href="#tab_{{ boxId }}" data-toggle="pill" role="tab">Hosted
Domains <b>{{ custom_boxes.boxes[boxId][0] }}</b></a>
</li>
{% endfor %}
</ul>
</div>
</div>
<div class="card-body">
<div class="tab-content">
{% for boxId in custom_boxes.order %}
<div class="tab-pane fade show" id='tab_{{ boxId }}'>
<div class="card-header">
<h3 class="card-title">Hosted Domains
<b>{{ custom_boxes.boxes[boxId][0] }}</b></h3>
{% if show_bg_domain_button %}
<button type="button"
class="btn btn-primary refresh-bg-button float-right">
<i class="fa-solid fa-sync"></i>
&nbsp;Sync Domains
</button>
{% endif %}
</div>
<div class="card-body table-responsive p-0 pt-2">
<table id='tbl_domain_list_{{ boxId }}'
class="table table-striped table-hover">
<thead>
<tr>
<th>Name</th>
<th>DNSSEC</th>
<th>Type</th>
<th>Serial</th>
<th>Primary</th>
<th>Account</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </section>
</div>
</section>
{% endblock %} {% endblock %}
{% block extrascripts %} {% block extrascripts %}
<script> <script>
//SYBPATCH START// //SYBPATCH START//
function setUpDomainList(id ,url){ function setUpDomainList(id, url) {
$(id).DataTable({ $(id).DataTable({
"paging" : true, "paging": true,
"lengthChange" : true, "lengthChange": true,
language: { language: {
searchPlaceholder: "Use ^ and $ for start and end", searchPlaceholder: "Use ^ and $ for start and end",
},
"searching" : true,
"ordering" : true,
"columnDefs": [
{ "orderable": false, "targets": [-1] }
{% if current_user.role.name not in ['Administrator', 'Operator'] %},{ "visible": false, "targets": [-2] }{% endif %}
],
"processing" : true,
"serverSide" : true,
"ajax" : url,
"info" : false,
"autoWidth" : false,
{% if SETTING.get('default_domain_table_size')|string in ['10','25','50','100'] %}
"lengthMenu": [ [10, 25, 50, 100, -1],
[10, 25, 50, 100, "All"]],
{% else %}
"lengthMenu": [ [10, 25, 50, 100, {{ SETTING.get('default_domain_table_size') }}, -1],
[10, 25, 50, 100, {{ SETTING.get('default_domain_table_size') }}, "All"]],
{% endif %}
"pageLength": {{ SETTING.get('default_domain_table_size') }}
});
}
$('#tab_{{custom_boxes.order[0]}}').addClass( "active" );
{% for boxId in custom_boxes.order %}
setUpDomainList("#tbl_domain_list_{{boxId}}", "{{url_for('dashboard.domains_custom',boxId=boxId)}}");
{% endfor %}
//SYBPATCH END//
// set up history data table
$("#tbl_history").DataTable({
"paging" : false,
"lengthChange" : false,
"searching" : false,
"ordering" : false,
"info" : false,
"autoWidth" : true,
"columnDefs": [
{
"render": function ( data, type, row ) {
return moment.utc(data).local().format('YYYY-MM-DD HH:mm:ss');
}, },
"targets": 2 "searching": true,
} "ordering": true,
] "columnDefs": [
}); {"orderable": false, "targets": [-1]}
{% if current_user.role.name not in ['Administrator', 'Operator'] %},{
"visible": false,
"targets": [-2]
}{% endif %}
],
"processing": true,
"serverSide": true,
"ajax": url,
"info": false,
"autoWidth": false,
{% if SETTING.get('default_domain_table_size')|string in ['10','25','50','100'] %}
"lengthMenu": [[10, 25, 50, 100, -1],
[10, 25, 50, 100, "All"]],
{% else %}
"lengthMenu": [[10, 25, 50, 100, {{ SETTING.get('default_domain_table_size') }}, -1],
[10, 25, 50, 100, {{ SETTING.get('default_domain_table_size') }}, "All"]],
{% endif %}
"pageLength": {{ SETTING.get('default_domain_table_size') }}
});
}
$(document.body).on('click', '.history-info-button', function () { $('#tab_{{custom_boxes.order[0]}}').addClass("active");
var modal = $("#modal_history_info"); {% for boxId in custom_boxes.order %}
var history_id = $(this).val(); setUpDomainList("#tbl_domain_list_{{boxId}}", "{{url_for('dashboard.domains_custom',boxId=boxId)}}");
var info = $("#history-info-div-" + history_id).html(); {% endfor %}
$('#modal-info-content').html(info); //SYBPATCH END//
modal.modal('show');
});
$(document.body).on('click', '.refresh-bg-button', function() { // set up history data table
var modal = $("#modal_bg_reload"); $("#tbl_history").DataTable({
modal.modal('show'); "paging": false,
reload_domains($SCRIPT_ROOT + '/dashboard/domains-updater'); "lengthChange": false,
}); "searching": false,
"ordering": false,
"info": false,
"autoWidth": true,
"columnDefs": [
{
"render": function (data, type, row) {
return moment.utc(data).local().format('YYYY-MM-DD HH:mm:ss');
},
"targets": 2
}
]
});
$(document.body).on("click", ".button_template", function (e) { $(document.body).on('click', '.history-info-button', function () {
var modal = $("#modal_template"); var modal = $("#modal_history_info");
var domain = $(this).prop('id'); var history_id = $(this).val();
var form = " <label for=\"template_name\">Template name</label> \ var info = $("#history-info-div-" + history_id).html();
$('#modal-info-content').html(info);
modal.modal('show');
});
$(document.body).on('click', '.refresh-bg-button', function () {
var modal = $("#modal_bg_reload");
modal.modal('show');
reload_domains($SCRIPT_ROOT + '/dashboard/domains-updater');
});
$(document.body).on("click", ".button_template", function (e) {
var modal = $("#modal_template");
var domain = $(this).prop('id');
var form = " <label for=\"template_name\">Template name</label> \
<input type=\"text\" class=\"form-control\" name=\"template_name\" id=\"template_name\" placeholder=\"Enter a valid template name (required)\"> \ <input type=\"text\" class=\"form-control\" name=\"template_name\" id=\"template_name\" placeholder=\"Enter a valid template name (required)\"> \
<label for=\"template_description\">Template description</label> \ <label for=\"template_description\">Template description</label> \
<input type=\"text\" class=\"form-control\" name=\"template_description\" id=\"template_description\" placeholder=\"Enter a template description (optional)\"> \ <input type=\"text\" class=\"form-control\" name=\"template_description\" id=\"template_description\" placeholder=\"Enter a template description (optional)\"> \
<input id=\"domain\" name=\"domain\" type=\"hidden\" value=\""+domain+"\"> \ <input id=\"domain\" name=\"domain\" type=\"hidden\" value=\"" + domain + "\"> \
"; ";
modal.find('.modal-body p').html(form); modal.find('.modal-body p').html(form);
modal.find('#button_save').click(function() { modal.find('#button_save').click(function () {
var data = {'_csrf_token': '{{ csrf_token() }}'}; var data = {'_csrf_token': '{{ csrf_token() }}'};
data['name'] = modal.find('#template_name').val(); data['name'] = modal.find('#template_name').val();
data['description'] = modal.find('#template_description').val(); data['description'] = modal.find('#template_description').val();
data['domain'] = modal.find('#domain').val(); data['domain'] = modal.find('#domain').val();
applyChanges(data, "{{ url_for('admin.create_template_from_zone') }}", true); applyChanges(data, "{{ url_for('admin.create_template_from_zone') }}", true);
modal.modal('hide'); modal.modal('hide');
}) })
modal.find('#button_close').click(function() { modal.find('#button_close').click(function () {
modal.modal('hide'); modal.modal('hide');
}) })
modal.modal('show'); modal.modal('show');
}); });
{% if current_user.role.name in ['Administrator', 'Operator'] or not SETTING.get('dnssec_admins_only') %} {% if current_user.role.name in ['Administrator', 'Operator'] or not SETTING.get('dnssec_admins_only') %}
$(document.body).on("click", ".button_dnssec", function() { $(document.body).on("click", ".button_dnssec", function () {
var domain = $(this).prop('id'); var domain = $(this).prop('id');
getdnssec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec', domain); getdnssec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec', domain);
}); });
$(document.body).on("click", ".button_dnssec_enable", function() { $(document.body).on("click", ".button_dnssec_enable", function () {
var domain = $(this).prop('id'); var domain = $(this).prop('id');
enable_dns_sec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec/enable', '{{ csrf_token() }}'); enable_dns_sec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec/enable', '{{ csrf_token() }}');
}); });
$(document.body).on("click", ".button_dnssec_disable", function() { $(document.body).on("click", ".button_dnssec_disable", function () {
var domain = $(this).prop('id'); var domain = $(this).prop('id');
enable_dns_sec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec/disable', '{{ csrf_token() }}'); enable_dns_sec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec/disable', '{{ csrf_token() }}');
}); });
{% endif %} {% endif %}
</script> </script>
{% endblock %} {% endblock %}
{% block modals %} {% block modals %}
<div class="modal fade" id="modal_history_info"> <div class="modal fade" id="modal_history_info">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title">History Details</h4> <h4 class="modal-title">History Details</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div id="modal-info-content"> <div id="modal-info-content">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close
</button>
</div>
</div>
</div> </div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close
</button>
</div>
</div> </div>
</div>
</div>
<div class="modal fade modal-primary" id="modal_template"> <div class="modal fade modal-primary" id="modal_template">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title">Clone to template</h4> <h4 class="modal-title">Clone to template</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p></p> <p></p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" id="button_close" data-dismiss="modal"> <button type="button" class="btn btn-secondary float-right" id="button_close" data-dismiss="modal">
Close Close
</button> </button>
<button type="button" class="btn btn-primary float-right" id="button_save"> <button type="button" class="btn btn-primary float-right" id="button_save">
Save Save
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="modal_dnssec_info"> <div class="modal fade" id="modal_dnssec_info">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title">DNSSEC</h4> <h4 class="modal-title">DNSSEC</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p></p> <p></p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal"> <button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close Close
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="modal_bg_reload"> <div class="modal fade" id="modal_bg_reload">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h4 class="modal-title">Sync Domains from backend</h4> <h4 class="modal-title">Sync Domains from backend</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div id="modal_bg_reload_content"> <div id="modal_bg_reload_content">
<i class="fa fa-refresh fa-spin"></i> Update in progress .. <i class="fa fa-refresh fa-spin"></i> Update in progress ..
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close
</button>
</div>
</div>
</div> </div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary float-right" data-dismiss="modal">
Close
</button>
</div>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}