@bobfrankston/rmfmail 1.2.229 → 1.2.231

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/TODO.md +27 -0
  2. package/client/app.bundle.js +349 -66
  3. package/client/app.bundle.js.map +4 -4
  4. package/client/app.js +16 -2
  5. package/client/app.js.map +1 -1
  6. package/client/app.ts +14 -1
  7. package/client/components/calendar-sidebar.js +1 -1
  8. package/client/components/calendar-sidebar.js.map +1 -1
  9. package/client/components/calendar-sidebar.ts +1 -1
  10. package/client/components/context-menu.js +12 -1
  11. package/client/components/context-menu.js.map +1 -1
  12. package/client/components/context-menu.ts +36 -1
  13. package/client/components/edit-menu.js +339 -0
  14. package/client/components/edit-menu.js.map +1 -0
  15. package/client/components/edit-menu.ts +343 -0
  16. package/client/components/folder-tree.js +2 -2
  17. package/client/components/folder-tree.js.map +1 -1
  18. package/client/components/folder-tree.ts +2 -2
  19. package/client/components/message-list.js +3 -1
  20. package/client/components/message-list.js.map +1 -1
  21. package/client/components/message-list.ts +3 -1
  22. package/client/compose/compose.bundle.js +254 -83
  23. package/client/compose/compose.bundle.js.map +4 -4
  24. package/client/compose/compose.js +5 -28
  25. package/client/compose/compose.js.map +1 -1
  26. package/client/compose/compose.ts +4 -13
  27. package/client/compose/edit-commands.js +10 -89
  28. package/client/compose/edit-commands.js.map +1 -1
  29. package/client/compose/edit-commands.ts +11 -77
  30. package/package.json +1 -1
  31. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-146480 → node_modules.npmglobalize-stash-7472}/.package-lock.json +0 -0
