Commit Graph
23 Commits
Author SHA1 Message Date
doyaGu f9f0e71453 fix(board): commit a search only after its query succeeds and report read failures
A failed read on a UI path (sort change, clear, refresh after a write, opening a
card, the tag picker, the tags tab) used to escape as an unhandled exception.
Reads now run before the view is cleared and report Error_Read_* instead; the
active filter changes only once its query has run. DataWritten and TagsChanged
fire only after a successful refresh, so a broken database shows one dialog.
2026-10-03 08:58:53 -04:00
doyaGu 23f7806e2d fix(search): cap an expression at 256 atoms
The compiled SQL chains every atom into one expression, and SQLite rejects
expressions deeper than 1000 levels. A query of about 1000 words parsed but
then failed in SQL, outside the syntax-error handling, and crashed the app.
The parser now rejects more than 256 atoms as a syntax error.
2026-10-03 08:49:57 -04:00
doyaGu 1d744ba504 fix(search): reject empty phrases and phrases glued to other text
The lexer now keeps token offsets and rejects what the grammar never allowed
but the token rules accepted:
- an empty phrase: "" (matched every card), tag:""
- a phrase touching a word or another phrase: a"b", "a"b, "a""b"
- whitespace between a qualifier and its phrase value: tag: "x"

key:"value" stays the only legal contact; parentheses still delimit phrases.
Listed in PLAN 6.1/6.2 and USAGE.
2026-10-03 08:20:30 -04:00
doyaGu 9277e2a331 fix(export): escape backslashes in tag table cells
A backslash right before a pipe, as in the tag name a\|b, turned the escaped
pipe into "\|": the table splitter reads "\\" as an escaped backslash and the
pipe as a column separator, shifting the row. Cells now escape '\' before '|'.
Recorded in PLAN 5.8.
2026-10-03 08:20:23 -04:00
doyaGu 98e001d719 test: spell the private-use character as \uE000 in the ordering test
The literal U+E000 was invisible and read like an empty title.
2026-10-03 08:13:03 -04:00
doyaGu 8e144b9154 fix(export): write LF line endings and keep titles on one line
AppendLine wrote CRLF on Windows; the document now uses LF everywhere and
converts CRLF/CR inside card bodies and column descriptions. Column titles and
the workspace name are collapsed to one line like card titles.
2026-10-03 08:12:53 -04:00
doyaGu c12408d2e3 fix(storage): refuse to open a workspace whose database file is missing
With .ykanban present but ykanban.db gone, opening used to create an empty
database and show an empty board without any hint. It now throws
WorkspaceDatabaseMissingException and shows the open-failed page, telling the
user to restore a backup or delete .ykanban and initialize again.
2026-10-03 08:12:53 -04:00
doyaGu 22102cd1ea fix(storage): initialize workspaces under the lock in one transaction
Follows PLAN 4.2: create .ykanban, take the lock, then build the database.
SqliteDatabase.Create writes every migration and the preset columns in a
single transaction and deletes the file again on failure, so no empty
version-0 database is left behind. WorkspaceSession.Initialize keeps the lock
into the session instead of releasing and re-acquiring it.

A lock conflict while initializing shows the lock-conflict page.
2026-10-03 08:12:35 -04:00
doyaGu d2a5d36bd2 fix(search): reject parentheses nested deeper than 64 levels
Deep nesting overflowed the stack of the recursive Pidgin parser (around
400-700 levels), an uncatchable crash. The depth is now checked on the token
stream before parsing and reported as a syntax error. Listed in PLAN 6.2 and
USAGE.
2026-10-03 08:12:34 -04:00
doyaGu 6ea0df43e3 feat: implement tags tab, board search execution and markdown export wiring 2026-10-03 07:34:34 -04:00
doyaGu e3f58ce150 feat: implement board tab with dialogs, virtualized card lists and refresh-after-write
- board: columns in id order, per-column sort via config, column width presets (240/320/480) and custom 160-720
- column header new-card and edit/delete menu; card menu delete and move-to-column
- card editor as one unit of work with dirty check and discard confirmation; nested tag picker writes new tags immediately
- schema constraint violations mapped to typed exceptions and shown inside the modal
- dialog service with owner stack so nested modals center on their parent and get FlowDirection
- repository: filtered GetCards, CountCards; view-model tests
2026-10-03 03:33:25 -04:00
doyaGu 433f204c81 feat: apply ui flow direction to modal windows and guard code-behind resources usage 2026-10-03 02:59:47 -04:00
doyaGu 6743e1572e feat: add workspace open-failed page and tighten launch argument rules 2026-10-03 02:58:43 -04:00
doyaGu cde9e8e20c fix: align markdown export escaping and time format with plan 2026-10-03 02:56:18 -04:00
doyaGu 4b56297135 feat: write app.json only when changed and fall back per invalid field 2026-10-03 02:54:27 -04:00
doyaGu bb4f96a9c5 feat: drop created-at card sort and add card display ordering 2026-10-03 02:52:28 -04:00
doyaGu 27b507e439 feat: tighten search grammar and use unicode case folding 2026-10-03 02:50:52 -04:00
doyaGu 632339ea42 feat: make column title and tag name uniqueness case-insensitive 2026-10-03 02:44:46 -04:00
doyaGu 33757f6cbc chore: migrate to net10.0 and Microsoft.Data.Sqlite 10.0.12 2026-10-03 02:43:39 -04:00
yyc12345 22a0f61cb5 feat: add search parser, sql compiler and markdown export 2026-10-02 22:32:33 +08:00
yyc12345 941e22c7ff feat: add models and workspace repository layer 2026-10-02 22:12:38 +08:00
yyc12345 c2ee02c209 feat: add storage foundation and i18n resources 2026-10-02 22:05:12 +08:00
yyc12345 a5edad4aad chore: reorganize project and add test project 2026-10-02 21:44:40 +08:00