@bobfrankston/rmfmail 1.1.134 → 1.1.135
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/.commitmsg +19 -26
- package/client/app.bundle.js +20 -1
- package/client/app.bundle.js.map +2 -2
- package/client/components/message-viewer.js +35 -2
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +28 -3
- package/client/compose/compose.bundle.js +8 -4
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/compose/compose.css +10 -2
- package/client/compose/compose.js +29 -7
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +28 -7
- package/client/styles/components.css +15 -0
- package/npmchanges.md +30 -0
- package/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-57056 → node_modules.npmglobalize-stash-44996}/.package-lock.json +0 -0
package/.commitmsg
CHANGED
|
@@ -1,27 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
feat: elapsed-time wait indicator + autocomplete + invalid-addr UX
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Fix
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
This unblocks the stale-folder_id repair path: bobma's Added2.issues
|
|
22
|
-
has 552 ghost local rows tagged to a small folder but carrying
|
|
23
|
-
INBOX-sized UIDs. Server FETCH on those UIDs in the wrong folder
|
|
24
|
-
returns zero, the prefetch loop logs "0/N bodies" every tick, and
|
|
25
|
-
the preview pane shows "Fetching body from server..." forever. Repair
|
|
26
|
-
wipes the metadata, re-fetches envelopes, and folder_id gets rebuilt
|
|
27
|
-
from the server's actual UID lists.
|
|
3
|
+
- Body-fetch placeholder now renders an elapsed-time counter that ticks
|
|
4
|
+
every second ("Fetching body from server… (12s)"). After 30 s the
|
|
5
|
+
counter flips red+bold so a real wedge is visually distinct from a
|
|
6
|
+
normal slow Dovecot read. Cleared automatically when bodyAvailable
|
|
7
|
+
fires, generation advances, or the placeholder leaves the DOM.
|
|
8
|
+
- Compose address autocomplete: clicking a "Frankston, Bob" suggestion
|
|
9
|
+
against a `bob` token used to produce `bob, "Frankston, Bob" <addr>`
|
|
10
|
+
(the original token preserved instead of replaced) in some edge cases.
|
|
11
|
+
Fix is in replaceCaretToken — strip the trailing comma/whitespace from
|
|
12
|
+
the pre-token segment, re-add a clean ", " separator. tokenSpanAtCaret
|
|
13
|
+
also now skips leading whitespace inside the span so the separator
|
|
14
|
+
belongs to "before", not the token itself.
|
|
15
|
+
- "Invalid address" send-block now uses high-contrast white-on-red
|
|
16
|
+
styling (was muted red text on light grey, easy to miss). Both
|
|
17
|
+
classList wiring and CSS updated: the .compose-status-error class
|
|
18
|
+
gets a saturated red background, white bold text, padding/radius.
|
|
19
|
+
Message text bumped to "Invalid address: '...' — Send blocked" so
|
|
20
|
+
the user knows it's the gating condition, not a transient note.
|
package/client/app.bundle.js
CHANGED
|
@@ -1179,8 +1179,25 @@ async function showMessage(accountId, uid, folderId, specialUse, isRetry = false
|
|
|
1179
1179
|
} catch {
|
|
1180
1180
|
}
|
|
1181
1181
|
const previewText = (msg.preview || cached?.preview || "").trim();
|
|
1182
|
-
|
|
1182
|
+
const waitStart = Date.now();
|
|
1183
|
+
const indicatorHtml = `<span class="mv-wait-elapsed" data-start="${waitStart}">(0s)</span>`;
|
|
1184
|
+
bodyEl.innerHTML = previewText ? `<div class="mv-preview-placeholder">${escapeHtml(previewText)}<div class="mv-wait-line">Fetching body from server\u2026 ${indicatorHtml}</div></div>` : `<div class="mv-empty">Fetching body from server\u2026 ${indicatorHtml}</div>`;
|
|
1183
1185
|
const captureGen = gen;
|
|
1186
|
+
const tick = setInterval(() => {
|
|
1187
|
+
if (captureGen !== showMessageGeneration) {
|
|
1188
|
+
clearInterval(tick);
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
const span = bodyEl.querySelector(".mv-wait-elapsed");
|
|
1192
|
+
if (!span) {
|
|
1193
|
+
clearInterval(tick);
|
|
1194
|
+
return;
|
|
1195
|
+
}
|
|
1196
|
+
const secs = Math.round((Date.now() - waitStart) / 1e3);
|
|
1197
|
+
span.textContent = secs >= 60 ? `(${Math.floor(secs / 60)}m ${secs % 60}s)` : `(${secs}s)`;
|
|
1198
|
+
if (secs === 30)
|
|
1199
|
+
span.classList.add("mv-wait-slow");
|
|
1200
|
+
}, 1e3);
|
|
1184
1201
|
const off = subscribeStore("*", (ev) => {
|
|
1185
1202
|
if (ev.kind !== "bodyAvailable")
|
|
1186
1203
|
return;
|
|
@@ -1188,9 +1205,11 @@ async function showMessage(accountId, uid, folderId, specialUse, isRetry = false
|
|
|
1188
1205
|
return;
|
|
1189
1206
|
if (captureGen !== showMessageGeneration) {
|
|
1190
1207
|
off();
|
|
1208
|
+
clearInterval(tick);
|
|
1191
1209
|
return;
|
|
1192
1210
|
}
|
|
1193
1211
|
off();
|
|
1212
|
+
clearInterval(tick);
|
|
1194
1213
|
showMessage(accountId, uid, folderId, specialUse, true, envelope || cached || void 0).catch(() => {
|
|
1195
1214
|
});
|
|
1196
1215
|
});
|