@bobfrankston/rmfmail 1.0.467
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/README.md +429 -0
- package/bin/build-icon-ico.js +283 -0
- package/bin/lean-accounts.js +172 -0
- package/bin/mailx.js +1580 -0
- package/bin/mailx.js.map +1 -0
- package/bin/mailx.ts +1549 -0
- package/bin/postinstall.js +39 -0
- package/bin/postinstall.js.map +1 -0
- package/bin/postinstall.ts +41 -0
- package/bin/tsconfig.json +10 -0
- package/client/.gitattributes +10 -0
- package/client/.msger-window.json +1 -0
- package/client/android.html +226 -0
- package/client/app.js +3400 -0
- package/client/app.js.map +1 -0
- package/client/app.ts +3190 -0
- package/client/components/address-book.js +199 -0
- package/client/components/address-book.js.map +1 -0
- package/client/components/address-book.ts +204 -0
- package/client/components/alarms.js +299 -0
- package/client/components/alarms.js.map +1 -0
- package/client/components/alarms.ts +276 -0
- package/client/components/calendar-sidebar.js +508 -0
- package/client/components/calendar-sidebar.js.map +1 -0
- package/client/components/calendar-sidebar.ts +474 -0
- package/client/components/calendar.js +217 -0
- package/client/components/calendar.js.map +1 -0
- package/client/components/calendar.ts +211 -0
- package/client/components/context-menu.js +80 -0
- package/client/components/context-menu.js.map +1 -0
- package/client/components/context-menu.ts +95 -0
- package/client/components/folder-picker.js +119 -0
- package/client/components/folder-picker.js.map +1 -0
- package/client/components/folder-picker.ts +127 -0
- package/client/components/folder-tree.js +1093 -0
- package/client/components/folder-tree.js.map +1 -0
- package/client/components/folder-tree.ts +1069 -0
- package/client/components/message-list.js +1140 -0
- package/client/components/message-list.js.map +1 -0
- package/client/components/message-list.ts +1129 -0
- package/client/components/message-viewer.js +1291 -0
- package/client/components/message-viewer.js.map +1 -0
- package/client/components/message-viewer.ts +1257 -0
- package/client/components/outbox-view.js +104 -0
- package/client/components/outbox-view.js.map +1 -0
- package/client/components/outbox-view.ts +102 -0
- package/client/components/tasks.js +261 -0
- package/client/components/tasks.js.map +1 -0
- package/client/components/tasks.ts +234 -0
- package/client/compose/compose.css +560 -0
- package/client/compose/compose.html +52 -0
- package/client/compose/compose.js +1289 -0
- package/client/compose/compose.js.map +1 -0
- package/client/compose/compose.ts +1231 -0
- package/client/compose/editor.js +616 -0
- package/client/compose/editor.js.map +1 -0
- package/client/compose/editor.ts +599 -0
- package/client/compose/ghost-text.js +122 -0
- package/client/compose/ghost-text.js.map +1 -0
- package/client/compose/ghost-text.ts +140 -0
- package/client/favicon.svg +11 -0
- package/client/icon.ico +0 -0
- package/client/icon.png +0 -0
- package/client/index.html +230 -0
- package/client/lib/android-bootstrap.js +9 -0
- package/client/lib/android-bootstrap.js.map +1 -0
- package/client/lib/android-bootstrap.ts +9 -0
- package/client/lib/api-client.js +378 -0
- package/client/lib/api-client.js.map +1 -0
- package/client/lib/api-client.ts +439 -0
- package/client/lib/local-service.js +603 -0
- package/client/lib/local-service.js.map +1 -0
- package/client/lib/local-service.ts +646 -0
- package/client/lib/local-store.js +214 -0
- package/client/lib/local-store.js.map +1 -0
- package/client/lib/local-store.ts +283 -0
- package/client/lib/mailxapi.js +304 -0
- package/client/lib/message-state.js +132 -0
- package/client/lib/message-state.js.map +1 -0
- package/client/lib/message-state.ts +160 -0
- package/client/package.json +16 -0
- package/client/styles/components.css +2049 -0
- package/client/styles/layout.css +332 -0
- package/client/styles/variables.css +85 -0
- package/client/tsconfig.json +19 -0
- package/package.json +124 -0
- package/packages/mailx-api/.gitattributes +10 -0
- package/packages/mailx-api/index.d.ts +10 -0
- package/packages/mailx-api/index.d.ts.map +1 -0
- package/packages/mailx-api/index.js +322 -0
- package/packages/mailx-api/index.js.map +1 -0
- package/packages/mailx-api/index.ts +283 -0
- package/packages/mailx-api/package.json +27 -0
- package/packages/mailx-api/tsconfig.json +9 -0
- package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-compose/.gitattributes +10 -0
- package/packages/mailx-compose/index.d.ts +21 -0
- package/packages/mailx-compose/index.d.ts.map +1 -0
- package/packages/mailx-compose/index.js +61 -0
- package/packages/mailx-compose/index.js.map +1 -0
- package/packages/mailx-compose/index.ts +85 -0
- package/packages/mailx-compose/package.json +18 -0
- package/packages/mailx-compose/tsconfig.json +9 -0
- package/packages/mailx-core/index.d.ts +139 -0
- package/packages/mailx-core/index.d.ts.map +1 -0
- package/packages/mailx-core/index.js +403 -0
- package/packages/mailx-core/index.js.map +1 -0
- package/packages/mailx-core/index.ts +424 -0
- package/packages/mailx-core/ipc.d.ts +13 -0
- package/packages/mailx-core/ipc.d.ts.map +1 -0
- package/packages/mailx-core/ipc.js +56 -0
- package/packages/mailx-core/ipc.js.map +1 -0
- package/packages/mailx-core/ipc.ts +62 -0
- package/packages/mailx-core/package.json +18 -0
- package/packages/mailx-core/tsconfig.json +9 -0
- package/packages/mailx-host/.gitattributes +10 -0
- package/packages/mailx-host/index.d.ts +21 -0
- package/packages/mailx-host/index.d.ts.map +1 -0
- package/packages/mailx-host/index.js +29 -0
- package/packages/mailx-host/index.js.map +1 -0
- package/packages/mailx-host/index.ts +38 -0
- package/packages/mailx-host/package.json +23 -0
- package/packages/mailx-host/tsconfig.json +9 -0
- package/packages/mailx-host/types-shim.d.ts +14 -0
- package/packages/mailx-imap/.gitattributes +10 -0
- package/packages/mailx-imap/index.d.ts +442 -0
- package/packages/mailx-imap/index.d.ts.map +1 -0
- package/packages/mailx-imap/index.js +3684 -0
- package/packages/mailx-imap/index.js.map +1 -0
- package/packages/mailx-imap/index.ts +3652 -0
- package/packages/mailx-imap/package-lock.json +131 -0
- package/packages/mailx-imap/package.json +28 -0
- package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
- package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
- package/packages/mailx-imap/providers/gmail-api.js +8 -0
- package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
- package/packages/mailx-imap/providers/gmail-api.ts +8 -0
- package/packages/mailx-imap/providers/outlook-api.ts +7 -0
- package/packages/mailx-imap/providers/types.d.ts +9 -0
- package/packages/mailx-imap/providers/types.d.ts.map +1 -0
- package/packages/mailx-imap/providers/types.js +9 -0
- package/packages/mailx-imap/providers/types.js.map +1 -0
- package/packages/mailx-imap/providers/types.ts +9 -0
- package/packages/mailx-imap/tsconfig.json +9 -0
- package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-send/.gitattributes +10 -0
- package/packages/mailx-send/README.md +217 -0
- package/packages/mailx-send/cli-queue.d.ts +11 -0
- package/packages/mailx-send/cli-queue.d.ts.map +1 -0
- package/packages/mailx-send/cli-queue.js +59 -0
- package/packages/mailx-send/cli-queue.js.map +1 -0
- package/packages/mailx-send/cli-queue.ts +62 -0
- package/packages/mailx-send/cli-send.d.ts +17 -0
- package/packages/mailx-send/cli-send.d.ts.map +1 -0
- package/packages/mailx-send/cli-send.js +75 -0
- package/packages/mailx-send/cli-send.js.map +1 -0
- package/packages/mailx-send/cli-send.ts +83 -0
- package/packages/mailx-send/cli.d.ts +22 -0
- package/packages/mailx-send/cli.d.ts.map +1 -0
- package/packages/mailx-send/cli.js +115 -0
- package/packages/mailx-send/cli.js.map +1 -0
- package/packages/mailx-send/cli.ts +126 -0
- package/packages/mailx-send/index.d.ts +77 -0
- package/packages/mailx-send/index.d.ts.map +1 -0
- package/packages/mailx-send/index.js +264 -0
- package/packages/mailx-send/index.js.map +1 -0
- package/packages/mailx-send/index.ts +333 -0
- package/packages/mailx-send/mailsend/README.md +133 -0
- package/packages/mailx-send/mailsend/cli.d.ts +12 -0
- package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
- package/packages/mailx-send/mailsend/cli.js +70 -0
- package/packages/mailx-send/mailsend/cli.js.map +1 -0
- package/packages/mailx-send/mailsend/cli.ts +81 -0
- package/packages/mailx-send/mailsend/index.d.ts +77 -0
- package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
- package/packages/mailx-send/mailsend/index.js +264 -0
- package/packages/mailx-send/mailsend/index.js.map +1 -0
- package/packages/mailx-send/mailsend/index.ts +333 -0
- package/packages/mailx-send/mailsend/package-lock.json +65 -0
- package/packages/mailx-send/mailsend/package.json +26 -0
- package/packages/mailx-send/mailsend/tsconfig.json +21 -0
- package/packages/mailx-send/package-lock.json +65 -0
- package/packages/mailx-send/package.json +37 -0
- package/packages/mailx-send/tsconfig.json +21 -0
- package/packages/mailx-server/.gitattributes +10 -0
- package/packages/mailx-server/index.d.ts +8 -0
- package/packages/mailx-server/index.d.ts.map +1 -0
- package/packages/mailx-server/index.js +397 -0
- package/packages/mailx-server/index.js.map +1 -0
- package/packages/mailx-server/index.ts +429 -0
- package/packages/mailx-server/package.json +28 -0
- package/packages/mailx-server/tsconfig.json +9 -0
- package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-service/google-sync.d.ts +96 -0
- package/packages/mailx-service/google-sync.d.ts.map +1 -0
- package/packages/mailx-service/google-sync.js +153 -0
- package/packages/mailx-service/google-sync.js.map +1 -0
- package/packages/mailx-service/google-sync.ts +238 -0
- package/packages/mailx-service/index.d.ts +366 -0
- package/packages/mailx-service/index.d.ts.map +1 -0
- package/packages/mailx-service/index.js +2589 -0
- package/packages/mailx-service/index.js.map +1 -0
- package/packages/mailx-service/index.ts +2512 -0
- package/packages/mailx-service/jsonrpc.d.ts +25 -0
- package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
- package/packages/mailx-service/jsonrpc.js +238 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -0
- package/packages/mailx-service/jsonrpc.ts +268 -0
- package/packages/mailx-service/package.json +22 -0
- package/packages/mailx-service/tsconfig.json +9 -0
- package/packages/mailx-settings/.gitattributes +10 -0
- package/packages/mailx-settings/cloud.d.ts +47 -0
- package/packages/mailx-settings/cloud.d.ts.map +1 -0
- package/packages/mailx-settings/cloud.js +408 -0
- package/packages/mailx-settings/cloud.js.map +1 -0
- package/packages/mailx-settings/cloud.ts +393 -0
- package/packages/mailx-settings/index.d.ts +140 -0
- package/packages/mailx-settings/index.d.ts.map +1 -0
- package/packages/mailx-settings/index.js +872 -0
- package/packages/mailx-settings/index.js.map +1 -0
- package/packages/mailx-settings/index.ts +908 -0
- package/packages/mailx-settings/package.json +20 -0
- package/packages/mailx-settings/tsconfig.json +9 -0
- package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-store/.gitattributes +10 -0
- package/packages/mailx-store/db.d.ts +346 -0
- package/packages/mailx-store/db.d.ts.map +1 -0
- package/packages/mailx-store/db.js +1796 -0
- package/packages/mailx-store/db.js.map +1 -0
- package/packages/mailx-store/db.ts +2007 -0
- package/packages/mailx-store/file-store.d.ts +36 -0
- package/packages/mailx-store/file-store.d.ts.map +1 -0
- package/packages/mailx-store/file-store.js +80 -0
- package/packages/mailx-store/file-store.js.map +1 -0
- package/packages/mailx-store/file-store.ts +82 -0
- package/packages/mailx-store/index.d.ts +7 -0
- package/packages/mailx-store/index.d.ts.map +1 -0
- package/packages/mailx-store/index.js +7 -0
- package/packages/mailx-store/index.js.map +1 -0
- package/packages/mailx-store/index.ts +7 -0
- package/packages/mailx-store/package.json +19 -0
- package/packages/mailx-store/tsconfig.json +9 -0
- package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
- package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
- package/packages/mailx-store-web/android-bootstrap.js +1247 -0
- package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
- package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
- package/packages/mailx-store-web/db.d.ts +132 -0
- package/packages/mailx-store-web/db.d.ts.map +1 -0
- package/packages/mailx-store-web/db.js +642 -0
- package/packages/mailx-store-web/db.js.map +1 -0
- package/packages/mailx-store-web/db.ts +756 -0
- package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
- package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
- package/packages/mailx-store-web/gmail-api-web.js +11 -0
- package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
- package/packages/mailx-store-web/gmail-api-web.ts +11 -0
- package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
- package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
- package/packages/mailx-store-web/imap-web-provider.js +140 -0
- package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
- package/packages/mailx-store-web/imap-web-provider.ts +156 -0
- package/packages/mailx-store-web/index.d.ts +10 -0
- package/packages/mailx-store-web/index.d.ts.map +1 -0
- package/packages/mailx-store-web/index.js +10 -0
- package/packages/mailx-store-web/index.js.map +1 -0
- package/packages/mailx-store-web/index.ts +10 -0
- package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
- package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
- package/packages/mailx-store-web/main-thread-host.js +292 -0
- package/packages/mailx-store-web/main-thread-host.js.map +1 -0
- package/packages/mailx-store-web/main-thread-host.ts +322 -0
- package/packages/mailx-store-web/package.json +23 -0
- package/packages/mailx-store-web/provider-types.d.ts +7 -0
- package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
- package/packages/mailx-store-web/provider-types.js +7 -0
- package/packages/mailx-store-web/provider-types.js.map +1 -0
- package/packages/mailx-store-web/provider-types.ts +7 -0
- package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
- package/packages/mailx-store-web/sql.js.d.ts +29 -0
- package/packages/mailx-store-web/sync-manager.d.ts +68 -0
- package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
- package/packages/mailx-store-web/sync-manager.js +506 -0
- package/packages/mailx-store-web/sync-manager.js.map +1 -0
- package/packages/mailx-store-web/sync-manager.ts +508 -0
- package/packages/mailx-store-web/tsconfig.json +10 -0
- package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
- package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
- package/packages/mailx-store-web/web-jsonrpc.js +102 -0
- package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
- package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
- package/packages/mailx-store-web/web-message-store.d.ts +16 -0
- package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
- package/packages/mailx-store-web/web-message-store.js +89 -0
- package/packages/mailx-store-web/web-message-store.js.map +1 -0
- package/packages/mailx-store-web/web-message-store.ts +97 -0
- package/packages/mailx-store-web/web-service.d.ts +111 -0
- package/packages/mailx-store-web/web-service.d.ts.map +1 -0
- package/packages/mailx-store-web/web-service.js +542 -0
- package/packages/mailx-store-web/web-service.js.map +1 -0
- package/packages/mailx-store-web/web-service.ts +616 -0
- package/packages/mailx-store-web/web-settings.d.ts +83 -0
- package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
- package/packages/mailx-store-web/web-settings.js +491 -0
- package/packages/mailx-store-web/web-settings.js.map +1 -0
- package/packages/mailx-store-web/web-settings.ts +522 -0
- package/packages/mailx-store-web/worker-bundle.js +6838 -0
- package/packages/mailx-store-web/worker-entry.d.ts +8 -0
- package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
- package/packages/mailx-store-web/worker-entry.js +187 -0
- package/packages/mailx-store-web/worker-entry.js.map +1 -0
- package/packages/mailx-store-web/worker-entry.ts +215 -0
- package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
- package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
- package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
- package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
- package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
- package/packages/mailx-types/.gitattributes +10 -0
- package/packages/mailx-types/index.d.ts +319 -0
- package/packages/mailx-types/index.d.ts.map +1 -0
- package/packages/mailx-types/index.js +243 -0
- package/packages/mailx-types/index.js.map +1 -0
- package/packages/mailx-types/index.ts +498 -0
- package/packages/mailx-types/package.json +16 -0
- package/packages/mailx-types/tsconfig.json +9 -0
- package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
- package/todo.json +13 -0
- package/tsconfig.base.json +31 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folder picker — small modal for choosing a destination folder.
|
|
3
|
+
* Used by the message-list right-click "Move to folder…" item and any
|
|
4
|
+
* other UI that needs the user to pick a folder.
|
|
5
|
+
*
|
|
6
|
+
* Reads folders from the local DB via getFolders() (local-first — no
|
|
7
|
+
* server round-trip). Filters by typed text. Returns the selected
|
|
8
|
+
* folder, or null if the user dismissed.
|
|
9
|
+
*/
|
|
10
|
+
import { getFolders } from "../lib/api-client.js";
|
|
11
|
+
/** Show a modal folder picker. Returns a promise resolving to the picked
|
|
12
|
+
* folder, or null if dismissed. The list is restricted to one account
|
|
13
|
+
* (the current message's account) so it doesn't get cluttered with
|
|
14
|
+
* unrelated folders; cross-account moves can be added later via an
|
|
15
|
+
* account selector at the top of the picker. */
|
|
16
|
+
export function pickFolder(accountId, opts) {
|
|
17
|
+
return new Promise(async (resolve) => {
|
|
18
|
+
const overlay = document.createElement("div");
|
|
19
|
+
overlay.className = "folder-picker-overlay";
|
|
20
|
+
overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.4);z-index:10000;display:flex;align-items:center;justify-content:center;";
|
|
21
|
+
const modal = document.createElement("div");
|
|
22
|
+
modal.className = "folder-picker-modal";
|
|
23
|
+
modal.style.cssText = "background:var(--bg, #fff);color:var(--fg, #000);border:1px solid var(--border, #ccc);border-radius:6px;box-shadow:0 4px 24px rgba(0,0,0,0.3);width:380px;max-width:90vw;max-height:70vh;display:flex;flex-direction:column;overflow:hidden;";
|
|
24
|
+
const header = document.createElement("div");
|
|
25
|
+
header.style.cssText = "padding:10px 14px;border-bottom:1px solid var(--border, #ddd);font-weight:600;";
|
|
26
|
+
header.textContent = opts?.title || "Move to folder…";
|
|
27
|
+
modal.appendChild(header);
|
|
28
|
+
const search = document.createElement("input");
|
|
29
|
+
search.type = "text";
|
|
30
|
+
search.placeholder = "Filter folders…";
|
|
31
|
+
search.style.cssText = "margin:8px 12px;padding:6px 10px;border:1px solid var(--border, #ccc);border-radius:4px;font-size:13px;";
|
|
32
|
+
modal.appendChild(search);
|
|
33
|
+
const listEl = document.createElement("div");
|
|
34
|
+
listEl.style.cssText = "flex:1;overflow-y:auto;padding:4px 0;";
|
|
35
|
+
modal.appendChild(listEl);
|
|
36
|
+
const footer = document.createElement("div");
|
|
37
|
+
footer.style.cssText = "padding:8px 12px;border-top:1px solid var(--border, #ddd);display:flex;justify-content:flex-end;gap:8px;";
|
|
38
|
+
const cancelBtn = document.createElement("button");
|
|
39
|
+
cancelBtn.textContent = "Cancel";
|
|
40
|
+
cancelBtn.style.cssText = "padding:6px 14px;cursor:pointer;";
|
|
41
|
+
footer.appendChild(cancelBtn);
|
|
42
|
+
modal.appendChild(footer);
|
|
43
|
+
overlay.appendChild(modal);
|
|
44
|
+
document.body.appendChild(overlay);
|
|
45
|
+
const dismiss = (result) => {
|
|
46
|
+
overlay.remove();
|
|
47
|
+
document.removeEventListener("keydown", onKey);
|
|
48
|
+
resolve(result);
|
|
49
|
+
};
|
|
50
|
+
const onKey = (e) => {
|
|
51
|
+
if (e.key === "Escape") {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
dismiss(null);
|
|
54
|
+
}
|
|
55
|
+
if (e.key === "Enter") {
|
|
56
|
+
const first = listEl.querySelector(".folder-picker-row.match");
|
|
57
|
+
if (first)
|
|
58
|
+
first.click();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
document.addEventListener("keydown", onKey);
|
|
62
|
+
overlay.addEventListener("click", (e) => { if (e.target === overlay)
|
|
63
|
+
dismiss(null); });
|
|
64
|
+
cancelBtn.addEventListener("click", () => dismiss(null));
|
|
65
|
+
// Local-first: load from DB synchronously-ish (one IPC round-trip).
|
|
66
|
+
let folders = [];
|
|
67
|
+
try {
|
|
68
|
+
folders = (await getFolders(accountId)) || [];
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
listEl.textContent = "Failed to load folders";
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Hide special-use that don't make sense as targets (Outbox).
|
|
75
|
+
// Allow Trash / Junk so users can manually file into them.
|
|
76
|
+
const excluded = new Set(opts?.excludeFolderIds || []);
|
|
77
|
+
const targets = folders
|
|
78
|
+
.filter((f) => !excluded.has(f.id))
|
|
79
|
+
.filter((f) => f.specialUse !== "outbox")
|
|
80
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
81
|
+
function render(filter) {
|
|
82
|
+
listEl.innerHTML = "";
|
|
83
|
+
const lc = filter.toLowerCase().trim();
|
|
84
|
+
let firstMatchSet = false;
|
|
85
|
+
for (const f of targets) {
|
|
86
|
+
const row = document.createElement("div");
|
|
87
|
+
row.className = "folder-picker-row";
|
|
88
|
+
row.style.cssText = "padding:6px 14px;cursor:pointer;font-size:13px;display:flex;justify-content:space-between;gap:8px;";
|
|
89
|
+
const name = document.createElement("span");
|
|
90
|
+
name.textContent = f.path;
|
|
91
|
+
const tag = document.createElement("span");
|
|
92
|
+
tag.style.cssText = "color:var(--muted, #888);font-size:11px;";
|
|
93
|
+
tag.textContent = f.specialUse || "";
|
|
94
|
+
row.appendChild(name);
|
|
95
|
+
row.appendChild(tag);
|
|
96
|
+
const matches = !lc || f.path.toLowerCase().includes(lc);
|
|
97
|
+
if (matches) {
|
|
98
|
+
row.classList.add("match");
|
|
99
|
+
if (!firstMatchSet) {
|
|
100
|
+
row.style.background = "var(--hover, #eee)";
|
|
101
|
+
firstMatchSet = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
row.addEventListener("mouseenter", () => row.style.background = "var(--hover, #eee)");
|
|
105
|
+
row.addEventListener("mouseleave", () => row.style.background = "");
|
|
106
|
+
row.addEventListener("click", () => {
|
|
107
|
+
dismiss({ accountId, folderId: f.id, folderPath: f.path, folderName: f.path.split(/[./]/).pop() || f.path });
|
|
108
|
+
});
|
|
109
|
+
if (!matches)
|
|
110
|
+
row.style.display = "none";
|
|
111
|
+
listEl.appendChild(row);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
render("");
|
|
115
|
+
search.addEventListener("input", () => render(search.value));
|
|
116
|
+
setTimeout(() => search.focus(), 0);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=folder-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-picker.js","sourceRoot":"","sources":["folder-picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folder picker — small modal for choosing a destination folder.
|
|
3
|
+
* Used by the message-list right-click "Move to folder…" item and any
|
|
4
|
+
* other UI that needs the user to pick a folder.
|
|
5
|
+
*
|
|
6
|
+
* Reads folders from the local DB via getFolders() (local-first — no
|
|
7
|
+
* server round-trip). Filters by typed text. Returns the selected
|
|
8
|
+
* folder, or null if the user dismissed.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { getFolders } from "../lib/api-client.js";
|
|
12
|
+
|
|
13
|
+
export interface FolderPickResult {
|
|
14
|
+
accountId: string;
|
|
15
|
+
folderId: number;
|
|
16
|
+
folderPath: string;
|
|
17
|
+
folderName: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Show a modal folder picker. Returns a promise resolving to the picked
|
|
21
|
+
* folder, or null if dismissed. The list is restricted to one account
|
|
22
|
+
* (the current message's account) so it doesn't get cluttered with
|
|
23
|
+
* unrelated folders; cross-account moves can be added later via an
|
|
24
|
+
* account selector at the top of the picker. */
|
|
25
|
+
export function pickFolder(accountId: string, opts?: { excludeFolderIds?: number[]; title?: string }): Promise<FolderPickResult | null> {
|
|
26
|
+
return new Promise(async (resolve) => {
|
|
27
|
+
const overlay = document.createElement("div");
|
|
28
|
+
overlay.className = "folder-picker-overlay";
|
|
29
|
+
overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.4);z-index:10000;display:flex;align-items:center;justify-content:center;";
|
|
30
|
+
|
|
31
|
+
const modal = document.createElement("div");
|
|
32
|
+
modal.className = "folder-picker-modal";
|
|
33
|
+
modal.style.cssText = "background:var(--bg, #fff);color:var(--fg, #000);border:1px solid var(--border, #ccc);border-radius:6px;box-shadow:0 4px 24px rgba(0,0,0,0.3);width:380px;max-width:90vw;max-height:70vh;display:flex;flex-direction:column;overflow:hidden;";
|
|
34
|
+
|
|
35
|
+
const header = document.createElement("div");
|
|
36
|
+
header.style.cssText = "padding:10px 14px;border-bottom:1px solid var(--border, #ddd);font-weight:600;";
|
|
37
|
+
header.textContent = opts?.title || "Move to folder…";
|
|
38
|
+
modal.appendChild(header);
|
|
39
|
+
|
|
40
|
+
const search = document.createElement("input");
|
|
41
|
+
search.type = "text";
|
|
42
|
+
search.placeholder = "Filter folders…";
|
|
43
|
+
search.style.cssText = "margin:8px 12px;padding:6px 10px;border:1px solid var(--border, #ccc);border-radius:4px;font-size:13px;";
|
|
44
|
+
modal.appendChild(search);
|
|
45
|
+
|
|
46
|
+
const listEl = document.createElement("div");
|
|
47
|
+
listEl.style.cssText = "flex:1;overflow-y:auto;padding:4px 0;";
|
|
48
|
+
modal.appendChild(listEl);
|
|
49
|
+
|
|
50
|
+
const footer = document.createElement("div");
|
|
51
|
+
footer.style.cssText = "padding:8px 12px;border-top:1px solid var(--border, #ddd);display:flex;justify-content:flex-end;gap:8px;";
|
|
52
|
+
const cancelBtn = document.createElement("button");
|
|
53
|
+
cancelBtn.textContent = "Cancel";
|
|
54
|
+
cancelBtn.style.cssText = "padding:6px 14px;cursor:pointer;";
|
|
55
|
+
footer.appendChild(cancelBtn);
|
|
56
|
+
modal.appendChild(footer);
|
|
57
|
+
|
|
58
|
+
overlay.appendChild(modal);
|
|
59
|
+
document.body.appendChild(overlay);
|
|
60
|
+
|
|
61
|
+
const dismiss = (result: FolderPickResult | null) => {
|
|
62
|
+
overlay.remove();
|
|
63
|
+
document.removeEventListener("keydown", onKey);
|
|
64
|
+
resolve(result);
|
|
65
|
+
};
|
|
66
|
+
const onKey = (e: KeyboardEvent) => {
|
|
67
|
+
if (e.key === "Escape") { e.preventDefault(); dismiss(null); }
|
|
68
|
+
if (e.key === "Enter") {
|
|
69
|
+
const first = listEl.querySelector(".folder-picker-row.match") as HTMLElement | null;
|
|
70
|
+
if (first) first.click();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener("keydown", onKey);
|
|
74
|
+
overlay.addEventListener("click", (e) => { if (e.target === overlay) dismiss(null); });
|
|
75
|
+
cancelBtn.addEventListener("click", () => dismiss(null));
|
|
76
|
+
|
|
77
|
+
// Local-first: load from DB synchronously-ish (one IPC round-trip).
|
|
78
|
+
let folders: any[] = [];
|
|
79
|
+
try {
|
|
80
|
+
folders = (await getFolders(accountId)) || [];
|
|
81
|
+
} catch (e) {
|
|
82
|
+
listEl.textContent = "Failed to load folders";
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Hide special-use that don't make sense as targets (Outbox).
|
|
87
|
+
// Allow Trash / Junk so users can manually file into them.
|
|
88
|
+
const excluded = new Set(opts?.excludeFolderIds || []);
|
|
89
|
+
const targets = folders
|
|
90
|
+
.filter((f: any) => !excluded.has(f.id))
|
|
91
|
+
.filter((f: any) => f.specialUse !== "outbox")
|
|
92
|
+
.sort((a: any, b: any) => a.path.localeCompare(b.path));
|
|
93
|
+
|
|
94
|
+
function render(filter: string): void {
|
|
95
|
+
listEl.innerHTML = "";
|
|
96
|
+
const lc = filter.toLowerCase().trim();
|
|
97
|
+
let firstMatchSet = false;
|
|
98
|
+
for (const f of targets) {
|
|
99
|
+
const row = document.createElement("div");
|
|
100
|
+
row.className = "folder-picker-row";
|
|
101
|
+
row.style.cssText = "padding:6px 14px;cursor:pointer;font-size:13px;display:flex;justify-content:space-between;gap:8px;";
|
|
102
|
+
const name = document.createElement("span");
|
|
103
|
+
name.textContent = f.path;
|
|
104
|
+
const tag = document.createElement("span");
|
|
105
|
+
tag.style.cssText = "color:var(--muted, #888);font-size:11px;";
|
|
106
|
+
tag.textContent = f.specialUse || "";
|
|
107
|
+
row.appendChild(name);
|
|
108
|
+
row.appendChild(tag);
|
|
109
|
+
const matches = !lc || f.path.toLowerCase().includes(lc);
|
|
110
|
+
if (matches) {
|
|
111
|
+
row.classList.add("match");
|
|
112
|
+
if (!firstMatchSet) { row.style.background = "var(--hover, #eee)"; firstMatchSet = true; }
|
|
113
|
+
}
|
|
114
|
+
row.addEventListener("mouseenter", () => row.style.background = "var(--hover, #eee)");
|
|
115
|
+
row.addEventListener("mouseleave", () => row.style.background = "");
|
|
116
|
+
row.addEventListener("click", () => {
|
|
117
|
+
dismiss({ accountId, folderId: f.id, folderPath: f.path, folderName: f.path.split(/[./]/).pop() || f.path });
|
|
118
|
+
});
|
|
119
|
+
if (!matches) row.style.display = "none";
|
|
120
|
+
listEl.appendChild(row);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
render("");
|
|
124
|
+
search.addEventListener("input", () => render(search.value));
|
|
125
|
+
setTimeout(() => search.focus(), 0);
|
|
126
|
+
});
|
|
127
|
+
}
|