@@ -0,0 +1,339 @@
1
+ /**
2
+ * The Cut / Copy / Paste / Select-all block, for every menu in the app.
3
+ *
4
+ * Why this exists: mailx replaces the WebView's native context menu almost
5
+ * everywhere (app.ts kills the default one, and each surface builds its own),
6
+ * and a menu that takes over from the native one inherits the native one's
7
+ * JOB — including the clipboard. Surfaces that forgot produced a right-click
8
+ * with no Cut/Copy/Paste at all, which is what a user hits first and what
9
+ * Bob's wife reported (2026-08-09, "some menus don't show copy/cut/paste").
10
+ *
11
+ * Before this file there were three separate clipboard implementations —
12
+ * a rich-editor one in compose/edit-commands.ts, a hand-rolled one for the
13
+ * recipient <input> in compose.ts, and nothing anywhere else. They differed
14
+ * in what they put on the clipboard and in whether a refusal was reported or
15
+ * swallowed. Now every menu builds its clipboard block from `editMenuItems()`
16
+ * and every clipboard action runs through `runClipboard()`.
17
+ *
18
+ * Two execution paths, ONE entry point:
19
+ * - `engine` set (TinyMCE Editor or Quill) → the rich path, which preserves
20
+ * text/html so formatting survives a copy between messages.
21
+ * - otherwise → the DOM path, which handles <input>/<textarea> through
22
+ * value + selectionStart/End, and contenteditable/plain page text through
23
+ * the Selection API.
24
+ *
25
+ * NOT document.execCommand("copy"/"paste"): those need transient user
26
+ * activation, which a context-menu callback (and especially a native-menu
27
+ * callback dispatched from Rust via ExecuteScript) does not carry. The async
28
+ * Clipboard API works from a focused document; clipboard READ is
29
+ * permission-gated and can legitimately be refused — so these functions
30
+ * REJECT with a real message instead of returning quietly, and every caller
31
+ * surfaces it. A menu item that silently does nothing is worse than no menu
32
+ * item.
33
+ */
34
+ /** Input types whose value is text the user can sensibly cut/copy/paste.
35
+ * Deliberately excludes the pickers (date, color, file, checkbox…), where a
36
+ * clipboard item would do nothing. */
37
+ const TEXTUAL_INPUT_TYPES = new Set([
38
+ "text", "search", "email", "url", "tel", "number", "password", "",
39
+ ]);
40
+ function isTinyEngine(ne) {
41
+ return !!ne && typeof ne.execCommand === "function" && !!ne.selection;
42
+ }
43
+ /** Classify `target` for the purposes of a clipboard menu. Never throws —
44
+ * a menu must open even if it can't offer anything. */
45
+ export function describeEditTarget(target) {
46
+ const none = { el: null, editable: false, selection: "", canRead: true, isField: false };
47
+ const node = target;
48
+ if (!node)
49
+ return { ...none, selection: pageSelection() };
50
+ const start = (node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement);
51
+ if (!start)
52
+ return { ...none, selection: pageSelection() };
53
+ const field = start.closest("input, textarea");
54
+ if (field) {
55
+ const type = (field instanceof HTMLInputElement ? field.type : "text").toLowerCase();
56
+ if (!TEXTUAL_INPUT_TYPES.has(type))
57
+ return { ...none, selection: pageSelection() };
58
+ const s = field.selectionStart ?? 0, e = field.selectionEnd ?? 0;
59
+ return {
60
+ el: field,
61
+ editable: !field.readOnly && !field.disabled,
62
+ selection: e > s ? field.value.slice(s, e) : "",
63
+ canRead: type !== "password",
64
+ isField: true,
65
+ };
66
+ }
67
+ const ce = start.closest("[contenteditable]");
68
+ const editable = !!ce && ce.isContentEditable;
69
+ return { el: ce || start, editable, selection: pageSelection(), canRead: true, isField: false };
70
+ }
71
+ function pageSelection() {
72
+ try {
73
+ return window.getSelection()?.toString() || "";
74
+ }
75
+ catch {
76
+ return "";
77
+ }
78
+ }
79
+ function escapeHtml(s) {
80
+ return s.replace(/[&<>]/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;" }[c]));
81
+ }
82
+ /** Read the clipboard, preferring text/html so formatting survives a paste
83
+ * exactly as Ctrl+V would. Returns both shapes; callers pick. */
84
+ async function readClipboard() {
85
+ let html = "", text = "";
86
+ if (navigator.clipboard?.read) {
87
+ for (const item of await navigator.clipboard.read()) {
88
+ if (item.types.includes("text/html"))
89
+ html = await (await item.getType("text/html")).text();
90
+ if (item.types.includes("text/plain"))
91
+ text = await (await item.getType("text/plain")).text();
92
+ }
93
+ // Chromium resolves read() with an empty list rather than rejecting
94
+ // when the page isn't allowed to read — don't let that look like an
95
+ // empty clipboard.
96
+ if (!html && !text)
97
+ text = await navigator.clipboard.readText();
98
+ }
99
+ else {
100
+ text = await navigator.clipboard.readText();
101
+ }
102
+ return { html, text };
103
+ }
104
+ /** Write `text` (and optionally `html`) to the clipboard in one item, so a
105
+ * paste into a rich target keeps formatting and a paste into a plain one
106
+ * still gets sensible text. */
107
+ async function writeClipboard(text, html) {
108
+ if (html && typeof ClipboardItem === "function" && navigator.clipboard?.write) {
109
+ await navigator.clipboard.write([new ClipboardItem({
110
+ "text/html": new Blob([html], { type: "text/html" }),
111
+ "text/plain": new Blob([text], { type: "text/plain" }),
112
+ })]);
113
+ return;
114
+ }
115
+ await navigator.clipboard.writeText(text);
116
+ }
117
+ /** Expand a collapsed caret to the word under it, so "right-click a word →
118
+ * Copy" acts on that word rather than on nothing. Rich-editor path only:
119
+ * in a plain field an empty selection means empty, and silently grabbing a
120
+ * word would be a surprise. */
121
+ function expandToWord(ne) {
122
+ if (isTinyEngine(ne)) {
123
+ try {
124
+ if (ne.selection.isCollapsed() && typeof ne.selection.expand === "function") {
125
+ ne.selection.expand({ type: "word" });
126
+ }
127
+ }
128
+ catch { /* older TinyMCE — the command still applies at the caret */ }
129
+ return;
130
+ }
131
+ if (ne && typeof ne.getSelection === "function" && typeof ne.setSelection === "function") {
132
+ const sel = ne.getSelection();
133
+ if (!sel || sel.length > 0)
134
+ return;
135
+ const text = ne.getText();
136
+ let a = sel.index, b = sel.index;
137
+ while (a > 0 && /\S/.test(text[a - 1]))
138
+ a--;
139
+ while (b < text.length && /\S/.test(text[b]))
140
+ b++;
141
+ if (b > a)
142
+ ne.setSelection(a, b - a);
143
+ }
144
+ }
145
+ /** Replace the selected range of an <input>/<textarea> with `text`, leaving
146
+ * the caret after it, and fire `input` so listeners (autocomplete, autosave,
147
+ * auto-grow) see the change — assigning .value alone fires nothing. */
148
+ function replaceFieldSelection(field, text) {
149
+ const s = field.selectionStart ?? field.value.length;
150
+ const e = field.selectionEnd ?? field.value.length;
151
+ field.value = field.value.slice(0, s) + text + field.value.slice(e);
152
+ field.selectionStart = field.selectionEnd = s + text.length;
153
+ field.dispatchEvent(new Event("input", { bubbles: true }));
154
+ }
155
+ /**
156
+ * Run a clipboard command for `ctx`. Rejects (never swallows) when the
157
+ * clipboard refuses — callers report it.
158
+ */
159
+ export async function runClipboard(ctx, id) {
160
+ if (ctx.engine)
161
+ return runEngineClipboard(ctx.engine, id);
162
+ const info = describeEditTarget(ctx.target);
163
+ if (id === "paste") {
164
+ if (!info.editable || !info.el)
165
+ throw new Error("nothing here accepts a paste");
166
+ const { html, text } = await readClipboard();
167
+ if (info.isField) {
168
+ // A field holds text, so HTML on the clipboard is pasted as its
169
+ // text — which is what every other app does here.
170
+ if (!text && !html)
171
+ return;
172
+ replaceFieldSelection(info.el, text || stripHtml(html));
173
+ return;
174
+ }
175
+ const content = html || (text ? escapeHtml(text).replace(/\r?\n/g, "<br>") : "");
176
+ if (!content)
177
+ return;
178
+ insertHtmlAtSelection(info.el, content);
179
+ return;
180
+ }
181
+ if (!info.canRead)
182
+ throw new Error("this field's contents can't be copied");
183
+ if (!info.selection)
184
+ return; // nothing selected — no-op, not an error
185
+ if (info.isField) {
186
+ await writeClipboard(info.selection);
187
+ }
188
+ else {
189
+ await writeClipboard(info.selection, selectionHtml());
190
+ }
191
+ if (id !== "cut")
192
+ return;
193
+ if (!info.editable)
194
+ throw new Error("this text is read-only — copied instead of cut");
195
+ if (info.isField) {
196
+ replaceFieldSelection(info.el, "");
197
+ return;
198
+ }
199
+ try {
200
+ window.getSelection()?.deleteFromDocument();
201
+ }
202
+ catch { /* selection vanished */ }
203
+ }
204
+ /** Rich-editor clipboard (TinyMCE / Quill). Keeps text/html on copy so a
205
+ * formatted quote survives the round trip. */
206
+ async function runEngineClipboard(ne, id) {
207
+ const isTiny = isTinyEngine(ne);
208
+ if (id === "paste") {
209
+ const { html, text } = await readClipboard();
210
+ const content = html || (text ? escapeHtml(text).replace(/\r?\n/g, "<br>") : "");
211
+ if (!content)
212
+ return;
213
+ if (isTiny) {
214
+ ne.execCommand("mceInsertContent", false, content);
215
+ return;
216
+ }
217
+ if (ne?.clipboard?.dangerouslyPasteHTML) {
218
+ const sel = ne.getSelection(true);
219
+ ne.clipboard.dangerouslyPasteHTML(sel?.index ?? 0, content);
220
+ return;
221
+ }
222
+ throw new Error("editor doesn't support paste");
223
+ }
224
+ expandToWord(ne);
225
+ let html = "", text = "";
226
+ if (isTiny) {
227
+ html = ne.selection.getContent({ format: "html" });
228
+ text = ne.selection.getContent({ format: "text" });
229
+ }
230
+ else {
231
+ text = pageSelection();
232
+ html = selectionHtml();
233
+ }
234
+ if (!text && !html)
235
+ return;
236
+ await writeClipboard(text, html || undefined);
237
+ if (id !== "cut")
238
+ return;
239
+ if (isTiny) {
240
+ ne.execCommand("Delete");
241
+ return;
242
+ }
243
+ if (typeof ne?.deleteText === "function") {
244
+ const sel = ne.getSelection();
245
+ if (sel?.length)
246
+ ne.deleteText(sel.index, sel.length);
247
+ }
248
+ }
249
+ /** Serialize the current DOM selection as HTML, for a formatting-preserving copy. */
250
+ function selectionHtml() {
251
+ try {
252
+ const sel = window.getSelection();
253
+ if (!sel || sel.rangeCount === 0 || sel.isCollapsed)
254
+ return "";
255
+ const div = document.createElement("div");
256
+ div.appendChild(sel.getRangeAt(0).cloneContents());
257
+ return div.innerHTML;
258
+ }
259
+ catch {
260
+ return "";
261
+ }
262
+ }
263
+ function stripHtml(html) {
264
+ const div = document.createElement("div");
265
+ div.innerHTML = html;
266
+ return div.textContent || "";
267
+ }
268
+ /** Insert `html` at the caret inside a contenteditable host. */
269
+ function insertHtmlAtSelection(host, html) {
270
+ const sel = window.getSelection();
271
+ const frag = document.createRange().createContextualFragment(html);
272
+ if (!sel || sel.rangeCount === 0) {
273
+ host?.appendChild(frag);
274
+ return;
275
+ }
276
+ const range = sel.getRangeAt(0);
277
+ range.deleteContents();
278
+ const last = frag.lastChild;
279
+ range.insertNode(frag);
280
+ if (last) {
281
+ range.setStartAfter(last);
282
+ range.collapse(true);
283
+ sel.removeAllRanges();
284
+ sel.addRange(range);
285
+ }
286
+ }
287
+ /** Select everything in the target — the field's value, or the page selection
288
+ * scoped to the element the menu was opened over. */
289
+ function selectAll(info) {
290
+ if (info.isField && info.el) {
291
+ info.el.select();
292
+ return;
293
+ }
294
+ const host = info.el;
295
+ if (!host)
296
+ return;
297
+ const range = document.createRange();
298
+ range.selectNodeContents(host);
299
+ const sel = window.getSelection();
300
+ sel?.removeAllRanges();
301
+ sel?.addRange(range);
302
+ }
303
+ /**
304
+ * The clipboard block for a menu, ready to spread into an items array.
305
+ *
306
+ * Returns [] when the right-click landed somewhere none of it applies (a
307
+ * message row with no selection, a folder name, an icon) — so callers can
308
+ * spread it unconditionally without ending up with a menu full of dead
309
+ * entries. Items that apply but aren't currently available (Copy with nothing
310
+ * selected) are shown DISABLED rather than hidden, so the menu doesn't change
311
+ * shape under the pointer.
312
+ */
313
+ export function editMenuItems(ctx, opts = {}) {
314
+ const report = opts.onError || ((m) => console.warn(`[edit-menu] ${m}`));
315
+ const info = ctx.engine
316
+ ? { el: null, editable: true, selection: pageSelection(), canRead: true, isField: false }
317
+ : describeEditTarget(ctx.target);
318
+ // Nothing to offer: not editable, and no text selected to copy.
319
+ if (!ctx.engine && !info.editable && !info.selection)
320
+ return [];
321
+ const run = (id) => () => {
322
+ void runClipboard(ctx, id).catch((e) => {
323
+ const key = id === "cut" ? "Ctrl+X" : id === "copy" ? "Ctrl+C" : "Ctrl+V";
324
+ const what = id[0].toUpperCase() + id.slice(1);
325
+ report(`${what} failed: ${e?.message || e}. ${key} still works.`);
326
+ });
327
+ };
328
+ const hasSel = !!ctx.engine || !!info.selection;
329
+ const items = [
330
+ { label: "Cut", action: run("cut"), disabled: !info.editable || !hasSel || !info.canRead },
331
+ { label: "Copy", action: run("copy"), disabled: !hasSel || !info.canRead },
332
+ { label: "Paste", action: run("paste"), disabled: !info.editable },
333
+ ];
334
+ if (opts.selectAll !== false && !ctx.engine) {
335
+ items.push({ label: "Select all", action: () => selectAll(info) });
336
+ }
337
+ return items;
338
+ }
339
+ //# sourceMappingURL=edit-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-menu.js","sourceRoot":"","sources":["edit-menu.ts"],"names":[],"mappings":"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"}