(js) Allow edition of IMAP flags/labels

This commit is contained in:
Francis Lachapelle
2017-10-12 15:44:14 -04:00
parent 8b02db7b8c
commit e59a8e12ba
5 changed files with 72 additions and 33 deletions
@@ -22,13 +22,13 @@
data = {};
}
// We swap $key -> _$key to avoid an Angular bug (https://github.com/angular/angular.js/issues/6266)
var labels = _.fromPairs(_.map(data.SOGoMailLabelsColors, function(value, key) {
if (key.charAt(0) == '$')
return ['_' + key, value];
return [key, value];
}));
data.SOGoMailLabelsColors = labels;
// Split mail labels keys and values
data.SOGoMailLabelsColorsKeys = [];
data.SOGoMailLabelsColorsValues = [];
_.forEach(data.SOGoMailLabelsColors, function (value, key) {
data.SOGoMailLabelsColorsKeys.push(key);
data.SOGoMailLabelsColorsValues.push(value);
});
_.forEach(data.SOGoSieveFilters, function(filter) {
_.forEach(filter.actions, function(action) {
@@ -268,18 +268,13 @@
}
});
// We swap _$key -> $key to avoid an Angular bug (https://github.com/angular/angular.js/issues/6266)
labels = _.fromPairs(_.map(preferences.defaults.SOGoMailLabelsColors, function(value, key) {
if (key.charAt(0) == '_' && key.charAt(1) == '$') {
// New key, let's take the value and flatten it
if (key.length > 2 && key.charAt(2) == '$') {
return [value[0].toLowerCase().replace(/[ \(\)\/\{%\*<>\\\"]/g, "_"), value];
}
return [key.substring(1), value];
}
return [key, value];
}));
preferences.defaults.SOGoMailLabelsColors = labels;
// Merge back mail labels keys and values
preferences.defaults.SOGoMailLabelsColors = {};
_.forEach(preferences.defaults.SOGoMailLabelsColorsKeys, function(key, i) {
preferences.defaults.SOGoMailLabelsColors[key] = preferences.defaults.SOGoMailLabelsColorsValues[i];
});
delete preferences.defaults.SOGoMailLabelsColorsKeys;
delete preferences.defaults.SOGoMailLabelsColorsValues;
_.forEach(preferences.defaults.SOGoSieveFilters, function(filter) {
_.forEach(filter.actions, function(action) {
@@ -17,6 +17,7 @@
this.timeZonesList = $window.timeZonesList;
this.timeZonesSearchText = '';
this.sieveVariablesCapability = ($window.sieveCapabilities.indexOf('variables') >= 0);
this.mailLabelKeyRE = new RegExp("^[^(){} %*\"\\\\]*$");
if (sgSettings.activeUser('path').mail) {
@@ -154,17 +155,23 @@
this.preferences.defaults.AuxiliaryMailAccounts.splice(index, 1);
form.$setDirty();
};
this.resetMailLabelValidity = function(index, form) {
form['mailIMAPLabel_' + index].$setValidity('duplicate', true);
};
this.addMailLabel = function(form) {
// See $omit() in the Preferences services for real key generation
var key = '_$$' + guid();
this.preferences.defaults.SOGoMailLabelsColors[key] = ["New label", "#aaa"];
focus('mailLabel_' + (_.size(this.preferences.defaults.SOGoMailLabelsColors) - 1));
this.preferences.defaults.SOGoMailLabelsColorsKeys.push("label");
this.preferences.defaults.SOGoMailLabelsColorsValues.push(["New label", "#aaa"]);
focus('mailLabel_' + (_.size(this.preferences.defaults.SOGoMailLabelsColorsKeys) - 1));
form.$setDirty();
};
this.removeMailLabel = function(key, form) {
delete this.preferences.defaults.SOGoMailLabelsColors[key];
this.removeMailLabel = function(index, form) {
this.preferences.defaults.SOGoMailLabelsColorsKeys.splice(index, 1);
this.preferences.defaults.SOGoMailLabelsColorsValues.splice(index, 1);
form.$setDirty();
};
@@ -310,6 +317,21 @@
}
}
if (this.preferences.defaults.SOGoMailLabelsColorsKeys.length !=
this.preferences.defaults.SOGoMailLabelsColorsValues.length ||
this.preferences.defaults.SOGoMailLabelsColorsKeys.length !=
_.uniq(this.preferences.defaults.SOGoMailLabelsColorsKeys).length) {
Dialog.alert(l('Error'), l("IMAP labels must have unique names."));
_.forEach(this.preferences.defaults.SOGoMailLabelsColorsKeys, function (value, i, keys) {
if (form['mailIMAPLabel_' + i].$dirty &&
(keys.indexOf(value) != i ||
keys.indexOf(value, i+1) > -1)) {
form['mailIMAPLabel_' + i].$setValidity('duplicate', false);
sendForm = false;
}
});
}
if (sendForm)
return this.preferences.$save().then(function(data) {
if (!options || !options.quick) {