Merge branch 'master' into patch-1

This commit is contained in:
the-djmaze 2022-09-26 18:59:40 +02:00 committed by GitHub
commit ceaab4eeb7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
56 changed files with 124 additions and 206 deletions

View file

@ -29,11 +29,11 @@ UploadErrorCode = {
/**
* @enum {number}
*/
SaveSettingsStep = {
Animate: -2,
SaveSettingStatus = {
Saving: -2,
Idle: -1,
TrueResult: 1,
FalseResult: 0
Success: 1,
Failed: 0
},
/**

View file

@ -28,22 +28,6 @@ export const FolderMetadataKeys = {
KolabFolderTypeShared: '/shared/vendor/kolab/folder-type'
};
/**
* @enum {string}
*/
export const FolderSortMode = {
DateDesc: '', // default 'REVERSE DATE'
DateAsc: 'DATE',
FromDesc: 'REVERSE FROM',
FromAsc: 'FROM',
SizeDesc: 'REVERSE SIZE',
SizeAsc: 'SIZE',
SubjectDesc: 'REVERSE SUBJECT',
SubjectAsc: 'SUBJECT'
// ToDesc: 'REVERSE TO',
// ToAsc: 'TO',
};
/**
* @enum {string}
*/

View file

@ -1,4 +1,4 @@
import { SaveSettingsStep } from 'Common/Enums';
import { SaveSettingStatus } from 'Common/Enums';
import { elementById } from 'Common/Globals';
let __themeTimer = 0,
@ -40,14 +40,14 @@ export const
changeTheme = (value, themeTrigger = ()=>0) => {
const themeStyle = elementById('app-theme-style'),
clearTimer = () => {
__themeTimer = setTimeout(() => themeTrigger(SaveSettingsStep.Idle), 1000);
__themeTimer = setTimeout(() => themeTrigger(SaveSettingStatus.Idle), 1000);
__themeJson = null;
},
url = themeStyle.dataset.href.replace(/(Admin|User)\/-\/[^/]+\//, '$1/-/' + value + '/') + 'Json/';
clearTimeout(__themeTimer);
themeTrigger(SaveSettingsStep.Animate);
themeTrigger(SaveSettingStatus.Saving);
if (__themeJson) {
__themeJson.abort();
@ -61,7 +61,7 @@ export const
.then(data => {
if (2 === arrayLength(data)) {
themeStyle.textContent = data[1];
themeTrigger(SaveSettingsStep.TrueResult);
themeTrigger(SaveSettingStatus.Success);
}
})
.then(clearTimer, clearTimer);

View file

@ -1,6 +1,6 @@
import ko from 'ko';
import { pInt } from 'Common/Utils';
import { SaveSettingsStep } from 'Common/Enums';
import { SaveSettingStatus } from 'Common/Enums';
import { koComputable } from 'External/ko';
import { dispose } from 'External/ko';
@ -23,10 +23,10 @@ export class AbstractInput {
classForTrigger = ko.observable(''),
setTriggerState = value => {
switch (pInt(value)) {
case SaveSettingsStep.TrueResult:
case SaveSettingStatus.Success:
classForTrigger('success');
break;
case SaveSettingsStep.FalseResult:
case SaveSettingStatus.Failed:
classForTrigger('error');
break;
default:

View file

@ -78,8 +78,13 @@ class SquireUI
actions = {
mode: {
plain: {
html: '〈〉',
cmd: () => this.setMode('plain' == this.mode ? 'wysiwyg' : 'plain'),
// html: '〈〉',
// cmd: () => this.setMode('plain' == this.mode ? 'wysiwyg' : 'plain'),
select: [
[i18n('SETTINGS_GENERAL/LABEL_EDITOR_HTML'),'wysiwyg'],
[i18n('SETTINGS_GENERAL/LABEL_EDITOR_PLAIN'),'plain']
],
cmd: s => this.setMode('plain' == s.value ? 'plain' : 'wysiwyg'),
hint: i18n('EDITOR/TEXT_SWITCHER_PLAIN_TEXT', 'Plain')
}
},
@ -299,8 +304,9 @@ class SquireUI
input.className = 'btn';
if (Array.isArray(cfg.select)) {
cfg.select.forEach(value => {
var option = new Option(value, value);
option.style[action] = value;
value = Array.isArray(value) ? value : [value, value];
var option = new Option(value[0], value[1]);
option.style[action] = value[1];
input.append(option);
});
} else {
@ -347,6 +353,8 @@ class SquireUI
toolgroup.children.length && toolbar.append(toolgroup);
}
this.modeSelect = actions.mode.plain.input;
let changes = actions.changes;
changes.undo.input.disabled = changes.redo.input.disabled = true;
squire.addEventListener('undoStateChange', state => {
@ -413,6 +421,7 @@ class SquireUI
this.onModeChange?.();
setTimeout(()=>this.focus(),1);
}
this.modeSelect.selectedIndex = 'plain' == this.mode ? 1 : 0;
}
// CKeditor gimmicks used by HtmlEditor

49
dev/External/ko.js vendored
View file

@ -1,8 +1,8 @@
import ko from 'ko';
import { i18nToNodes } from 'Common/Translator';
import { doc, createElement } from 'Common/Globals';
import { SaveSettingsStep } from 'Common/Enums';
import { arrayLength, isFunction, forEachObjectEntry } from 'Common/Utils';
import { SaveSettingStatus } from 'Common/Enums';
import { isFunction, forEachObjectEntry } from 'Common/Utils';
export const
errorTip = (element, value) => value
@ -68,6 +68,19 @@ Object.assign(ko.bindingHandlers, {
}
},
onEsc: {
init: (element, fValueAccessor, fAllBindings, viewModel) => {
let fn = event => {
if ('Escape' == event.key) {
element.dispatchEvent(new Event('change'));
fValueAccessor().call(viewModel);
}
};
element.addEventListener('keyup', fn);
ko.utils.domNodeDisposal.addDisposeCallback(element, () => element.removeEventListener('keyup', fn));
}
},
onSpace: {
init: (element, fValueAccessor, fAllBindings, viewModel) => {
let fn = event => {
@ -133,41 +146,19 @@ Object.assign(ko.bindingHandlers, {
const value = parseInt(ko.unwrap(fValueAccessor()),10);
let cl = (element.saveTriggerIcon || element).classList;
if (element.saveTriggerIcon) {
cl.toggle('saving', value === SaveSettingsStep.Animate);
cl.toggle('success', value === SaveSettingsStep.TrueResult);
cl.toggle('error', value === SaveSettingsStep.FalseResult);
cl.toggle('saving', value === SaveSettingStatus.Saving);
cl.toggle('success', value === SaveSettingStatus.Success);
cl.toggle('error', value === SaveSettingStatus.Failed);
}
cl = element.classList;
cl.toggle('success', value === SaveSettingsStep.TrueResult);
cl.toggle('error', value === SaveSettingsStep.FalseResult);
cl.toggle('success', value === SaveSettingStatus.Success);
cl.toggle('error', value === SaveSettingStatus.Failed);
}
}
});
// extenders
ko.extenders.limitedList = (target, limitedList) => {
const result = ko
.computed({
read: target,
write: newValue => {
let currentValue = target(),
list = ko.unwrap(limitedList);
list = arrayLength(list) ? list : [''];
if (!list.includes(newValue)) {
newValue = list.includes(currentValue, list) ? currentValue : list[0];
target(newValue + ' ');
}
target(newValue);
}
})
.extend({ notify: 'always' });
result(target());
return result;
};
ko.extenders.toggleSubscribeProperty = (target, options) => {
const prop = options[1];
if (prop) {

View file

@ -4,7 +4,7 @@ import { addObservablesTo, addComputablesTo, addSubscribablesTo } from 'External
import { keyScope, SettingsGet, leftPanelDisabled, elementById } from 'Common/Globals';
import { ViewTypePopup, showScreenPopup } from 'Knoin/Knoin';
import { SaveSettingsStep } from 'Common/Enums';
import { SaveSettingStatus } from 'Common/Enums';
class AbstractView {
constructor(templateID, type)
@ -123,16 +123,16 @@ export class AbstractViewSettings
trigger = prop + 'Trigger';
addObservablesTo(this, {
[prop]: SettingsGet(name),
[trigger]: SaveSettingsStep.Idle,
[trigger]: SaveSettingStatus.Idle,
});
addSubscribablesTo(this, {
[prop]: (value => {
this[trigger](SaveSettingsStep.Animate);
this[trigger](SaveSettingStatus.Saving);
valueCb?.(value);
rl.app.Remote.saveSetting(name, value,
iError => {
this[trigger](iError ? SaveSettingsStep.FalseResult : SaveSettingsStep.TrueResult);
setTimeout(() => this[trigger](SaveSettingsStep.Idle), 1000);
this[trigger](iError ? SaveSettingStatus.Failed : SaveSettingStatus.Success);
setTimeout(() => this[trigger](SaveSettingStatus.Idle), 1000);
}
);
}).debounce(999),

View file

@ -250,7 +250,7 @@ export class FolderModel extends AbstractModel {
focused: false,
selected: false,
edited: false,
editing: false,
isSubscribed: true,
checkable: false, // Check for new messages
askDelete: false,
@ -443,9 +443,7 @@ export class FolderModel extends AbstractModel {
});
folder.addSubscribables({
name: value => folder.nameForEdit(value),
edited: value => value && folder.nameForEdit(folder.name()),
editing: value => value && folder.nameForEdit(folder.name()),
unreadEmails: unread => {
if (FolderType.Inbox === folder.type()) {

View file

@ -8,7 +8,7 @@ import {
import { addObservablesTo, addSubscribablesTo, addComputablesTo } from 'External/ko';
import { SaveSettingsStep } from 'Common/Enums';
import { SaveSettingStatus } from 'Common/Enums';
import { Settings, SettingsGet, SettingsCapa } from 'Common/Globals';
import { translatorReload, convertLangName } from 'Common/Translator';
@ -30,9 +30,7 @@ export class AdminSettingsGeneral extends AbstractViewSettings {
const aLanguagesAdmin = Settings.app('languagesAdmin');
this.languagesAdmin = ko.observableArray(isArray(aLanguagesAdmin) ? aLanguagesAdmin : []);
this.languageAdmin = ko
.observable(SettingsGet('LanguageAdmin'))
.extend({ limitedList: this.languagesAdmin });
this.languageAdmin = ko.observable(SettingsGet('LanguageAdmin'));
this.theme = ThemeStore.theme;
this.themes = ThemeStore.themes;
@ -40,8 +38,8 @@ export class AdminSettingsGeneral extends AbstractViewSettings {
this.addSettings(['AllowLanguagesOnSettings','NewMoveToFolder']);
addObservablesTo(this, {
attachmentLimitTrigger: SaveSettingsStep.Idle,
themeTrigger: SaveSettingsStep.Idle,
attachmentLimitTrigger: SaveSettingStatus.Idle,
themeTrigger: SaveSettingStatus.Idle,
capaThemes: SettingsCapa('Themes'),
capaUserBackground: SettingsCapa('UserBackground'),
capaAdditionalAccounts: SettingsCapa('AdditionalAccounts'),
@ -84,19 +82,19 @@ export class AdminSettingsGeneral extends AbstractViewSettings {
languageAdminFullName: () => convertLangName(this.languageAdmin())
});
this.languageAdminTrigger = ko.observable(SaveSettingsStep.Idle).extend({ debounce: 100 });
this.languageAdminTrigger = ko.observable(SaveSettingStatus.Idle).extend({ debounce: 100 });
const fReloadLanguageHelper = (saveSettingsStep) => () => {
this.languageAdminTrigger(saveSettingsStep);
setTimeout(() => this.languageAdminTrigger(SaveSettingsStep.Idle), 1000);
setTimeout(() => this.languageAdminTrigger(SaveSettingStatus.Idle), 1000);
},
fSaveHelper = key => value => Remote.saveSetting(key, value);
addSubscribablesTo(this, {
languageAdmin: value => {
this.languageAdminTrigger(SaveSettingsStep.Animate);
this.languageAdminTrigger(SaveSettingStatus.Saving);
translatorReload(true, value)
.then(fReloadLanguageHelper(SaveSettingsStep.TrueResult), fReloadLanguageHelper(SaveSettingsStep.FalseResult))
.then(fReloadLanguageHelper(SaveSettingStatus.Success), fReloadLanguageHelper(SaveSettingStatus.Failed))
.then(() => Remote.saveSetting('LanguageAdmin', value));
},

View file

@ -51,14 +51,13 @@ export class UserSettingsFolders /*extends AbstractViewSettings*/ {
this.folderForDeletion = folderForDeletion;
this.folderForEdit = ko.observable(null).extend({ toggleSubscribeProperty: [this, 'edited'] });
this.folderForEdit = ko.observable(null).extend({ toggleSubscribeProperty: [this, 'editing'] });
SettingsUserStore.hideUnsubscribed.subscribe(value => Remote.saveSetting('HideUnsubscribed', value));
}
folderEditOnEnter(folder) {
const nameToEdit = folder ? folder.nameForEdit().trim() : '';
const nameToEdit = folder?.nameForEdit().trim();
if (nameToEdit && folder.name() !== nameToEdit) {
Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, {
Folder: folder.fullName,
@ -88,13 +87,13 @@ export class UserSettingsFolders /*extends AbstractViewSettings*/ {
});
}
folder.edited(false);
// this.folderForEdit(null);
folder.editing(false);
}
folderEditOnEsc(folder) {
if (folder) {
folder.edited(false);
}
// this.folderForEdit(null);
folder?.editing(false);
}
onShow() {

View file

@ -1,7 +1,7 @@
import ko from 'ko';
import { SMAudio } from 'Common/Audio';
import { SaveSettingsStep } from 'Common/Enums';
import { SaveSettingStatus } from 'Common/Enums';
import { EditorDefaultType, Layout } from 'Common/EnumsUser';
import { Settings, SettingsGet } from 'Common/Globals';
import { isArray } from 'Common/Utils';
@ -48,7 +48,7 @@ export class UserSettingsGeneral extends AbstractViewSettings {
this.allowLanguagesOnSettings = !!SettingsGet('AllowLanguagesOnSettings');
this.languageTrigger = ko.observable(SaveSettingsStep.Idle);
this.languageTrigger = ko.observable(SaveSettingStatus.Idle);
this.identities = IdentityUserStore;
@ -103,14 +103,14 @@ export class UserSettingsGeneral extends AbstractViewSettings {
const fReloadLanguageHelper = (saveSettingsStep) => () => {
this.languageTrigger(saveSettingsStep);
setTimeout(() => this.languageTrigger(SaveSettingsStep.Idle), 1000);
setTimeout(() => this.languageTrigger(SaveSettingStatus.Idle), 1000);
};
addSubscribablesTo(this, {
language: value => {
this.languageTrigger(SaveSettingsStep.Animate);
this.languageTrigger(SaveSettingStatus.Saving);
translatorReload(false, value)
.then(fReloadLanguageHelper(SaveSettingsStep.TrueResult), fReloadLanguageHelper(SaveSettingsStep.FalseResult))
.then(fReloadLanguageHelper(SaveSettingStatus.Success), fReloadLanguageHelper(SaveSettingStatus.Failed))
.then(() => Remote.saveSetting('Language', value));
},

View file

@ -1,6 +1,6 @@
import { addObservablesTo } from 'External/ko';
import { SaveSettingsStep, UploadErrorCode } from 'Common/Enums';
import { SaveSettingStatus, UploadErrorCode } from 'Common/Enums';
import { changeTheme, convertThemeName } from 'Common/Utils';
import { themePreviewLink, serverRequest } from 'Common/Links';
import { i18n } from 'Common/Translator';
@ -29,7 +29,7 @@ export class UserSettingsThemes /*extends AbstractViewSettings*/ {
themeBackground.enabled = SettingsCapa('UserBackground');
this.background = themeBackground;
this.themeTrigger = ko.observable(SaveSettingsStep.Idle).extend({ debounce: 100 });
this.themeTrigger = ko.observable(SaveSettingStatus.Idle).extend({ debounce: 100 });
ThemeStore.theme.subscribe(value => {
this.themesObjects.forEach(theme => {

View file

@ -3,6 +3,7 @@ import { Settings, SettingsGet } from 'Common/Globals';
import { isArray } from 'Common/Utils';
export const LanguageStore = {
language: ko.observable(''),
languages: ko.observableArray(),
userLanguage: ko.observable(''),
@ -13,6 +14,3 @@ export const LanguageStore = {
this.userLanguage(SettingsGet('UserLanguage'));
}
}
LanguageStore.language = ko.observable('')
.extend({ limitedList: LanguageStore.languages });

View file

@ -4,6 +4,7 @@ import { isArray } from 'Common/Utils';
import { serverRequestRaw } from 'Common/Links';
export const ThemeStore = {
theme: ko.observable(''),
themes: ko.observableArray(),
userBackgroundName: ko.observable(''),
userBackgroundHash: ko.observable(''),
@ -23,8 +24,6 @@ export const ThemeStore = {
}
};
ThemeStore.theme = ko.observable('').extend({ limitedList: ThemeStore.themes });
ThemeStore.isMobile.subscribe(value => $htmlCL.toggle('rl-mobile', value));
ThemeStore.userBackgroundHash.subscribe(value => {

View file

@ -1,7 +1,7 @@
import ko from 'ko';
import { koComputable } from 'External/ko';
import { FolderType, FolderSortMode } from 'Common/EnumsUser';
import { FolderType } from 'Common/EnumsUser';
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { forEachObjectEntry } from 'Common/Utils';
import { addObservablesTo, addSubscribablesTo, addComputablesTo } from 'External/ko';
@ -44,7 +44,7 @@ export const FolderUserStore = new class {
foldersInboxUnreadCount: 0
});
self.sortMode = ko.observable('').extend({ limitedList: Object.values(FolderSortMode) });
self.sortMode = ko.observable('');
self.namespace = '';

View file

@ -1,7 +1,7 @@
import ko from 'ko';
import { koComputable } from 'External/ko';
import { Layout, EditorDefaultType, ComposeType } from 'Common/EnumsUser';
import { Layout } from 'Common/EnumsUser';
import { pInt } from 'Common/Utils';
import { addObservablesTo } from 'External/ko';
import { $htmlCL, SettingsGet, fireEvent } from 'Common/Globals';
@ -11,24 +11,6 @@ export const SettingsUserStore = new class {
constructor() {
const self = this;
self.layout = ko
.observable(1)
.extend({ limitedList: Object.values(Layout) });
self.editorDefaultType = ko.observable('Html').extend({
limitedList: [
EditorDefaultType.Html,
EditorDefaultType.Plain
]
});
self.msgDefaultAction = ko.observable(1).extend({
limitedList: [
ComposeType.Reply,
ComposeType.ReplyAll
]
});
self.messagesPerPage = ko.observable(25).extend({ debounce: 999 });
self.messageReadDelay = ko.observable(5).extend({ debounce: 999 });
@ -48,7 +30,11 @@ export const SettingsUserStore = new class {
requestReadReceipt: 0,
requestDsn: 0,
pgpSign: 0,
pgpEncrypt: 0
pgpEncrypt: 0,
layout: 1,
editorDefaultType: 'Html',
msgDefaultAction: 1
});
self.init();

View file

@ -23,8 +23,7 @@
opacity: 0.6;
}
.folder-name.can-be-edited:hover {
text-decoration-style: dashed;
.folder-name.can-be-edited {
cursor: pointer;
}

View file

@ -126,10 +126,7 @@ const
}
},
isPlainEditor = () => {
let type = SettingsUserStore.editorDefaultType();
return EditorDefaultType.Html !== type;
},
isPlainEditor = () => EditorDefaultType.Plain === SettingsUserStore.editorDefaultType(),
/**
* @param {string} prefix
@ -966,10 +963,7 @@ export class ComposePopupView extends AbstractViewPopup {
this.editor(editor => {
encrypted || editor.setHtml(sText);
if (encrypted
|| EditorDefaultType.Plain === SettingsUserStore.editorDefaultType()
|| !message.isHtml()
) {
if (encrypted || this.isPlainEditor() || !message.isHtml()) {
editor.modePlain();
}

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "\"%EMAIL%\" إعادة توجيه الى",
"SUBNAME_REJECT": "رفض",
"SUBNAME_VACATION_MESSAGE": "رسالة العطلة",
"SUBNAME_DISCARD": "تجاهل",
"LOADING_PROCESS": "تحديث قائمة عوامل التصفية"
"SUBNAME_DISCARD": "تجاهل"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "الأمان",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Препрати към \"%EMAIL%\"",
"SUBNAME_REJECT": "Откажи",
"SUBNAME_VACATION_MESSAGE": "Съобщение в отпуска",
"SUBNAME_DISCARD": "Отхвърли",
"LOADING_PROCESS": "Обнови списъка с филтри"
"SUBNAME_DISCARD": "Отхвърли"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Сигурност",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Přeposlat to \"%EMAIL%\"",
"SUBNAME_REJECT": "Odmítnout",
"SUBNAME_VACATION_MESSAGE": "Odpověď v nepřítomnosti",
"SUBNAME_DISCARD": "Zahodit",
"LOADING_PROCESS": "Aktualizovat seznam filtrů"
"SUBNAME_DISCARD": "Zahodit"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Zabezpečení",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Videresend til \"%EMAIL%\"",
"SUBNAME_REJECT": "Afvis",
"SUBNAME_VACATION_MESSAGE": "Feriemeddelelse",
"SUBNAME_DISCARD": "Kassér",
"LOADING_PROCESS": "Opdater oversigten over filtre"
"SUBNAME_DISCARD": "Kassér"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sikkerhed",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Weiterleiten nach \"%EMAIL%\"",
"SUBNAME_REJECT": "Ablehnen",
"SUBNAME_VACATION_MESSAGE": "Urlaubsbenachrichtigung",
"SUBNAME_DISCARD": "Verwerfen",
"LOADING_PROCESS": "Aktualisiere Filterliste"
"SUBNAME_DISCARD": "Verwerfen"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sicherheit",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Προώθηση στο \"%EMAIL%\"",
"SUBNAME_REJECT": "Απόρριψη",
"SUBNAME_VACATION_MESSAGE": "Μήνυμα διακοπών",
"SUBNAME_DISCARD": "Απόρριψη",
"LOADING_PROCESS": "Ενημέρωση λίστας φίλτρων"
"SUBNAME_DISCARD": "Απόρριψη"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Ασφάλεια",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Reenviar a \"%EMAIL%\"",
"SUBNAME_REJECT": "Rechazar",
"SUBNAME_VACATION_MESSAGE": "Mensaje de vacaciones",
"SUBNAME_DISCARD": "Descartar",
"LOADING_PROCESS": "Actualizando lista de filtros"
"SUBNAME_DISCARD": "Descartar"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Seguridad",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Edasta aadressile \"%EMAIL%\"",
"SUBNAME_REJECT": "Lükka tagasi",
"SUBNAME_VACATION_MESSAGE": "Puhkuse teade",
"SUBNAME_DISCARD": "Hülga",
"LOADING_PROCESS": "Värskendan filtrite nimekirja"
"SUBNAME_DISCARD": "Hülga"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Turvalisus",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "ارسال به \"%EMAIL%\"",
"SUBNAME_REJECT": "برگشت‌زدن",
"SUBNAME_VACATION_MESSAGE": "پیام تعطیلات",
"SUBNAME_DISCARD": "دور انداختن",
"LOADING_PROCESS": "بروزرسانی لیست فیلتر"
"SUBNAME_DISCARD": "دور انداختن"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "امنیت",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Välitä osoitteeseen \"%EMAIL%\"",
"SUBNAME_REJECT": "Hylkää",
"SUBNAME_VACATION_MESSAGE": "Lomaviesti",
"SUBNAME_DISCARD": "Poista",
"LOADING_PROCESS": "Asetetaan suodattimet"
"SUBNAME_DISCARD": "Poista"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Turvallisuus",

View file

@ -379,8 +379,7 @@
"SUBNAME_FORWARD_TO": "Faire suivre à \"%EMAIL%\"",
"SUBNAME_REJECT": "Rejeter",
"SUBNAME_VACATION_MESSAGE": "Message d'absence",
"SUBNAME_DISCARD": "Exclure",
"LOADING_PROCESS": "Mise à jour de la liste de filtres"
"SUBNAME_DISCARD": "Exclure"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sécurité",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Továbbítás ide: \"%EMAIL%\"",
"SUBNAME_REJECT": "Visszautasít",
"SUBNAME_VACATION_MESSAGE": "Vakáció üzenet",
"SUBNAME_DISCARD": "Elvetés",
"LOADING_PROCESS": "Szűrő lista frissítése"
"SUBNAME_DISCARD": "Elvetés"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Biztonság",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Teruskan ke \"%EMAIL%\"",
"SUBNAME_REJECT": "Tolak",
"SUBNAME_VACATION_MESSAGE": "Pesan liburan",
"SUBNAME_DISCARD": "Buang",
"LOADING_PROCESS": "Perbarui daftar filter"
"SUBNAME_DISCARD": "Buang"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Keamanan",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Áframsenda til \"%EMAIL%\"",
"SUBNAME_REJECT": "Hafna",
"SUBNAME_VACATION_MESSAGE": "Skilaboð vegna fría",
"SUBNAME_DISCARD": "Henda",
"LOADING_PROCESS": "Uppfæri síulista"
"SUBNAME_DISCARD": "Henda"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Öryggi",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Inoltra a \"%EMAIL%\"",
"SUBNAME_REJECT": "Rifiuta",
"SUBNAME_VACATION_MESSAGE": "Messaggio fuori-ufficio",
"SUBNAME_DISCARD": "Scarta",
"LOADING_PROCESS": "Aggiornamento lista filtri"
"SUBNAME_DISCARD": "Scarta"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sicurezza",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "\"%EMAIL%\"へ転送",
"SUBNAME_REJECT": "拒否",
"SUBNAME_VACATION_MESSAGE": "バケーションメッセージ",
"SUBNAME_DISCARD": "破棄",
"LOADING_PROCESS": "フィルターリストの更新中"
"SUBNAME_DISCARD": "破棄"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "セキュリティ",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "\"%EMAIL%\"(으)로 전달",
"SUBNAME_REJECT": "거부",
"SUBNAME_VACATION_MESSAGE": "부재 중 메시지",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "필터 목록 업데이트 중"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "보안",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "persiūsti \"%EMAIL%\"",
"SUBNAME_REJECT": "Atmesti",
"SUBNAME_VACATION_MESSAGE": "Atostogų žinutė",
"SUBNAME_DISCARD": "Nepaisyti",
"LOADING_PROCESS": "Atnaujinamas filtrų sąrašas"
"SUBNAME_DISCARD": "Nepaisyti"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sauga",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Videresend til «%EMAIL%»",
"SUBNAME_REJECT": "Avvis",
"SUBNAME_VACATION_MESSAGE": "Feriemelding",
"SUBNAME_DISCARD": "Forkast",
"LOADING_PROCESS": "Oppdater filterliste"
"SUBNAME_DISCARD": "Forkast"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Sikkerhet",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Doorsturen naar \"%EMAIL%\"",
"SUBNAME_REJECT": "Afwijzen",
"SUBNAME_VACATION_MESSAGE": "Afwezigheidsbericht",
"SUBNAME_DISCARD": "Gooi weg",
"LOADING_PROCESS": "Bezig met updaten van de filter lijst"
"SUBNAME_DISCARD": "Gooi weg"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Beveiliging",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Przekaż do \"%EMAIL%\"",
"SUBNAME_REJECT": "Odrzuć",
"SUBNAME_VACATION_MESSAGE": "Wiadomość urlopowa",
"SUBNAME_DISCARD": "Porzuć",
"LOADING_PROCESS": "Aktualizowanie listy filtrów"
"SUBNAME_DISCARD": "Porzuć"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Bezpieczeństwo",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Encaminhar para \"%EMAIL%\"",
"SUBNAME_REJECT": "Rejeitar",
"SUBNAME_VACATION_MESSAGE": "Mensagem de férias",
"SUBNAME_DISCARD": "Descartar",
"LOADING_PROCESS": "Atualizando Lista de filtros"
"SUBNAME_DISCARD": "Descartar"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Segurança",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Encaminhar para \"%EMAIL%\"",
"SUBNAME_REJECT": "Rejeitar",
"SUBNAME_VACATION_MESSAGE": "Mensagem de férias",
"SUBNAME_DISCARD": "Descartar",
"LOADING_PROCESS": "A atualizar lista de filtros"
"SUBNAME_DISCARD": "Descartar"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Segurança",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Encaminhar para \"%EMAIL%\"",
"SUBNAME_REJECT": "Rejeitar",
"SUBNAME_VACATION_MESSAGE": "Mensagem de férias",
"SUBNAME_DISCARD": "Descartar",
"LOADING_PROCESS": "A atualizar lista de filtros"
"SUBNAME_DISCARD": "Descartar"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Segurança",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Переслать на \"%EMAIL%\"",
"SUBNAME_REJECT": "Не принимать",
"SUBNAME_VACATION_MESSAGE": "Сообщение автоответчика",
"SUBNAME_DISCARD": "Уничтожить",
"LOADING_PROCESS": "Обновление списка фильтров"
"SUBNAME_DISCARD": "Уничтожить"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Безопасность",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Posreduj na \"%EMAIL%\"",
"SUBNAME_REJECT": "Zavrni",
"SUBNAME_VACATION_MESSAGE": "Sporočilo odsotnosti",
"SUBNAME_DISCARD": "Zavrzi",
"LOADING_PROCESS": "Posodabljanje seznama filtrov"
"SUBNAME_DISCARD": "Zavrzi"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Varnost",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Vidarebefordra till \"%EMAIL%\"",
"SUBNAME_REJECT": "Avvisa",
"SUBNAME_VACATION_MESSAGE": "semestermeddelande",
"SUBNAME_DISCARD": "Kassera",
"LOADING_PROCESS": "Uppdaterar filter listan"
"SUBNAME_DISCARD": "Kassera"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Säkerhet",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Повідомлення про відпустку",
"SUBNAME_DISCARD": "Відклонити",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Відклонити"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Безпека",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Chuyển tiếp đến \"%EMAIL%\"",
"SUBNAME_REJECT": "Từ chối",
"SUBNAME_VACATION_MESSAGE": "Thư thông báo bạn đang nghỉ lễ",
"SUBNAME_DISCARD": "Loại bỏ",
"LOADING_PROCESS": "Đang cập nhật danh sách tấm lọc thư"
"SUBNAME_DISCARD": "Loại bỏ"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "An ninh",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "转发到 \"%EMAIL%\"",
"SUBNAME_REJECT": "拒绝",
"SUBNAME_VACATION_MESSAGE": "假期自动回复",
"SUBNAME_DISCARD": "取消",
"LOADING_PROCESS": "正在更新筛选规则列表"
"SUBNAME_DISCARD": "取消"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "安全",

View file

@ -378,8 +378,7 @@
"SUBNAME_FORWARD_TO": "Forward to \"%EMAIL%\"",
"SUBNAME_REJECT": "Reject",
"SUBNAME_VACATION_MESSAGE": "Vacation message",
"SUBNAME_DISCARD": "Discard",
"LOADING_PROCESS": "Updating filter list"
"SUBNAME_DISCARD": "Discard"
},
"SETTINGS_SECURITY": {
"LEGEND_SECURITY": "Security",

View file

@ -1,11 +1,11 @@
<tr data-bind="css: { 'selectable': selectable, 'system': isSystemFolder }">
<td data-bind="css: 'deep-' + deep">
<span class="folder-name" data-bind="text: name, visible: !edited(), css: { 'can-be-edited': canBeEdited },
<span class="folder-name" data-bind="text: name, visible: !editing(), css: { 'can-be-edited': canBeEdited },
click: function (oFolder) { oFolder.canBeEdited() && $root.folderForEdit(oFolder); },
tooltipErrorTip: errorMsg"></span>
<input type="text"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="value: nameForEdit, visible: edited, hasfocus: edited, onEnter: function () { $root.folderEditOnEnter($data); }">
data-bind="value: nameForEdit, visible: editing, hasfocus: editing, onEnter: function () { $root.folderEditOnEnter($data); }, onEsc: function () { $root.folderEditOnEsc($data); }">
&nbsp;
<span class="folder-system-name" data-bind="text: manageFolderSystemName, visible: isSystemFolder"></span>
</td>