mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-03-03 18:28:48 +08:00
Improved observables
This commit is contained in:
parent
8d7e25fc7c
commit
7db7d5545b
28 changed files with 236 additions and 234 deletions
|
@ -399,7 +399,7 @@ class AppUser extends AbstractApp {
|
|||
Remote.foldersReloadWithTimeout(FolderStore.foldersLoading);
|
||||
},
|
||||
(errorCode) => {
|
||||
FolderStore.folderList.error(getNotification(errorCode, '', errorDefCode));
|
||||
FolderStore.folderListError(getNotification(errorCode, '', errorDefCode));
|
||||
Remote.foldersReloadWithTimeout(FolderStore.foldersLoading);
|
||||
}
|
||||
);
|
||||
|
@ -757,7 +757,7 @@ class AppUser extends AbstractApp {
|
|||
}
|
||||
|
||||
this.reloadFlagsCurrentMessageListAndMessageFromCache();
|
||||
MessageStore.message.viewTrigger(!MessageStore.message.viewTrigger());
|
||||
MessageStore.messageViewTrigger(!MessageStore.messageViewTrigger());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
11
dev/External/User/ko.js
vendored
11
dev/External/User/ko.js
vendored
|
@ -287,15 +287,4 @@ ko.extenders.specialThrottle = (target, timeout) => {
|
|||
return target;
|
||||
};
|
||||
|
||||
// functions
|
||||
|
||||
ko.observable.fn.validateEmail = function() {
|
||||
this.hasError = ko.observable(false);
|
||||
|
||||
this.subscribe(value => this.hasError(value && !/^[^@\s]+@[^@\s]+$/.test(value)));
|
||||
|
||||
this.valueHasMutated();
|
||||
return this;
|
||||
};
|
||||
|
||||
export default ko;
|
||||
|
|
4
dev/External/ko.js
vendored
4
dev/External/ko.js
vendored
|
@ -36,7 +36,6 @@ ko.bindingHandlers.tooltip = {
|
|||
ko.bindingHandlers.tooltipErrorTip = {
|
||||
init: element => {
|
||||
doc.addEventListener('click', () => element.removeAttribute('data-rainloopErrorTip'));
|
||||
ko.utils.domNodeDisposal.addDisposeCallback(element, () => element.removeAttribute('data-rainloopErrorTip'));
|
||||
},
|
||||
update: (element, fValueAccessor) => {
|
||||
const value = koValue(fValueAccessor());
|
||||
|
@ -258,8 +257,7 @@ ko.extenders.falseTimeout = (target, option) => {
|
|||
// functions
|
||||
|
||||
ko.observable.fn.deleteAccessHelper = function() {
|
||||
this.extend({ falseTimeout: 3000 }).extend({ toggleSubscribeProperty: [this, 'deleteAccess'] });
|
||||
return this;
|
||||
return this.extend({ falseTimeout: 3000, toggleSubscribeProperty: [this, 'deleteAccess'] });
|
||||
};
|
||||
|
||||
ko.addObservablesTo = (target, observables) => {
|
||||
|
|
|
@ -102,7 +102,7 @@ export class FolderCollectionModel extends AbstractCollectionModel
|
|||
|
||||
AppStore.threadsAllowed(!!(Settings.app('useImapThread') && this.IsThreadsSupported));
|
||||
|
||||
FolderStore.folderList.optimized(!!this.Optimized);
|
||||
FolderStore.folderListOptimized(!!this.Optimized);
|
||||
|
||||
let update = false;
|
||||
|
||||
|
|
|
@ -11,8 +11,26 @@ const settingsGet = rl.settings.get;
|
|||
class ContactsAdminSettings {
|
||||
constructor() {
|
||||
this.defaultOptionsAfterRender = defaultOptionsAfterRender;
|
||||
this.enableContacts = ko.observable(!!settingsGet('ContactsEnable'));
|
||||
this.contactsSync = ko.observable(!!settingsGet('ContactsSync'));
|
||||
|
||||
ko.addObservablesTo(this, {
|
||||
enableContacts: !!settingsGet('ContactsEnable'),
|
||||
contactsSync: !!settingsGet('ContactsSync'),
|
||||
contactsType: '',
|
||||
|
||||
pdoDsn: settingsGet('ContactsPdoDsn'),
|
||||
pdoUser: settingsGet('ContactsPdoUser'),
|
||||
pdoPassword: settingsGet('ContactsPdoPassword'),
|
||||
|
||||
pdoDsnTrigger: SaveSettingsStep.Idle,
|
||||
pdoUserTrigger: SaveSettingsStep.Idle,
|
||||
pdoPasswordTrigger: SaveSettingsStep.Idle,
|
||||
contactsTypeTrigger: SaveSettingsStep.Idle,
|
||||
|
||||
testing: false,
|
||||
testContactsSuccess: false,
|
||||
testContactsError: false,
|
||||
testContactsErrorMessage: ''
|
||||
});
|
||||
|
||||
const supportedTypes = settingsGet('supportedPdoDrivers') || [],
|
||||
types = [{
|
||||
|
@ -30,8 +48,6 @@ class ContactsAdminSettings {
|
|||
|
||||
this.contactsTypesOptions = types;
|
||||
|
||||
this.contactsType = ko.observable('');
|
||||
|
||||
this.mainContactsType = ko
|
||||
.computed({
|
||||
read: this.contactsType,
|
||||
|
@ -55,20 +71,6 @@ class ContactsAdminSettings {
|
|||
this.testContactsErrorMessage('');
|
||||
});
|
||||
|
||||
this.pdoDsn = ko.observable(settingsGet('ContactsPdoDsn'));
|
||||
this.pdoUser = ko.observable(settingsGet('ContactsPdoUser'));
|
||||
this.pdoPassword = ko.observable(settingsGet('ContactsPdoPassword'));
|
||||
|
||||
this.pdoDsnTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.pdoUserTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.pdoPasswordTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.contactsTypeTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
|
||||
this.testing = ko.observable(false);
|
||||
this.testContactsSuccess = ko.observable(false);
|
||||
this.testContactsError = ko.observable(false);
|
||||
this.testContactsErrorMessage = ko.observable('');
|
||||
|
||||
this.contactsType(settingsGet('ContactsPdoType'));
|
||||
|
||||
this.onTestContactsResponse = this.onTestContactsResponse.bind(this);
|
||||
|
|
|
@ -39,9 +39,15 @@ class GeneralAdminSettings {
|
|||
this.capaAttachmentThumbnails = CapaAdminStore.attachmentThumbnails;
|
||||
this.capaTemplates = CapaAdminStore.templates;
|
||||
|
||||
this.allowLanguagesOnSettings = ko.observable(!!settingsGet('AllowLanguagesOnSettings'));
|
||||
ko.addObservablesTo(this, {
|
||||
allowLanguagesOnSettings: !!settingsGet('AllowLanguagesOnSettings'),
|
||||
newMoveToFolder: !!settingsGet('NewMoveToFolder'),
|
||||
attachmentLimitTrigger: SaveSettingsStep.Idle,
|
||||
languageTrigger: SaveSettingsStep.Idle,
|
||||
themeTrigger: SaveSettingsStep.Idle
|
||||
});
|
||||
|
||||
this.weakPassword = AppAdminStore.weakPassword;
|
||||
this.newMoveToFolder = ko.observable(!!settingsGet('NewMoveToFolder'));
|
||||
|
||||
this.dataFolderAccess = AppAdminStore.dataFolderAccess;
|
||||
|
||||
|
@ -67,10 +73,7 @@ class GeneralAdminSettings {
|
|||
this.languageFullName = ko.computed(() => convertLangName(this.language()));
|
||||
this.languageAdminFullName = ko.computed(() => convertLangName(this.languageAdmin()));
|
||||
|
||||
this.attachmentLimitTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.languageTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.languageAdminTrigger = ko.observable(SaveSettingsStep.Idle).extend({ throttle: 100 });
|
||||
this.themeTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
}
|
||||
|
||||
onBuild() {
|
||||
|
|
|
@ -7,13 +7,14 @@ import Remote from 'Remote/Admin/Fetch';
|
|||
class LoginAdminSettings {
|
||||
constructor() {
|
||||
const settingsGet = rl.settings.get;
|
||||
this.determineUserLanguage = ko.observable(!!settingsGet('DetermineUserLanguage'));
|
||||
this.determineUserDomain = ko.observable(!!settingsGet('DetermineUserDomain'));
|
||||
ko.addObservablesTo(this, {
|
||||
determineUserLanguage: !!settingsGet('DetermineUserLanguage'),
|
||||
determineUserDomain: !!settingsGet('DetermineUserDomain'),
|
||||
allowLanguagesOnLogin: !!settingsGet('AllowLanguagesOnLogin'),
|
||||
dummy: false
|
||||
});
|
||||
|
||||
this.defaultDomain = ko.observable(settingsGet('LoginDefaultDomain')).idleTrigger();
|
||||
this.allowLanguagesOnLogin = ko.observable(!!settingsGet('AllowLanguagesOnLogin'));
|
||||
|
||||
this.dummy = ko.observable(false);
|
||||
}
|
||||
|
||||
onBuild() {
|
||||
|
|
|
@ -13,8 +13,6 @@ const settingsGet = rl.settings.get;
|
|||
|
||||
class SecurityAdminSettings {
|
||||
constructor() {
|
||||
this.useLocalProxyForExternalImages = ko.observable(!!rl.settings.get('UseLocalProxyForExternalImages'));
|
||||
|
||||
this.weakPassword = AppAdminStore.weakPassword;
|
||||
|
||||
this.capaOpenPGP = CapaAdminStore.openPGP;
|
||||
|
@ -22,35 +20,39 @@ class SecurityAdminSettings {
|
|||
this.capaTwoFactorAuth = CapaAdminStore.twoFactorAuth;
|
||||
this.capaTwoFactorAuthForce = CapaAdminStore.twoFactorAuthForce;
|
||||
|
||||
ko.addObservablesTo(this, {
|
||||
useLocalProxyForExternalImages: !!rl.settings.get('UseLocalProxyForExternalImages'),
|
||||
|
||||
verifySslCertificate: !!settingsGet('VerifySslCertificate'),
|
||||
allowSelfSigned: !!settingsGet('AllowSelfSigned'),
|
||||
|
||||
isTwoFactorDropperShown: false,
|
||||
twoFactorDropperUser: '',
|
||||
twoFactorDropperUserFocused: false,
|
||||
|
||||
adminLogin: settingsGet('AdminLogin'),
|
||||
adminLoginError: false,
|
||||
adminPassword: '',
|
||||
adminPasswordNew: '',
|
||||
adminPasswordNew2: '',
|
||||
adminPasswordNewError: false,
|
||||
|
||||
adminPasswordUpdateError: false,
|
||||
adminPasswordUpdateSuccess: false
|
||||
});
|
||||
|
||||
this.capaTwoFactorAuth.subscribe(value => {
|
||||
if (!value) {
|
||||
this.capaTwoFactorAuthForce(false);
|
||||
}
|
||||
});
|
||||
|
||||
this.verifySslCertificate = ko.observable(!!settingsGet('VerifySslCertificate'));
|
||||
this.allowSelfSigned = ko.observable(!!settingsGet('AllowSelfSigned'));
|
||||
|
||||
this.verifySslCertificate.subscribe(value => {
|
||||
if (!value) {
|
||||
this.allowSelfSigned(true);
|
||||
}
|
||||
});
|
||||
|
||||
this.isTwoFactorDropperShown = ko.observable(false);
|
||||
this.twoFactorDropperUser = ko.observable('');
|
||||
this.twoFactorDropperUser.focused = ko.observable(false);
|
||||
|
||||
this.adminLogin = ko.observable(settingsGet('AdminLogin'));
|
||||
this.adminLoginError = ko.observable(false);
|
||||
this.adminPassword = ko.observable('');
|
||||
this.adminPasswordNew = ko.observable('');
|
||||
this.adminPasswordNew2 = ko.observable('');
|
||||
this.adminPasswordNewError = ko.observable(false);
|
||||
|
||||
this.adminPasswordUpdateError = ko.observable(false);
|
||||
this.adminPasswordUpdateSuccess = ko.observable(false);
|
||||
|
||||
this.adminPassword.subscribe(() => {
|
||||
this.adminPasswordUpdateError(false);
|
||||
this.adminPasswordUpdateSuccess(false);
|
||||
|
@ -104,7 +106,7 @@ class SecurityAdminSettings {
|
|||
this.isTwoFactorDropperShown(true);
|
||||
|
||||
setTimeout(() => {
|
||||
this.twoFactorDropperUser.focused(true);
|
||||
this.twoFactorDropperUserFocused(true);
|
||||
}, 50);
|
||||
}
|
||||
|
||||
|
@ -167,7 +169,7 @@ class SecurityAdminSettings {
|
|||
|
||||
this.isTwoFactorDropperShown(false);
|
||||
this.twoFactorDropperUser('');
|
||||
this.twoFactorDropperUser.focused(false);
|
||||
this.twoFactorDropperUserFocused(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,12 +16,14 @@ class FiltersUserSettings {
|
|||
this.modules = FilterStore.modules;
|
||||
this.filters = FilterStore.filters;
|
||||
|
||||
this.inited = ko.observable(false);
|
||||
this.serverError = ko.observable(false);
|
||||
this.serverErrorDesc = ko.observable('');
|
||||
this.haveChanges = ko.observable(false);
|
||||
ko.addObservablesTo(this, {
|
||||
inited: false,
|
||||
serverError: false,
|
||||
serverErrorDesc: '',
|
||||
haveChanges: false,
|
||||
|
||||
this.saveErrorText = ko.observable('');
|
||||
saveErrorText: ''
|
||||
});
|
||||
|
||||
this.serverError.subscribe((value) => {
|
||||
if (!value) {
|
||||
|
@ -37,18 +39,14 @@ class FiltersUserSettings {
|
|||
|
||||
this.filterForDeletion = ko.observable(null).deleteAccessHelper();
|
||||
|
||||
this.filters.subscribe(() => {
|
||||
this.haveChanges(true);
|
||||
});
|
||||
this.filters.subscribe(() => this.haveChanges(true));
|
||||
|
||||
this.filterRaw.subscribe(() => {
|
||||
this.haveChanges(true);
|
||||
this.filterRaw.error(false);
|
||||
});
|
||||
|
||||
this.haveChanges.subscribe(() => {
|
||||
this.saveErrorText('');
|
||||
});
|
||||
this.haveChanges.subscribe(() => this.saveErrorText(''));
|
||||
|
||||
this.filterRaw.active.subscribe(() => {
|
||||
this.haveChanges(true);
|
||||
|
|
|
@ -62,7 +62,7 @@ class FoldersUserSettings {
|
|||
}
|
||||
|
||||
onShow() {
|
||||
FolderStore.folderList.error('');
|
||||
FolderStore.folderListError('');
|
||||
}
|
||||
|
||||
onBuild(oDom) {
|
||||
|
@ -113,7 +113,7 @@ class FoldersUserSettings {
|
|||
removeFolderFromCacheList(folderToRemove.fullNameRaw);
|
||||
}
|
||||
} else if (0 < folderToRemove.privateMessageCountAll()) {
|
||||
FolderStore.folderList.error(getNotification(Notification.CantDeleteNonEmptyFolder));
|
||||
FolderStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,9 +47,11 @@ class GeneralUserSettings {
|
|||
this.languageFullName = ko.computed(() => convertLangName(this.language()));
|
||||
this.languageTrigger = ko.observable(SaveSettingsStep.Idle).extend({ throttle: 100 });
|
||||
|
||||
this.mppTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.editorDefaultTypeTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
this.layoutTrigger = ko.observable(SaveSettingsStep.Idle);
|
||||
ko.addObservablesTo(this, {
|
||||
mppTrigger: SaveSettingsStep.Idle,
|
||||
editorDefaultTypeTrigger: SaveSettingsStep.Idle,
|
||||
layoutTrigger: SaveSettingsStep.Idle
|
||||
});
|
||||
|
||||
this.identities = IdentityStore.identities;
|
||||
|
||||
|
|
|
@ -3,17 +3,19 @@ import { Capa } from 'Common/Enums';
|
|||
|
||||
class CapaAdminStore {
|
||||
constructor() {
|
||||
this.additionalAccounts = ko.observable(false);
|
||||
this.identities = ko.observable(false);
|
||||
this.attachmentThumbnails = ko.observable(false);
|
||||
this.sieve = ko.observable(false);
|
||||
this.filters = ko.observable(false);
|
||||
this.themes = ko.observable(true);
|
||||
this.userBackground = ko.observable(false);
|
||||
this.openPGP = ko.observable(false);
|
||||
this.twoFactorAuth = ko.observable(false);
|
||||
this.twoFactorAuthForce = ko.observable(false);
|
||||
this.templates = ko.observable(false);
|
||||
ko.addObservablesTo(this, {
|
||||
additionalAccounts: false,
|
||||
identities: false,
|
||||
attachmentThumbnails: false,
|
||||
sieve: false,
|
||||
filters: false,
|
||||
themes: true,
|
||||
userBackground: false,
|
||||
openPGP: false,
|
||||
twoFactorAuth: false,
|
||||
twoFactorAuthForce: false,
|
||||
templates: false
|
||||
});
|
||||
}
|
||||
|
||||
populate() {
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
import ko from 'ko';
|
||||
|
||||
class LicenseAdminStore {
|
||||
constructor() {
|
||||
this.licensing = ko.observable(false);
|
||||
this.licensingProcess = ko.observable(false);
|
||||
this.licenseValid = ko.observable(false);
|
||||
this.licenseExpired = ko.observable(0);
|
||||
this.licenseError = ko.observable('');
|
||||
|
||||
this.licenseTrigger = ko.observable(false);
|
||||
}
|
||||
}
|
||||
|
||||
export default new LicenseAdminStore();
|
|
@ -5,8 +5,10 @@ class PackageAdminStore {
|
|||
this.packages = ko.observableArray([]);
|
||||
this.packages.loading = ko.observable(false).extend({ throttle: 100 });
|
||||
|
||||
this.packagesReal = ko.observable(true);
|
||||
this.packagesMainUpdatable = ko.observable(true);
|
||||
ko.addObservablesTo(this, {
|
||||
packagesReal: true,
|
||||
packagesMainUpdatable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,13 +7,11 @@ class LanguageStore {
|
|||
|
||||
this.language = ko
|
||||
.observable('')
|
||||
.extend({ limitedList: this.languages })
|
||||
.extend({ reversible: true });
|
||||
.extend({ limitedList: this.languages, reversible: true });
|
||||
|
||||
this.languageAdmin = ko
|
||||
.observable('')
|
||||
.extend({ limitedList: this.languagesAdmin })
|
||||
.extend({ reversible: true });
|
||||
.extend({ limitedList: this.languagesAdmin, reversible: true });
|
||||
|
||||
this.userLanguage = ko.observable('');
|
||||
this.userLanguageAdmin = ko.observable('');
|
||||
|
|
|
@ -2,10 +2,11 @@ import ko from 'ko';
|
|||
|
||||
class AccountUserStore {
|
||||
constructor() {
|
||||
this.email = ko.observable('');
|
||||
this.parentEmail = ko.observable('');
|
||||
|
||||
this.signature = ko.observable('');
|
||||
ko.addObservablesTo(this, {
|
||||
email: '',
|
||||
parentEmail: '',
|
||||
signature: ''
|
||||
});
|
||||
|
||||
this.accounts = ko.observableArray([]);
|
||||
this.accounts.loading = ko.observable(false).extend({ throttle: 100 });
|
||||
|
|
|
@ -7,9 +7,21 @@ const Settings = rl.settings;
|
|||
|
||||
class AppUserStore {
|
||||
constructor() {
|
||||
this.currentAudio = ko.observable('');
|
||||
ko.addObservablesTo(this, {
|
||||
currentAudio: '',
|
||||
|
||||
this.focusedState = ko.observable(Focused.None);
|
||||
focusedState: Focused.None,
|
||||
|
||||
projectHash: '',
|
||||
threadsAllowed: false,
|
||||
|
||||
composeInEdit: false,
|
||||
|
||||
contactsAutosave: false,
|
||||
useLocalProxyForExternalImages: false,
|
||||
|
||||
contactsIsAllowed: false
|
||||
});
|
||||
|
||||
const isMobile = Settings.app('mobile');
|
||||
|
||||
|
@ -38,16 +50,6 @@ class AppUserStore {
|
|||
}
|
||||
});
|
||||
|
||||
this.projectHash = ko.observable('');
|
||||
this.threadsAllowed = ko.observable(false);
|
||||
|
||||
this.composeInEdit = ko.observable(false);
|
||||
|
||||
this.contactsAutosave = ko.observable(false);
|
||||
this.useLocalProxyForExternalImages = ko.observable(false);
|
||||
|
||||
this.contactsIsAllowed = ko.observable(false);
|
||||
|
||||
this.attachmentsActions = ko.observableArray([]);
|
||||
|
||||
this.devEmail = '';
|
||||
|
|
|
@ -9,11 +9,13 @@ class ContactUserStore {
|
|||
this.contacts.exportingVcf = ko.observable(false).extend({ throttle: 200 });
|
||||
this.contacts.exportingCsv = ko.observable(false).extend({ throttle: 200 });
|
||||
|
||||
this.allowContactsSync = ko.observable(false);
|
||||
this.enableContactsSync = ko.observable(false);
|
||||
this.contactsSyncUrl = ko.observable('');
|
||||
this.contactsSyncUser = ko.observable('');
|
||||
this.contactsSyncPass = ko.observable('');
|
||||
ko.addObservablesTo(this, {
|
||||
allowContactsSync: false,
|
||||
enableContactsSync: false,
|
||||
contactsSyncUrl: '',
|
||||
contactsSyncUser: '',
|
||||
contactsSyncPass: ''
|
||||
});
|
||||
}
|
||||
|
||||
populate() {
|
||||
|
|
|
@ -2,15 +2,16 @@ import ko from 'ko';
|
|||
|
||||
class FilterUserStore {
|
||||
constructor() {
|
||||
this.capa = ko.observable('');
|
||||
this.modules = ko.observable({});
|
||||
ko.addObservablesTo(this, {
|
||||
capa: '',
|
||||
modules: {},
|
||||
raw: ''
|
||||
});
|
||||
|
||||
this.filters = ko.observableArray([]);
|
||||
|
||||
this.filters.loading = ko.observable(false).extend({ throttle: 200 });
|
||||
this.filters.saving = ko.observable(false).extend({ throttle: 200 });
|
||||
|
||||
this.raw = ko.observable('');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,26 +7,29 @@ import { getFolderInboxName, getFolderFromCacheList } from 'Common/Cache';
|
|||
|
||||
class FolderUserStore {
|
||||
constructor() {
|
||||
this.displaySpecSetting = ko.observable(true);
|
||||
ko.addObservablesTo(this, {
|
||||
displaySpecSetting: true,
|
||||
|
||||
this.sentFolder = ko.observable('');
|
||||
this.draftFolder = ko.observable('');
|
||||
this.spamFolder = ko.observable('');
|
||||
this.trashFolder = ko.observable('');
|
||||
this.archiveFolder = ko.observable('');
|
||||
sentFolder: '',
|
||||
draftFolder: '',
|
||||
spamFolder: '',
|
||||
trashFolder: '',
|
||||
archiveFolder: '',
|
||||
|
||||
folderListOptimized: false,
|
||||
folderListError: '',
|
||||
|
||||
foldersLoading: false,
|
||||
foldersCreating: false,
|
||||
foldersDeleting: false,
|
||||
foldersRenaming: false,
|
||||
|
||||
foldersInboxUnreadCount: 0
|
||||
});
|
||||
|
||||
this.namespace = '';
|
||||
|
||||
this.folderList = ko.observableArray([]);
|
||||
this.folderList.optimized = ko.observable(false);
|
||||
this.folderList.error = ko.observable('');
|
||||
|
||||
this.foldersLoading = ko.observable(false);
|
||||
this.foldersCreating = ko.observable(false);
|
||||
this.foldersDeleting = ko.observable(false);
|
||||
this.foldersRenaming = ko.observable(false);
|
||||
|
||||
this.foldersInboxUnreadCount = ko.observable(0);
|
||||
|
||||
this.currentFolder = ko.observable(null).extend({ toggleSubscribeProperty: [this, 'selected'] });
|
||||
|
||||
|
|
|
@ -59,44 +59,47 @@ class MessageUserStore {
|
|||
|
||||
this.messageList = ko.observableArray([]).extend({ rateLimit: 0 });
|
||||
|
||||
this.messageListCount = ko.observable(0);
|
||||
this.messageListSearch = ko.observable('');
|
||||
this.messageListThreadUid = ko.observable('');
|
||||
this.messageListPage = ko.observable(1);
|
||||
this.messageListPageBeforeThread = ko.observable(1);
|
||||
this.messageListError = ko.observable('');
|
||||
ko.addObservablesTo(this, {
|
||||
messageListCount: 0,
|
||||
messageListSearch: '',
|
||||
messageListThreadUid: '',
|
||||
messageListPage: 1,
|
||||
messageListPageBeforeThread: 1,
|
||||
messageListError: '',
|
||||
|
||||
this.messageListEndFolder = ko.observable('');
|
||||
this.messageListEndSearch = ko.observable('');
|
||||
this.messageListEndThreadUid = ko.observable('');
|
||||
this.messageListEndPage = ko.observable(1);
|
||||
messageListEndFolder: '',
|
||||
messageListEndSearch: '',
|
||||
messageListEndThreadUid: '',
|
||||
messageListEndPage: 1,
|
||||
|
||||
messageListLoading: false,
|
||||
messageListIsNotCompleted: false,
|
||||
|
||||
selectorMessageSelected: null,
|
||||
selectorMessageFocused: null,
|
||||
|
||||
// message viewer
|
||||
message: null,
|
||||
|
||||
messageViewTrigger: false,
|
||||
|
||||
messageError: '',
|
||||
|
||||
messageCurrentLoading: false,
|
||||
|
||||
messageFullScreenMode: false,
|
||||
|
||||
messagesBodiesDom: null,
|
||||
messageActiveDom: null
|
||||
});
|
||||
|
||||
this.messageListLoading = ko.observable(false);
|
||||
this.messageListIsNotCompleted = ko.observable(false);
|
||||
this.messageListCompleteLoadingThrottle = ko.observable(false).extend({ throttle: 200 });
|
||||
this.messageListCompleteLoadingThrottleForAnimation = ko.observable(false).extend({ specialThrottle: 700 });
|
||||
|
||||
this.messageListDisableAutoSelect = ko.observable(false).extend({ falseTimeout: 500 });
|
||||
|
||||
this.selectorMessageSelected = ko.observable(null);
|
||||
this.selectorMessageFocused = ko.observable(null);
|
||||
|
||||
// message viewer
|
||||
this.message = ko.observable(null);
|
||||
|
||||
this.message.viewTrigger = ko.observable(false);
|
||||
|
||||
this.messageError = ko.observable('');
|
||||
|
||||
this.messageCurrentLoading = ko.observable(false);
|
||||
|
||||
this.messageLoadingThrottle = ko.observable(false).extend({ throttle: 50 });
|
||||
|
||||
this.messageFullScreenMode = ko.observable(false);
|
||||
|
||||
this.messagesBodiesDom = ko.observable(null);
|
||||
this.messageActiveDom = ko.observable(null);
|
||||
|
||||
this.messageLoading = ko.computed(() => this.messageCurrentLoading());
|
||||
|
||||
this.messageListEndHash = ko.computed(
|
||||
|
|
|
@ -23,13 +23,15 @@ class SettingsUserStore {
|
|||
|
||||
this.messagesPerPage = ko.observable(20).extend({ limitedList: MESSAGES_PER_PAGE_VALUES });
|
||||
|
||||
this.showImages = ko.observable(false);
|
||||
this.useCheckboxesInList = ko.observable(true);
|
||||
this.allowDraftAutosave = ko.observable(true);
|
||||
this.useThreads = ko.observable(false);
|
||||
this.replySameFolder = ko.observable(false);
|
||||
ko.addObservablesTo(this, {
|
||||
showImages: false,
|
||||
useCheckboxesInList: true,
|
||||
allowDraftAutosave: true,
|
||||
useThreads: false,
|
||||
replySameFolder: false,
|
||||
|
||||
this.autoLogout = ko.observable(30);
|
||||
autoLogout: 30
|
||||
});
|
||||
|
||||
this.usePreviewPane = ko.computed(() => Layout.NoPreview !== this.layout());
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import ko from 'ko';
|
||||
|
||||
import { StorageResultType, Notification } from 'Common/Enums';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
|
||||
|
@ -8,14 +6,7 @@ import Remote from 'Remote/User/Fetch';
|
|||
import { popup, command } from 'Knoin/Knoin';
|
||||
import { AbstractViewNext } from 'Knoin/AbstractViewNext';
|
||||
|
||||
ko.observable.fn.validateEmail = function() {
|
||||
this.hasError = ko.observable(false);
|
||||
|
||||
this.subscribe(value => this.hasError(value && !/^[^@\s]+@[^@\s]+$/.test(value)));
|
||||
|
||||
this.valueHasMutated();
|
||||
return this;
|
||||
};
|
||||
const reEmail = /^[^@\s]+@[^@\s]+$/;
|
||||
|
||||
@popup({
|
||||
name: 'View/Popup/Identity',
|
||||
|
@ -29,10 +20,20 @@ class IdentityPopupView extends AbstractViewNext {
|
|||
this.addObservables({
|
||||
edit: false,
|
||||
owner: false,
|
||||
|
||||
email: '',
|
||||
emailFocused: false,
|
||||
emailHasError: false,
|
||||
|
||||
name: '',
|
||||
|
||||
replyTo: '',
|
||||
replyToFocused: false,
|
||||
replyToHasError: false,
|
||||
|
||||
bcc: '',
|
||||
bccFocused: false,
|
||||
bccHasError: false,
|
||||
|
||||
signature: '',
|
||||
signatureInsertBefore: false,
|
||||
|
@ -44,21 +45,26 @@ class IdentityPopupView extends AbstractViewNext {
|
|||
submitError: ''
|
||||
});
|
||||
|
||||
this.email = ko.observable('').validateEmail();
|
||||
this.replyTo = ko.observable('').validateEmail();
|
||||
this.bcc = ko.observable('').validateEmail();
|
||||
|
||||
this.bcc.subscribe((value) => {
|
||||
if (false === this.showBcc() && value.length) {
|
||||
this.showBcc(true);
|
||||
}
|
||||
});
|
||||
|
||||
this.replyTo.subscribe((value) => {
|
||||
if (false === this.showReplyTo() && value.length) {
|
||||
this.showReplyTo(true);
|
||||
this.addSubscribables({
|
||||
email: value => this.emailHasError(value && !reEmail.test(value)),
|
||||
replyTo: value => {
|
||||
this.replyToHasError(value && !reEmail.test(value));
|
||||
if (false === this.showReplyTo() && value.length) {
|
||||
this.showReplyTo(true);
|
||||
}
|
||||
},
|
||||
bcc: value => {
|
||||
this.bccHasError(value && !reEmail.test(value));
|
||||
if (false === this.showBcc() && value.length) {
|
||||
this.showBcc(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
this.email.valueHasMutated();
|
||||
this.replyTo.valueHasMutated();
|
||||
this.bcc.valueHasMutated();
|
||||
*/
|
||||
}
|
||||
|
||||
@command((self) => !self.submitRequest())
|
||||
|
@ -67,11 +73,11 @@ class IdentityPopupView extends AbstractViewNext {
|
|||
this.signature.__fetchEditorValue();
|
||||
}
|
||||
|
||||
if (!this.email.hasError()) {
|
||||
this.email.hasError(!this.email().trim());
|
||||
if (!this.emailHasError()) {
|
||||
this.emailHasError(!this.email().trim());
|
||||
}
|
||||
|
||||
if (this.email.hasError()) {
|
||||
if (this.emailHasError()) {
|
||||
if (!this.owner()) {
|
||||
this.emailFocused(true);
|
||||
}
|
||||
|
@ -79,12 +85,12 @@ class IdentityPopupView extends AbstractViewNext {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (this.replyTo.hasError()) {
|
||||
if (this.replyToHasError()) {
|
||||
this.replyToFocused(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.bcc.hasError()) {
|
||||
if (this.bccHasError()) {
|
||||
this.bccFocused(true);
|
||||
return false;
|
||||
}
|
||||
|
@ -129,9 +135,9 @@ class IdentityPopupView extends AbstractViewNext {
|
|||
this.signature('');
|
||||
this.signatureInsertBefore(false);
|
||||
|
||||
this.email.hasError(false);
|
||||
this.replyTo.hasError(false);
|
||||
this.bcc.hasError(false);
|
||||
this.emailHasError(false);
|
||||
this.replyToHasError(false);
|
||||
this.bccHasError(false);
|
||||
|
||||
this.showBcc(false);
|
||||
this.showReplyTo(false);
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import ko from 'ko';
|
||||
|
||||
import AppStore from 'Stores/User/App';
|
||||
import AccountStore from 'Stores/User/Account';
|
||||
import MessageStore from 'Stores/User/Message';
|
||||
|
@ -32,8 +30,10 @@ class AbstractSystemDropDownUserView extends AbstractViewNext {
|
|||
this.accounts = AccountStore.accounts;
|
||||
this.accountsUnreadCount = AccountStore.accountsUnreadCount;
|
||||
|
||||
this.accountMenuDropdownTrigger = ko.observable(false);
|
||||
this.capaAdditionalAccounts = ko.observable(Settings.capa(Capa.AdditionalAccounts));
|
||||
this.addObservables({
|
||||
accountMenuDropdownTrigger: false,
|
||||
capaAdditionalAccounts: Settings.capa(Capa.AdditionalAccounts)
|
||||
});
|
||||
|
||||
this.addAccountClick = this.addAccountClick.bind(this);
|
||||
|
||||
|
|
|
@ -264,7 +264,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext {
|
|||
fullScreenMode: value => $htmlCL.toggle('rl-message-fullscreen', value)
|
||||
});
|
||||
|
||||
this.message.viewTrigger.subscribe(() => {
|
||||
MessageStore.messageViewTrigger.subscribe(() => {
|
||||
const message = this.message();
|
||||
message ? this.viewIsFlagged(message.isFlagged()) : this.viewIsFlagged(false);
|
||||
});
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<div class="controls">
|
||||
<div class="input-append">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: twoFactorDropperUser, hasfocus: twoFactorDropperUser.focused" placeholder="Email"/>
|
||||
data-bind="textInput: twoFactorDropperUser, hasfocus: twoFactorDropperUserFocused" placeholder="Email"/>
|
||||
<button class="btn">
|
||||
<i class="icon-spinner animated" data-bind="visible: true"></i>
|
||||
<span data-bind="visible: false">OK</span>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<span data-bind="text: submitError"></span>
|
||||
</div>
|
||||
<br />
|
||||
<div class="control-group" data-bind="visible: !owner(), css: {'error': email.hasError}">
|
||||
<div class="control-group" data-bind="visible: !owner(), css: {'error': emailHasError}">
|
||||
<label class="i18n control-label" data-i18n="POPUPS_IDENTITY/LABEL_EMAIL"></label>
|
||||
<div class="controls">
|
||||
<input type="email" class="inputEmail input-xlarge" autofocus=""
|
||||
|
@ -36,7 +36,7 @@
|
|||
data-bind="value: name, onEnter: addOrEditIdentityCommand" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: showReplyTo, css: {'error': replyTo.hasError}">
|
||||
<div class="control-group" data-bind="visible: showReplyTo, css: {'error': replyToHasError}">
|
||||
<label class="i18n control-label" data-i18n="POPUPS_IDENTITY/LABEL_REPLY_TO"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="inputReplyTo input-xlarge"
|
||||
|
@ -44,7 +44,7 @@
|
|||
data-bind="value: replyTo, onEnter: addOrEditIdentityCommand, hasfocus: replyToFocused" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: showBcc, css: {'error': bcc.hasError}">
|
||||
<div class="control-group" data-bind="visible: showBcc, css: {'error': bccHasError}">
|
||||
<label class="i18n control-label" data-i18n="POPUPS_IDENTITY/LABEL_BCC"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="inputBcc input-xlarge"
|
||||
|
|
|
@ -18,14 +18,14 @@
|
|||
|
||||
<span class="i18n" data-i18n="SETTINGS_FOLDERS/BUTTON_SYSTEM"></span>
|
||||
</a>
|
||||
<div class="alert folders-list-error" data-bind="visible: folderList.optimized">
|
||||
<div class="alert folders-list-error" data-bind="visible: folderListOptimized">
|
||||
<b class="i18n" data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_1"></b>
|
||||
<br />
|
||||
<span class="i18n" data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_2"></span>
|
||||
</div>
|
||||
<div class="alert folders-list-error" data-bind="visible: '' !== folderList.error()">
|
||||
<button type="button" class="close" data-bind="click: function () { folderList.error(''); }">×</button>
|
||||
<span data-bind="text: folderList.error"></span>
|
||||
<div class="alert folders-list-error" data-bind="visible: '' !== folderListError()">
|
||||
<button type="button" class="close" data-bind="click: function () { folderListError(''); }">×</button>
|
||||
<span data-bind="text: folderListError"></span>
|
||||
</div>
|
||||
<table class="table table-hover list-table" data-bind="i18nUpdate: folderList" style="margin-top: 40px">
|
||||
<colgroup>
|
||||
|
@ -42,4 +42,4 @@
|
|||
<span data-bind="text: folderListHelp"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue