mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-15 04:04:50 +08:00
954de06f86
This should provide performance and memory benefits over regular computed observables
186 lines
6 KiB
JavaScript
186 lines
6 KiB
JavaScript
import ko from 'ko';
|
|
import { koComputable } from 'External/ko';
|
|
|
|
import { Notification } from 'Common/Enums';
|
|
import { FolderMetadataKeys } from 'Common/EnumsUser';
|
|
import { Settings } from 'Common/Globals';
|
|
import { getNotification } from 'Common/Translator';
|
|
|
|
import { setFolder, getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache';
|
|
import { Capa } from 'Common/Enums';
|
|
import { defaultOptionsAfterRender } from 'Common/Utils';
|
|
import { sortFolders } from 'Common/UtilsUser';
|
|
import { initOnStartOrLangChange, i18n } from 'Common/Translator';
|
|
|
|
import { FolderUserStore } from 'Stores/User/Folder';
|
|
import { SettingsUserStore } from 'Stores/User/Settings';
|
|
|
|
import Remote from 'Remote/User/Fetch';
|
|
|
|
import { showScreenPopup } from 'Knoin/Knoin';
|
|
|
|
import { FolderCreatePopupView } from 'View/Popup/FolderCreate';
|
|
import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
|
|
|
|
const folderForDeletion = ko.observable(null).deleteAccessHelper();
|
|
|
|
export class FoldersUserSettings /*extends AbstractViewSettings*/ {
|
|
constructor() {
|
|
this.showKolab = koComputable(() => FolderUserStore.hasCapability('METADATA') && Settings.capa(Capa.Kolab));
|
|
this.defaultOptionsAfterRender = defaultOptionsAfterRender;
|
|
this.kolabTypeOptions = ko.observableArray();
|
|
let i18nFilter = key => i18n('SETTINGS_FOLDERS/TYPE_' + key);
|
|
initOnStartOrLangChange(()=>{
|
|
this.kolabTypeOptions([
|
|
{ id: '', name: '' },
|
|
{ id: 'event', name: i18nFilter('CALENDAR') },
|
|
{ id: 'contact', name: i18nFilter('CONTACTS') },
|
|
{ id: 'task', name: i18nFilter('TASKS') },
|
|
{ id: 'note', name: i18nFilter('NOTES') },
|
|
{ id: 'file', name: i18nFilter('FILES') },
|
|
{ id: 'journal', name: i18nFilter('JOURNAL') },
|
|
{ id: 'configuration', name: i18nFilter('CONFIGURATION') }
|
|
]);
|
|
});
|
|
|
|
this.displaySpecSetting = FolderUserStore.displaySpecSetting;
|
|
this.folderList = FolderUserStore.folderList;
|
|
this.folderListOptimized = FolderUserStore.folderListOptimized;
|
|
this.folderListError = FolderUserStore.folderListError;
|
|
this.hideUnsubscribed = SettingsUserStore.hideUnsubscribed;
|
|
|
|
this.loading = koComputable(() => {
|
|
const loading = FolderUserStore.foldersLoading(),
|
|
creating = FolderUserStore.foldersCreating(),
|
|
deleting = FolderUserStore.foldersDeleting(),
|
|
renaming = FolderUserStore.foldersRenaming();
|
|
|
|
return loading || creating || deleting || renaming;
|
|
});
|
|
|
|
this.folderForDeletion = folderForDeletion;
|
|
|
|
this.folderForEdit = ko.observable(null).extend({ toggleSubscribeProperty: [this, 'edited'] });
|
|
|
|
this.useImapSubscribe = Settings.app('useImapSubscribe');
|
|
SettingsUserStore.hideUnsubscribed.subscribe(value => Remote.saveSetting('HideUnsubscribed', value ? 1 : 0));
|
|
}
|
|
|
|
folderEditOnEnter(folder) {
|
|
const nameToEdit = folder ? folder.nameForEdit().trim() : '';
|
|
|
|
if (nameToEdit && folder.name() !== nameToEdit) {
|
|
Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, {
|
|
Folder: folder.fullName,
|
|
NewFolderName: nameToEdit
|
|
})
|
|
.then(data => {
|
|
folder.name(nameToEdit/*data.Name*/);
|
|
if (folder.subFolders.length) {
|
|
Remote.setTrigger(FolderUserStore.foldersLoading, true);
|
|
// clearTimeout(Remote.foldersTimeout);
|
|
// Remote.foldersTimeout = setTimeout(() => Remote.foldersReload(), 500);
|
|
setTimeout(() => Remote.foldersReload(), 500);
|
|
// TODO: rename all subfolders with folder.delimiter to prevent reload?
|
|
} else {
|
|
removeFolderFromCacheList(folder.fullName);
|
|
folder.fullName = data.Result.FullName;
|
|
setFolder(folder);
|
|
const parent = getFolderFromCacheList(folder.parentName);
|
|
sortFolders(parent ? parent.subFolders : FolderUserStore.folderList);
|
|
}
|
|
})
|
|
.catch(error => {
|
|
FolderUserStore.folderListError(
|
|
getNotification(error.code, '', Notification.CantRenameFolder)
|
|
+ '.\n' + error.message);
|
|
});
|
|
}
|
|
|
|
folder.edited(false);
|
|
}
|
|
|
|
folderEditOnEsc(folder) {
|
|
if (folder) {
|
|
folder.edited(false);
|
|
}
|
|
}
|
|
|
|
onShow() {
|
|
FolderUserStore.folderListError('');
|
|
}
|
|
/*
|
|
onBuild(oDom) {
|
|
}
|
|
*/
|
|
createFolder() {
|
|
showScreenPopup(FolderCreatePopupView);
|
|
}
|
|
|
|
systemFolder() {
|
|
showScreenPopup(FolderSystemPopupView);
|
|
}
|
|
|
|
deleteFolder(folderToRemove) {
|
|
if (folderToRemove
|
|
&& folderToRemove.canBeDeleted()
|
|
&& folderToRemove.deleteAccess()
|
|
) {
|
|
if (0 < folderToRemove.privateMessageCountAll()) {
|
|
// FolderUserStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder));
|
|
folderToRemove.errorMsg(getNotification(Notification.CantDeleteNonEmptyFolder));
|
|
} else {
|
|
folderForDeletion(null);
|
|
|
|
if (folderToRemove) {
|
|
Remote.abort('Folders').post('FolderDelete', FolderUserStore.foldersDeleting, {
|
|
Folder: folderToRemove.fullName
|
|
}).then(
|
|
() => {
|
|
// folderToRemove.flags.push('\\nonexistent');
|
|
folderToRemove.selectable(false);
|
|
// folderToRemove.subscribed(false);
|
|
// folderToRemove.checkable(false);
|
|
if (!folderToRemove.subFolders.length) {
|
|
removeFolderFromCacheList(folderToRemove.fullName);
|
|
const folder = getFolderFromCacheList(folderToRemove.parentName);
|
|
(folder ? folder.subFolders : FolderUserStore.folderList).remove(folderToRemove);
|
|
}
|
|
},
|
|
error => {
|
|
FolderUserStore.folderListError(
|
|
getNotification(error.code, '', Notification.CantDeleteFolder)
|
|
+ '.\n' + error.message
|
|
);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
toggleFolderKolabType(folder, event) {
|
|
let type = event.target.value;
|
|
// TODO: append '.default' ?
|
|
Remote.folderSetMetadata(null, folder.fullName, FolderMetadataKeys.KolabFolderType, type);
|
|
folder.kolabType(type);
|
|
}
|
|
|
|
toggleFolderSubscription(folder) {
|
|
let subscribe = !folder.subscribed();
|
|
Remote.request('FolderSubscribe', null, {
|
|
Folder: folder.fullName,
|
|
Subscribe: subscribe ? 1 : 0
|
|
});
|
|
folder.subscribed(subscribe);
|
|
}
|
|
|
|
toggleFolderCheckable(folder) {
|
|
let checkable = !folder.checkable();
|
|
Remote.request('FolderCheckable', null, {
|
|
Folder: folder.fullName,
|
|
Checkable: checkable ? 1 : 0
|
|
});
|
|
folder.checkable(checkable);
|
|
}
|
|
}
|