Files
roundcube-aliasmanager/assets/scripts/app.js
T

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();
});