@bobfrankston/rmfmail 1.2.333 → 1.2.337

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/client/android-bootstrap.bundle.js +53 -0
  2. package/client/android-bootstrap.bundle.js.map +2 -2
  3. package/client/app.bundle.js +51 -14
  4. package/client/app.bundle.js.map +2 -2
  5. package/client/app.js +12 -6
  6. package/client/app.js.map +1 -1
  7. package/client/app.ts +12 -6
  8. package/client/components/folder-tree.js +6 -1
  9. package/client/components/folder-tree.js.map +1 -1
  10. package/client/components/folder-tree.ts +5 -1
  11. package/client/components/message-list.js +54 -11
  12. package/client/components/message-list.js.map +1 -1
  13. package/client/components/message-list.ts +47 -9
  14. package/client/components/message-viewer.js +6 -1
  15. package/client/components/message-viewer.js.map +1 -1
  16. package/client/components/message-viewer.ts +6 -1
  17. package/client/compose/compose.bundle.js +42 -5
  18. package/client/compose/compose.bundle.js.map +4 -4
  19. package/client/compose/compose.js +7 -2
  20. package/client/compose/compose.js.map +1 -1
  21. package/client/compose/compose.ts +7 -2
  22. package/client/index.html +2 -2
  23. package/client/package.json +1 -1
  24. package/package.json +9 -9
  25. package/packages/mailx-imap/index.d.ts +4 -1
  26. package/packages/mailx-imap/index.d.ts.map +1 -1
  27. package/packages/mailx-imap/index.js +5 -2
  28. package/packages/mailx-imap/index.js.map +1 -1
  29. package/packages/mailx-imap/index.ts +7 -3
  30. package/packages/mailx-imap/package-lock.json +2 -2
  31. package/packages/mailx-imap/package.json +1 -1
  32. package/packages/mailx-service/index.d.ts.map +1 -1
  33. package/packages/mailx-service/index.js +33 -3
  34. package/packages/mailx-service/index.js.map +1 -1
  35. package/packages/mailx-service/index.ts +30 -3
  36. package/packages/mailx-service/package.json +1 -1
  37. package/packages/mailx-service/sync-queue.d.ts +7 -0
  38. package/packages/mailx-service/sync-queue.d.ts.map +1 -1
  39. package/packages/mailx-service/sync-queue.js +9 -0
  40. package/packages/mailx-service/sync-queue.js.map +1 -1
  41. package/packages/mailx-service/sync-queue.ts +10 -0
  42. package/packages/mailx-settings/package.json +1 -1
  43. package/packages/mailx-store/package.json +1 -1
  44. package/packages/mailx-store-web/package.json +1 -1
  45. package/packages/mailx-types/index.d.ts.map +1 -1
  46. package/packages/mailx-types/index.js +14 -0
  47. package/packages/mailx-types/index.js.map +1 -1
  48. package/packages/mailx-types/index.ts +13 -0
  49. package/packages/mailx-types/package.json +1 -1
