@bobfrankston/rmfmail 1.2.302 → 1.2.304
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 +49 -49
- package/client/android-bootstrap.bundle.js +25 -9
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js +40 -6
- package/client/app.bundle.js.map +2 -2
- package/client/components/calendar-sidebar.js +18 -5
- package/client/components/calendar-sidebar.js.map +1 -1
- package/client/components/calendar-sidebar.ts +19 -5
- package/client/components/context-menu.js +49 -1
- package/client/components/context-menu.js.map +1 -1
- package/client/components/context-menu.ts +53 -1
- package/client/compose/compose.bundle.js +31 -1
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/styles/components.css +11 -1
- package/npmchanges.md +102 -0
- package/package.json +4 -4
- package/packages/mailx-store-web/db.d.ts +1 -1
- package/packages/mailx-store-web/db.d.ts.map +1 -1
- package/packages/mailx-store-web/db.js +28 -4
- package/packages/mailx-store-web/db.js.map +1 -1
- package/packages/mailx-store-web/db.ts +28 -4
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-store-web/web-service.d.ts +2 -2
- package/packages/mailx-store-web/web-service.d.ts.map +1 -1
- package/packages/mailx-store-web/web-service.js +15 -5
- package/packages/mailx-store-web/web-service.js.map +1 -1
- package/packages/mailx-store-web/web-service.ts +14 -4
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-54400 → node_modules.npmglobalize-stash-37088}/.package-lock.json +0 -0
package/.commitmsg
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
Ask at the pointer, not in the host's dialog
|
|
2
|
+
|
|
3
|
+
"clicking the x is supposed [to] delete the task but seems to do nothing …
|
|
4
|
+
it eventually puts up a message far from where I clicked" (Bob 2026-09-04,
|
|
5
|
+
with both screenshots).
|
|
6
|
+
|
|
7
|
+
The × handler called the native `confirm()`. In the WebView that is the host's
|
|
8
|
+
own dialog: titled "msger.localhost says", centred in the window rather than
|
|
9
|
+
under the pointer, arriving late enough that the click reads as having done
|
|
10
|
+
nothing — and blocking the WebView event loop the whole time it is up, which is
|
|
11
|
+
the hazard message-viewer.ts already refuses `alert()` for. Compose reached the
|
|
12
|
+
same conclusion in its own window and wrote an in-page modal; the main window
|
|
13
|
+
never got one, so thirteen `confirm()` calls still go to the host.
|
|
14
|
+
|
|
15
|
+
`confirmAt(x, y, label)` in context-menu.ts asks the question as a two-item
|
|
16
|
+
menu at the pointer. Built on showContextMenu rather than as a new modal, so
|
|
17
|
+
there is one menu, one dismissal path, and one piece of stay-on-screen clamping
|
|
18
|
+
— that clamping in particular was already solved here for narrow Android
|
|
19
|
+
screens, and a second implementation would have had to learn it again.
|
|
20
|
+
|
|
21
|
+
The label NAMES its target — `Delete "Records. Berkowitz"`, never "OK". By the
|
|
22
|
+
time a confirmation is read the pointer has moved and the row it came from is
|
|
23
|
+
no longer obvious; a named action can be checked, and "OK" cannot. The
|
|
24
|
+
explanation the old dialog text carried ("removes it from Google Tasks — to
|
|
25
|
+
mark done use the checkbox") is now the item's tooltip: worth having, not worth
|
|
26
|
+
a dialog.
|
|
27
|
+
|
|
28
|
+
Three call sites move: the row ×, the row context menu's Delete, and the batch
|
|
29
|
+
delete behind the Delete key / trash button. The batch one has no click to
|
|
30
|
+
anchor to, so it asks over the first selected row — where the tasks are and
|
|
31
|
+
where the user is looking.
|
|
32
|
+
|
|
33
|
+
Two supporting changes:
|
|
34
|
+
|
|
35
|
+
`ContextMenuOptions.onClose` — fires whichever way the menu goes away, so a
|
|
36
|
+
promise-shaped menu can answer "cancelled" instead of hanging forever on a
|
|
37
|
+
dismissal. An item's click calls closeContextMenu() BEFORE item.action(), so
|
|
38
|
+
onClose always runs first; confirmAt defers its cancel by one microtask, and
|
|
39
|
+
since the action is synchronous and completes within the same task, a chosen
|
|
40
|
+
item has always settled the promise by the time that microtask drains.
|
|
41
|
+
|
|
42
|
+
`.ctx-emphasized` now renders. `MenuItem.emphasized` has been passed since the
|
|
43
|
+
right-drag menu was written ("Move here" as the default action) and no CSS rule
|
|
44
|
+
ever matched it, so it has never once looked different from its neighbours.
|
|
45
|
+
|
|
46
|
+
The other ten `confirm()` calls — rebuild, factory reset, permanent delete,
|
|
47
|
+
folder move/delete, contact delete, discard draft — are untouched. They are
|
|
48
|
+
the same dialog with the same problems and they should follow, but each is a
|
|
49
|
+
destructive action worth reading before it moves.
|
|
@@ -5855,6 +5855,7 @@ var sql_wasm_default = __toBinary("AGFzbQEAAAABnwRFYAJ/fwF/YAF/AX9gA39/fwBgA39/f
|
|
|
5855
5855
|
|
|
5856
5856
|
// packages/mailx-store-web/db.js
|
|
5857
5857
|
init_mailx_types();
|
|
5858
|
+
var FLAGGED_SQL = " AND flags_json LIKE '%\\\\Flagged%'";
|
|
5858
5859
|
var JUNK_LOCAL_RE = new RegExp(CONTACT_RULES.junk.localExact, "i");
|
|
5859
5860
|
var JUNK_LOCAL_SUFFIX_RE = new RegExp(CONTACT_RULES.junk.localSuffix, "i");
|
|
5860
5861
|
var JUNK_LOCAL_PREFIX_RE = new RegExp(CONTACT_RULES.junk.localPrefix, "i");
|
|
@@ -6304,7 +6305,8 @@ var WebMailxDB = class {
|
|
|
6304
6305
|
const page = query.page || 1;
|
|
6305
6306
|
const pageSize = query.pageSize || 50;
|
|
6306
6307
|
const offset = (page - 1) * pageSize;
|
|
6307
|
-
const
|
|
6308
|
+
const dateCol = query.dateBasis === "received" ? "date" : "COALESCE(sent_date, date)";
|
|
6309
|
+
const sortCol = query.sort === "from" ? "from_name" : query.sort === "subject" ? "subject" : dateCol;
|
|
6308
6310
|
const sortDir = query.sortDir || "desc";
|
|
6309
6311
|
let where = "account_id = ? AND folder_id = ?";
|
|
6310
6312
|
const params = [query.accountId, query.folderId];
|
|
@@ -6313,21 +6315,25 @@ var WebMailxDB = class {
|
|
|
6313
6315
|
const term = `%${query.search}%`;
|
|
6314
6316
|
params.push(term, term, term);
|
|
6315
6317
|
}
|
|
6318
|
+
if (query.flaggedOnly)
|
|
6319
|
+
where += FLAGGED_SQL;
|
|
6316
6320
|
const countRow = this.get(`SELECT COUNT(*) as cnt FROM messages WHERE ${where}`, params);
|
|
6317
6321
|
const total = countRow?.cnt || 0;
|
|
6318
6322
|
const rows = this.all(`SELECT * FROM messages WHERE ${where} ORDER BY ${sortCol} ${sortDir} LIMIT ? OFFSET ?`, [...params, pageSize, offset]);
|
|
6319
6323
|
return { items: rows.map((r) => this.rowToEnvelope(r)), total, page, pageSize };
|
|
6320
6324
|
}
|
|
6321
|
-
getUnifiedInbox(page = 1, pageSize = 50) {
|
|
6325
|
+
getUnifiedInbox(page = 1, pageSize = 50, flaggedOnly = false, dateBasis = "sent") {
|
|
6322
6326
|
const offset = (page - 1) * pageSize;
|
|
6323
6327
|
const inboxRows = this.all("SELECT id FROM folders WHERE special_use = 'inbox'");
|
|
6324
6328
|
if (inboxRows.length === 0)
|
|
6325
6329
|
return { items: [], total: 0, page, pageSize };
|
|
6326
6330
|
const ids = inboxRows.map((r) => r.id);
|
|
6327
6331
|
const placeholders = ids.map(() => "?").join(",");
|
|
6328
|
-
const
|
|
6332
|
+
const flagFilter = flaggedOnly ? FLAGGED_SQL : "";
|
|
6333
|
+
const dateCol = dateBasis === "received" ? "date" : "COALESCE(sent_date, date)";
|
|
6334
|
+
const countRow = this.get(`SELECT COUNT(*) as cnt FROM messages WHERE folder_id IN (${placeholders})${flagFilter}`, ids);
|
|
6329
6335
|
const total = countRow?.cnt || 0;
|
|
6330
|
-
const rows = this.all(`SELECT * FROM messages WHERE folder_id IN (${placeholders}) ORDER BY
|
|
6336
|
+
const rows = this.all(`SELECT * FROM messages WHERE folder_id IN (${placeholders})${flagFilter} ORDER BY ${dateCol} DESC LIMIT ? OFFSET ?`, [...ids, pageSize, offset]);
|
|
6331
6337
|
return { items: rows.map((r) => this.rowToEnvelope(r)), total, page, pageSize };
|
|
6332
6338
|
}
|
|
6333
6339
|
getMessageByUid(accountId, uid, folderId) {
|
|
@@ -6936,11 +6942,21 @@ var WebMailxService = class _WebMailxService {
|
|
|
6936
6942
|
return this.db.getFolders(accountId);
|
|
6937
6943
|
}
|
|
6938
6944
|
// ── Messages ──
|
|
6939
|
-
|
|
6940
|
-
|
|
6941
|
-
|
|
6942
|
-
|
|
6943
|
-
|
|
6945
|
+
// 2026-09-04 — Claude Code (Opus 5), at Bob's direction ("it then says no
|
|
6946
|
+
// flagged messages. but there are message flagged" — 260 of them). Both of
|
|
6947
|
+
// these took two or seven parameters while api-client has always CALLED
|
|
6948
|
+
// them with four and nine: `flaggedOnly` and `dateBasis` fell off the end
|
|
6949
|
+
// and JavaScript said nothing. The star filter therefore existed on the
|
|
6950
|
+
// phone only as the client's `.flagged-only` CSS rule, which can hide
|
|
6951
|
+
// unflagged rows in the loaded page but cannot reach a starred message on
|
|
6952
|
+
// page 4 — so a list whose newest 50 carry no star reads as "no flagged
|
|
6953
|
+
// messages". Keep these signatures in step with api-client's calls; the
|
|
6954
|
+
// language will not do it for you.
|
|
6955
|
+
getUnifiedInbox(page = 1, pageSize = 50, flaggedOnly = false, dateBasis = "sent") {
|
|
6956
|
+
return this.db.getUnifiedInbox(page, pageSize, flaggedOnly, dateBasis);
|
|
6957
|
+
}
|
|
6958
|
+
getMessages(accountId, folderId, page = 1, pageSize = 50, sort = "date", sortDir = "desc", search, flaggedOnly = false, dateBasis = "sent") {
|
|
6959
|
+
return this.db.getMessages({ accountId, folderId, page, pageSize, sort, sortDir, search, flaggedOnly, dateBasis });
|
|
6944
6960
|
}
|
|
6945
6961
|
async getMessage(accountId, uid, allowRemote = false, folderId) {
|
|
6946
6962
|
const envelope = this.db.getMessageByUid(accountId, uid, folderId);
|