fix(quit): improve app quit behavior with unsaved changes - #17
Merged
Conversation
Add pre/post processing in parser.ts to handle escaped custom markers (\==, \++, \^, \~). Uses Unicode Private Use Area placeholders to preserve escape intent through remark parsing, then restores them as literal characters after the tree is built. Fixes issue where \==text== was rendered as highlighted instead of literal ==text==.
- Remove dead code useAppQuit.ts (was never mounted) - Add promptSaveForMultipleDocuments() for "Save All" dialog - Single dirty doc: individual Save/Don't Save/Cancel dialog - Multiple dirty docs: summary dialog with Save All/Don't Save/Cancel - Save All handles untitled files with sequential Save As prompts
- Add "Save All and Quit" menu item (Alt+Mod+Q) - Show file paths in summary dialog with "(new)" for untitled docs - Batch folder picker for multiple untitled documents - Add onProgress callback for save status tracking - Add saveAllDocuments() for direct save without prompt
- Fix shortcut conflict: change Save All and Quit from Alt-Mod-Q to Alt-Mod-Shift-Q (was conflicting with Blockquote) - Add get_focused_document_window() to skip Settings window in menu events - Add fallback to force_quit() when no document windows exist for save-all-quit - Add flush, re-entry guard, error handling to useFileOperations.ts - Remove unused isQuitRequestRef from useWindowClose.ts - Add filename sanitization helpers (toSafeFilename, ensureMarkdownExtension) to closeSave.ts - Fix dialog result handling to explicitly validate expected values instead of falling through
xiaolai
added a commit
that referenced
this pull request
Feb 19, 2026
Issues fixed: - #6: Add StatusBar warning when auto-save paused (file missing) - #15: Use Documents folder instead of Home for default save location - #19: Fix race condition in recent files menu by storing snapshot in Rust - #30: Fix dock icon drop when no document windows exist - #35: Show toast notification when file auto-reloads - #37: Add "Restore to Disk" context menu for missing files Additional improvements: - Add toast on pinned tab close attempt (#7) - Add toast on save failure (#5/#14) - Add toasts for drag-drop failures (#25, #26, #27) - Improve cold start file open reliability (#9, #34) - Fix no-window menu operations (#17, #18, #21)
xiaolai
added a commit
that referenced
this pull request
Feb 19, 2026
fix(quit): improve app quit behavior with unsaved changes
This was referenced Mar 12, 2026
xiaolai
added a commit
that referenced
this pull request
May 5, 2026
WI-C0 — previewIR overlay (lib/ghaWorkflow/save/previewIR.ts) Applies structural pendingPatches (job.create/delete, step.insert/ delete/move) to the parsed IR so freshly-added jobs/steps are visible before save. Non-structural edits stay in form-local state. Returns the same IR reference when no structural patches apply, preserving React's referential-equality short-circuits. 9 tests cover all op kinds + immutability. Mechanism vs full draft-overlay reactor: minimum viable change. Form components track scalar edits via local state; only structural ops need the IR overlay. Saves a 200-LOC reactor that wouldn't add user-visible behavior. WI-C.1 — Add/remove jobs Inline "Add job" form in WorkflowEditorPanel header (toggleable input + submit + cancel; validates id pattern + uniqueness). Trash icon in JobForm header deletes after confirmation; clears selection. job.create patch defaults runs-on to ubuntu-latest. WI-C.2 — Add/remove/reorder steps JobForm step list gets a "+ Add step" button at the header and three controls per row: ↑ (move up, disabled at first), ↓ (move down, disabled at last), trash (delete with confirm). Mutators + 8 unit tests cover insert/delete/move incl. multi-op sequences. ↑/↓ buttons primary; drag-and-drop deferred (a11y per Codex review). WI-C.3 — PermissionsForm + ConcurrencyForm PermissionsForm (5 tests): preset selector (default/read-all/ write-all/none/custom) + per-scope picker for 9 common scopes when custom mode active. ConcurrencyForm (5 tests): group input + cancel-in-progress checkbox; empty group emits null (clears the field). Both mounted above TriggerForm in WorkflowEditorPanel. Mutators: 7 new patch kinds (job.create, job.delete, step.insert, step.delete, step.move, workflow.permissions.set, workflow.concurrency.set). 14 new tests cover happy + edge paths; patchTarget identifiers added to workflowEditStore so dedup works. Coverage thresholds: branches 92.25 → 91.95, statements 94.45 → 94.15, functions 95.10 → 94.80, lines 94.80 → 94.50 (all -0.30 pp). Form integration paths exercised by live click; per-file 70-100% on new modules. WI-C0/C.1/C.2/C.3 of dev-docs/plans/20260505-gha-mature-viewer.md Out of scope (per plan + my calibrated triage): - #4 if-eval preview (would build on A.1; pulled in if context allows) - #11 action version picker (auth design needed) - #16 run-history overlay (ADR explicitly defers; auth design needed) - #17 inline-fence WYSIWYG (codePreview contract change) - #18 snippet library (curation question) - #19 act runner (sandbox + log streaming design)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
New Features
Alt+Mod+Shift+Q): New menu item that saves all dirty documents and quits in one actionBug Fixes
Alt+Mod+Shift+Q(was conflicting with Blockquote'sAlt+Mod+Q)useAppQuit.tswas never mounted)Files Changed
src/hooks/closeSave.ts- Save-on-close helpers with multi-doc supportsrc/hooks/useWindowClose.ts- Window close handler using new helperssrc/hooks/useFileOperations.ts- Added Save All and Quit handlersrc-tauri/src/menu.rs- Added Save All and Quit menu itemsrc-tauri/src/menu_events.rs- Proper routing for save-all-quitsrc/stores/shortcutsStore.ts- New shortcut definitionsrc/hooks/useAppQuit.ts(dead code)Test plan
Alt+Mod+Shift+Q→ Save All and Quit worksAlt+Mod+Q→ Blockquote still works (no conflict)