@bobfrankston/rmfmail 1.2.242 → 1.2.244

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 (31) hide show
  1. package/client/android-bootstrap.bundle.js +24 -2
  2. package/client/android-bootstrap.bundle.js.map +2 -2
  3. package/client/app.bundle.js +28 -52
  4. package/client/app.bundle.js.map +3 -3
  5. package/client/app.js +22 -57
  6. package/client/app.js.map +1 -1
  7. package/client/app.ts +21 -54
  8. package/client/components/message-list.js +13 -2
  9. package/client/components/message-list.js.map +1 -1
  10. package/client/components/message-viewer.js +10 -2
  11. package/client/components/message-viewer.js.map +1 -1
  12. package/client/components/message-viewer.ts +11 -2
  13. package/package.json +7 -7
  14. package/packages/mailx-imap/index.d.ts +9 -0
  15. package/packages/mailx-imap/index.d.ts.map +1 -1
  16. package/packages/mailx-imap/index.js +86 -0
  17. package/packages/mailx-imap/index.js.map +1 -1
  18. package/packages/mailx-imap/index.ts +73 -0
  19. package/packages/mailx-imap/package-lock.json +2 -2
  20. package/packages/mailx-imap/package.json +1 -1
  21. package/packages/mailx-service/index.d.ts.map +1 -1
  22. package/packages/mailx-service/index.js +37 -4
  23. package/packages/mailx-service/index.js.map +1 -1
  24. package/packages/mailx-types/mime-inline-images.d.ts +0 -4
  25. package/packages/mailx-types/mime-inline-images.d.ts.map +1 -1
  26. package/packages/mailx-types/mime-inline-images.js +48 -4
  27. package/packages/mailx-types/mime-inline-images.js.map +1 -1
  28. package/packages/mailx-types/mime-inline-images.ts +45 -5
  29. package/packages/mailx-types/package.json +1 -1
  30. package/packages/mailx-types/test/inline-images.test.mjs +79 -0
  31. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-33484 → node_modules.npmglobalize-stash-55392}/.package-lock.json +0 -0
@@ -1621,6 +1621,24 @@ var init_address_book = __esm({
1621
1621
  });
1622
1622
 
1623
1623
  // client/components/message-viewer.js
