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.
This commit is contained in:
2026-06-02 12:47:06 +08:00
parent 12f2916a24
commit 0b26f7e5b3
37 changed files with 1479 additions and 338 deletions
+21 -1
View File
@@ -102,5 +102,25 @@
"server.emailConfirmSubject": "Confirm your Verstak Sync account",
"server.emailConfirmBody": "Welcome to Verstak Sync!\n\nPlease confirm your email by clicking:\n%s\n\nIf you did not register, ignore this message.",
"server.emailResetSubject": "Verstak Sync password reset",
"server.emailResetBody": "Reset your Verstak Sync password:\n\n%s\n\nThis link expires in 1 hour."
"server.emailResetBody": "Reset your Verstak Sync password:\n\n%s\n\nThis link expires in 1 hour.",
"nav.system": "System",
"nav.workspace": "Workspace",
"nav.noNodes": "No nodes",
"nav.openFolder": "Open folder",
"nav.createInside": "Create inside",
"template.folder": "Folder",
"template.project": "Project",
"template.client": "Client",
"template.document": "Document",
"template.recipe": "Recipe",
"common.archive": "Archive",
"migrate.dryRun": "Dry run",
"migrate.foldersCreated": "Folders created",
"migrate.templatesSet": "Templates set",
"migrate.errors": "Errors",
"migrate.noNodes": "No nodes to migrate"
}
+21 -1
View File
@@ -384,5 +384,25 @@
"server.emailConfirmSubject": "Подтверждение аккаунта Verstak Sync",
"server.emailConfirmBody": "Добро пожаловать в Verstak Sync!\n\nПодтвердите email, перейдя по ссылке:\n%s\n\nЕсли вы не регистрировались, проигнорируйте это письмо.",
"server.emailResetSubject": "Сброс пароля Verstak Sync",
"server.emailResetBody": "Сброс пароля Verstak Sync:\n\n%s\n\nСсылка действительна 1 час."
"server.emailResetBody": "Сброс пароля Verstak Sync:\n\n%s\n\nСсылка действительна 1 час.",
"nav.system": "Системное",
"nav.workspace": "Рабочее пространство",
"nav.noNodes": "Нет узлов",
"nav.openFolder": "Открыть папку",
"nav.createInside": "Создать внутри",
"template.folder": "Папка",
"template.project": "Проект",
"template.client": "Клиент",
"template.document": "Документ",
"template.recipe": "Рецепт",
"common.archive": "Архивировать",
"migrate.dryRun": "Пробный запуск",
"migrate.foldersCreated": "Папок создано",
"migrate.templatesSet": "Шаблонов назначено",
"migrate.errors": "Ошибки",
"migrate.noNodes": "Нет узлов для миграции"
}