Slightly modified patch code of #1657

This commit is contained in:
the-djmaze 2024-07-11 01:31:58 +02:00
parent 95436347e5
commit 50e30dbb6e
47 changed files with 135 additions and 8 deletions

View file

@ -112,7 +112,7 @@ export class AppUser extends AbstractApp {
case FolderType.Trash:
oMoveFolder = getFolderFromCacheList(FolderUserStore.trashFolder());
nSetSystemFoldersNotification = iFolderType;
bDelete = bDelete || UNUSED_OPTION_VALUE === FolderUserStore.trashFolder()
bDelete = bDelete/* || UNUSED_OPTION_VALUE === FolderUserStore.trashFolder()*/
|| sFromFolderFullName === FolderUserStore.spamFolder()
|| sFromFolderFullName === FolderUserStore.trashFolder();
break;

View file

@ -71,7 +71,9 @@ MessageSetAction = {
SetSeen: 0,
UnsetSeen: 1,
SetFlag: 2,
UnsetFlag: 3
UnsetFlag: 3,
SetDeleted: 4,
UnsetDeleted: 5
},
/**

View file

@ -206,6 +206,7 @@ export class MessageModel extends AbstractModel {
isUnseen: () => !this.flags().includes('\\seen'),
isFlagged: () => this.flags().includes('\\flagged'),
isDeleted: () => this.flags().includes('\\deleted'),
// isJunk: () => this.flags().includes('$junk') && !this.flags().includes('$nonjunk'),
// isPhishing: () => this.flags().includes('$phishing'),
@ -363,7 +364,7 @@ export class MessageModel extends AbstractModel {
lineAsCss(flags=1) {
let classes = [];
forEachObjectEntry({
deleted: this.deleted(),
deleted: this.deleted() || this.isDeleted(),
selected: this.selected(),
checked: this.checked(),
unseen: this.isUnseen(),

View file

@ -36,6 +36,7 @@ import { baseCollator } from 'Common/Translator';
const
isChecked = item => item.checked(),
isDeleted = item => item.isDeleted(),
replaceHash = hash => {
rl.route.off();
hasher.replaceHash(hash);
@ -142,6 +143,14 @@ MessagelistUserStore.hasCheckedOrSelected = koComputable(() =>
| !!MessagelistUserStore.find(isChecked)
).extend({ rateLimit: 50 });
MessagelistUserStore.hasCheckedOrSelectedAndDeleted = koComputable(
() => !!MessagelistUserStore.listCheckedOrSelected().find(isDeleted)
).extend({ rateLimit: 50 });
MessagelistUserStore.hasCheckedOrSelectedAndUndeleted = koComputable(
() => !!MessagelistUserStore.listCheckedOrSelected().find(item => !item?.isDeleted())
).extend({ rateLimit: 50 });
MessagelistUserStore.notifyNewMessages = (folder, newMessages) => {
if (getFolderInboxName() === folder && arrayLength(newMessages)) {
@ -370,6 +379,14 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => {
messages.forEach(oMessage =>
oMessage.isFlagged() && rootUids.push(oMessage.uid) && oMessage.flags.remove('\\flagged')
);
} else if (iSetAction == MessageSetAction.SetDeleted) {
messages.forEach(oMessage =>
!oMessage.isDeleted() && rootUids.push(oMessage.uid) && oMessage.flags.push('\\deleted')
);
} else if (iSetAction == MessageSetAction.UnsetDeleted) {
messages.forEach(oMessage =>
oMessage.isDeleted() && rootUids.push(oMessage.uid) && oMessage.flags.remove('\\deleted')
);
}
rootUids = rootUids.validUnique();
length = rootUids.length;
@ -399,6 +416,15 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => {
setAction: iSetAction == MessageSetAction.SetFlag ? 1 : 0
});
break;
case MessageSetAction.SetDeleted:
case MessageSetAction.UnsetDeleted:
Remote.request('MessageSetDeleted', null, {
folder: sFolderFullName,
uids: rootUids.join(','),
setAction: iSetAction == MessageSetAction.SetDeleted ? 1 : 0
});
break;
// no default
}
}

View file

@ -33,6 +33,10 @@ input:-webkit-autofill:active {
transition: color 9999s ease-out, background-color 9999s ease-out;
}
[data-icon].rotate::before {
transform: rotate(-180deg);
}
/*
@media (pointer: coarse), (hover: none) {
[title] {

View file

@ -1,6 +1,7 @@
import ko from 'ko';
import { addObservablesTo, addComputablesTo } from 'External/ko';
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { ScopeFolderList, ScopeMessageList, ScopeMessageView } from 'Common/Enums';
import { ComposeType, FolderType, MessageSetAction } from 'Common/EnumsUser';
import { doc,
@ -326,7 +327,8 @@ export class MailMessageList extends AbstractViewRight {
downloadZipCommand: canBeMovedHelper,
forwardCommand: canBeMovedHelper,
deleteWithoutMoveCommand: canBeMovedHelper,
deleteCommand: canBeMovedHelper,
deleteCommand: () => MessagelistUserStore.hasCheckedOrSelectedAndUndeleted(),
undeleteCommand: () => MessagelistUserStore.hasCheckedOrSelectedAndDeleted(),
archiveCommand: canBeMovedHelper,
spamCommand: canBeMovedHelper,
notSpamCommand: canBeMovedHelper,
@ -400,8 +402,27 @@ export class MailMessageList extends AbstractViewRight {
&& moveMessagesToFolderType(FolderType.Trash, true);
}
// User setting hideDeleted || immediatelyMoveToTrash ??
deleteCommand() {
moveMessagesToFolderType(FolderType.Trash);
// moveMessagesToFolderType(FolderType.Trash);
if (UNUSED_OPTION_VALUE === FolderUserStore.trashFolder() || '' === FolderUserStore.trashFolder()) {
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.SetDeleted,
MessagelistUserStore.listCheckedOrSelected()
);
} else {
moveMessagesToFolderType(FolderType.Trash);
}
}
// User setting !hideDeleted && !immediatelyMoveToTrash ??
undeleteCommand() {
listAction(
FolderUserStore.currentFolderFullName(),
MessageSetAction.UnsetDeleted,
MessagelistUserStore.listCheckedOrSelected()
);
}
archiveCommand() {

View file

@ -1,6 +1,7 @@
import ko from 'ko';
import { addObservablesTo, addComputablesTo, addSubscribablesTo } from 'External/ko';
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { ScopeFolderList, ScopeMessageList, ScopeMessageView } from 'Common/Enums';
import {
@ -99,6 +100,20 @@ export class MailMessageView extends AbstractViewRight {
currentMessage(null);
rl.app.moveMessagesToFolderType(folderType, message.folder, new Set([message.uid]), bDelete);
}
}, this.messageVisible),
createCommandSetHelper = action =>
createCommand(() => setAction(action), this.messageVisible),
createCommandDeleteHelper = () =>
createCommand(() => {
if (UNUSED_OPTION_VALUE === FolderUserStore.trashFolder() || '' === FolderUserStore.trashFolder()) {
setAction(MessageSetAction.SetDeleted);
} else {
const message = currentMessage();
if (message) {
currentMessage(null);
rl.app.moveMessagesToFolderType(FolderType.Trash, message.folder, new Set([message.uid]));
}
}
}, this.messageVisible);
this.msgDefaultAction = SettingsUserStore.msgDefaultAction;
@ -197,6 +212,8 @@ export class MailMessageView extends AbstractViewRight {
pgpSupported: () => currentMessage() && PgpUserStore.isSupported(),
canBeUndeleted: () => currentMessage()?.isDeleted(),
messageListOrViewLoading:
() => MessagelistUserStore.isLoading() | MessageUserStore.loading()
});
@ -231,7 +248,11 @@ export class MailMessageView extends AbstractViewRight {
this.forwardAsAttachmentCommand = createCommandReplyHelper(ComposeType.ForwardAsAttachment);
this.editAsNewCommand = createCommandReplyHelper(ComposeType.EditAsNew);
this.deleteCommand = createCommandActionHelper(FolderType.Trash);
// this.deleteCommand = createCommandActionHelper(FolderType.Trash);
// User setting hideDeleted || immediatelyMoveToTrash ??
this.deleteCommand = createCommandDeleteHelper();
// User setting !hideDeleted && !immediatelyMoveToTrash ??
this.undeleteCommand = createCommandSetHelper(MessageSetAction.UnsetDeleted);
this.deleteWithoutMoveCommand = createCommandActionHelper(FolderType.Trash, true);
this.archiveCommand = createCommandActionHelper(FolderType.Archive);
this.spamCommand = createCommandActionHelper(FolderType.Junk);

View file

@ -449,6 +449,11 @@ trait Messages
return $this->messageSetFlag(MessageFlag::FLAGGED, true);
}
public function DoMessageSetDeleted() : array
{
return $this->messageSetFlag(MessageFlag::DELETED, true);
}
public function DoMessageSetKeyword() : array
{
return $this->messageSetFlag($this->GetActionParam('keyword', ''), true);

View file

@ -11,6 +11,7 @@
"CLOSE": "أغلق (Esc)",
"CONTACTS": "جهات الإتصال",
"DELETE": "حذف",
"UNDELETE": "Undelete",
"DONE": "إنتهاء",
"EMAIL": "إيميل",
"FROM": "من",

View file

@ -11,6 +11,7 @@
"CLOSE": "Закрыць (Esc)",
"CONTACTS": "Кантакты",
"DELETE": "Выдаліць",
"UNDELETE": "Undelete",
"DONE": "Завяршыць",
"EMAIL": "Пошта",
"FROM": "Ад",

View file

@ -11,6 +11,7 @@
"CLOSE": "Затваряне (Esc)",
"CONTACTS": "Контакти",
"DELETE": "Изтрий",
"UNDELETE": "Undelete",
"DONE": "Готово",
"EMAIL": "Акаунт",
"FROM": "От",

View file

@ -11,6 +11,7 @@
"CLOSE": "Zavřít (Esc)",
"CONTACTS": "Adresář",
"DELETE": "Odstranit",
"UNDELETE": "Undelete",
"DONE": "Dokončit",
"EMAIL": "Email",
"FROM": "Odesílatel",

View file

@ -11,6 +11,7 @@
"CLOSE": "Luk (Esc)",
"CONTACTS": "Kontakter",
"DELETE": "Slet",
"UNDELETE": "Undelete",
"DONE": "Færdig",
"EMAIL": "E-mail",
"FROM": "Fra",

View file

@ -11,6 +11,7 @@
"CLOSE": "Schließen",
"CONTACTS": "Kontakte",
"DELETE": "Löschen",
"UNDELETE": "Undelete",
"DONE": "Erledigt",
"EMAIL": "E-Mail",
"FROM": "Von",

View file

@ -11,6 +11,7 @@
"CLOSE": "Κλείσιμο (Esc)",
"CONTACTS": "Επαφές",
"DELETE": "Διαγραφή",
"UNDELETE": "Undelete",
"DONE": "Έγινε",
"EMAIL": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
"FROM": "Από",

View file

@ -11,6 +11,7 @@
"CLOSE": "Close",
"CONTACTS": "Contacts",
"DELETE": "Delete",
"UNDELETE": "Undelete",
"DONE": "Done",
"EMAIL": "Email",
"FROM": "From",

View file

@ -11,6 +11,7 @@
"CLOSE": "Cerrar",
"CONTACTS": "Contactos",
"DELETE": "Eliminar",
"UNDELETE": "Undelete",
"DONE": "Hecho",
"EMAIL": "Email",
"FROM": "De",

View file

@ -11,6 +11,7 @@
"CLOSE": "Sulge (Esc)",
"CONTACTS": "Kontaktid",
"DELETE": "Kustuta",
"UNDELETE": "Undelete",
"DONE": "Valmis",
"EMAIL": "E-post",
"FROM": "Saatja",

View file

@ -11,6 +11,7 @@
"CLOSE": "Itxi",
"CONTACTS": "Kontaktuak",
"DELETE": "Ezabatu",
"UNDELETE": "Undelete",
"DONE": "Eginda",
"EMAIL": "Email",
"FROM": "Nork",

View file

@ -11,6 +11,7 @@
"CLOSE": "بستن (Esc)",
"CONTACTS": "تماس‌ها",
"DELETE": "حذف",
"UNDELETE": "Undelete",
"DONE": "انجام شد",
"EMAIL": "پست الکترونیک",
"FROM": "از",

View file

@ -11,6 +11,7 @@
"CLOSE": "Sulje (Esc)",
"CONTACTS": "Yhteystiedot",
"DELETE": "Poista",
"UNDELETE": "Undelete",
"DONE": "Valmis",
"EMAIL": "Sähköpostisi",
"FROM": "Lähettäjä",

View file

@ -11,6 +11,7 @@
"CLOSE": "Fermer",
"CONTACTS": "Contacts",
"DELETE": "Supprimer",
"UNDELETE": "Undelete",
"DONE": "Fait",
"EMAIL": "Courriel",
"FROM": "De",

View file

@ -11,6 +11,7 @@
"CLOSE": "Bezárás (Esc)",
"CONTACTS": "Névjegyek",
"DELETE": "Törlés",
"UNDELETE": "Undelete",
"DONE": "Kész",
"EMAIL": "E-mail",
"FROM": "Feladó",

View file

@ -11,6 +11,7 @@
"CLOSE": "Tutup (esc)",
"CONTACTS": "Kontak",
"DELETE": "Hapus",
"UNDELETE": "Undelete",
"DONE": "Selesai",
"EMAIL": "Email",
"FROM": "Dari",

View file

@ -11,6 +11,7 @@
"CLOSE": "Loka (Esc)",
"CONTACTS": "Tengiliðir",
"DELETE": "Eyða",
"UNDELETE": "Undelete",
"DONE": "Lokið",
"EMAIL": "Tölvupóstfang",
"FROM": "Frá",

View file

@ -11,6 +11,7 @@
"CLOSE": "Chiudi (Esc)",
"CONTACTS": "Contatti",
"DELETE": "Elimina",
"UNDELETE": "Undelete",
"DONE": "Fatto",
"EMAIL": "Email",
"FROM": "Da",

View file

@ -11,6 +11,7 @@
"CLOSE": "閉じる(Esc)",
"CONTACTS": "連絡先",
"DELETE": "削除",
"UNDELETE": "Undelete",
"DONE": "完了",
"EMAIL": "メールアドレス",
"FROM": "差出人",

View file

@ -11,6 +11,7 @@
"CLOSE": "닫기 (Esc)",
"CONTACTS": "연락처",
"DELETE": "삭제",
"UNDELETE": "Undelete",
"DONE": "완료",
"EMAIL": "이메일",
"FROM": "보내는 사람",

View file

@ -11,6 +11,7 @@
"CLOSE": "Uždaryti (Esc)",
"CONTACTS": "Kontaktai",
"DELETE": "Naikinti",
"UNDELETE": "Undelete",
"DONE": "Atlikta",
"EMAIL": "E-paštas",
"FROM": "Nuo",

View file

@ -11,6 +11,7 @@
"CLOSE": "Aizvērt (Esc)",
"CONTACTS": "Kontakti",
"DELETE": "Dzēst",
"UNDELETE": "Undelete",
"DONE": "Done",
"EMAIL": "E-pasts",
"FROM": "No",

View file

@ -11,6 +11,7 @@
"CLOSE": "Lukk (Esc)",
"CONTACTS": "Kontakter",
"DELETE": "Slett",
"UNDELETE": "Undelete",
"DONE": "Ferdig",
"EMAIL": "E-postadresse",
"FROM": "Fra",

View file

@ -11,6 +11,7 @@
"CLOSE": "Sluiten",
"CONTACTS": "Contactpersonen",
"DELETE": "Verwijder",
"UNDELETE": "Undelete",
"DONE": "Klaar",
"EMAIL": "E-mailadres",
"FROM": "Van",

View file

@ -11,6 +11,7 @@
"CLOSE": "Zamknij (Esc)",
"CONTACTS": "Kontakty",
"DELETE": "Usuń",
"UNDELETE": "Undelete",
"DONE": "Gotowe",
"EMAIL": "Adres e-mail",
"FROM": "Od",

View file

@ -11,6 +11,7 @@
"CLOSE": "Fechar (Esc)",
"CONTACTS": "Contatos",
"DELETE": "Excluir",
"UNDELETE": "Undelete",
"DONE": "Concluir",
"EMAIL": "E-mail",
"FROM": "De",

View file

@ -11,6 +11,7 @@
"CLOSE": "Fechar",
"CONTACTS": "Contactos",
"DELETE": "Eliminar",
"UNDELETE": "Undelete",
"DONE": "Terminado",
"EMAIL": "Email",
"FROM": "De",

View file

@ -11,6 +11,7 @@
"CLOSE": "Închide (Esc)",
"CONTACTS": "Contacte",
"DELETE": "Șterge",
"UNDELETE": "Undelete",
"DONE": "Done",
"EMAIL": "Email",
"FROM": "De la",

View file

@ -11,6 +11,7 @@
"CLOSE": "Закрыть (Esc)",
"CONTACTS": "Контакты",
"DELETE": "Удалить",
"UNDELETE": "Восстановить",
"DONE": "Завершить",
"EMAIL": "Почта",
"FROM": "От",

View file

@ -11,6 +11,7 @@
"CLOSE": "Zatvoriť (Esc)",
"CONTACTS": "Adresár",
"DELETE": "Odstrániť",
"UNDELETE": "Undelete",
"DONE": "Done",
"EMAIL": "Email",
"FROM": "Odosielateľ",

View file

@ -11,6 +11,7 @@
"CLOSE": "Zapri (Esc)",
"CONTACTS": "Stiki",
"DELETE": "Izbriši",
"UNDELETE": "Undelete",
"DONE": "Končaj",
"EMAIL": "E-pošta",
"FROM": "Od",

View file

@ -11,6 +11,7 @@
"CLOSE": "Stäng (Esc)",
"CONTACTS": "Kontakter",
"DELETE": "Ta bort",
"UNDELETE": "Undelete",
"DONE": "Klar",
"EMAIL": "E-post",
"FROM": "Från",

View file

@ -11,6 +11,7 @@
"CLOSE": "Kapat (Esc)",
"CONTACTS": "Kişi Listesi",
"DELETE": "Sil",
"UNDELETE": "Undelete",
"DONE": "Done",
"EMAIL": "E-Posta",
"FROM": "Kimden",

View file

@ -11,6 +11,7 @@
"CLOSE": "Закрити (Esc)",
"CONTACTS": "Контакти",
"DELETE": "Видалити",
"UNDELETE": "Undelete",
"DONE": "Зроблено",
"EMAIL": "Пошта",
"FROM": "Від",

View file

@ -11,6 +11,7 @@
"CLOSE": "Đóng",
"CONTACTS": "Danh bạ",
"DELETE": "Xóa",
"UNDELETE": "Undelete",
"DONE": "Đã xong",
"EMAIL": "Email",
"FROM": "Đến từ",

View file

@ -11,6 +11,7 @@
"CLOSE": "關閉",
"CONTACTS": "連絡人",
"DELETE": "刪除",
"UNDELETE": "Undelete",
"DONE": "完成",
"EMAIL": "電子郵件",
"FROM": "寄件者",

View file

@ -11,6 +11,7 @@
"CLOSE": "关闭",
"CONTACTS": "联系人",
"DELETE": "删除",
"UNDELETE": "Undelete",
"DONE": "完成",
"EMAIL": "邮箱",
"FROM": "发件人",

View file

@ -17,6 +17,9 @@
<i class="icon-check-mark-circle-two"></i>
</a>
<a class="btn fontastic" data-bind="command: deleteCommand" data-i18n="[title]GLOBAL/DELETE">🗑</a>
<!--
<a class="btn fontastic" data-bind="command: undeleteCommand" data-i18n="[title]GLOBAL/UNDELETE" style="transform:rotate(-180deg)">🗑</a>
-->
</div>
<div class="btn-group dropdown" data-bind="registerBootstrapDropdown: true">
<a id="more-list-dropdown-id" class="btn dropdown-toggle fontastic" href="#" tabindex="-1" data-i18n="[title]GLOBAL/MORE"></a>
@ -63,6 +66,9 @@
<li role="presentation" data-bind="command: deleteCommand">
<a href="#" tabindex="-1" data-icon="🗑" data-i18n="GLOBAL/DELETE"></a>
</li>
<li role="presentation" data-bind="command: undeleteCommand">
<a href="#" tabindex="-1" data-icon="🗑" data-i18n="GLOBAL/UNDELETE" class="rotate"></a>
</li>
<li role="presentation" data-bind="visible: allowDangerousActions, command: deleteWithoutMoveCommand">
<a href="#" tabindex="-1" data-icon="🗑" data-i18n="MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE"></a>
</li>

View file

@ -11,7 +11,8 @@
<a class="btn" data-bind="visible: isSpamFolder, command: notSpamCommand" data-i18n="[title]GLOBAL/NOT_SPAM">
<i class="icon-check-mark-circle-two"></i>
</a>
<a class="btn fontastic" data-bind="command: deleteCommand" data-i18n="[title]GLOBAL/DELETE">🗑</a>
<a class="btn fontastic" data-bind="visible: !canBeUndeleted(), command: deleteCommand" data-i18n="[title]GLOBAL/DELETE">🗑</a>
<a class="btn fontastic" data-bind="visible: canBeUndeleted, command: undeleteCommand" data-i18n="[title]GLOBAL/UNDELETE" style="transform:rotate(-180deg)">🗑</a>
</div>
<div class="btn-group">
<a class="btn btn-thin buttonUp fontastic" data-bind="command: goUpCommand"></a>
@ -82,9 +83,12 @@
<li role="presentation">
<a href="#" tabindex="-1" data-bind="command: copyCommand" data-icon="&#xE068;" data-i18n="GLOBAL/COPY_TO"></a>
</li>
<li role="presentation">
<li role="presentation" data-bind="visible: !canBeUndeleted()">
<a href="#" tabindex="-1" data-bind="command: deleteCommand" data-icon="🗑" data-i18n="GLOBAL/DELETE"></a>
</li>
<li role="presentation" data-bind="visible: canBeUndeleted">
<a href="#" tabindex="-1" data-bind="command: undeleteCommand" data-icon="🗑" data-i18n="GLOBAL/UNDELETE" class="rotate"></a>
</li>
<li role="presentation">
<a href="#" tabindex="-1" data-bind="command: deleteWithoutMoveCommand" data-icon="🗑" data-i18n="MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE"></a>
</li>