// Retention rules (admin/domainadmin mailbox page): list with the last nightly run, domain choices of the add modal. // The log of the runs is on the dashboard (draw_retention_logs). Loaded via $js_minifier. var mailcowRetention = (function($) { 'use strict'; // lang.retention of the mailbox page, '' if missing function L(key) { var src = (typeof lang !== 'undefined' && lang && lang.retention) ? lang.retention : {}; return (src[key] !== undefined && src[key] !== null) ? src[key] : ''; } function esc(s) { return escapeHtml(s === null || s === undefined ? '' : s); } // replaces the %s of a text one after the other function fill(text) { var args = Array.prototype.slice.call(arguments, 1); return text.replace(/%s/g, function() { return args.length ? args.shift() : ''; }); } function folderLabel(folder) { return folder.indexOf('folder:') === 0 ? folder.substr(7) : (L('folder_' + folder) || folder); } function foldersCell(item) { return (item.folders || []).map(function(folder) { return esc(folderLabel(folder)); }).join('
'); } function periodCell(item) { return esc(fill(L('days_short'), item.days)) + (item.keep_flagged == 1 ? '
' + esc(L('keep_flagged')) + '
' : ''); } function modeCell(mode) { return mode === 'delete' ? '' + esc(L('mode_delete')) + '' : '' + esc(L('simulated')) + ''; } function assignedCell(item) { var list = []; if (item.all_mailboxes == 1) list.push(esc(L('all_mailboxes'))); (item.mailboxes || []).slice(0, 3).forEach(function(mailbox) { list.push(esc(mailbox)); }); if ((item.mailboxes || []).length > 3) list.push('+' + (item.mailboxes.length - 3) + ''); if ((item.groups || []).length) list.push(' ' + esc(L('groups')) + ': ' + item.groups.length); return list.length ? list.join('
') : '' + esc(L('assigned_none')) + ''; } function lastRunCell(run) { if (!run) return '' + esc(L('never_run')) + ''; var text = run.simulated == 1 ? fill(L('run_simulated'), run.mailboxes, run.matched) : fill(L('run_deleted'), run.mailboxes, run.deleted); return esc(run.created) + '
' + esc(text) + '
' + (run.errors > 0 ? '
' + esc(fill(L('errors'), run.errors)) + '
' : ''); } function drawTable() { if ($.fn.DataTable.isDataTable('#retention_table')) { $('#retention_table').DataTable().columns.adjust().responsive.recalc(); return; } $('#retention_table').DataTable({ responsive: true, processing: true, serverSide: false, stateSave: true, pageLength: pagination_size, dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" + "tr" + "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", language: lang_datatables, order: [[3, 'asc']], ajax: { type: "GET", url: "/api/v1/get/retention-rule/all", dataSrc: function(json) { if (!Array.isArray(json)) return []; $.each(json, function(i, item) { item.chkbox = item.can_edit ? '' : ''; item.name_display = esc(item.name) + (item.description ? '
' + esc(item.description) + '
' : ''); item.folders_display = foldersCell(item); item.period_display = periodCell(item); item.mode_display = modeCell(item.mode); item.assigned_display = assignedCell(item); item.last_run_display = lastRunCell(item.last_run); item.action = '
' + ' ' + esc(item.can_edit ? lang.edit : L('view')) + '' + (item.can_edit ? ' ' + esc(lang.remove) + '' : '') + '
'; }); return json; }, error: function() { mailcow_alert_box(L('list_error'), 'danger'); } }, 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', defaultContent: '', responsivePriority: 7 }, { title: L('name'), data: 'name_display', defaultContent: '', responsivePriority: 2 }, { title: L('domain'), data: 'domain', defaultContent: '', responsivePriority: 5 }, { title: L('folders'), data: 'folders_display', defaultContent: '', responsivePriority: 3 }, { title: L('days'), data: 'period_display', defaultContent: '', responsivePriority: 3 }, { title: L('mode'), data: 'mode_display', defaultContent: '', responsivePriority: 4 }, { title: L('assign'), data: 'assigned_display', defaultContent: '', responsivePriority: 5 }, { title: L('last_run'), data: 'last_run_display', defaultContent: '', responsivePriority: 4 }, { title: lang.active, data: 'active', defaultContent: '', responsivePriority: 6, render: function(d) { return d == 1 ? '' : ''; } }, { title: lang.action, data: 'action', orderable: false, className: 'dt-sm-head-hidden dt-data-w100 dtr-col-md dt-text-right', responsivePriority: 3, defaultContent: '' } ] }); } // add modal: mailboxes and groups of the chosen domain only. The options are rebuilt and bootstrap-select is // built anew: its refresh repeats the list and still shows hidden options function filterDomain($form) { var domain = $form.find('select.retention-domain-select').val(); $form.find('select.retention-mailboxes, select.retention-groups').each(function() { var $select = $(this); if (!$select.data('all-options')) $select.data('all-options', $select.children('option').clone()); $select.selectpicker('destroy'); $select.empty().append($select.data('all-options').filter(function() { return $(this).data('domain') === domain; }).clone().prop('selected', false)); $select.selectpicker({'styleBase': 'btn btn-xs-lg', 'noneSelectedText': lang_footer.nothing_selected}); }); } $(document).ready(function() { $('select.retention-domain-select').on('change', function() { filterDomain($(this).closest('form')); }); $('#addRetentionModal').on('show.bs.modal', function() { filterDomain($(this).find('form')); }); }); return { drawTable: drawTable }; })(jQuery);