@@ -4663,7 +4663,8 @@ var init_message_viewer = __esm({
4663
4663
  return;
4664
4664
  if (!currentMessage || currentAccountId !== ev.accountId)
4665
4665
  return;
4666
- if (currentMessage.uid !== ev.previousDraftUid)
4666
+ const sameDraft = !!ev.draftId && currentMessage.mailxDraftId === ev.draftId;
4667
+ if (!sameDraft && currentMessage.uid !== ev.previousDraftUid)
4667
4668
  return;
4668
4669
  const newBody = String(ev.bodyHtml || "");
4669
4670
  currentMessage.bodyHtml = newBody;
@@ -4808,6 +4809,7 @@ __export(message_list_exports, {
4808
4809
  removeMessagesAndReconcile: () => removeMessagesAndReconcile,
4809
4810
  revealMessage: () => revealMessage,
4810
4811
  scrollFocusedIntoView: () => scrollFocusedIntoView,
4812
+ selectAllMessages: () => selectAllMessages,
4811
4813
  selectAllVisible: () => selectAllVisible,
4812
4814
  setDateBasis: () => setDateBasis,
4813
4815
  setLiveFilter: () => setLiveFilter,
@@ -4833,6 +4835,11 @@ function applyLiveFilter(body) {
4833
4835
  row.classList.toggle("filter-hidden", !text.includes(liveFilterText));
4834
4836
  }
4835
4837
  }
4838
+ function currentSearchPagingScope() {
4839
+ if (currentSearchScope !== "server")
4840
+ return currentSearchScope;
4841
+ return currentSearchFolderId ? "current" : "all";
4842
+ }
4836
4843
  function emptyListMessage() {
4837
4844
  if (searchMode && currentSearchQuery) {
4838
4845
  return `No messages found by "${escapeHtmlText(currentSearchQuery)}"`;
@@ -5244,6 +5251,29 @@ function selectAllVisible() {
5244
5251
  body.querySelectorAll(".ml-row:not(.filter-hidden)").forEach((r) => r.classList.add("selected"));
5245
5252
  updateBulkBar();
5246
5253
  }
5254
+ async function selectAllMessages() {
5255
+ const body = document.getElementById("ml-body");
5256
+ if (!body)
5257
+ return;
5258
+ const status = document.getElementById("status-sync");
5259
+ let guard = 0;
5260
+ while (currentPage * 50 < totalMessages && guard++ < 1e4) {
5261
+ if (loading) {
5262
+ await new Promise((r) => setTimeout(r, 50));
5263
+ continue;
5264
+ }
5265
+ const before = body.querySelectorAll(".ml-row").length;
5266
+ if (status)
5267
+ status.textContent = `Loading all ${totalMessages} messages to select them\u2026 ${before} so far`;
5268
+ await loadMoreMessages();
5269
+ if (body.querySelectorAll(".ml-row").length === before)
5270
+ break;
5271
+ }
5272
+ selectAllVisible();
5273
+ const n = body.querySelectorAll(".ml-row.selected").length;
5274
+ if (status)
5275
+ status.textContent = `Selected ${n} message${n === 1 ? "" : "s"}`;
5276
+ }
5247
5277
  function selectRange(from, to) {
5248
5278
  const body = document.getElementById("ml-body");
5249
5279
  if (!body)
@@ -5494,6 +5524,10 @@ async function loadSearchResults(query, scope = "all", accountId = "", folderId
5494
5524
  liveFilterText = "";
5495
5525
  unifiedMode = false;
5496
5526
  currentSearchQuery = query;
5527
+ currentSearchScope = scope;
5528
+ currentSearchAccountId = accountId;
5529
+ currentSearchFolderId = folderId;
5530
+ currentSearchIncludeTrash = includeTrashSpam;
5497
5531
  currentPage = 1;
5498
5532
  totalMessages = 0;
5499
5533
  const body = document.getElementById("ml-body");
@@ -5718,7 +5752,7 @@ async function loadMoreMessages() {
5718
5752
  const rowsBefore = body.querySelectorAll(".ml-row").length;
5719
5753
  try {
5720
5754
  const flaggedOnly = body.classList.contains("flagged-only");
5721
- const result = searchMode ? await searchMessages(currentSearchQuery, currentPage) : unifiedMode ? await getUnifiedInbox(currentPage, 50, flaggedOnly, dateBasis) : await getMessages(currentAccountId2, currentFolderId, currentPage, 50, flaggedOnly, currentSort, currentSortDir, dateBasis);
5755
+ const result = searchMode ? await searchMessages(currentSearchQuery, currentPage, 50, currentSearchPagingScope(), currentSearchAccountId, currentSearchFolderId, currentSearchIncludeTrash) : unifiedMode ? await getUnifiedInbox(currentPage, 50, flaggedOnly, dateBasis) : await getMessages(currentAccountId2, currentFolderId, currentPage, 50, flaggedOnly, currentSort, currentSortDir, dateBasis);
5722
5756
  const current = getMessages2();
5723
5757
  setMessages([...current, ...result.items]);
5724
5758
  appendMessages(body, unifiedMode ? "" : currentAccountId2, result.items);
@@ -5957,7 +5991,7 @@ function escapeHtml4(s) {
5957
5991
  div.textContent = s;
5958
5992
  return div.innerHTML;
5959
5993
  }
5960
- var onMessageSelect, currentAccountId2, currentFolderId, currentSpecialUse, lastClickedRow, currentPage, totalMessages, loading, MAX_REFRESH_PAGES, unifiedMode, searchMode, liveFilterText, currentSearchQuery, wasUnifiedBeforeSearch, showToInsteadOfFrom, touchWasScroll, lastPointerWasTouch, currentSort, currentSortDir, dateBasis, loadGen, listCache, CACHE_KEY_UNIFIED, positionMemory, POSITION_STORAGE_KEY, focusedRow, rowByKey, prioritySenders, priorityDomains, timeFmt, dateFmt, dateFmtSameYear, MessageRow;
5994
+ var onMessageSelect, currentAccountId2, currentFolderId, currentSpecialUse, lastClickedRow, currentPage, totalMessages, loading, MAX_REFRESH_PAGES, unifiedMode, searchMode, liveFilterText, currentSearchQuery, currentSearchScope, currentSearchAccountId, currentSearchFolderId, currentSearchIncludeTrash, wasUnifiedBeforeSearch, showToInsteadOfFrom, touchWasScroll, lastPointerWasTouch, currentSort, currentSortDir, dateBasis, loadGen, listCache, CACHE_KEY_UNIFIED, positionMemory, POSITION_STORAGE_KEY, focusedRow, rowByKey, prioritySenders, priorityDomains, timeFmt, dateFmt, dateFmtSameYear, MessageRow;
5961
5995
  var init_message_list = __esm({
5962
5996
  "client/components/message-list.js"() {
5963
5997
  "use strict";
@@ -5977,6 +6011,10 @@ var init_message_list = __esm({
5977
6011
  searchMode = false;
5978
6012
  liveFilterText = "";
5979
6013
  currentSearchQuery = "";
6014
+ currentSearchScope = "all";
6015
+ currentSearchAccountId = "";
6016
+ currentSearchFolderId = 0;
6017
+ currentSearchIncludeTrash = false;
5980
6018
  wasUnifiedBeforeSearch = false;
5981
6019
  showToInsteadOfFrom = false;
5982
6020
  touchWasScroll = false;
@@ -6261,15 +6299,10 @@ var init_message_list = __esm({
6261
6299
  const selectedCount = body ? body.querySelectorAll(".ml-row.selected").length : 0;
6262
6300
  showMenu(e.clientX, e.clientY, [
6263
6301
  {
6264
- label: `Select all (${visibleRows.length})`,
6302
+ // Total in the view, not rows loaded so far (2026-09-16).
6303
+ label: `Select all (${Math.max(totalMessages || 0, visibleRows.length)})`,
6265
6304
  action: () => {
6266
- if (!body)
6267
- return;
6268
- body.classList.add("multi-select-on");
6269
- for (const r of visibleRows)
6270
- r.classList.add("selected");
6271
- lastClickedRow = visibleRows[visibleRows.length - 1] || null;
6272
- updateBulkBar();
6305
+ void selectAllMessages();
6273
6306
  },
6274
6307
  disabled: visibleRows.length === 0
6275
6308
  },
@@ -8899,8 +8932,11 @@ function renderNode(node, container, depth, forceExpand) {
8899
8932
  const treeContainer = document.getElementById("folder-tree");
8900
8933
  if (treeContainer)
8901
8934
  loadFolderTree(treeContainer);
8935
+ const status = document.getElementById("status-sync");
8936
+ if (status)
8937
+ status.textContent = `Emptied ${node.name} locally \u2014 deleting on the server in the background`;
8902
8938
  } catch (err) {
8903
- alert(`Failed: ${err.message}`);
8939
+ alert(`Failed to empty ${node.name}: ${err.message}`);
8904
8940
  }
8905
8941
  } });
8906
8942
  }
@@ -11620,7 +11656,8 @@ function doSearch(immediate = false) {
11620
11656
  if (serverOn) {
11621
11657
  serverSearchTimer = setTimeout(() => {
11622
11658
  serverSearchTimer = null;
11623
- loadSearchResults(query, "server", currentAccountId3, currentFolderId2, includeTrash);
11659
+ const serverFolderId = localScopeEff === "current" ? currentFolderId2 : 0;
11660
+ loadSearchResults(query, "server", currentAccountId3, serverFolderId, includeTrash);
11624
11661
  }, SERVER_SEARCH_DALLY_MS);
11625
11662
  }
11626
11663
  }
@@ -12435,7 +12472,7 @@ document.addEventListener("keydown", (e) => {
12435
12472
  const mlBody = document.getElementById("ml-body");
12436
12473
  if (mlBody) {
12437
12474
  e.preventDefault();
12438
- selectAllVisible();
12475
+ void selectAllMessages();
12439
12476
  }
12440
12477
  }
12441
12478
  if (e.ctrlKey && e.key === "d" || e.key === "Delete") {