@bobfrankston/rmfmail 1.2.326 → 1.2.328

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 ADDED
@@ -0,0 +1,12 @@
1
+ Edit in Word: edits come back as Word's own HTML (Range.ExportFragment), not mammoth; default calendar = primary
2
+
3
+ - mailx-service 0.1.40: the COM autosave sidecar exports `<base>-word.htm` via
4
+ Range.ExportFragment(path, wdFormatFilteredHTML) before each autosave and
5
+ mirrors a manual Ctrl+S on its next tick. New word-html.ts turns that export
6
+ into a body fragment (Mso classes, comments and o: tags stripped, sidecar
7
+ images inlined as data: URIs). The watcher has a per-file debounce, ignores
8
+ .docx saves once the Word HTML mirror exists, and keeps mammoth only for
9
+ sessions without the sidecar. Word gets only the text above the signature
10
+ (v1.2.327 split); the signature and quoted message are re-attached unchanged.
11
+ - Calendar: the Add-event picker always defaults to the primary ("personal")
12
+ calendar instead of remembering the last choice.
@@ -32,3 +32,23 @@ Session: Claude Fable 5.1, started 2026-09-13 ~17:00 EDT.
32
32
  one tick after paste; moves the caret just after (or before) the anchor when only whitespace/U+FEFF
33
33
  separates it from the edge. Quill's typed path NOT covered (not the configured editor).
34
34
  - Ships as rmfmail 1.2.326 via rebuild.cmd (running). Bob must restart the daemon for the new bundle.
35
+
36
+ ## Follow-on (~19:40): Edit in Word lost the quoted message's formatting
37
+ - Cause: whole body → html-to-docx (flattens blockquote) → Word → mammoth (only p/a/br back).
38
+ - Fix (v1.2.327, publishing): `splitWordEditable()` in client/compose/compose.ts — Word gets only the
39
+ part above the signature rule (`hr.mailx-sig-rule`, legacy `hr[style*=3cm]`) or `div.reply`; the
40
+ tail is re-read from the editor at apply time and appended unchanged.
41
+ - OPEN (Bob's direction): replace mammoth on the return path with his `y:\dev\utils\whts` converter.
42
+ whts today = whole-document CLI (`converter(docPath)` writes files, uses globals/logger/drive
43
+ paths, emits CSS classes via styleToClass, pulls sql/itemgen/pdf deps). Needs a lean exported
44
+ `docxToHtml()` core with inline styles before rmfmail can import it. Not touched — separate project.
45
+ - Checked: bundled TinyMCE 8.8.2 has NO Word-HTML cleaner (that is PowerPaste, paid); only the
46
+ generic paste path and `mceInsertClipboardContent`.
47
+
48
+ ## ~20:20 ExportFragment route BUILT (mailx-service 0.1.40, unpublished yet)
49
+ - word-html.ts (new): wordHtmlToFragment(htm) — body only, Mso classes/comments/o: tags stripped, images inlined.
50
+ - index.ts: sidecar exports `${base}-word.htm` via Range.ExportFragment(…,10) BEFORE each autosave and
51
+ mirrors manual Ctrl+S on the next tick; watcher has per-file debounce, ignores .docx once -word.htm
52
+ exists, converts -word.htm; sweep protects -word.htm/-word_files. Head/tail split (v1.2.327) unchanged.
53
+ - Calendar default = primary always (calendar-sidebar.ts, sticky localStorage choice removed). Publishing as 1.2.328 (rebuild4.log).
54
+ localStorage pref else "primary").
@@ -7233,16 +7233,11 @@ function openNewEventDialog() {
7233
7233
  const fillCalendars = (list) => {
7234
7234
  const writable = writableCalendars(list);
7235
7235
  calSelect.innerHTML = "";
7236
- let last = "";
7237
- try {
7238
- last = localStorage.getItem(LAST_CALENDAR_PREF) || "";
7239
- } catch {
7240
- }
7241
7236
  for (const c of writable) {
7242
7237
  const opt = document.createElement("option");
7243
7238
  opt.value = c.id;
7244
7239
  opt.textContent = c.primary ? `${c.name} (personal)` : c.name;
7245
- if (c.id === last || !last && c.primary)
7240
+ if (c.primary)
7246
7241
  opt.selected = true;
7247
7242
  calSelect.append(opt);
7248
7243
  }
@@ -7328,10 +7323,6 @@ function openNewEventDialog() {
7328
7323
  const saved = [];
7329
7324
  const calendarId = calSelect.value || "primary";
7330
7325
  const calendarName = calSelect.selectedOptions[0]?.textContent || "";
7331
- try {
7332
- localStorage.setItem(LAST_CALENDAR_PREF, calendarId);
7333
- } catch {
7334
- }
7335
7326
  for (const ev of targets) {
7336
7327
  const row = { ...eventToLocalRow(ev, text), calendarId };
7337
7328
  try {
@@ -7593,7 +7584,7 @@ function initCalendarSidebar() {
7593
7584
  }
7594
7585
  }
7595
7586
  }
7596
- var SIDEBAR_PREF, SHOW_RECURRING_PREF, SHOW_DONE_PREF, HORIZON_DAYS_PREF, HORIZON_DEFAULT_DAYS, HOLIDAY_HORIZON_MS, viewYear, viewMonth, viewDay, viewPinned, lastEvents, lastOverdueTasks, LAST_CALENDAR_PREF, calById, calendarList, hiddenCalendars, selectedTaskUuids, TASK_DELETE_NOTE;
7587
+ var SIDEBAR_PREF, SHOW_RECURRING_PREF, SHOW_DONE_PREF, HORIZON_DAYS_PREF, HORIZON_DEFAULT_DAYS, HOLIDAY_HORIZON_MS, viewYear, viewMonth, viewDay, viewPinned, lastEvents, lastOverdueTasks, calById, calendarList, hiddenCalendars, selectedTaskUuids, TASK_DELETE_NOTE;
7597
7588
  var init_calendar_sidebar = __esm({
7598
7589
  "client/components/calendar-sidebar.js"() {
7599
7590
  "use strict";
@@ -7611,7 +7602,6 @@ var init_calendar_sidebar = __esm({
7611
7602
  viewPinned = false;
7612
7603
  lastEvents = [];
7613
7604
  lastOverdueTasks = [];
7614
- LAST_CALENDAR_PREF = "mailx.calendar.lastCreateCalendar";
7615
7605
  calById = /* @__PURE__ */ new Map();
7616
7606
  calendarList = [];
7617
7607
  hiddenCalendars = /* @__PURE__ */ new Set();