@bobfrankston/rmfmail 1.2.123 → 1.2.125

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 (58) hide show
  1. package/README.md +6 -0
  2. package/TODO.md +2 -0
  3. package/bin/mailx.js +51 -0
  4. package/bin/mailx.js.map +1 -1
  5. package/bin/mailx.ts +45 -1
  6. package/bin/popout-server.js +40 -2
  7. package/bin/popout-server.js.map +1 -1
  8. package/bin/popout-server.ts +36 -2
  9. package/client/android-bootstrap.bundle.js +29 -21
  10. package/client/android-bootstrap.bundle.js.map +3 -3
  11. package/client/app.bundle.js +41 -3
  12. package/client/app.bundle.js.map +3 -3
  13. package/client/app.js +16 -0
  14. package/client/app.js.map +1 -1
  15. package/client/app.ts +15 -0
  16. package/client/components/folder-tree.js +31 -3
  17. package/client/components/folder-tree.js.map +1 -1
  18. package/client/components/folder-tree.ts +24 -3
  19. package/client/components/message-viewer.js +1 -1
  20. package/client/components/message-viewer.js.map +1 -1
  21. package/client/components/message-viewer.ts +1 -1
  22. package/client/compose/compose.bundle.js +7 -0
  23. package/client/compose/compose.bundle.js.map +2 -2
  24. package/client/index.html +2 -0
  25. package/client/lib/api-client.js +8 -0
  26. package/client/lib/api-client.js.map +1 -1
  27. package/client/lib/api-client.ts +8 -0
  28. package/client/lib/mailxapi.js +4 -0
  29. package/client/lib/popout-bridge.js +14 -0
  30. package/client/lib/popout-bridge.js.map +1 -1
  31. package/client/lib/popout-bridge.ts +12 -0
  32. package/package.json +9 -9
  33. package/packages/mailx-imap/index.d.ts.map +1 -1
  34. package/packages/mailx-imap/index.js +23 -2
  35. package/packages/mailx-imap/index.js.map +1 -1
  36. package/packages/mailx-imap/index.ts +21 -2
  37. package/packages/mailx-imap/package-lock.json +2 -2
  38. package/packages/mailx-imap/package.json +1 -1
  39. package/packages/mailx-service/index.d.ts +21 -0
  40. package/packages/mailx-service/index.d.ts.map +1 -1
  41. package/packages/mailx-service/index.js +28 -2
  42. package/packages/mailx-service/index.js.map +1 -1
  43. package/packages/mailx-service/index.ts +28 -2
  44. package/packages/mailx-service/jsonrpc.js +2 -0
  45. package/packages/mailx-service/jsonrpc.js.map +1 -1
  46. package/packages/mailx-service/jsonrpc.ts +2 -0
  47. package/packages/mailx-service/sync-queue.d.ts +8 -0
  48. package/packages/mailx-service/sync-queue.d.ts.map +1 -1
  49. package/packages/mailx-service/sync-queue.js +10 -0
  50. package/packages/mailx-service/sync-queue.js.map +1 -1
  51. package/packages/mailx-service/sync-queue.ts +11 -0
  52. package/packages/mailx-settings/package.json +1 -1
  53. package/packages/mailx-store-web/package.json +1 -1
  54. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  55. package/packages/mailx-store-web/web-service.js +9 -2
  56. package/packages/mailx-store-web/web-service.js.map +1 -1
  57. package/packages/mailx-store-web/web-service.ts +9 -2
  58. package/packages/mailx-types/package.json +1 -1
