Skip to content

[TW-7527] fix(@ownmail/app): preserve intent across mail and calendar workflows - #374

Merged
AaronDDM merged 6 commits into
mainfrom
codex/TW-7527-improve-experience-part-3
Oct 5, 2026
Merged

AaronDDM merged 6 commits into
mainfrom
codex/TW-7527-improve-experience-part-3

Conversation

@AaronDDM

@AaronDDM AaronDDM commented Oct 5, 2026 •

Copy link
Copy Markdown
Collaborator

OwnMail now protects user intent across inbox cleanup, interrupted composition, search, and scheduling. Bulk actions work consistently in folders and search results, explicitly target loaded conversations, retain failed selections, and provide aggregate Undo with retry. Mobile selection uses the existing bottom bar and restores keyboard focus after recovery.

Draft autosave tracks edit revisions, so a slow response cannot mark newer typing as saved. Persistent save status, failure feedback and Retry preserve the latest recipient and message edits, including cleared fields. Populated-draft deletion and empty-subject sending require deliberate choices. Search handles empty-field suggestions, IME input, stale selections, duplicate submissions, and clear-focus recovery; draft Resume hydration is also corrected.

Calendar editing shows the time zone and end date, preserves elapsed duration across midnight and daylight-saving changes, and requires a first/second occurrence choice for ambiguous local times. Metadata-only edits retain original timestamps. Dirty editors protect Close, Cancel, Escape, module navigation, Back, and reload.

Validation:

  • 3,523 app tests across 175 files; 100% statements, branches, functions and lines coverage, with thresholds unchanged. Final full run used two workers after concurrent builds caused timeout failures; no test timeouts were relaxed.
  • All five OwnMail build/typecheck tasks pass; authenticated SSR and packed-install release smoke tests pass.
  • Repository lint passes before each commit with 63 spacing warnings; commit hooks and message checks pass.
  • Browser checks cover draft cancellation and save-failure Retry, ten-conversation archive/Undo, search-result bulk recovery and focus, repeated-hour choices, preserved duration, and responsive surfaces at 320/375/414/640/767/768 px.
  • Six app changesets included: one minor for bulk selection and five patches.

Research, sources, frozen persona rubric and reusable calculator.

Independent task-based evaluation improved from mean 6.67 to 8.50; all six personas reach the raised 8.5 minimum. These are synthetic expert assessments, not observed recommendation probabilities or NPS. Remaining limits include loaded-only batches, some bulk keyboard friction, and no durable unfinished-event recovery after browser termination. Real providers, physical devices and assistive technologies were not exercised. GitHub checks are queued; this draft PR has not been merged or deployed.

Tracks TW-7527 under TW-5882.

@AaronDDM
AaronDDM requested a review from qasim-nylas October 5, 2026 20:27
@AaronDDM
AaronDDM marked this pull request as ready for review October 5, 2026 20:27
@AaronDDM
AaronDDM requested a review from radenkovic as a code owner October 5, 2026 20:27

@qasim-nylas qasim-nylas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-05T20:32:38.870125Z e3a1143 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@AaronDDM
AaronDDM merged commit dde7ce1 into main Oct 5, 2026
2 of 6 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e3a1143a9d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +231 to +235
function changeEventDate(date: string) {
setEventDate(date)
setEndDate(editorDateOffset(date, Math.floor(endHour / 24)))
setStartChoice(null)
setEndChoice(null)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve duration when changing the event date

When a timed event's date is changed across a DST boundary, this retains the old wall-clock end instead of recomputing it from lastDuration. For example, moving a 01:30–02:30 event to 2026-03-08 in America/Toronto leaves a nonexistent 02:30 end and prevents saving; a fall-back date can similarly change the elapsed duration. Derive the new end instant from the selected start plus the preserved duration, as changeStartHour already does.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants