@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.
- package/TODO.md +27 -0
- package/client/app.bundle.js +349 -66
- package/client/app.bundle.js.map +4 -4
- package/client/app.js +16 -2
- package/client/app.js.map +1 -1
- package/client/app.ts +14 -1
- package/client/components/calendar-sidebar.js +1 -1
- package/client/components/calendar-sidebar.js.map +1 -1
- package/client/components/calendar-sidebar.ts +1 -1
- package/client/components/context-menu.js +12 -1
- package/client/components/context-menu.js.map +1 -1
- package/client/components/context-menu.ts +36 -1
- package/client/components/edit-menu.js +339 -0
- package/client/components/edit-menu.js.map +1 -0
- package/client/components/edit-menu.ts +343 -0
- package/client/components/folder-tree.js +2 -2
- package/client/components/folder-tree.js.map +1 -1
- package/client/components/folder-tree.ts +2 -2
- package/client/components/message-list.js +3 -1
- package/client/components/message-list.js.map +1 -1
- package/client/components/message-list.ts +3 -1
- package/client/compose/compose.bundle.js +254 -83
- package/client/compose/compose.bundle.js.map +4 -4
- package/client/compose/compose.js +5 -28
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +4 -13
- package/client/compose/edit-commands.js +10 -89
- package/client/compose/edit-commands.js.map +1 -1
- package/client/compose/edit-commands.ts +11 -77
- package/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-146480 → node_modules.npmglobalize-stash-7472}/.package-lock.json +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["edit-commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["edit-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Editor FORMATTING commands for compose menus.
|
|
3
|
+
*
|
|
4
|
+
* The clipboard half of these menus moved to components/edit-menu.ts, which
|
|
5
|
+
* every menu in the app now shares — compose's editors, compose's recipient
|
|
6
|
+
* fields, and each main-window surface. What stays here is what's specific to
|
|
7
|
+
* a rich editor: bold/italic/link/clear, and the word-expansion they act on.
|
|
3
8
|
*
|
|
4
9
|
* These exist because mailx has THREE right-click menus over the same editor
|
|
5
10
|
* and they kept drifting apart:
|
|
@@ -20,6 +25,8 @@
|
|
|
20
25
|
* branching happens once, here, instead of in each menu.
|
|
21
26
|
*/
|
|
22
27
|
|
|
28
|
+
import { editMenuItems } from "../components/edit-menu.js";
|
|
29
|
+
|
|
23
30
|
export type EditCommandId = "cut" | "copy" | "paste" | "bold" | "italic" | "underline" | "strike" | "link" | "clear";
|
|
24
31
|
|
|
25
32
|
function isTinyEditor(ne: any): boolean {
|
|
@@ -49,72 +56,6 @@ function expandToWord(ne: any): void {
|
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
58
|
|
|
52
|
-
function escapeHtml(s: string): string {
|
|
53
|
-
return s.replace(/[&<>]/g, c => ({ "&": "&", "<": "<", ">": ">" }[c] as string));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Cut / Copy / Paste through the async Clipboard API.
|
|
58
|
-
*
|
|
59
|
-
* NOT document.execCommand: that needs transient user activation, which a
|
|
60
|
-
* native-menu callback (dispatched from Rust via ExecuteScript) does not
|
|
61
|
-
* carry. Clipboard WRITE is allowed for a focused document; clipboard READ is
|
|
62
|
-
* permission-gated and can legitimately be refused — which is why this
|
|
63
|
-
* rejects with a real message instead of returning quietly. Callers surface
|
|
64
|
-
* it; a menu item that silently does nothing is worse than no menu item.
|
|
65
|
-
*/
|
|
66
|
-
export async function runClipboardCommand(ne: any, id: "cut" | "copy" | "paste"): Promise<void> {
|
|
67
|
-
const isTiny = isTinyEditor(ne);
|
|
68
|
-
if (id === "paste") {
|
|
69
|
-
let html = "";
|
|
70
|
-
let text = "";
|
|
71
|
-
if (navigator.clipboard?.read) {
|
|
72
|
-
for (const item of await navigator.clipboard.read()) {
|
|
73
|
-
if (item.types.includes("text/html")) html = await (await item.getType("text/html")).text();
|
|
74
|
-
if (item.types.includes("text/plain")) text = await (await item.getType("text/plain")).text();
|
|
75
|
-
}
|
|
76
|
-
} else {
|
|
77
|
-
text = await navigator.clipboard.readText();
|
|
78
|
-
}
|
|
79
|
-
// Prefer HTML so formatting survives, as Ctrl+V would. Plain text has
|
|
80
|
-
// to be escaped and line-broken by hand or it lands as raw markup.
|
|
81
|
-
const content = html || (text ? escapeHtml(text).replace(/\r?\n/g, "<br>") : "");
|
|
82
|
-
if (!content) return;
|
|
83
|
-
if (isTiny) { ne.execCommand("mceInsertContent", false, content); return; }
|
|
84
|
-
if (ne?.clipboard?.dangerouslyPasteHTML) {
|
|
85
|
-
const sel = ne.getSelection(true);
|
|
86
|
-
ne.clipboard.dangerouslyPasteHTML(sel?.index ?? 0, content);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
throw new Error("editor doesn't support paste");
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
expandToWord(ne);
|
|
93
|
-
let html = "";
|
|
94
|
-
let text = "";
|
|
95
|
-
if (isTiny) {
|
|
96
|
-
html = ne.selection.getContent({ format: "html" });
|
|
97
|
-
text = ne.selection.getContent({ format: "text" });
|
|
98
|
-
} else {
|
|
99
|
-
text = window.getSelection()?.toString() || "";
|
|
100
|
-
}
|
|
101
|
-
if (!text && !html) return;
|
|
102
|
-
if (html && typeof ClipboardItem === "function" && navigator.clipboard?.write) {
|
|
103
|
-
await navigator.clipboard.write([new ClipboardItem({
|
|
104
|
-
"text/html": new Blob([html], { type: "text/html" }),
|
|
105
|
-
"text/plain": new Blob([text], { type: "text/plain" }),
|
|
106
|
-
})]);
|
|
107
|
-
} else {
|
|
108
|
-
await navigator.clipboard.writeText(text);
|
|
109
|
-
}
|
|
110
|
-
if (id !== "cut") return;
|
|
111
|
-
if (isTiny) { ne.execCommand("Delete"); return; }
|
|
112
|
-
if (typeof ne?.deleteText === "function") {
|
|
113
|
-
const sel = ne.getSelection();
|
|
114
|
-
if (sel?.length) ne.deleteText(sel.index, sel.length);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
59
|
/** Bold / Italic / Underline / Strikethrough / Link / Clear formatting, acting
|
|
119
60
|
* on the selection or, with a collapsed caret, the word under it. */
|
|
120
61
|
export function runFormatCommand(ne: any, id: EditCommandId): void {
|
|
@@ -152,19 +93,12 @@ export function standardEditItems(
|
|
|
152
93
|
getEditor: () => any,
|
|
153
94
|
opts: { onError?: (msg: string) => void; showSource?: () => void } = {},
|
|
154
95
|
): Array<{ label: string; action: () => void; separator?: boolean }> {
|
|
155
|
-
const report = opts.onError || ((m: string) => console.warn(`[edit-commands] ${m}`));
|
|
156
|
-
const clip = (id: "cut" | "copy" | "paste") => () => {
|
|
157
|
-
void runClipboardCommand(getEditor(), id).catch((e: any) => {
|
|
158
|
-
const key = id === "cut" ? "Ctrl+X" : id === "copy" ? "Ctrl+C" : "Ctrl+V";
|
|
159
|
-
report(`${id[0].toUpperCase()}${id.slice(1)} failed: ${e?.message || e}. ${key} still works.`);
|
|
160
|
-
});
|
|
161
|
-
};
|
|
162
96
|
const fmt = (id: EditCommandId) => () => runFormatCommand(getEditor(), id);
|
|
97
|
+
// Clipboard block comes from the shared implementation — the same one the
|
|
98
|
+
// main window's menus use, so the two can't drift apart again.
|
|
163
99
|
const items: Array<{ label: string; action: () => void; separator?: boolean }> = [
|
|
164
100
|
{ label: "", action: () => { /* */ }, separator: true },
|
|
165
|
-
{
|
|
166
|
-
{ label: "Copy", action: clip("copy") },
|
|
167
|
-
{ label: "Paste", action: clip("paste") },
|
|
101
|
+
...editMenuItems({ engine: getEditor() }, { onError: opts.onError }),
|
|
168
102
|
{ label: "", action: () => { /* */ }, separator: true },
|
|
169
103
|
{ label: "Bold", action: fmt("bold") },
|
|
170
104
|
{ label: "Italic", action: fmt("italic") },
|
package/package.json
CHANGED