$(document).ready(function() { acl_data = JSON.parse(acl); // Set paging // Clone mailbox mass actions $("div").find("[data-actions-header='true'").each(function() { $(this).html($(this).nextAll('.mass-actions-mailbox:first').html()); }); // Auto-fill domain quota when adding new domain auto_fill_quota = function(domain) { $.get("/api/v1/get/domain/" + domain, function(data){ var result = $.parseJSON(JSON.stringify(data)); def_new_mailbox_quota = ( result.def_new_mailbox_quota / 1048576); max_new_mailbox_quota = ( result.max_new_mailbox_quota / 1048576); if (max_new_mailbox_quota != '0') { $('.addInputQuotaExhausted').hide(); $("#quotaBadge").html('max. ' + max_new_mailbox_quota + ' MiB'); $('#addInputQuota').attr({"disabled": false, "value": "", "type": "number", "max": max_new_mailbox_quota}); $('#addInputQuota').val(def_new_mailbox_quota); } else { $('.addInputQuotaExhausted').show(); $("#quotaBadge").html('max. ' + max_new_mailbox_quota + ' MiB'); $('#addInputQuota').attr({"disabled": true, "value": "", "type": "text", "value": "n/a"}); $('#addInputQuota').val(max_new_mailbox_quota); } }); } $('#addSelectDomain').on('change', function() { auto_fill_quota($('#addSelectDomain').val()); }); auto_fill_quota($('#addSelectDomain').val()); $(".goto_checkbox").click(function( event ) { $("form[data-id='add_alias'] .goto_checkbox").not(this).prop('checked', false); if ($("form[data-id='add_alias'] .goto_checkbox:checked").length > 0) { $('#textarea_alias_goto').prop('disabled', true); } else { $("#textarea_alias_goto").removeAttr('disabled'); } }); $('#addAliasModal').on('show.bs.modal', function(e) { if ($("form[data-id='add_alias'] .goto_checkbox:checked").length > 0) { $('#textarea_alias_goto').prop('disabled', true); } else { $("#textarea_alias_goto").removeAttr('disabled'); } }); // Log modal $('#syncjobLogModal').on('show.bs.modal', function(e) { var syncjob_id = $(e.relatedTarget).data('syncjob-id'); $.ajax({ url: '/inc/ajax/syncjob_logs.php', data: { id: syncjob_id }, dataType: 'text', success: function(data){ $(e.currentTarget).find('#logText').text(data); }, error: function(xhr, status, error) { $(e.currentTarget).find('#logText').text(xhr.responseText); } }); }); // Log modal $('#dnsInfoModal').on('show.bs.modal', function(e) { var domain = $(e.relatedTarget).data('domain'); $('.dns-modal-body').html('
Loading...
'); $.ajax({ url: '/inc/ajax/dns_diagnostics.php', data: { domain: domain }, dataType: 'text', success: function(data){ $('.dns-modal-body').html(data); }, error: function(xhr, status, error) { $('.dns-modal-body').html(xhr.responseText); } }); }); // Sieve data modal $('#sieveDataModal').on('show.bs.modal', function(e) { var sieveScript = $(e.relatedTarget).data('sieve-script'); $(e.currentTarget).find('#sieveDataText').html('
' + sieveScript + '
'); }); // Disable submit button on script change $('.textarea-code').on('keyup', function() { // Disable all "save" buttons, could be a "related button only" function, todo $('.add_sieve_script').attr({"disabled": true}); }); // Validate script data $(".validate_sieve").click(function( event ) { event.preventDefault(); var validation_button = $(this); // Get script_data textarea content from form the button was clicked in var script = $('textarea[name="script_data"]', $(this).parents('form:first')).val(); $.ajax({ dataType: 'json', url: "/inc/ajax/sieve_validation.php", type: "get", data: { script: script }, complete: function(data) { var response = (data.responseText); response_obj = JSON.parse(response); if (response_obj.type == "success") { $(validation_button).next().attr({"disabled": false}); } mailcow_alert_box(response_obj.msg, response_obj.type); }, }); }); // $(document).on('DOMNodeInserted', '#prefilter_table', function () { // $("#active-script").closest('td').css('background-color','#b0f0a0'); // $("#inactive-script").closest('td').css('background-color','#b0f0a0'); // }); $('#addResourceModal').on('shown.bs.modal', function() { $("#multiple_bookings").val($("#multiple_bookings_select").val()); if ($("#multiple_bookings").val() == "custom") { $("#multiple_bookings_custom_div").show(); $("#multiple_bookings").val($("#multiple_bookings_custom").val()); } }) $("#multiple_bookings_select").change(function() { $("#multiple_bookings").val($("#multiple_bookings_select").val()); if ($("#multiple_bookings").val() == "custom") { $("#multiple_bookings_custom_div").show(); } else { $("#multiple_bookings_custom_div").hide(); } }); $("#multiple_bookings_custom").bind ("change keypress keyup blur", function () { $("#multiple_bookings").val($("#multiple_bookings_custom").val()); }); }); jQuery(function($){ // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript function humanFileSize(i){if(Math.abs(i)<1024)return i+" B";var B=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],e=-1;do{i/=1024,++e}while(Math.abs(i)>=1024&&e':new Date(i?1e3*i:0).toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})} $(".refresh_table").on('click', function(e) { e.preventDefault(); var table_name = $(this).data('table'); if ($.fn.DataTable.isDataTable('#' + table_name)) $('#' + table_name).DataTable().ajax.reload(); }); function draw_domain_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#domain_table') ) { $('#domain_table').DataTable().columns.adjust().responsive.recalc(); return; } var table = $('#domain_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/domain/all", dataSrc: function(json){ $.each(json, function(i, item) { item.aliases = item.aliases_in_domain + " / " + item.max_num_aliases_for_domain; item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain; item.quota = item.quota_used_in_domain + "/" + item.max_quota_for_domain + "/" + item.bytes_total; item.stats = item.msgs_total + "/" + item.bytes_total; if (!item.rl) item.rl = '∞'; else { item.rl = $.map(item.rl, function(e){ return e; }).join('/1'); } item.def_quota_for_mbox = humanFileSize(item.def_quota_for_mbox); item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox); item.chkbox = ''; item.action = '
'; if (role == "admin") { item.action += ' ' + lang.edit + '' + ' ' + lang.remove + '' + ' DNS
'; } else { item.action += ' ' + lang.edit + '' + ' DNS'; } if (Array.isArray(item.tags)){ var tags = ''; for (var i = 0; i < item.tags.length; i++) tags += ' ' + escapeHtml(item.tags[i]) + ''; item.tags = tags; } else { item.tags = ''; } if (item.backupmx == 1) { if (item.relay_unknown_only == 1) { item.domain_name = '
Relay Non-Local
' + item.domain_name; } else if (item.relay_all_recipients == 1) { item.domain_name = '
Relay All
' + item.domain_name; } else { item.domain_name = '
Relay
' + item.domain_name; } } }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: lang.domain, data: 'domain_name', responsivePriority: 3, defaultContent: '' }, { title: lang.aliases, data: 'aliases', defaultContent: '' }, { title: lang.mailboxes, data: 'mailboxes', responsivePriority: 4, defaultContent: '' }, { title: lang.domain_quota, data: 'quota', defaultContent: '', render: function (data, type) { data = data.split("/"); return humanFileSize(data[0]) + " / " + humanFileSize(data[1]); } }, { title: lang.stats, data: 'stats', defaultContent: '', render: function (data, type) { data = data.split("/"); return ' ' + data[0] + ' / ' + humanFileSize(data[1]); } }, { title: lang.mailbox_defquota, data: 'def_quota_for_mbox', defaultContent: '' }, { title: lang.mailbox_quota, data: 'max_quota_for_mbox', defaultContent: '' }, { title: 'RL', data: 'rl', defaultContent: '' }, { title: lang.backup_mx, data: 'backupmx', defaultContent: '', redner: function (data, type){ return 1==value ? '' : 0==value && ''; } }, { title: lang.domain_admins, data: 'domain_admins', defaultContent: '', className: 'none' }, { title: 'Tags', data: 'tags', defaultContent: '', className: 'none' }, { title: lang.active, data: 'active', defaultContent: '', responsivePriority: 6, render: function (data, type) { return 1==data?'':(0==data?'':2==data&&'—'); } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_mailbox_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#mailbox_table') ) { $('#mailbox_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#mailbox_table').DataTable({ responsive : true, processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/mailbox/reduced", dataSrc: function(json){ $.each(json, function (i, item) { item.quota = item.quota_used + "/" + item.quota; item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox); item.last_mail_login = item.last_imap_login + '/' + item.last_pop3_login + '/' + item.last_smtp_login; /* if (!item.rl) { item.rl = '∞'; } else { item.rl = $.map(item.rl, function(e){ return e; }).join('/1'); if (item.rl_scope === 'domain') { item.rl = ' ' + item.rl + ' (via ' + item.domain + ')'; } } */ item.chkbox = ''; if (item.attributes.passwd_update != '0') { var last_pw_change = new Date(item.attributes.passwd_update.replace(/-/g, "/")); item.last_pw_change = last_pw_change.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"}); } else { item.last_pw_change = '-'; } item.tls_enforce_in = ''; item.tls_enforce_out = ''; item.pop3_access = ''; item.imap_access = ''; item.smtp_access = ''; item.sieve_access = ''; if (item.attributes.quarantine_notification === 'never') { item.quarantine_notification = lang.never; } else if (item.attributes.quarantine_notification === 'hourly') { item.quarantine_notification = lang.hourly; } else if (item.attributes.quarantine_notification === 'daily') { item.quarantine_notification = lang.daily; } else if (item.attributes.quarantine_notification === 'weekly') { item.quarantine_notification = lang.weekly; } if (item.attributes.quarantine_category === 'reject') { item.quarantine_category = '' + lang.q_reject + ''; } else if (item.attributes.quarantine_category === 'add_header') { item.quarantine_category = '' + lang.q_add_header + ''; } else if (item.attributes.quarantine_category === 'all') { item.quarantine_category = lang.q_all; } if (acl_data.login_as === 1) { item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + ''; if (ALLOW_ADMIN_EMAIL_LOGIN) { item.action += ''; } item.action += '
'; } else { item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; } item.in_use = '
' + '
' + item.percent_in_use + '%' + '
'; item.username = escapeHtml(item.username); if (Array.isArray(item.tags)){ var tags = ''; for (var i = 0; i < item.tags.length; i++) tags += ' ' + escapeHtml(item.tags[i]) + ''; item.tags = tags; } else { item.tags = ''; } }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: lang.username, data: 'username', responsivePriority: 3, defaultContent: '' }, { title: lang.domain_quota, data: 'quota', responsivePriority: 8, defaultContent: '', render: function (data, type) { data = data.split("/"); var of_q = (data[1] == 0 ? "∞" : humanFileSize(data[1])); return humanFileSize(data[0]) + " / " + of_q; } }, { title: lang.last_mail_login, data: 'last_mail_login', defaultContent: '', responsivePriority: 7, render: function (data, type) { res = data.split("/"); return '
IMAP @ ' + unix_time_format(Number(res[0])) + '

' + '
POP3 @ ' + unix_time_format(Number(res[1])) + '

' + '
SMTP @ ' + unix_time_format(Number(res[2])) + '
'; } }, { title: lang.last_pw_change, data: 'last_pw_change', defaultContent: '' }, { title: lang.in_use, data: 'in_use', defaultContent: '', responsivePriority: 9, className: 'dt-data-w100' }, { title: lang.fname, data: 'name', defaultContent: '', className: 'none' }, { title: lang.domain, data: 'domain', defaultContent: '', className: 'none' }, { title: lang.tls_enforce_in, data: 'tls_enforce_in', defaultContent: '', className: 'none' }, { title: lang.tls_enforce_out, data: 'tls_enforce_out', defaultContent: '', className: 'none' }, { title: 'SMTP', data: 'smtp_access', defaultContent: '', className: 'none' }, { title: 'IMAP', data: 'imap_access', defaultContent: '', className: 'none' }, { title: 'POP3', data: 'pop3_access', defaultContent: '', className: 'none' }, { title: 'SIEVE', data: 'sieve_access', defaultContent: '', className: 'none' }, { title: lang.quarantine_notification, data: 'quarantine_notification', defaultContent: '', className: 'none' }, { title: lang.quarantine_category, data: 'quarantine_category', defaultContent: '', className: 'none' }, { title: lang.msg_num, data: 'messages', defaultContent: '', responsivePriority: 5 }, { title: 'Tags', data: 'tags', defaultContent: '', className: 'none' }, { title: lang.active, data: 'active', defaultContent: '', responsivePriority: 4, render: function (data, type) { return 1==data?'':(0==data?'':2==data&&'—'); } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md', responsivePriority: 6, defaultContent: '' }, ] }); } function draw_resource_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#resource_table') ) { $('#resource_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#resource_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/resource/all", dataSrc: function(json){ $.each(json, function (i, item) { if (item.multiple_bookings == '0') { item.multiple_bookings = '' + lang.booking_0_short + ''; } else if (item.multiple_bookings == '-1') { item.multiple_bookings = '' + lang.booking_lt0_short + ''; } else { item.multiple_bookings = '' + lang.booking_custom_short + ' (' + item.multiple_bookings + ')'; } item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; item.name = escapeHtml(item.name); item.description = escapeHtml(item.description); }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: lang.description, data: 'description', responsivePriority: 3, defaultContent: '' }, { title: lang.alias, data: 'name', defaultContent: '' }, { title: lang.kind, data: 'kind', defaultContent: '' }, { title: lang.domain, data: 'domain', responsivePriority: 4, defaultContent: '' }, { title: lang.multiple_bookings, data: 'multiple_bookings', defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':(0==data?'':2==data&&'—'); } }, { title: lang.action, data: 'action', responsivePriority: 5, defaultContent: '', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right' }, ] }); } function draw_bcc_table() { $.get("/api/v1/get/bcc-destination-options", function(data){ // Domains var optgroup = ""; $.each(data.domains, function(index, domain){ optgroup += "" }); optgroup += "" $('#bcc-local-dest').append(optgroup); // Alias domains var optgroup = ""; $.each(data.alias_domains, function(index, alias_domain){ optgroup += "" }); optgroup += "" $('#bcc-local-dest').append(optgroup); // Mailboxes and aliases $.each(data.mailboxes, function(mailbox, aliases){ var optgroup = ""; $.each(aliases, function(index, alias){ optgroup += "" }); optgroup += "" $('#bcc-local-dest').append(optgroup); }); // Finish $('#bcc-local-dest').selectpicker('refresh'); }); // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#bcc_table') ) { $('#bcc_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#bcc_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/bcc/all", dataSrc: function(json){ $.each(json, function (i, item) { item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; item.local_dest = escapeHtml(item.local_dest); item.bcc_dest = escapeHtml(item.bcc_dest); if (item.type == 'sender') { item.type = '' + lang.bcc_sender_map + ''; } else { item.type = '' + lang.bcc_rcpt_map + ''; } }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 3, defaultContent: '' }, { title: lang.bcc_type, data: 'type', defaultContent: '' }, { title: lang.bcc_local_dest, data: 'local_dest', defaultContent: '' }, { title: lang.bcc_destinations, data: 'bcc_dest', defaultContent: '' }, { title: lang.domain, data: 'domain', responsivePriority: 4, defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':(0==data?'':2==data&&'—'); } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_recipient_map_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#recipient_map_table') ) { $('#recipient_map_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#recipient_map_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/recipient_map/all", dataSrc: function(json){ if (role !== "admin") return null; $.each(json, function (i, item) { item.recipient_map_old = escapeHtml(item.recipient_map_old); item.recipient_map_new = escapeHtml(item.recipient_map_new); item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 3, defaultContent: '' }, { title: lang.recipient_map_old, data: 'recipient_map_old', defaultContent: '' }, { title: lang.recipient_map_new, data: 'recipient_map_new', defaultContent: '', responsivePriority: 4 }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':0==data&&''; } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_tls_policy_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#tls_policy_table') ) { $('#tls_policy_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#tls_policy_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/tls-policy-map/all", dataSrc: function(json){ console.log(json); if (role !== "admin") return null; $.each(json, function (i, item) { item.dest = escapeHtml(item.dest); item.policy = '' + escapeHtml(item.policy) + ''; if (item.parameters == '') { item.parameters = '-'; } else { item.parameters = '' + escapeHtml(item.parameters) + ''; } item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 3, defaultContent: '' }, { title: lang.tls_map_dest, data: 'dest', defaultContent: '', responsivePriority: 4 }, { title: lang.tls_map_policy, data: 'policy', defaultContent: '' }, { title: lang.tls_map_parameters, data: 'parameters', defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':0==data&&''; } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_alias_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#alias_table') ) { $('#alias_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#alias_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/alias/all", dataSrc: function(json){ $.each(json, function (i, item) { item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; item.goto = escapeHtml(item.goto.replace(/,/g, " ")); if (item.public_comment !== null) { item.public_comment = escapeHtml(item.public_comment); } else { item.public_comment = '-'; } if (item.private_comment !== null) { item.private_comment = escapeHtml(item.private_comment); } else { item.private_comment = '-'; } if (item.is_catch_all == 1) { item.address = '
' + lang.catch_all + '
' + escapeHtml(item.address); } else { item.address = escapeHtml(item.address); } if (item.goto == "null@localhost") { item.goto = '⤷ '; } else if (item.goto == "spam@localhost") { item.goto = '' + lang.goto_spam + ''; } else if (item.goto == "ham@localhost") { item.goto = '' + lang.goto_ham + ''; } if (item.in_primary_domain !== "") { item.domain = ' ' + item.domain; } }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 3, defaultContent: '' }, { title: lang.alias, data: 'address', responsivePriority: 4, defaultContent: '' }, { title: lang.target_address, data: 'goto', defaultContent: '' }, { title: lang.domain, data: 'domain', defaultContent: '', responsivePriority: 5, }, { title: lang.bcc_destinations, data: 'bcc_dest', defaultContent: '' }, { title: lang.sogo_visible, data: 'sogo_visible', defaultContent: '', render: function(data, type){ return 1==data?'':0==data&&''; } }, { title: lang.public_comment, data: 'public_comment', defaultContent: '' }, { title: lang.private_comment, data: 'private_comment', defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', responsivePriority: 6, render: function (data, type) { return 1==data?'':0==data&&''; } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_aliasdomain_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#aliasdomain_table') ) { $('#aliasdomain_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#aliasdomain_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/alias-domain/all", dataSrc: function(json){ $.each(json, function (i, item) { item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + ' DNS
' + ''; item.chkbox = ''; if(item.parent_is_backupmx == '1') { item.target_domain = '' + item.target_domain + '
' + lang.alias_domain_backupmx + '
'; } else { item.target_domain = '' + item.target_domain + ''; } }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: lang.alias, data: 'alias_domain', responsivePriority: 3, defaultContent: '' }, { title: lang.target_domain, data: 'target_domain', responsivePriority: 4, defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':0==data&&''; } }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_sync_job_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#sync_job_table') ) { $('#sync_job_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#sync_job_table').DataTable({ processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/syncjobs/all/no_log", dataSrc: function(json){ $.each(json, function (i, item) { item.log = '' + lang.open_logs + '' item.user2 = escapeHtml(item.user2); if (!item.exclude > 0) { item.exclude = '-'; } else { item.exclude = '' + escapeHtml(item.exclude) + ''; } item.server_w_port = escapeHtml(item.user1) + '@' + item.host1 + ':' + item.port1; item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = ''; if (item.is_running == 1) { item.is_running = '' + lang.running + ''; } else { item.is_running = '' + lang.waiting + ''; } if (!item.last_run > 0) { item.last_run = lang.waiting; } if (item.success == null) { item.success = '-'; item.exit_status = ''; } else { item.success = ''; } if (lang['syncjob_'+item.exit_status]) { item.exit_status = lang['syncjob_'+item.exit_status]; } else if (item.success != '-') { item.exit_status = lang.syncjob_check_log; } item.exit_status = item.success + ' ' + item.exit_status; }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 3, defaultContent: '' }, { title: lang.owner, data: 'user2', responsivePriority: 4, defaultContent: '' }, { title: 'Server', data: 'server_w_port', defaultContent: '' }, { title: lang.last_run, data: 'last_run', defaultContent: '' }, { title: lang.syncjob_last_run_result, data: 'exit_status', defaultContent: '' }, { title: 'Log', data: 'log', defaultContent: '' }, { title: lang.active, data: 'active', defaultContent: '', render: function (data, type) { return 1==data?'':0==data&&''; } }, { title: lang.status, data: 'is_running', defaultContent: '' }, { title: lang.excludes, data: 'exclude', defaultContent: '', className: 'none' }, { title: lang.mins_interval, data: 'mins_interval', defaultContent: '', className: 'none' }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); } function draw_filter_table() { // just recalc width if instance already exists if ($.fn.DataTable.isDataTable('#filter_table') ) { $('#filter_table').DataTable().columns.adjust().responsive.recalc(); return; } var table = $('#filter_table').DataTable({ autoWidth: false, processing: true, serverSide: false, language: lang_datatables, ajax: { type: "GET", url: "/api/v1/get/filters/all", dataSrc: function(json){ $.each(json, function (i, item) { if (item.active == 1) { item.active = '' + lang.active + ''; } else { item.active = '' + lang.inactive + ''; } item.script_data = '
' + escapeHtml(item.script_data) + '
' item.filter_type = '
' + item.filter_type.charAt(0).toUpperCase() + item.filter_type.slice(1).toLowerCase() + '
' item.action = '
' + ' ' + lang.edit + '' + ' ' + lang.remove + '' + '
'; item.chkbox = '' }); return json; } }, columns: [ { // placeholder, so checkbox will not block child row toggle title: '', data: null, searchable: false, orderable: false, defaultContent: '', responsivePriority: 1 }, { title: '', data: 'chkbox', searchable: false, orderable: false, defaultContent: '', responsivePriority: 2 }, { title: 'ID', data: 'id', responsivePriority: 2, defaultContent: '' }, { title: lang.active, data: 'active', responsivePriority: 3, defaultContent: '' }, { title: 'Type', data: 'filter_type', responsivePriority: 4, defaultContent: '' }, { title: lang.owner, data: 'username', defaultContent: '' }, { title: lang.description, data: 'script_desc', defaultContent: '' }, { title: 'Script', data: 'script_data', defaultContent: '', className: 'none' }, { title: lang.action, data: 'action', className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-body-right', responsivePriority: 5, defaultContent: '' }, ] }); }; // detect element visibility changes function onVisible(element, callback) { $(document).ready(function() { element_object = document.querySelector(element); if (element_object === null) return; new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if(entry.intersectionRatio > 0) { callback(element_object); } }); }).observe(element_object); }); } // Load only if the tab is visible onVisible("[id^=domain_table]", () => draw_domain_table()); onVisible("[id^=mailbox_table]", () => draw_mailbox_table()); onVisible("[id^=resource_table]", () => draw_resource_table()); onVisible("[id^=alias_table]", () => draw_alias_table()); onVisible("[id^=aliasdomain_table]", () => draw_aliasdomain_table()); onVisible("[id^=sync_job_table]", () => draw_sync_job_table()); onVisible("[id^=filter_table]", () => draw_filter_table()); onVisible("[id^=bcc_table]", () => draw_bcc_table()); onVisible("[id^=recipient_map_table]", () => draw_recipient_map_table()); onVisible("[id^=tls_policy_table]", () => draw_tls_policy_table()); });