@bobfrankston/rmfmail 1.2.243 → 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.
package/client/app.js CHANGED
@@ -6,7 +6,7 @@ import { initFolderTree, refreshFolderTree, updateFolderCounts, setFolderSynced,
6
6
  import { initMessageList, loadMessages, loadUnifiedInbox, loadSearchResults, reloadCurrentFolder, clearSearchMode, getSelectedMessages, markBodiesCached, getCurrentFocused, releaseFocus, removeMessagesAndReconcile, setRowFlagged, scrollFocusedIntoView, refreshPriorityIndex, revealMessage, getCurrentView, selectAllVisible, exitMultiSelect, getDateBasis, setDateBasis } from "./components/message-list.js";
7
7
  import { seenOf, flaggedOf, draftOf, setSeen, setFlagged } from "@bobfrankston/mailx-types";
8
8
  import { initTabs, setActiveView as setActiveTabView, openTab } from "./components/tabs.js";
9
- import { getCurrentMessage, initViewer, popOutCurrentMessage, popOutToWindow, printCurrentMessage, toggleFullscreenPreview, showPreviewBodyMenu, wrapHtmlBody } from "./components/message-viewer.js";
9
+ import { getCurrentMessage, initViewer, popOutCurrentMessage, popOutToWindow, printCurrentMessage, toggleFullscreenPreview, showPreviewBodyMenu } from "./components/message-viewer.js";
10
10
  import { connectWebSocket, onWsEvent, triggerSync, syncAccount, reauthenticate, getAccounts, getFolders, deleteMessage, deleteMessages, undeleteMessage, restartServer, getSyncPending, getVersion, getSettings, saveSettings, getAutocompleteSettings, saveAutocompleteSettings, repairAccounts, updateFlags, markAsSpamMessages, logClientEvent, sendMessage as apiSendMessage, subscribeStore, cancelServerSearch, installConsoleCapture, getAttachment } from "./lib/api-client.js";
11
11
  import * as messageState from "./lib/message-state.js";
12
12
  import { editMenuItems } from "./components/edit-menu.js";
@@ -6511,61 +6511,21 @@ document.addEventListener("mailx-popout-message", (async (e) => {
6511
6511
  showComposeOverlay(msg.subject ? `Edit: ${msg.subject}` : "Edit draft");
6512
6512
  return;
6513
6513
  }
6514
- const wrapper = document.createElement("div");
6515
- wrapper.className = "popout-overlay";
6516
- 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;";
6517
- const header = document.createElement("div");
6518
- 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;";
6519
- const title = document.createElement("span");
6520
- title.textContent = subject || "(no subject)";
6521
- title.style.cssText = "flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;";
6522
- const closeBtn = document.createElement("button");
6523
- closeBtn.textContent = "×";
6524
- closeBtn.style.cssText = "background:none;border:none;font-size:1.4rem;cursor:pointer;padding:0 8px;";
6525
- closeBtn.addEventListener("click", () => wrapper.remove());
6526
- header.appendChild(title);
6527
- header.appendChild(closeBtn);
6528
- const meta = document.createElement("div");
6529
- meta.style.cssText = "padding:8px 12px;border-bottom:1px solid var(--color-border);font-size:0.9rem;color:var(--color-text-muted);";
6530
- meta.innerHTML = `<div><b>From:</b> ${escapeHtmlBasic(msg.from?.name || "")} &lt;${escapeHtmlBasic(msg.from?.address || "")}&gt;</div>
6531
- <div><b>To:</b> ${(msg.to || []).map((a) => escapeHtmlBasic(`${a.name || ""} <${a.address}>`)).join(", ")}</div>
6532
- ${msg.cc?.length ? `<div><b>Cc:</b> ${msg.cc.map((a) => escapeHtmlBasic(`${a.name || ""} <${a.address}>`)).join(", ")}</div>` : ""}
6533
- <div><b>Date:</b> ${new Date(msg.date).toLocaleString()}</div>`;
6534
- const body = document.createElement("iframe");
6535
- body.style.cssText = "flex:1;border:none;width:100%;background:#fff;";
6536
- body.sandbox.add("allow-same-origin");
6537
- wrapper.appendChild(header);
6538
- wrapper.appendChild(meta);
6539
- wrapper.appendChild(body);
6540
- document.body.appendChild(wrapper);
6541
- // Use the same wrapHtmlBody styling as the inline preview pane so the
6542
- // popout's typography matches the preview's typography. Earlier the
6543
- // popout fed bodyHtml DIRECTLY into srcdoc with no CSS wrapping, so
6544
- // the browser used its default font (Times serif) while the preview
6545
- // pane used system-ui sans-serif (Bob 2026-05-12: "double clicking on
6546
- // the summary shows in a different font than in preview").
6547
- body.srcdoc = msg.bodyHtml
6548
- ? wrapHtmlBody(msg.bodyHtml, !!msg.remoteAllowed)
6549
- : `<!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>`;
6550
- // Drag-to-move.
6551
- let dragX = 0, dragY = 0, dragging = false;
6552
- header.addEventListener("mousedown", (de) => {
6553
- if (de.target.tagName === "BUTTON")
6554
- return;
6555
- dragging = true;
6556
- const rect = wrapper.getBoundingClientRect();
6557
- dragX = de.clientX - rect.left;
6558
- dragY = de.clientY - rect.top;
6559
- de.preventDefault();
6560
- });
6561
- document.addEventListener("mousemove", (de) => {
6562
- if (!dragging)
6563
- return;
6564
- wrapper.style.left = `${de.clientX - dragX}px`;
6565
- wrapper.style.top = `${de.clientY - dragY}px`;
6566
- wrapper.style.right = "auto";
6567
- });
6568
- document.addEventListener("mouseup", () => { dragging = false; });
6514
+ // ONE read-only popout, not three. This handler used to build its own
6515
+ // `.popout-overlay` — header, meta block, body iframe — with NO action
6516
+ // buttons at all, which is what a double-click on a message opened:
6517
+ // "I wanted to pop this out for editing but I don't see any controls.
6518
+ // It's just a view without even the reply etc." (Bob 2026-08-09). The
6519
+ // other two popout surfaces (the ⧉ overlay in message-viewer.ts and the
6520
+ // native msger window in popout-server.ts) have had a Reply/Reply-All/
6521
+ // Forward/Edit-as-new/Flag/Delete toolbar since 2026-05-16; this copy
6522
+ // never got one, and the handler's own comment noted it was "missing
6523
+ // every action button" while working around it for drafts only.
6524
+ //
6525
+ // Deleting the copy is the fix: double-click now opens the SAME overlay
6526
+ // the toolbar button does, so there is one surface to keep working.
6527
+ const { spawnDesktopPopout } = await import("./components/message-viewer.js");
6528
+ spawnDesktopPopout(msg, accountId);
6569
6529
  }));
6570
6530
  function escapeHtmlBasic(s) {
6571
6531
  return (s || "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", "\"": "&quot;", "'": "&#39;" }[c]));