Improved "delete folder" error handling.

This commit is contained in:
djmaze 2021-12-13 14:32:15 +01:00
parent 503219c70e
commit 1d9c772b94
4 changed files with 42 additions and 36 deletions

14
dev/External/ko.js vendored
View file

@ -3,15 +3,17 @@ import { doc, createElement } from 'Common/Globals';
import { SaveSettingsStep } from 'Common/Enums'; import { SaveSettingsStep } from 'Common/Enums';
import { arrayLength, isFunction } from 'Common/Utils'; import { arrayLength, isFunction } from 'Common/Utils';
const
koValue = value => !ko.isObservable(value) && isFunction(value) ? value() : ko.unwrap(value);
ko.bindingHandlers.tooltipErrorTip = { ko.bindingHandlers.tooltipErrorTip = {
init: element => { init: (element, fValueAccessor) => {
doc.addEventListener('click', () => element.removeAttribute('data-rainloopErrorTip')); doc.addEventListener('click', () => {
let value = fValueAccessor();
ko.isObservable(value) && value('');
element.removeAttribute('data-rainloopErrorTip');
});
}, },
update: (element, fValueAccessor) => { update: (element, fValueAccessor) => {
const value = koValue(fValueAccessor()); let value = ko.unwrap(fValueAccessor());
value = isFunction(value) ? value() : value;
if (value) { if (value) {
setTimeout(() => element.setAttribute('data-rainloopErrorTip', value), 100); setTimeout(() => element.setAttribute('data-rainloopErrorTip', value), 100);
} else { } else {

View file

@ -219,6 +219,7 @@ export class FolderModel extends AbstractModel {
deleteAccess: false, deleteAccess: false,
nameForEdit: '', nameForEdit: '',
errorMsg: '',
privateMessageCountAll: 0, privateMessageCountAll: 0,
privateMessageCountUnread: 0, privateMessageCountUnread: 0,

View file

@ -121,39 +121,40 @@ export class FoldersUserSettings /*extends AbstractViewSettings*/ {
} }
deleteFolder(folderToRemove) { deleteFolder(folderToRemove) {
if ( if (folderToRemove
folderToRemove && && folderToRemove.canBeDeleted()
folderToRemove.canBeDeleted() && && folderToRemove.deleteAccess()
folderToRemove.deleteAccess() &&
0 === folderToRemove.privateMessageCountAll()
) { ) {
folderForDeletion(null); if (0 < folderToRemove.privateMessageCountAll()) {
// FolderUserStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder));
folderToRemove.errorMsg(getNotification(Notification.CantDeleteNonEmptyFolder));
} else {
folderForDeletion(null);
if (folderToRemove) { if (folderToRemove) {
Remote.abort('Folders').post('FolderDelete', FolderUserStore.foldersDeleting, { Remote.abort('Folders').post('FolderDelete', FolderUserStore.foldersDeleting, {
Folder: folderToRemove.fullName Folder: folderToRemove.fullName
}).then( }).then(
() => { () => {
// folderToRemove.flags.push('\\nonexistent'); // folderToRemove.flags.push('\\nonexistent');
folderToRemove.selectable(false); folderToRemove.selectable(false);
// folderToRemove.subscribed(false); // folderToRemove.subscribed(false);
// folderToRemove.checkable(false); // folderToRemove.checkable(false);
if (!folderToRemove.subFolders.length) { if (!folderToRemove.subFolders.length) {
removeFolderFromCacheList(folderToRemove.fullName); removeFolderFromCacheList(folderToRemove.fullName);
const folder = getFolderFromCacheList(folderToRemove.parentName); const folder = getFolderFromCacheList(folderToRemove.parentName);
(folder ? folder.subFolders : FolderUserStore.folderList).remove(folderToRemove); (folder ? folder.subFolders : FolderUserStore.folderList).remove(folderToRemove);
}
},
error => {
FolderUserStore.folderListError(
getNotification(error.code, '', Notification.CantDeleteFolder)
+ '.\n' + error.message
);
} }
}, );
error => { }
FolderUserStore.folderListError(
getNotification(error.code, '', Notification.CantDeleteFolder)
+ '.\n' + error.message
);
}
);
} }
} else if (0 < folderToRemove.privateMessageCountAll()) {
FolderUserStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder));
} }
} }

View file

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