mirivlad
88eb99e9af
fix: verstak:// links in preview, case-insensitive search, keyboard layout swap
...
1. Fix verstak:// links rendered as blocked/strikethrough in markdown preview:
- Changed href from 'javascript:void(0)' to hash-based '#verstak-type-id'
- DOMPurify no longer strips the link; click handler uses data-verstak-href
- CSS already handles .md-link--internal with cyan color, no strikethrough
2. Add markdown label escaping for internal link picker:
- New escapeMarkdownLabel() in markdown.ts escapes [ ] ( )
- Applied in InternalLinkPicker.selectResult() before inserting markdown
3. Fix case-insensitive search for RU/EN:
- Add title_lower column (migration 019) populated by Go strings.ToLower
- BackfillTitleLower() runs after migrations to populate existing rows
- Search() now queries title_lower with Go-level lowercase (Unicode-aware)
- insertNode() and UpdateTitle() populate title_lower automatically
- New migration 019 + BackfillTitleLower in storage.go
- Tests: TestSearchCaseInsensitive, TestSearchFindsCreatedNode
4. Add keyboard layout swap search support:
- New keyboardLayout.ts utility with RU↔EN QWERTY mapping
- expandKeyboardVariants() generates original + swapped + lowercased variants
- InternalLinkPicker.search() queries all variants in parallel, deduplicates by ID
- Examples: dthcnfr → верстак, руддщ → hello
Files changed:
- markdown.ts: hash href + escapeMarkdownLabel export
- InternalLinkPicker.svelte: label escaping + layout swap search
- keyboardLayout.ts: new RU/EN layout swap utility
- repository.go: title_lower in Search/insertNode/UpdateTitle
- storage.go: migration019 + BackfillTitleLower
- migrations_019.sql.go: new migration
- search_test.go, repository_test.go: new tests
2026-06-15 10:39:44 +08:00
mirivlad
0b26f7e5b3
refactor: implement template-driven node tree and human-readable vault layout
...
Unified Node model: added template_id, fs_path, archived, sort_order fields.
Template registry: system templates embedded as JSON (folder/project/client/
document/recipe), with Registry for enabled/disabled/filtered access.
SafeDisplayNameToPathSegment: human-readable path segments with Cyrillic
support, illegal char replacement, uniqueness via numeric suffixes.
Sidebar refactored: system views (Today/Inbox/Activity) separate from
workspace tree. Creation menu built dynamically from enabled templates.
Create/Rename/Move: physical folder operations with fs_path update,
recursive descendant path updates.
DB migration 012: adds template_id, fs_path, archived columns.
Vault migration command: rebuilds fs_path for existing nodes.
Tests: safename, registry, node model, repository integration.
Docs: VAULT_LAYOUT.md, TEMPLATES.md, PLAN.md updated.
i18n: nav.system, nav.workspace, template.*, common.rename/archive,
migrate.* keys added to ru.json and en.json.
2026-06-02 12:47:06 +08:00
mirivlad
9ee6df0d3f
feat: node section assignment for sidebar filtering + search fix
...
Backend:
- Migration 004: add 'section' column to nodes table
(NULL=inbox, values: clients/projects/recipes/documents/archive)
- Create(parentID, type, title, section) — section stored on root nodes
- ListRoots(includeDeleted, section) — filters by section
(section='inbox' returns nodes with NULL section)
- GET /api/nodes?section=X filters root nodes by section
- POST /api/nodes accepts 'section' field in body
Frontend:
- Sidebar separates 'НАВИГАЦИЯ' (virtual sections) from 'ДЕЛА' (real nodes)
- Each section loads only its own nodes: GET /api/nodes?section=clients etc.
- Creating from a section sets the section automatically
- Inbox shows only nodes with no section
- selectBySearch(id) closes result dropdown after selection
- All types shown in Russian (Дело, Заметка, Папка, etc.)
Acceptance: go build pass, go test pass (all packages),
manual: Pro projects section shows only project-nodes,
clients only client-nodes, inbox only unsectioned nodes.
2026-05-31 01:26:46 +08:00
mirivlad
69eb909d48
step 3: nodes repository + CRUD + CLI node commands
...
- types.go: TypeSpace/Case/Folder/Note/... + Slugify()
- node.go: Node struct, Meta, IsDeleted/IsRoot helpers
- repository.go: full CRUD (Create, Get, GetActive, ListChildren,
ListRoots, UpdateTitle, Move, SoftDelete) + Meta KV (MetaSet,
MetaGet, MetaList)
- node_cmd.go: thin wrappers around repository
- main.go: verstak node create/list/get/move/delete subcommands
- repository_test.go: 12 tests covering all CRUD paths
Acceptance: go build pass, go test pass (12 tests),
CLI create+list+get+move+delete all working.
2026-05-30 19:09:25 +08:00