@@ -88,6 +88,7 @@ __export(api_client_exports, {
88
88
  openInWord: () => openInWord,
89
89
  openLocalPath: () => openLocalPath,
90
90
  popoutCompose: () => popoutCompose,
91
+ popoutMainWindow: () => popoutMainWindow,
91
92
  popoutWindow: () => popoutWindow,
92
93
  readConfigHelp: () => readConfigHelp,
93
94
  readJsoncFile: () => readJsoncFile,
@@ -647,6 +648,12 @@ function closeComposePopout(id) {
647
648
  const fn = ipc().closeComposePopout;
648
649
  return fn ? fn(id) : Promise.resolve({ ok: false });
649
650
  }
651
+ async function popoutMainWindow(accountId, folderId, name) {
652
+ const fn = ipc().popoutMainWindow;
653
+ if (!fn)
654
+ return { ok: false, reason: "no popoutMainWindow bridge" };
655
+ return fn(accountId, folderId, name);
656
+ }
650
657
  async function getDeviceAccounts() {
651
658
  return ipc().getDeviceAccounts?.() ?? [];
652
659
  }
@@ -1633,7 +1640,7 @@ async function showMessage(accountId, uid, folderId, specialUse, isRetry = false
1633
1640
  bodyEl.innerHTML = `<div class="mv-system-message mv-system-error">
1634
1641
  <div class="mv-system-tag">mailx</div>
1635
1642
  <div class="mv-system-title">Body fetch failed</div>
1636
- <div class="mv-system-body">${escapeHtml2(msg.bodyError)}<br><span style="color:var(--color-text-muted);font-size:0.9em">${transient ? "Reopen this message to retry." : "Permanent \u2014 the message may have been deleted on the server."}</span></div>
1643
+ <div class="mv-system-body">${escapeHtml2(msg.bodyError)}<br><span style="color:var(--color-text-muted);font-size:0.9em">${transient ? "Reopen this message to retry." : "The server reports this message no longer exists (deleted or moved by another client)."}</span></div>
1637
1644
  </div>`;
1638
1645
  currentMessage = msg;
1639
1646
  currentAccountId = accountId;
@@ -6816,6 +6823,15 @@ function renderNode(node, container, depth) {
6816
6823
  { label: "Open in new tab", action: () => {
6817
6824
  openTab({ kind: "folder", accountId: node.accountId, folderId: node.id, specialUse: node.specialUse || "" }, node.name, true);
6818
6825
  } },
6826
+ { label: "Open in new window", action: async () => {
6827
+ try {
6828
+ const r = await popoutMainWindow(node.accountId, node.id, node.name);
6829
+ if (!r?.ok)
6830
+ alert(`New window failed: ${r?.reason || "unknown"}`);
6831
+ } catch (err) {
6832
+ alert(`New window failed: ${err.message}`);
6833
+ }
6834
+ } },
6819
6835
  { label: "", action: () => {
6820
6836
  }, separator: true },
6821
6837
  { label: "Mark all read", action: async () => {
@@ -7522,10 +7538,22 @@ async function loadFolderTree(container) {
7522
7538
  }
7523
7539
  }
7524
7540
  if (!target && (isFirstLoad || !hasAutoSelected)) {
7541
+ const bootGo = new URLSearchParams(location.search);
7542
+ const goAcct = bootGo.get("goAccount");
7543
+ const goFolder = bootGo.get("goFolder");
7544
+ if (goAcct && goFolder) {
7545
+ for (const f of allFolderEls) {
7546
+ const el = f;
7547
+ if (el.dataset.accountId === goAcct && el.dataset.folderId === goFolder) {
7548
+ target = el;
7549
+ break;
7550
+ }
7551
+ }
7552
+ }
7525
7553
  const unified = container.querySelector(".ft-unified");
7526
- if (unified) {
7554
+ if (!target && unified) {
7527
7555
  target = unified;
7528
- } else {
7556
+ } else if (!target) {
7529
7557
  let bestInbox = null;
7530
7558
  let bestCount = -1;
7531
7559
  for (const f of allFolderEls) {
@@ -10589,6 +10617,16 @@ function openShortcutsDialog() {
10589
10617
  }
10590
10618
  var viewBtn = document.getElementById("btn-view");
10591
10619
  var viewDropdown = document.getElementById("view-dropdown");
10620
+ document.getElementById("opt-new-window")?.addEventListener("click", async () => {
10621
+ if (viewDropdown) viewDropdown.hidden = true;
10622
+ try {
10623
+ const { popoutMainWindow: popoutMainWindow2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
10624
+ const r = await popoutMainWindow2();
10625
+ if (!r?.ok) showAlert(`New window failed: ${r?.reason || "unknown"}`);
10626
+ } catch (e) {
10627
+ showAlert(`New window failed: ${e?.message || e}`);
10628
+ }
10629
+ });
10592
10630
  var optTwoLine = document.getElementById("opt-two-line");
10593
10631
  var optEleanor = document.getElementById("opt-eleanor");
10594
10632
  var optPreview = document.getElementById("opt-preview");