@bobfrankston/rmfmail 1.2.222 → 1.2.224
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/bin/mailx.js +6 -9
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +6 -9
- package/client/android-bootstrap.bundle.js +38 -4
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js +149 -32
- package/client/app.bundle.js.map +2 -2
- package/client/components/address-book.js +93 -29
- package/client/components/address-book.js.map +1 -1
- package/client/components/address-book.ts +103 -24
- package/client/components/context-menu.js +76 -0
- package/client/components/context-menu.js.map +1 -1
- package/client/components/context-menu.ts +77 -0
- package/client/compose/compose.bundle.js +276 -116
- package/client/compose/compose.bundle.js.map +4 -4
- package/client/compose/compose.js +4 -149
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +4 -104
- package/client/compose/edit-commands.js +207 -0
- package/client/compose/edit-commands.js.map +1 -0
- package/client/compose/edit-commands.ts +181 -0
- package/client/compose/editor.js +6 -0
- package/client/compose/editor.js.map +1 -1
- package/client/compose/editor.ts +6 -0
- package/client/compose/spellcheck.js +19 -0
- package/client/compose/spellcheck.js.map +1 -1
- package/client/compose/spellcheck.ts +11 -0
- package/client/lib/api-client.js +2 -2
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +2 -2
- package/client/lib/mailxapi.js +2 -2
- package/client/styles/components.css +40 -0
- package/package.json +7 -7
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +32 -4
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +34 -5
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts +1 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +33 -4
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +28 -4
- package/packages/mailx-service/jsonrpc.js +1 -1
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +1 -1
- package/packages/mailx-service/package.json +1 -1
- package/packages/mailx-store/db.d.ts +30 -10
- package/packages/mailx-store/db.d.ts.map +1 -1
- package/packages/mailx-store/db.js +108 -10
- package/packages/mailx-store/db.js.map +1 -1
- package/packages/mailx-store/db.ts +126 -13
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -1
- package/packages/mailx-store-web/android-bootstrap.js +17 -2
- package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
- package/packages/mailx-store-web/android-bootstrap.ts +17 -2
- 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 +17 -2
- package/packages/mailx-store-web/db.js.map +1 -1
- package/packages/mailx-store-web/db.ts +18 -3
- package/packages/mailx-store-web/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-104584 → node_modules.npmglobalize-stash-142920}/.package-lock.json +0 -0
package/bin/mailx.ts
CHANGED
|
@@ -188,21 +188,18 @@ const isDaemon = hasFlag("daemon"); // internal: re-spawned detached process
|
|
|
188
188
|
* suggestions live) and gates these to editable targets, so they never show
|
|
189
189
|
* on the read-only list or message preview.
|
|
190
190
|
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
191
|
+
* Deliberately NO Cut/Copy/Paste here: WebView2's own menu already carries
|
|
192
|
+
* them (with the right enabled/disabled state and the Ctrl+X/C/V hints), so
|
|
193
|
+
* app copies would just be duplicates a few rows further down. The menu that
|
|
194
|
+
* genuinely lacks them is mailx's spell menu, which preventDefaults the
|
|
195
|
+
* native one away — that gap is filled in compose/edit-commands.ts, at the
|
|
196
|
+
* menu that actually has the hole (Bob 2026-08-07).
|
|
197
197
|
*
|
|
198
198
|
* Ids are dispatched to compose.ts via window.__msgerContextCommand — one
|
|
199
199
|
* list, both windows (in-window compose overlay + popout compose), because
|
|
200
200
|
* drift between the two is what produced "right mouse isn't showing any
|
|
201
201
|
* formatting options" in the first place (Bob 2026-07-18). */
|
|
202
202
|
const COMPOSE_CONTEXT_MENU_ITEMS = [
|
|
203
|
-
{ id: "cut", label: "Cut" },
|
|
204
|
-
{ id: "copy", label: "Copy" },
|
|
205
|
-
{ id: "paste", label: "Paste" },
|
|
206
203
|
{ id: "bold", label: "Bold" },
|
|
207
204
|
{ id: "italic", label: "Italic" },
|
|
208
205
|
{ id: "underline", label: "Underline" },
|
|
@@ -5061,6 +5061,15 @@ var SCHEMA = `
|
|
|
5061
5061
|
name TEXT DEFAULT '',
|
|
5062
5062
|
email TEXT NOT NULL,
|
|
5063
5063
|
organization TEXT DEFAULT '',
|
|
5064
|
+
-- Full contact card, mirroring mailx-store v3. Android keeps its own
|
|
5065
|
+
-- IndexedDB-backed store, so the columns have to be declared here too
|
|
5066
|
+
-- or the same Google People fields get dropped on mobile.
|
|
5067
|
+
phone TEXT DEFAULT '',
|
|
5068
|
+
title TEXT DEFAULT '',
|
|
5069
|
+
address TEXT DEFAULT '',
|
|
5070
|
+
website TEXT DEFAULT '',
|
|
5071
|
+
notes TEXT DEFAULT '',
|
|
5072
|
+
birthday TEXT DEFAULT '',
|
|
5064
5073
|
last_used INTEGER DEFAULT 0,
|
|
5065
5074
|
use_count INTEGER DEFAULT 0,
|
|
5066
5075
|
updated_at INTEGER NOT NULL,
|
|
@@ -5508,10 +5517,23 @@ var WebMailxDB = class {
|
|
|
5508
5517
|
* Web side mirrors mailx-store/db.ts — the Google sync calls
|
|
5509
5518
|
* `recordSentAddress` first to upsert, then this to attach the
|
|
5510
5519
|
* Google identity for incremental delete tracking. */
|
|
5511
|
-
setContactGoogleId(email, googleId, organization) {
|
|
5520
|
+
setContactGoogleId(email, googleId, organization, card) {
|
|
5512
5521
|
if (!email)
|
|
5513
5522
|
return;
|
|
5514
|
-
this.run(
|
|
5523
|
+
this.run(`UPDATE contacts SET source = 'google', google_id = ?, organization = ?, title = ?,
|
|
5524
|
+
phone = ?, address = ?, website = ?, notes = ?, birthday = ?, updated_at = ?
|
|
5525
|
+
WHERE email = ?`, [
|
|
5526
|
+
googleId,
|
|
5527
|
+
organization || "",
|
|
5528
|
+
card?.title || "",
|
|
5529
|
+
card?.phone || "",
|
|
5530
|
+
card?.address || "",
|
|
5531
|
+
card?.website || "",
|
|
5532
|
+
card?.notes || "",
|
|
5533
|
+
card?.birthday || "",
|
|
5534
|
+
Date.now(),
|
|
5535
|
+
email
|
|
5536
|
+
]);
|
|
5515
5537
|
}
|
|
5516
5538
|
recordSentAddress(name, email) {
|
|
5517
5539
|
if (isJunkContact(email, name))
|
|
@@ -11241,7 +11263,9 @@ async function syncGoogleContactsForAccount(db2, accountId, tokenProvider2) {
|
|
|
11241
11263
|
try {
|
|
11242
11264
|
do {
|
|
11243
11265
|
const params = new URLSearchParams({
|
|
11244
|
-
|
|
11266
|
+
// Full contact card — matches the desktop sync in
|
|
11267
|
+
// mailx-imap so mobile doesn't silently hold less.
|
|
11268
|
+
personFields: "names,emailAddresses,organizations,photos,phoneNumbers,addresses,urls,biographies,birthdays",
|
|
11245
11269
|
pageSize: "100"
|
|
11246
11270
|
});
|
|
11247
11271
|
if (nextPageToken) params.set("pageToken", nextPageToken);
|
|
@@ -11273,13 +11297,23 @@ async function syncGoogleContactsForAccount(db2, accountId, tokenProvider2) {
|
|
|
11273
11297
|
}
|
|
11274
11298
|
const name = person.names?.[0]?.displayName || "";
|
|
11275
11299
|
const org = person.organizations?.[0]?.name || "";
|
|
11300
|
+
const bd = person.birthdays?.[0]?.date;
|
|
11301
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
11302
|
+
const card = {
|
|
11303
|
+
title: person.organizations?.[0]?.title || "",
|
|
11304
|
+
phone: person.phoneNumbers?.[0]?.value || "",
|
|
11305
|
+
address: person.addresses?.[0]?.formattedValue || "",
|
|
11306
|
+
website: person.urls?.[0]?.value || "",
|
|
11307
|
+
notes: person.biographies?.[0]?.value || "",
|
|
11308
|
+
birthday: bd?.month && bd?.day ? `${bd.year ? bd.year : "-"}-${pad(bd.month)}-${pad(bd.day)}` : ""
|
|
11309
|
+
};
|
|
11276
11310
|
for (const e of person.emailAddresses || []) {
|
|
11277
11311
|
const email = e.value?.toLowerCase();
|
|
11278
11312
|
if (!email) continue;
|
|
11279
11313
|
const existing = db2.searchContacts(email, 1);
|
|
11280
11314
|
const wasNew = !(existing.length > 0 && existing[0].email === email);
|
|
11281
11315
|
db2.recordSentAddress(name, email);
|
|
11282
|
-
db2.setContactGoogleId(email, googleId, org);
|
|
11316
|
+
db2.setContactGoogleId(email, googleId, org, card);
|
|
11283
11317
|
if (wasNew) changed++;
|
|
11284
11318
|
}
|
|
11285
11319
|
}
|