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:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "Нет узлов для миграции"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user