137 lines
3.8 KiB
JavaScript
137 lines
3.8 KiB
JavaScript
$(function() {
|
|
const labels = rcmail.env.aliasmanager_labels || {};
|
|
|
|
function call(action, data, onSuccess) {
|
|
data = $.extend({_token: rcmail.env.request_token}, data);
|
|
|
|
$.ajax({
|
|
type: 'POST',
|
|
url: rcmail.url('plugin.aliasmanager-' + action).replace(/&_unlock=[^&]*/, ''),
|
|
data: data,
|
|
dataType: 'json',
|
|
success: function(response) {
|
|
if (response.success) {
|
|
onSuccess(response.data || {});
|
|
} else {
|
|
rcmail.display_message(response.message, 'error');
|
|
updateAliasesList();
|
|
}
|
|
},
|
|
error: function() {
|
|
rcmail.display_message(labels.list_failed, 'error');
|
|
}
|
|
});
|
|
}
|
|
|
|
function renderRow(row, i) {
|
|
const id = 'toggle-active-' + i;
|
|
|
|
const toggle = $('<input type="checkbox" class="form-check-input custom-control-input btn-aliasmanager-toggle-alias">')
|
|
.attr('id', id)
|
|
.attr('data-email', row.email)
|
|
.prop('checked', row.active);
|
|
|
|
const copy = $('<button type="button" class="button btn-sm btn-secondary btn-aliasmanager-copy-alias"></button>')
|
|
.attr('data-email', row.email)
|
|
.text(labels.copy);
|
|
|
|
const del = $('<button type="button" class="button btn-sm btn-danger btn-aliasmanager-delete-alias"></button>')
|
|
.attr('data-email', row.email)
|
|
.text(labels.delete);
|
|
|
|
return $('<tr class="form-group"></tr>')
|
|
.append($('<td></td>').append($('<span class="alias-email"></span>').text(row.email)))
|
|
.append($('<td></td>').text(row.created))
|
|
.append($('<td></td>').append(
|
|
$('<div class="custom-control custom-switch"></div>')
|
|
.append(toggle)
|
|
.append($('<label class="custom-control-label"></label>').attr('for', id))
|
|
))
|
|
.append($('<td></td>').append(copy, ' ', del));
|
|
}
|
|
|
|
function updateAliasesList() {
|
|
call('get-alias-list', {}, function(data) {
|
|
const list = $('.alias-list').empty();
|
|
|
|
data.alias_list.forEach(function(row, i) {
|
|
list.append(renderRow(row, i));
|
|
});
|
|
|
|
list.append($('<tr class="alias-empty-row"><td colspan="4" class="alias-empty"></td></tr>'));
|
|
applyFilter();
|
|
});
|
|
}
|
|
|
|
// Hides rows that do not match the search query, shows a placeholder row when nothing is left
|
|
function applyFilter() {
|
|
const query = $('#alias-search').val().trim().toLowerCase();
|
|
const rows = $('.alias-list tr').not('.alias-empty-row');
|
|
let visible = 0;
|
|
|
|
rows.each(function() {
|
|
const match = !query || $(this).find('.alias-email').text().toLowerCase().indexOf(query) !== -1;
|
|
$(this).toggle(match);
|
|
if (match) {
|
|
visible++;
|
|
}
|
|
});
|
|
|
|
$('.alias-empty-row')
|
|
.toggle(visible === 0)
|
|
.find('td')
|
|
.text(rows.length ? labels.no_matches : labels.empty);
|
|
}
|
|
|
|
let searchTimer;
|
|
$(document).on('input', '#alias-search', function() {
|
|
clearTimeout(searchTimer);
|
|
searchTimer = setTimeout(applyFilter, 250);
|
|
});
|
|
|
|
function addAlias() {
|
|
const input = $('[name=alias_new_name]');
|
|
const name = input.val().trim();
|
|
|
|
if (!/[a-z0-9]/i.test(name)) {
|
|
rcmail.display_message(labels.name_required, 'warning');
|
|
return;
|
|
}
|
|
|
|
call('add-alias', {email: name}, function() {
|
|
input.val('');
|
|
updateAliasesList();
|
|
});
|
|
}
|
|
|
|
$(document).on('submit', '#aliasmanager-form', function(e) {
|
|
e.preventDefault();
|
|
addAlias();
|
|
});
|
|
|
|
$(document).on('change', '.btn-aliasmanager-toggle-alias', function() {
|
|
call('toggle-alias', {
|
|
email: $(this).attr('data-email'),
|
|
state: $(this).is(':checked'),
|
|
}, function() {});
|
|
});
|
|
|
|
$(document).on('click', '.btn-aliasmanager-delete-alias', function() {
|
|
if (confirm(labels.confirm_delete + '\n' + $(this).attr('data-email'))) {
|
|
call('delete-alias', {email: $(this).attr('data-email')}, updateAliasesList);
|
|
}
|
|
});
|
|
|
|
$(document).on('click', '.btn-aliasmanager-copy-alias', function() {
|
|
const text = $(this).attr('data-email');
|
|
|
|
if (navigator.clipboard) {
|
|
navigator.clipboard.writeText(text).then(function() {
|
|
rcmail.display_message(labels.copied, 'confirmation');
|
|
});
|
|
}
|
|
});
|
|
|
|
updateAliasesList();
|
|
});
|