/**
* Version:
* $Revision: 26 $
* Author:
* Michael Kefeder
* http://code.google.com/p/rcmail-thunderbird-labels/
*/
// global variable for contextmenu actions
rcmail.tb_label = '';
rcmail.options_labels = {};
if (window.rcmail) {
rcmail.addEventListener('init', function(evt) {
if (rcmail.task == 'mail') {
if (rcmail.env.action == 'show') {
$('#tb_label_popup .toolbarmenu li.labels').addClass('show');
}
if (['', 'index'].includes(rcmail.env.action)) {
rcmail.addEventListener('quick-filter.labels', (args) => {
const {filter, target_event} = args;
rcmail.mel_label_show_tooltip(target_event);
});
}
rcmail.addEventListener('responseafterlist', function (evt) {
var key = '';
if (rcmail.env.balp_label) {
$('#tb_label_popup .toolbarmenu li.labels').removeClass('show');
$('#messagessearchfilter option.labels').removeClass('show');
if (rcmail.env.mailbox.indexOf(rcmail.env.balp_label) === 0) {
key = rcmail.env.mailbox.split(rcmail.env.delimiter)[1];
key = rcmail_tb_labels_key_to_css(key);
}
else {
key = rcmail_tb_labels_key_to_css(rcmail.env.username);
}
}
else {
key = rcmail_tb_labels_key_to_css(rcmail.env.username);
}
if (Enumerable.from(rcmail.options_labels).count() == 0)
{
$('#searchfilter option.labels').each((index, elem) => {
const labelKey = Enumerable.from(elem.classList).toArray().join(".");
if (rcmail.options_labels[labelKey] === undefined)
rcmail.options_labels[labelKey] = [];
rcmail.options_labels[labelKey].push(elem.outerHTML);
if (!$(elem).hasClass(key))
$(elem).remove();
});
}
else {
let tmpQuerry = $('#searchfilter');//.html("");
$('#searchfilter option.labels').remove();
if (rcmail.options_labels[`labels.${key}`] !== undefined && rcmail.options_labels[`labels.${key}`])
{
for (const objectKey in rcmail.options_labels[`labels.${key}`]) {
if (Object.hasOwnProperty.call(rcmail.options_labels[`labels.${key}`], objectKey)) {
const element = rcmail.options_labels[`labels.${key}`][objectKey];
tmpQuerry.append(element);
}
}
}
}
$('#tb_label_popup .toolbarmenu li.labels.'+key).addClass('show');
$('#searchfilter option.labels.'+key).addClass('show');
});
}
});
}
function rcmail_tb_labels_key_to_css(key) {
return key
.replace(/\./g, '_-p-_')
.replace(/\$/g, '_-s-_')
.replace(/&/g, '_-e-_')
.replace(/~/g, '_-t-_')
.replace(/\\/g, '_-q-_');
}
function rcmail_tb_label_menu(p)
{
if (typeof rcmail_ui == "undefined")
rcmail_ui = UI;
if (!rcmail_ui.check_tb_popup())
rcmail_ui.tb_label_popup_add();
// Show the popup menu with tags
// -- skin larry vs classic
if (typeof rcmail_ui.show_popupmenu == "undefined")
rcmail_ui.show_popup('tb_label_popup');
else
rcmail_ui.show_popupmenu('tb_label_popup');
return false;
}
/**
* Shows the colors based on flag info like in Thunderbird
*/
function rcm_tb_label_insert(uid, row)
{
var message = rcmail.env.messages[uid];
if (message.flags && message.flags.tb_labels)
{
var html = "";
var rowobj = $(row.obj);
for (idx in message.flags.tb_labels) {
rowobj.addClass('label_' + message.flags.tb_labels[idx].replace('~', ''));
html += `<span class="text_${'label_' + message.flags.tb_labels[idx].replace('~', '')}">${rcmail.env.labels_translate[message.flags.tb_labels[idx].replace('~', '')]}</span>`;
}
if (html !== "")
rowobj.find("td.subject").prepend(`<td class="labels">${html}</td>`);
}
}
/**
* Shows the submenu of thunderbird labels
*/
function rcm_tb_label_submenu(p)
{
if (typeof rcmail_ui == "undefined")
rcmail_ui = UI;
// setup onclick and active/non active classes
rcm_tb_label_create_popupmenu();
// -- create sensible popup, using roundcubes internals
if (!rcmail_ui.check_tb_popup())
rcmail_ui.tb_label_popup_add();
// -- skin larry vs classic
if (typeof rcmail_ui.show_popupmenu == "undefined")
rcmail_ui.show_popup('tb_label_popup');
else
rcmail_ui.show_popupmenu('tb_label_popup');
return false;
}
function rcm_tb_label_flag_toggle(flag_uids, toggle_label, onoff)
{
var headers_table = $('.message-partheaders table.headers-table');
var preview_frame = $('#messagecontframe');
var header_preview_all_table = $('.message-partheaders table.headers-table');
// preview frame exists, simulate environment of single message view
if (preview_frame.length)
{
tb_labels_for_message = preview_frame.get(0).contentWindow.tb_labels_for_message;
headers_table = preview_frame.contents().find('.message-partheaders table.headers-table');
header_preview_all_table = preview_frame.contents().find('.message-partheaders table.headers-table');
}
if (!rcmail.message_list
&& !headers_table)
return;
if (rcmail.env.labels_translate[toggle_label]) {
var label_name = rcmail.env.labels_translate[toggle_label];
} else {
var label_name = toggle_label;
}
// for single message view
if (headers_table.length && flag_uids.length)
{
if (onoff == true)
{
// adcolor
headers_table.addClass('label_' + toggle_label.replace('~', ''));
// add to flag list
tb_labels_for_message.push(toggle_label);
if (header_preview_all_table.find('tr td.label').length > 0) {
header_preview_all_table.find('tr td.label').html(header_preview_all_table.find('tr td.label').html() + ', <span class="label_' + toggle_label + '">' + label_name + '</span>');
} else {
if (header_preview_all_table.length > 0) {
header_preview_all_table.append('<tr><td class="header-title">'+rcmail.gettext('mel_labels_sync.labels')+'</td><td class="header label"><span class="label_' + toggle_label.replace('~', '') + '">' + label_name + '</span></td></tr>');
}
}
}
else
{
// remove color
headers_table.removeClass('label_' + toggle_label);
var pos = jQuery.inArray(toggle_label, tb_labels_for_message);
if (pos > -1)
tb_labels_for_message.splice(pos, 1);
if (header_preview_all_table.find('tr td.label').length > 0) {
header_preview_all_table.find('tr td.label').html(header_preview_all_table.find('tr td.label').html().replace('<span class="label_' + toggle_label.replace('~','') + '">' + label_name + '</span>' + ', ','').replace(', ' + '<span class="label_' + toggle_label.replace('~','') + '">' + label_name + '</span>','').replace('<span class="label_' + toggle_label.replace('~','') + '">' + label_name + '</span>',''));
if (header_preview_all_table.find('tr td.label').html() == "") {
header_preview_all_table.find('tr td.label').parent().remove();
}
}
}
// exit function when in detail mode. when preview is active keep going
if (!rcmail.env.messages)
return;
}
jQuery.each(flag_uids, function (idx, uid) {
if (uid == -1) {
return;
}
var message = rcmail.env.messages[uid];
var row = rcmail.message_list.rows[uid];
if (onoff == true)
{
// add colors
var rowobj = $(row.obj);
rowobj.addClass('label_' + toggle_label.replace('~',''));
// add to flag list
message.flags.tb_labels.push(toggle_label);
if (rowobj.find('td.labels').length === 0 && rowobj.find('span.labels').length === 0)
rowobj.find("td.subject").prepend(`<td class="labels"></td>`)
if (rowobj.find('td.labels').length > 0) {
if (rowobj.find('td.labels').html() == "") {
rowobj.find('td.labels').html(`<span class="text_${'label_' + toggle_label.replace('~','')}">${label_name}</span>`);
} else {
rowobj.find('td.labels').append(`<span class="text_${'label_' + toggle_label.replace('~','')}">${label_name}</span>`);
}
}
else if (rowobj.find('span.labels').length > 0) {
if (rowobj.find('span.labels').html() == "") {
rowobj.find('span.labels').html(label_name);
} else {
rowobj.find('span.labels').html(rowobj.find('span.labels').html() + ', ' + label_name);
}
}
}
else
{
// remove colors
var rowobj = $(row.obj);
rowobj.removeClass('label_' + toggle_label.replace('~',''));
// remove from flag list
var pos = jQuery.inArray(toggle_label, message.flags.tb_labels);
if (pos > -1)
message.flags.tb_labels.splice(pos, 1);
if (rowobj.find('td.labels').length > 0) {
rowobj.find('td.labels').html(rowobj.find('td.labels').html().replace(`<span class="text_${'label_' + toggle_label.replace('~','')}">${label_name}</span>`, ''));
}
else if (rowobj.find('span.labels').length > 0) {
rowobj.find('span.labels').text(rowobj.find('span.labels').text().replace(label_name + ', ','').replace(', ' + label_name,'').replace(label_name,''));
}
if (rowobj.find('td.labels').children().length === 0)
rowobj.find('td.labels').remove();
}
});
}
function rcm_tb_label_flag_msgs(flag_uids, toggle_label)
{
rcm_tb_label_flag_toggle(flag_uids, toggle_label, true);
}
function rcm_tb_label_unflag_msgs(unflag_uids, toggle_label)
{
rcm_tb_label_flag_toggle(unflag_uids, toggle_label, false);
}
// helper function to get selected/active messages
function rcm_tb_label_get_selection()
{
var selection = rcmail.message_list ? rcmail.message_list.get_selection() : [];
if (selection.length === 0 && !!rcmail.env.itip_current_mail_selected)
{
selection = rcmail.env.itip_current_mail_selected;
delete rcmail.env.itip_current_mail_selected;
}
if (selection.length == 0 && rcmail.env.uid) selection = [rcmail.env.uid, ];
return selection;
}
function rcm_tb_label_create_popupmenu()
{
if ($('div#tb_label_popup').length > 0
&& !$('div#tb_label_popup').is(":visible")) {
$('div#tb_label_popup').attr('data-sticky', 'true');
if ($('div#tb_label_popup ul').length === 0) {
rcmail.http_request('plugin.thunderbird_labels.update_list_labels');
}
}
}
function rcm_tb_label_init_onclick(selector = '#tb_label_popup li a', closeAction = () => rcmail.hide_menu('tb_label_popup'))
{
if ($(selector).length) {
$(selector).each(function() {
var cur_a = $(this);
// TODO check if click event is defined instead of unbinding?
$(this).unbind('click');
$(this).click(function() {
var toggle_label;// = $(this).parent().attr('id').split('_b_')[0];
try {
toggle_label = $(this).parent().attr('id').split('_b_')[0].replace(/(<([^>]+)>)/gi, "");
} catch (error) {
toggle_label = Enumerable.from(this.classList).where(x => x.includes("label_")).first().replace("label_", "");
}
rcmail.mel_label_toggle(toggle_label);
});
});
}
}
function rcmail_ctxm_label(command, el, pos)
{
// my code works only on selected rows, contextmenu also on unselected
// so if no selection is available, use the uid set by contextmenu plugin
var selection = rcmail.message_list ? rcmail.message_list.get_selection() : [];
if (!selection.length && !rcmail.env.uid)
return;
if (!selection.length && rcmail.env.uid)
rcmail.message_list.select_row(rcmail.env.uid);
var cur_a = $('#tb_label_popup li.' + rcmail.tb_label +' a');
if (cur_a)
{
cur_a.click();
}
return;
}
function rcmail_ctxm_label_set(which)
{
// hack for my contextmenu submenu hack to propagate the selected label-no
rcmail.tb_label = which;
}
/**
* Show manage labels page as jquery UI dialog
*/
function show_rcube_manage_labels()
{
var frame = $('<iframe>').attr('id', 'managelabelsframe')
.attr('src', rcmail.url('settings/edit-prefs') + '&_section=labels&_framed=1')
.attr('frameborder', '0')
.appendTo(document.body);
var buttons = {};
frame.dialog({
modal: true,
resizable: false,
closeOnEscape: true,
title: '',
close: function() {
frame.dialog('destroy').remove();
window.location.reload();
},
buttons: buttons,
width: 660,
height: 500,
rcmail: rcmail
}).width(640);
// Fermer le pop up au click
rcmail.hide_menu('tb_label_popup');
}
// Toggle label for selection
rcube_webmail.prototype.mel_label_toggle = function(toggle_label) {
var selection = rcm_tb_label_get_selection();
var unset_all = false;
var labels_list = [];
// special case flag 0 means remove all flags
if (toggle_label == 'label0') {
unset_all = true;
$('#tb_label_popup li.show a').each(function() {
if ($(this).parent().attr('id') != 'label0'
&& $(this).attr('id') != 'rcube_manage_labels') {
labels_list.push($(this).parent().attr('id').split('_b_')[0]);
}
});
} else {
labels_list.push(toggle_label);
}
var _this = this;
jQuery.each(labels_list, function(index, value) {
if (value) {
var toggle_label = value.toLowerCase();
// compile list of unflag and flag msgs and then send command
// Thunderbird modifies multiple message flags like it did the first in the selection
// e.g. first message has flag1, you click flag1, every message select loses flag1, the ones not having flag1 don't get it!
var first_toggle_mode = 'on';
if (_this.env.messages)
{
var first_message = _this.env.messages[selection[0]];
if (first_message.flags && jQuery.inArray(toggle_label, first_message.flags.tb_labels) >= 0)
first_toggle_mode = 'off';
else
first_toggle_mode = 'on';
}
else // single message display
{
// flag already set?
if (jQuery.inArray(toggle_label, tb_labels_for_message) >= 0)
first_toggle_mode = 'off';
}
var flag_uids = [];
var unflag_uids = [];
jQuery.each(selection, function (idx, uid) {
// message list not available (example: in detailview)
if (!_this.env.messages)
{
if (first_toggle_mode == 'on')
flag_uids.push(uid);
else
unflag_uids.push(uid);
// make sure for unset all there is the single message id
if (unset_all && unflag_uids.length == 0)
unflag_uids.push(uid);
return;
}
var message = _this.env.messages[uid];
if (message.flags && jQuery.inArray(toggle_label, message.flags.tb_labels) >= 0)
{
if (first_toggle_mode == 'off')
unflag_uids.push(uid);
}
else
{
if (first_toggle_mode == 'on')
flag_uids.push(uid);
}
});
if (unset_all)
flag_uids = [];
// skip sending flags to backend that are not set anywhere
if (flag_uids.length > 0
|| unflag_uids.length > 0) {
var str_flag_uids = flag_uids.join(',');
var str_unflag_uids = unflag_uids.join(',');
var lock = _this.set_busy(true, 'loading');
_this.http_request('plugin.thunderbird_labels.set_flags', '_flag_uids=' + str_flag_uids + '&_unflag_uids=' + str_unflag_uids + '&_mbox=' + urlencode(rcmail.env.mailbox) + "&_toggle_label=" + urlencode(toggle_label), lock);
// remove/add classes and tb labels from messages in JS
rcm_tb_label_flag_msgs(flag_uids, toggle_label);
rcm_tb_label_unflag_msgs(unflag_uids, toggle_label);
}
}
});
// Fermer le pop up au click
try {
closeAction();
} catch (error) {
}
//rcmail.hide_menu('tb_label_popup');
};
rcube_webmail.prototype.mel_label_show_tooltip = async function($parent) {
//debugger;
// window.loadJsModule = window.loadJsModule ?? (top ?? parent).loadJsModule;
//const mel_tooltip_js = await loadJsModule('mel_metapage', 'mel_tooltip.js', '/js/lib/classes/');
let $body = $('body');
let $tooltip = $('body .label-tooltip');
if (0 === $tooltip.length) {
let $ul;
let tooltips = Object.keys(rcmail.env.labels_translate);
$tooltip = $('<div id="mel-label-tooltip-dropdown" class=""></div>');
$ul = $('<div class="ignore-bullet btn-group-vertical"></div>');
for (let index = 0, len = tooltips.length, key = null, element = null; index < len; ++index) {
key = tooltips[index];
element = rcmail.env.labels_translate[key];
$ul.append(
$('<button type="button" class="btn mel-button no-button-margin no-margin-button bckg true"></button>').data('value', key.replace('_-s-_', '$').replace('_-t-_', '~').toUpperCase()).text(element).click((e) => {
let $target = $(e.target);
if ($target.is('.active')) {
$target.removeClass('active').removeClass('background').addClass('txt');
}
else {
$target.addClass('active').addClass('background').removeClass('txt');
}
const key = $target.data('mel-label');
$target.addClass(`label_${key}`);
rcmail.triggerEvent('label.tooltip.click', {state:$target.is('.active'), $caller:$parent, $target});
}).data('mel-label', key).addClass(`label_${key} txt important`)
.on('mouseover', (e) => {
let $target = $(e.target);
const key = $target.data('mel-label');
$target.removeClass(`label_${key}`);
}).on('mouseout', (e) => {
let $target = $(e.target);
const key = $target.data('mel-label');
$target.addClass(`label_${key}`);
})
);
}
$ul.appendTo($tooltip);
$tooltip.appendTo($body);
$parent.addClass('label-tooltip').data('popup', 'mel-label-tooltip-dropdown');
UI.popup_init($parent[0]);
$parent.click();
}
}
//kMel_LuminanceRatioAAA(kMel_extractRGB('#1A2F34'), kMel_extractRGB('rgb(230, 199, 66)'))
$(document).ready(function() {
rcm_tb_label_init_onclick();
// add keyboard shortcuts for normal keyboard and keypad
$(document).keyup(function(e) {
if (!($("input").is(":focus")) && !($("textarea").is(":focus"))) {
var k = e.which;
if ((k > 47 && k < 58) || (k > 95 && k < 106))
{
var label_no = k % 48;
var cur_a = $('#tb_label_popup').find('li.show.click' + label_no + ' a').click();
}
}
});
// Add labels to mail template
if ($('#listoptions').length > 0) {
$('#listoptions fieldset#listoptions-columns ul.proplist').append('<li><label><input type="checkbox" name="list_col[]" value="labels" /> <span>'+rcmail.gettext('mel_labels_sync.labels')+'</span></label></li>');
}
if ($('th#rcmlabels').length > 0) {
$('th#rcmlabels span.labels').text(rcmail.gettext('mel_labels_sync.labels'));
}
// Add custom css
var css = "";
if (rcmail.env.ismobile) {
$.each(rcmail.env.labels_color, function(id, val) {
id = id.replace('~', '').replace(/\./g,'\\.');
css += "#messagelist li.label_" + id + " span.labels,\n";
css += "table span.label_" + id + ",\n";
css += ".toolbarmenu li.label_" + id + ",\n";
css += ".toolbarmenu li.label_" + id + " a.active\n";
css += "{\n";
css += " color: " + val + ";\n";
css += "}\n";
});
}
else {
$.each(rcmail.env.labels_color, function(id, val) {
if (val === null) val = "#737373";
const default_h = "#FFFFFF";
let textcolor = default_h;
try {
if (!mel_metapage.Functions.colors.kMel_LuminanceRatioAAA(mel_metapage.Functions.colors.kMel_extractRGB(val), mel_metapage.Functions.colors.kMel_extractRGB(textcolor))) textcolor = 'black';
} catch (error) {
}
id = id.replace('~', '').replace(/\./g,'\\.');
css += "#messagelist tr.label_" + id + " td,\n";
// css += "#messagelist tr.label_" + id + " td a,\n";
css += ".toolbarmenu li.label_" + id + ",\n";
css += ".toolbarmenu li.label_" + id + " a.active,\n";
css += "table span.label_" + id + "\n";
css += "{\n";
css += " color: " + val + ";\n";
css += "}\n";
css += `#messagelist tr.label_${id} td.labels span.text_label_${id} {
color:${textcolor};
background-color:${val};
border:thin solid ${textcolor};
}
#messagelist tr.label_${id} td{
background-color:${val}20;
--message-list-content-selected-mail-address-color: ${textcolor};
--message-list-content-selected-row-background-color: ${val};
--message-list-content-selected-mail-subject-color: var(--message-list-content-selected-mail-address-color);
}
#messagelist tr.label_${id}:hover td{
/*--message-list-content-selected-mail-address-hover-color: ${textcolor};
--message-list-content-row-background-hover-color: ${val};
--message-list-content-selected-mail-subject-hover-color: ${textcolor};*/
}
.label_${id}.background {
color:${textcolor};
background-color:${val};
}
.label_${id}.txt {
color:${val};
}
.label_${id}.background.important {
color:${textcolor}!important;
background-color:${val}!important;
}
.label_${id}.txt.important {
color:${val}!important;
}
#messagelist tr.label_${id} td.labels::before
{
text-shadow: ${textcolor} 1px 0px 0px, ${textcolor} 0.540302px 0.841471px 0px, ${textcolor} -0.416147px 0.909297px 0px, ${textcolor} -0.989993px 0.14112px 0px, ${textcolor} -0.653644px -0.756803px 0px, ${textcolor} 0.283662px -0.958924px 0px, ${textcolor} 0.96017px -0.279416px 0px;
}
`;
css += "#messagelist tr.selected.label_" + id + " td,\n";
css += "#messagelist tr.selected.label_" + id + " td a\n";
css += "{\n";
css += " /*color: #FFFFFF;\n";
css += " background-color: "+val+";\n*/";
css += "}\n";
css += `
html.dark-mode #messagelist tr.label_${id} td,
html.dark-mode #messagelist tr.selected.label_${id} td
{
color: ${val}!important;
}
`;
});
}
$("<style type='text/css'>"+css+"</style>").appendTo("head");
// if exists add contextmenu entries
if (window.rcm_contextmenu_register_command) {
rcm_contextmenu_register_command('ctxm_tb_label', rcmail_ctxm_label, $('#tb_label_ctxm_mainmenu'), 'moreacts', 'after', true);
}
// single message displayed?
if (window.tb_labels_for_message)
{
jQuery.each(tb_labels_for_message, function(idx, val)
{
rcm_tb_label_flag_msgs([-1,], val);
}
);
}
// add roundcube events
rcmail.addEventListener('insertrow', function(event) {
rcm_tb_label_insert(event.uid, event.row);
});
rcmail.addEventListener('init', function(evt) {
rcmail.register_command('plugin.thunderbird_labels.rcm_tb_label_submenu', rcm_tb_label_submenu, true);
if (rcmail.message_list) {
rcmail.message_list.addEventListener('select', function(list) {
// Ne récupérer la selection qu'une seule fois (problème de perf)
var selection = list.get_selection();
$('div#tb_label_popup li a').each(function() {
if ($(this).attr('id') != "rcube_manage_labels") {
// add/remove active class
if (selection.length == 0)
$(this).removeClass('active');
else
$(this).addClass('active');
}
});
});
}
if (rcmail.env.action == 'show') {
// Ne récupérer la selection qu'une seule fois (problème de perf)
var selection = rcm_tb_label_get_selection();
$('div#tb_label_popup li a').each(function() {
if ($(this).attr('id') != "rcube_manage_labels") {
// add/remove active class
if (selection.length == 0)
$(this).removeClass('active');
else
$(this).addClass('active');
}
});
}
});
rcmail.addEventListener('listupdate', function() {
if ($('td#rcmlabels').length > 0) {
$('td#rcmlabels span.labels').text(rcmail.gettext('mel_labels_sync.labels'));
}
});
rcmail.addEventListener('responseafterplugin.thunderbird_labels.update_list_labels', function(evt) {
if ($('div#tb_label_popup').length > 0) {
// Ne récupérer la selection qu'une seule fois (problème de perf)
var selection = rcm_tb_label_get_selection();
$('div#tb_label_popup').html(evt.response.html);
$('div#tb_label_popup li a').each(function() {
if ($(this).attr('id') != "rcube_manage_labels") {
// add/remove active class
if (selection.length == 0)
$(this).removeClass('active');
else
$(this).addClass('active');
}
});
rcm_tb_label_init_onclick();
}
});
// -- add my submenu to roundcubes UI (for roundcube classic only?)
if (window.rcube_mail_ui) {
rcube_mail_ui.prototype.tb_label_popup_add = function() {
add = {
tb_label_popup: {id:'tb_label_popup'}
};
this.popups = $.extend(this.popups, add);
var obj = $('#'+this.popups.tb_label_popup.id);
if (obj.length)
this.popups.tb_label_popup.obj = obj;
else
delete this.popups.tb_label_popup;
};
}
if (window.rcube_mail_ui) {
rcube_mail_ui.prototype.check_tb_popup = function() {
// larry skin doesn't have that variable, popup works automagically, return true
if (typeof this.popups == 'undefined')
return true;
if (this.popups.tb_label_popup)
return true;
else
return false;
};
}
});