1624
+ var message_viewer_exports = {};
1625
+ __export(message_viewer_exports, {
1626
+ clearViewer: () => clearViewer,
1627
+ getCurrentMessage: () => getCurrentMessage,
1628
+ initViewer: () => initViewer,
1629
+ invalidateParsedCache: () => invalidateParsedCache,
1630
+ popOutCurrentMessage: () => popOutCurrentMessage,
1631
+ popOutToWindow: () => popOutToWindow,
1632
+ printCurrentMessage: () => printCurrentMessage,
1633
+ printMessage: () => printMessage,
1634
+ saveCurrentMessageAsEml: () => saveCurrentMessageAsEml,
1635
+ saveCurrentMessageAsHtml: () => saveCurrentMessageAsHtml,
1636
+ showMessage: () => showMessage,
1637
+ showPreviewBodyMenu: () => showPreviewBodyMenu,
1638
+ spawnDesktopPopout: () => spawnDesktopPopout,
1639
+ toggleFullscreenPreview: () => toggleFullscreenPreview,
1640
+ wrapHtmlBody: () => wrapHtmlBody
1641
+ });
1624
1642
  function parsedCacheGet(accountId, folderId, uid) {
1625
1643
  if (folderId == null)
1626
1644
  return null;
@@ -3503,7 +3521,10 @@ function buildPrintableDoc(m) {
3503
3521
  function printCurrentMessage() {
3504
3522
  if (!currentMessage)
3505
3523
  return;
3506
- const doc = buildPrintableDoc(currentMessage);
3524
+ printMessage(currentMessage);
3525
+ }
3526
+ function printMessage(msg) {
3527
+ const doc = buildPrintableDoc(msg);
3507
3528
  if (!doc)
3508
3529
  return;
3509
3530
  const iframe = document.createElement("iframe");
@@ -4691,7 +4712,9 @@ async function loadSearchResults(query, scope = "all", accountId = "", folderId
4691
4712
  const partial = !!result.partial;
4692
4713
  const foldersFailed = result.foldersFailed || 0;
4693
4714
  const foldersSearched = result.foldersSearched || 0;
4694
- const partialNote = partial ? `<div class="ml-search-warning">\u26A0 Searched ${foldersSearched} folder(s); ${foldersFailed} could not be searched (timeout / connection). Results may be incomplete \u2014 retry to search them again.</div>` : "";
4715
+ const foldersGone = result.foldersGone || 0;
4716
+ const goneNote = foldersGone > 0 ? `<div class="ml-search-warning">Removed ${foldersGone} stale folder(s) that no longer exist on the server \u2014 they won't be searched again.</div>` : "";
4717
+ const partialNote = (partial && foldersFailed > 0 ? `<div class="ml-search-warning">\u26A0 Searched ${foldersSearched} folder(s); ${foldersFailed} timed out. Results may be incomplete \u2014 search again to retry those.</div>` : "") + goneNote;
4695
4718
  if (result.items.length === 0) {
4696
4719
  setMessages([]);
4697
4720
  body.innerHTML = partialNote + `<div class="ml-empty">No messages found by "${escapeHtmlText(query)}"${partial ? " in the folders that responded" : ""}</div>`;
@@ -10336,7 +10359,7 @@ document.addEventListener("mailx-compose", ((e) => {
10336
10359
  if (e.detail.mode === "draft" && sessionStorage.getItem("composeInit")) {
10337
10360
  showComposeOverlay();
10338
10361
  } else {
10339
- openCompose(e.detail.mode);
10362
+ openCompose(e.detail.mode, e.detail.message, e.detail.accountId);
10340
10363
  }
10341
10364
  }));
10342
10365
  document.addEventListener("mailx-delete", () => deleteSelection());
@@ -13232,56 +13255,9 @@ document.addEventListener("mailx-popout-message", (async (e) => {
13232
13255
  showComposeOverlay(msg.subject ? `Edit: ${msg.subject}` : "Edit draft");
13233
13256
  return;
13234
13257
  }
13235
- const wrapper = document.createElement("div");
13236
- wrapper.className = "popout-overlay";
13237
- wrapper.style.cssText = "position:fixed;top:5vh;right:5vw;width:min(900px,60vw);height:min(800px,80vh);z-index:1500;background:var(--color-bg);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 8px 32px rgba(0,0,0,0.3);display:flex;flex-direction:column;resize:both;overflow:hidden;";
13238
- const header = document.createElement("div");
13239
- header.style.cssText = "display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--color-bg-surface);border-bottom:1px solid var(--color-border);font-weight:600;cursor:move;";
13240
- const title = document.createElement("span");
13241
- title.textContent = subject || "(no subject)";
13242
- title.style.cssText = "flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;";
13243
- const closeBtn = document.createElement("button");
13244
- closeBtn.textContent = "\xD7";
13245
- closeBtn.style.cssText = "background:none;border:none;font-size:1.4rem;cursor:pointer;padding:0 8px;";
13246
- closeBtn.addEventListener("click", () => wrapper.remove());
13247
- header.appendChild(title);
13248
- header.appendChild(closeBtn);
13249
- const meta = document.createElement("div");
13250
- meta.style.cssText = "padding:8px 12px;border-bottom:1px solid var(--color-border);font-size:0.9rem;color:var(--color-text-muted);";
13251
- meta.innerHTML = `<div><b>From:</b> ${escapeHtmlBasic(msg.from?.name || "")} &lt;${escapeHtmlBasic(msg.from?.address || "")}&gt;</div>
13252
- <div><b>To:</b> ${(msg.to || []).map((a) => escapeHtmlBasic(`${a.name || ""} <${a.address}>`)).join(", ")}</div>
13253
- ${msg.cc?.length ? `<div><b>Cc:</b> ${msg.cc.map((a) => escapeHtmlBasic(`${a.name || ""} <${a.address}>`)).join(", ")}</div>` : ""}
13254
- <div><b>Date:</b> ${new Date(msg.date).toLocaleString()}</div>`;
13255
- const body = document.createElement("iframe");
13256
- body.style.cssText = "flex:1;border:none;width:100%;background:#fff;";
13257
- body.sandbox.add("allow-same-origin");
13258
- wrapper.appendChild(header);
13259
- wrapper.appendChild(meta);
13260
- wrapper.appendChild(body);
13261
- document.body.appendChild(wrapper);
13262
- body.srcdoc = msg.bodyHtml ? wrapHtmlBody(msg.bodyHtml, !!msg.remoteAllowed) : `<!DOCTYPE html><html><head><style>body{font-family:system-ui,sans-serif;font-size:17.5px;line-height:1.5;color:#1a1a2e;padding:1rem;margin:0;}pre{white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:inherit;margin:0;}</style></head><body><pre>${escapeHtmlBasic(msg.bodyText || "(no body)")}</pre></body></html>`;
13263
- let dragX = 0, dragY = 0, dragging = false;
13264
- header.addEventListener("mousedown", (de) => {
13265
- if (de.target.tagName === "BUTTON") return;
13266
- dragging = true;
13267
- const rect = wrapper.getBoundingClientRect();
13268
- dragX = de.clientX - rect.left;
13269
- dragY = de.clientY - rect.top;
13270
- de.preventDefault();
13271
- });
13272
- document.addEventListener("mousemove", (de) => {
13273
- if (!dragging) return;
13274
- wrapper.style.left = `${de.clientX - dragX}px`;
13275
- wrapper.style.top = `${de.clientY - dragY}px`;
13276
- wrapper.style.right = "auto";
13277
- });
13278
- document.addEventListener("mouseup", () => {
13279
- dragging = false;
13280
- });
13258
+ const { spawnDesktopPopout: spawnDesktopPopout2 } = await Promise.resolve().then(() => (init_message_viewer(), message_viewer_exports));
13259
+ spawnDesktopPopout2(msg, accountId);
13281
13260
  }));
13282
- function escapeHtmlBasic(s) {
13283
- return (s || "").replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
13284
- }
13285
13261
  document.getElementById("status-queue")?.addEventListener("click", async () => {
13286
13262
  try {
13287
13263
  const { openOutboxView: openOutboxView2 } = await Promise.resolve().then(() => (init_outbox_view(), outbox_view_exports));