@allbluecn/web-app 0.9.5 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/public/favicon.ico +0 -0
- package/src/__tests__/paraglide.test.ts +43 -0
- package/src/__tests__/setup.ts +27 -9
- package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
- package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
- package/src/assets/logo/logo.tsx +53 -36
- package/src/components/agents/agent-card.tsx +7 -7
- package/src/components/agents/agent-form-dialog.tsx +41 -42
- package/src/components/agents/agent-selector.tsx +6 -8
- package/src/components/agents/agents-page.tsx +26 -28
- package/src/components/agents/skill-card.tsx +1 -4
- package/src/components/agents/skill-form-dialog.tsx +19 -21
- package/src/components/agents/slash-skill-menu.tsx +5 -7
- package/src/components/agents/use-agent-handlers.ts +5 -8
- package/src/components/ai/ai-chat-prompt.tsx +26 -33
- package/src/components/ai/global-chat-panel.tsx +10 -11
- package/src/components/ai/use-knowledge-bases.ts +2 -2
- package/src/components/anyhub/anyhub-app-card.tsx +13 -15
- package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
- package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
- package/src/components/anyhub/anyhub-management-view.tsx +9 -11
- package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
- package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
- package/src/components/anyhub/anyhub-provider.tsx +0 -1
- package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
- package/src/components/auth/auth-header.tsx +2 -2
- package/src/components/auth/icon-input.tsx +0 -1
- package/src/components/auth/oauth-section.tsx +3 -5
- package/src/components/auth/password-input.tsx +2 -4
- package/src/components/auth/session-guard.tsx +0 -1
- package/src/components/auth/sso-section.tsx +3 -4
- package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
- package/src/components/billing/billing-panel.tsx +5 -6
- package/src/components/billing/checkout-redirect.ts +6 -10
- package/src/components/billing/feature-gate.tsx +2 -3
- package/src/components/billing/invoice-history.tsx +9 -11
- package/src/components/billing/login-prompt-dialog.tsx +10 -11
- package/src/components/billing/pricing-card.tsx +6 -7
- package/src/components/billing/pricing-page.tsx +4 -5
- package/src/components/billing/seats-manager.tsx +19 -20
- package/src/components/billing/subscription-card.tsx +13 -14
- package/src/components/billing/upgrade-prompt.tsx +11 -13
- package/src/components/changelog/changelog-page.tsx +36 -26
- package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
- package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
- package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
- package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
- package/src/components/chat/ai-chat-history/index.tsx +11 -15
- package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
- package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
- package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
- package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
- package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
- package/src/components/chat/ai-citations/index.tsx +3 -4
- package/src/components/chat/ai-citations/utils.ts +15 -3
- package/src/components/chat/ai-conversation.tsx +10 -12
- package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
- package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
- package/src/components/chat/ai-message/index.tsx +5 -5
- package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
- package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
- package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
- package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
- package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
- package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
- package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
- package/src/components/chat/ai-prompt-input/index.tsx +18 -11
- package/src/components/chat/ai-prompt-input/types.ts +6 -5
- package/src/components/chat/ai-thinking.tsx +6 -9
- package/src/components/chat/chat-thread-page.tsx +4 -5
- package/src/components/chat/interrupt-approval.tsx +6 -8
- package/src/components/command/command-palette.tsx +7 -10
- package/src/components/design/project-card.tsx +2 -3
- package/src/components/design/sketch/code-preview.tsx +3 -4
- package/src/components/design/sketch/export-panel.tsx +3 -4
- package/src/components/design/sketch/property-panel.tsx +16 -17
- package/src/components/error/global-error-boundary.tsx +65 -0
- package/src/components/forms/app-array-field.tsx +3 -4
- package/src/components/forms/app-combobox.tsx +2 -3
- package/src/components/forms/app-date-picker.tsx +2 -3
- package/src/components/forms/app-form-dialog.tsx +3 -4
- package/src/components/forms/app-select.tsx +2 -3
- package/src/components/forms/hooks/use-form-submit.ts +2 -2
- package/src/components/forms/schemas/common.ts +4 -6
- package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
- package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
- package/src/components/iteration/burndown-chart.tsx +6 -8
- package/src/components/iteration/constants.ts +5 -4
- package/src/components/iteration/create-iteration-dialog.tsx +14 -15
- package/src/components/iteration/iteration-card.tsx +3 -4
- package/src/components/iteration/iteration-editor.tsx +7 -8
- package/src/components/iteration/iteration-progress-bar.tsx +3 -5
- package/src/components/iteration/iteration-status-badge.tsx +1 -3
- package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
- package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
- package/src/components/knowledge/doc-properties.tsx +12 -13
- package/src/components/knowledge/editor/doc-header.tsx +7 -8
- package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
- package/src/components/knowledge/knowledge-homepage.tsx +6 -7
- package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
- package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
- package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
- package/src/components/knowledge/knowledge-tree.tsx +15 -16
- package/src/components/knowledge-public/bookmark-card.tsx +13 -14
- package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
- package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
- package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
- package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
- package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
- package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
- package/src/components/knowledge-public/markdown-editor.tsx +3 -4
- package/src/components/knowledge-public/markdown-view.tsx +2 -3
- package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
- package/src/components/knowledge-public/tag-filter.tsx +3 -4
- package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
- package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
- package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
- package/src/components/layout/sidebar-03/index.tsx +0 -1
- package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
- package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
- package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
- package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
- package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
- package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
- package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
- package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
- package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
- package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
- package/src/components/magicui/primitives/animate/slot.tsx +0 -1
- package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
- package/src/components/magicui/sparkles-text.tsx +0 -1
- package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
- package/src/components/notifications/settings-notifications.tsx +22 -23
- package/src/components/notifications/team-notifications.tsx +27 -29
- package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
- package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
- package/src/components/project/create-project-dialog.tsx +60 -34
- package/src/components/project/invite-member-dialog.tsx +20 -21
- package/src/components/project/project-activity-list.tsx +19 -24
- package/src/components/project/project-member-manager.tsx +27 -28
- package/src/components/project/project-module-card.tsx +5 -6
- package/src/components/project/schemas/create-project.ts +3 -5
- package/src/components/prototype/component/GenericPrototype.tsx +0 -1
- package/src/components/prototype/component-preview.tsx +0 -1
- package/src/components/settings/ai/api-key-field.tsx +8 -10
- package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
- package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
- package/src/components/settings/ai/model-card.tsx +25 -10
- package/src/components/settings/ai/model-manager.tsx +24 -16
- package/src/components/settings/ai/provider-card.tsx +9 -11
- package/src/components/settings/ai/provider-detail-form.tsx +24 -26
- package/src/components/settings/ai/provider-grid.tsx +23 -13
- package/src/components/settings/language-selector.tsx +13 -15
- package/src/components/settings/personal-team/account/account-client.tsx +14 -16
- package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
- package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
- package/src/components/settings/personal-team/team/team-client.tsx +45 -50
- package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
- package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
- package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
- package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
- package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
- package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
- package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
- package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
- package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
- package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
- package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
- package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
- package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
- package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
- package/src/components/story/__tests__/constants.test.ts +7 -7
- package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
- package/src/components/story/ai/action-registry.ts +12 -11
- package/src/components/story/ai/handlers/more-popover.tsx +5 -6
- package/src/components/story/ai/prototype-dialog.tsx +9 -10
- package/src/components/story/ai/split-dialog.tsx +22 -23
- package/src/components/story/ai/story-ai-panel.tsx +29 -30
- package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
- package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
- package/src/components/story/columns.tsx +33 -17
- package/src/components/story/constants.ts +73 -69
- package/src/components/story/create-story-dialog.tsx +13 -14
- package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
- package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
- package/src/components/story/detail/activity-tabs.tsx +6 -7
- package/src/components/story/detail/activity-timeline.tsx +33 -35
- package/src/components/story/detail/comment-input.tsx +7 -8
- package/src/components/story/detail/comment-item.tsx +15 -16
- package/src/components/story/detail/comment-thread.tsx +6 -7
- package/src/components/story/detail/reaction-bar.tsx +2 -3
- package/src/components/story/detail/story-detail-body.tsx +26 -28
- package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
- package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
- package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
- package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
- package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
- package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
- package/src/components/story/detail/story-properties.tsx +7 -8
- package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
- package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
- package/src/components/story/display/constants.ts +27 -26
- package/src/components/story/display/display-dropdown.tsx +20 -26
- package/src/components/story/display/group-resolver.tsx +12 -14
- package/src/components/story/display/use-grouped-stories.ts +3 -5
- package/src/components/story/display/use-paged-story-groups.ts +12 -13
- package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
- package/src/components/story/filters/applied-filters.tsx +7 -9
- package/src/components/story/filters/filter-condition.tsx +9 -12
- package/src/components/story/filters/filter-row.tsx +5 -6
- package/src/components/story/filters/filter-toggle.tsx +2 -3
- package/src/components/story/filters/filter-types.ts +24 -23
- package/src/components/story/filters/filter-value-input.tsx +3 -4
- package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
- package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
- package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
- package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
- package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
- package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
- package/src/components/story/inline-editors/date-editor.tsx +4 -5
- package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
- package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
- package/src/components/story/inline-editors/labels-editor.tsx +16 -17
- package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
- package/src/components/story/inline-editors/priority-editor.tsx +6 -8
- package/src/components/story/inline-editors/state-editor.tsx +6 -7
- package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
- package/src/components/story/inline-editors/title-editor.tsx +2 -3
- package/src/components/story/peek-panel.tsx +6 -7
- package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
- package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
- package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
- package/src/components/story/relations/general-groups.ts +12 -29
- package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
- package/src/components/story/relations/link-manage-dialog.tsx +12 -13
- package/src/components/story/relations/story-ref-row.tsx +20 -21
- package/src/components/story/schemas/story-create.ts +3 -5
- package/src/components/story/search-popover.tsx +5 -6
- package/src/components/story/story-list-table.tsx +3 -4
- package/src/components/story/story-list-view.tsx +9 -10
- package/src/components/story/story-panel-header.tsx +27 -28
- package/src/components/story/story-toolbar.tsx +11 -12
- package/src/components/story/transfer-story-popover.tsx +15 -16
- package/src/components/story/views/calendar-view.tsx +12 -14
- package/src/components/story/views/create-view-dialog.tsx +19 -52
- package/src/components/story/views/kanban-board.tsx +9 -12
- package/src/components/story/views/kanban-card.tsx +1 -3
- package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
- package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
- package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
- package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
- package/src/components/story/views/story-list/group.tsx +9 -11
- package/src/components/story/views/story-list/index.tsx +13 -14
- package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
- package/src/components/story/views/story-list/row.tsx +6 -7
- package/src/components/story/views/timeline-view.tsx +7 -8
- package/src/components/story/views/view-list-section.tsx +14 -16
- package/src/components/story/views/view-selector-button.tsx +6 -7
- package/src/components/story/views/view-switcher.tsx +9 -10
- package/src/components/story/views/view-types.ts +15 -15
- package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
- package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
- package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
- package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
- package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
- package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
- package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
- package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
- package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
- package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
- package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
- package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
- package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
- package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
- package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
- package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
- package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
- package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
- package/src/components/tiptap/node/mention-extension.ts +5 -5
- package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
- package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
- package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
- package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
- package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
- package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
- package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
- package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
- package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
- package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
- package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
- package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
- package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
- package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
- package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
- package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
- package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
- package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
- package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
- package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
- package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
- package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
- package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
- package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
- package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
- package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
- package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
- package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
- package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
- package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
- package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
- package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
- package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
- package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
- package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
- package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
- package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
- package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
- package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
- package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
- package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
- package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
- package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
- package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
- package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
- package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
- package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
- package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
- package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
- package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
- package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
- package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
- package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
- package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
- package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
- package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
- package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
- package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
- package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
- package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
- package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
- package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
- package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
- package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
- package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
- package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
- package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
- package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
- package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
- package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
- package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
- package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
- package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
- package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
- package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
- package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
- package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
- package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
- package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
- package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
- package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
- package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
- package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
- package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
- package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
- package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
- package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
- package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
- package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
- package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
- package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
- package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
- package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
- package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
- package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
- package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
- package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
- package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
- package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
- package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
- package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
- package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
- package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
- package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
- package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
- package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
- package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
- package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
- package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
- package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
- package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
- package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
- package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
- package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
- package/src/components/ui/field.tsx +1 -1
- package/src/components/ui/radio-group.tsx +2 -3
- package/src/components/ui/spinner.tsx +2 -2
- package/src/components/workspace/create-workspace-dialog.tsx +12 -13
- package/src/components/workspace/delete-workspace-options.tsx +177 -0
- package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
- package/src/components/workspace/schemas/create-workspace.ts +2 -2
- package/src/components/workspace/workspace-activity-card.tsx +60 -0
- package/src/components/workspace/workspace-contribution-card.tsx +37 -0
- package/src/components/workspace/workspace-header.tsx +100 -0
- package/src/components/workspace/workspace-kb-card.tsx +31 -0
- package/src/components/workspace/workspace-member-item.tsx +80 -0
- package/src/components/workspace/workspace-members-manager.tsx +291 -0
- package/src/components/workspace/workspace-project-list.tsx +129 -0
- package/src/config/sidebar-routes.tsx +25 -24
- package/src/config/sidebar-teams.ts +4 -4
- package/src/hooks/__tests__/use-commands.test.tsx +0 -10
- package/src/hooks/use-commands.ts +3 -7
- package/src/hooks/use-entity-subscription.ts +0 -1
- package/src/hooks/use-notifications.ts +5 -6
- package/src/hooks/useTranslator.ts +0 -1
- package/src/lib/__tests__/edition.test.ts +9 -0
- package/src/lib/analytics.ts +0 -1
- package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
- package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
- package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
- package/src/lib/auth/anonymous-safe.ts +39 -0
- package/src/lib/auth/page-gate.ts +18 -0
- package/src/lib/changelog/sdk-versions.ts +19 -19
- package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
- package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
- package/src/lib/collections/reference/labels-collection.ts +1 -1
- package/src/lib/collections/reference/projects-collection.ts +1 -1
- package/src/lib/collections/reference/users-brief-collection.ts +1 -1
- package/src/lib/collections/reference/workspaces-collection.ts +3 -3
- package/src/lib/commands/__tests__/registry.test.ts +3 -3
- package/src/lib/commands/registry.ts +22 -21
- package/src/lib/commands/types.ts +1 -1
- package/src/lib/edition.ts +7 -0
- package/src/lib/router-context.ts +1 -2
- package/src/plugins/.gen-manifest.json +13 -0
- package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
- package/src/plugins/core/inspiration/ui.tsx +2 -3
- package/src/plugins/core/prd/components/agent-input.tsx +7 -8
- package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
- package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
- package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
- package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
- package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
- package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
- package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
- package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
- package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
- package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
- package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
- package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
- package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
- package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
- package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
- package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
- package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
- package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
- package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
- package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
- package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
- package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
- package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
- package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
- package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
- package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
- package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
- package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
- package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
- package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
- package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
- package/src/plugins/core/prd/components/prototype/index.ts +3 -0
- package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
- package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
- package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
- package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
- package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
- package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
- package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
- package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
- package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
- package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
- package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
- package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
- package/src/plugins/core/prd/prd-nav.tsx +2 -3
- package/src/plugins/core/tags/nav-tag.tsx +14 -15
- package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
- package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
- package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
- package/src/plugins/core/tags/tag-badge.tsx +2 -3
- package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
- package/src/plugins/core/tags/tag-manager.tsx +23 -25
- package/src/plugins/core/tags/tag-selector.tsx +4 -5
- package/src/plugins/modules.gen.ts +21 -0
- package/src/plugins/plugins.gen.ts +20 -0
- package/src/plugins/ui.gen.ts +8 -0
- package/src/providers/index.tsx +3 -14
- package/src/routeTree.gen.ts +27 -0
- package/src/router.tsx +16 -6
- package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
- package/src/routes/__root.tsx +13 -36
- package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
- package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
- package/src/routes/_login/login/route.lazy.tsx +26 -25
- package/src/routes/_login/register/route.lazy.tsx +23 -24
- package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
- package/src/routes/_login/schemas/-auth.ts +11 -13
- package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
- package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
- package/src/routes/_nav/chat/route.lazy.tsx +9 -10
- package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
- package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
- package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
- package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
- package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
- package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
- package/src/routes/_nav/design/index.lazy.tsx +26 -27
- package/src/routes/_nav/inspiration/route.tsx +8 -0
- package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
- package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
- package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
- package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
- package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
- package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
- package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
- package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
- package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
- package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
- package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
- package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
- package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
- package/src/routes/_nav/notifications/route.tsx +2 -0
- package/src/routes/_nav/notion-like/route.tsx +2 -3
- package/src/routes/_nav/prd/$id/route.tsx +9 -0
- package/src/routes/_nav/prd/index.tsx +9 -0
- package/src/routes/_nav/prd/route.tsx +8 -0
- package/src/routes/_nav/pricing-02/route.tsx +2 -3
- package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
- package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
- package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
- package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
- package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
- package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
- package/src/routes/_nav/route.tsx +13 -16
- package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
- package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
- package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
- package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
- package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
- package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
- package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
- package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
- package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
- package/src/routes/_nav/settings/route.lazy.tsx +2 -3
- package/src/routes/_nav/settings/route.tsx +10 -15
- package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
- package/src/routes/_nav/tags/$id/route.tsx +8 -0
- package/src/routes/_nav/tags/index.tsx +8 -0
- package/src/routes/_nav/tags/route.tsx +8 -0
- package/src/routes/_nav/tags/settings/route.tsx +9 -0
- package/src/routes/_nav/test-cases/route.tsx +2 -3
- package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
- package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
- package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
- package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
- package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
- package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
- package/src/routes/_nav/workspaces/route.tsx +2 -0
- package/src/routes/_public/index/route.tsx +5 -1
- package/src/routes/invite/$token/route.lazy.tsx +36 -37
- package/src/routes/share/$versionId/route.lazy.tsx +4 -11
- package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
- package/src/routes/share/law/$id/route.lazy.tsx +6 -8
- package/src/routes/share/prd/$prdId/route.tsx +10 -0
- package/src/server/__tests__/agent-client-graph.test.ts +4 -8
- package/src/server/ai-ports.ts +7 -6
- package/src/server/builtin-project.ts +43 -0
- package/src/server/design/sketch/file-storage.ts +1 -1
- package/src/server/pro-services.ts +1 -1
- package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
- package/src/server/serverFns/activity.ts +15 -9
- package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
- package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
- package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
- package/src/server/serverFns/knowledge.ts +27 -2
- package/src/server/serverFns/notifications.ts +3 -0
- package/src/server/serverFns/project.ts +48 -35
- package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
- package/src/server/serverFns/story/story-crud.ts +9 -7
- package/src/server/serverFns/story/story-groups.ts +6 -6
- package/src/server/serverFns/workspace.ts +334 -13
- package/src/server-entry.ts +29 -0
- package/vite.shared.ts +4 -1
- package/src/components/layout/sidebar-03/logo.tsx +0 -41
- package/src/i18n/__tests__/detect.test.ts +0 -48
- package/src/i18n/__tests__/integration.test.tsx +0 -32
- package/src/i18n/__tests__/server.test.ts +0 -33
- package/src/i18n/client.ts +0 -32
- package/src/i18n/config.ts +0 -116
- package/src/i18n/detect.ts +0 -43
- package/src/i18n/locales/en/agents.json +0 -134
- package/src/i18n/locales/en/apps.json +0 -6
- package/src/i18n/locales/en/auth.json +0 -90
- package/src/i18n/locales/en/billing.json +0 -78
- package/src/i18n/locales/en/chat.json +0 -194
- package/src/i18n/locales/en/common.json +0 -242
- package/src/i18n/locales/en/dashboard.json +0 -38
- package/src/i18n/locales/en/design.json +0 -70
- package/src/i18n/locales/en/desktop.json +0 -35
- package/src/i18n/locales/en/display.json +0 -37
- package/src/i18n/locales/en/editor.json +0 -304
- package/src/i18n/locales/en/enterprise.json +0 -1
- package/src/i18n/locales/en/invite.json +0 -56
- package/src/i18n/locales/en/iterations.json +0 -92
- package/src/i18n/locales/en/knowledge.json +0 -462
- package/src/i18n/locales/en/mindmap.json +0 -28
- package/src/i18n/locales/en/notifications.json +0 -79
- package/src/i18n/locales/en/prd.json +0 -51
- package/src/i18n/locales/en/projects.json +0 -140
- package/src/i18n/locales/en/settings.json +0 -428
- package/src/i18n/locales/en/share.json +0 -20
- package/src/i18n/locales/en/story.json +0 -923
- package/src/i18n/locales/en/tags.json +0 -42
- package/src/i18n/locales/en/workspace.json +0 -90
- package/src/i18n/locales/zh/agents.json +0 -134
- package/src/i18n/locales/zh/apps.json +0 -6
- package/src/i18n/locales/zh/auth.json +0 -90
- package/src/i18n/locales/zh/billing.json +0 -78
- package/src/i18n/locales/zh/chat.json +0 -194
- package/src/i18n/locales/zh/common.json +0 -242
- package/src/i18n/locales/zh/dashboard.json +0 -38
- package/src/i18n/locales/zh/design.json +0 -70
- package/src/i18n/locales/zh/desktop.json +0 -35
- package/src/i18n/locales/zh/display.json +0 -37
- package/src/i18n/locales/zh/editor.json +0 -304
- package/src/i18n/locales/zh/enterprise.json +0 -1
- package/src/i18n/locales/zh/invite.json +0 -56
- package/src/i18n/locales/zh/iterations.json +0 -92
- package/src/i18n/locales/zh/knowledge.json +0 -462
- package/src/i18n/locales/zh/mindmap.json +0 -28
- package/src/i18n/locales/zh/notifications.json +0 -79
- package/src/i18n/locales/zh/prd.json +0 -51
- package/src/i18n/locales/zh/projects.json +0 -140
- package/src/i18n/locales/zh/settings.json +0 -428
- package/src/i18n/locales/zh/share.json +0 -20
- package/src/i18n/locales/zh/story.json +0 -923
- package/src/i18n/locales/zh/tags.json +0 -42
- package/src/i18n/locales/zh/workspace.json +0 -90
- package/src/i18n/server.ts +0 -18
- package/src/i18n/types.ts +0 -5
- package/src/server/serverFns/locale.ts +0 -20
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import * as React from "react";
|
|
19
|
-
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { toast } from "sonner";
|
|
21
20
|
import { UploadCloud, X, ChevronLeft, ChevronRight } from "lucide-react";
|
|
22
21
|
import { Button } from "@/components/ui/button";
|
|
@@ -30,6 +29,7 @@ import { Textarea } from "@/components/ui/textarea";
|
|
|
30
29
|
import { formatFileSize, getFileTypeIcon } from "./format";
|
|
31
30
|
import { FilePreview } from "./file-preview";
|
|
32
31
|
import type { StoryAttachmentItem } from "../types";
|
|
32
|
+
import { m } from "@/paraglide/messages.js";
|
|
33
33
|
|
|
34
34
|
const MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
35
35
|
|
|
@@ -70,7 +70,6 @@ export function AttachmentManageDialog({
|
|
|
70
70
|
onActivity,
|
|
71
71
|
editItem,
|
|
72
72
|
}: AttachmentManageDialogProps) {
|
|
73
|
-
const { t } = useTranslation("story");
|
|
74
73
|
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
75
74
|
const [staged, setStaged] = React.useState<StagedFile[]>([]);
|
|
76
75
|
const [description, setDescription] = React.useState("");
|
|
@@ -81,7 +80,7 @@ export function AttachmentManageDialog({
|
|
|
81
80
|
const [computedHashes, setComputedHashes] = React.useState<Set<string>>(new Set());
|
|
82
81
|
|
|
83
82
|
const isEdit = !!editItem;
|
|
84
|
-
const dialogTitle = isEdit ?
|
|
83
|
+
const dialogTitle = isEdit ? m.story_attachmentDialog_editTitle() : m.story_attachmentDialog_title();
|
|
85
84
|
|
|
86
85
|
// 编辑模式:预取现有文件并预填描述,同时计算 hash
|
|
87
86
|
React.useEffect(() => {
|
|
@@ -124,7 +123,7 @@ export function AttachmentManageDialog({
|
|
|
124
123
|
const next: StagedFile[] = [];
|
|
125
124
|
for (const file of Array.from(files)) {
|
|
126
125
|
if (file.size > MAX_FILE_SIZE) {
|
|
127
|
-
toast.error(
|
|
126
|
+
toast.error(m.story_attachmentDialog_sizeLimit({ name: file.name }));
|
|
128
127
|
continue;
|
|
129
128
|
}
|
|
130
129
|
next.push({
|
|
@@ -247,13 +246,13 @@ export function AttachmentManageDialog({
|
|
|
247
246
|
});
|
|
248
247
|
if (!res.ok) {
|
|
249
248
|
const err = await res.json().catch(() => ({}));
|
|
250
|
-
throw new Error(err.error ||
|
|
249
|
+
throw new Error(err.error || m.story_attachmentDialog_removeFailed());
|
|
251
250
|
}
|
|
252
251
|
const json = await res.json() as Record<string, unknown>;
|
|
253
252
|
if ((json.duplicated as boolean | undefined) === true) continue;
|
|
254
253
|
added.push(json as unknown as StoryAttachmentItem & { activity?: import("../types").ActivityItem });
|
|
255
254
|
} catch (err) {
|
|
256
|
-
toast.error((err as Error)?.message ||
|
|
255
|
+
toast.error((err as Error)?.message || m.story_attachmentDialog_removeFailed());
|
|
257
256
|
}
|
|
258
257
|
}
|
|
259
258
|
setUploading(false);
|
|
@@ -262,12 +261,12 @@ export function AttachmentManageDialog({
|
|
|
262
261
|
for (const item of added) {
|
|
263
262
|
if (item.activity) onActivity?.(item.activity);
|
|
264
263
|
}
|
|
265
|
-
toast.success(
|
|
264
|
+
toast.success(m.story_attachmentDialog_uploaded({ count: added.length }));
|
|
266
265
|
clearStaged();
|
|
267
266
|
onOpenChange(false);
|
|
268
267
|
} else if (!hasDuplicates) {
|
|
269
268
|
// 所有文件都重复,无新增
|
|
270
|
-
toast.info(
|
|
269
|
+
toast.info(m.story_attachmentDialog_duplicateHint());
|
|
271
270
|
clearStaged();
|
|
272
271
|
onOpenChange(false);
|
|
273
272
|
}
|
|
@@ -313,7 +312,7 @@ export function AttachmentManageDialog({
|
|
|
313
312
|
<div
|
|
314
313
|
role="button"
|
|
315
314
|
tabIndex={0}
|
|
316
|
-
aria-label={
|
|
315
|
+
aria-label={m.story_attachmentDialog_upload()}
|
|
317
316
|
onClick={() => inputRef.current?.click()}
|
|
318
317
|
onKeyDown={(e) => {
|
|
319
318
|
if (e.key === "Enter" || e.key === " ") {
|
|
@@ -337,8 +336,8 @@ export function AttachmentManageDialog({
|
|
|
337
336
|
>
|
|
338
337
|
<UploadCloud className="size-10" />
|
|
339
338
|
<div className="text-center">
|
|
340
|
-
<span className="block text-base font-medium text-foreground">{
|
|
341
|
-
<span className="mt-1 block text-xs">{
|
|
339
|
+
<span className="block text-base font-medium text-foreground">{m.story_attachmentDialog_upload()}</span>
|
|
340
|
+
<span className="mt-1 block text-xs">{m.story_attachmentDialog_uploadHint()}</span>
|
|
342
341
|
</div>
|
|
343
342
|
</div>
|
|
344
343
|
) : (
|
|
@@ -349,10 +348,10 @@ export function AttachmentManageDialog({
|
|
|
349
348
|
file={previewFile!}
|
|
350
349
|
fileName={previewName}
|
|
351
350
|
showTitleToggle
|
|
352
|
-
titleToggleLabel={
|
|
353
|
-
titleToggleHideLabel={
|
|
354
|
-
fullscreenLabel={
|
|
355
|
-
exitFullscreenLabel={
|
|
351
|
+
titleToggleLabel={m.story_attachmentDialog_toggleTitle()}
|
|
352
|
+
titleToggleHideLabel={m.story_attachmentDialog_hideTitle()}
|
|
353
|
+
fullscreenLabel={m.story_associatedAttachments_fullscreen()}
|
|
354
|
+
exitFullscreenLabel={m.story_associatedAttachments_exitFullscreen()}
|
|
356
355
|
/>
|
|
357
356
|
{/* 文件列表(水平排列,可滚动) */}
|
|
358
357
|
<div className="flex items-center gap-2">
|
|
@@ -384,7 +383,7 @@ export function AttachmentManageDialog({
|
|
|
384
383
|
>
|
|
385
384
|
{isDup && (
|
|
386
385
|
<span className="absolute top-0 left-1 z-20 -translate-x-1/2 -translate-y-1/2 rounded-full bg-red-500 px-1.5 py-0.5 text-[9px] font-semibold text-white shadow-sm whitespace-nowrap">
|
|
387
|
-
{
|
|
386
|
+
{m.story_attachmentDialog_duplicateBadge()}
|
|
388
387
|
</span>
|
|
389
388
|
)}
|
|
390
389
|
<button
|
|
@@ -404,7 +403,7 @@ export function AttachmentManageDialog({
|
|
|
404
403
|
variant="ghost"
|
|
405
404
|
size="icon"
|
|
406
405
|
className="absolute right-0.5 top-0.5 size-4 opacity-0 group-hover:opacity-100 transition-opacity"
|
|
407
|
-
aria-label={
|
|
406
|
+
aria-label={m.story_attachmentDialog_removeFile()}
|
|
408
407
|
disabled={uploading}
|
|
409
408
|
onClick={(e) => {
|
|
410
409
|
e.stopPropagation();
|
|
@@ -436,38 +435,38 @@ export function AttachmentManageDialog({
|
|
|
436
435
|
{/* 描述 */}
|
|
437
436
|
<div className="space-y-1.5">
|
|
438
437
|
<label htmlFor="attachment-desc" className="text-xs font-medium text-muted-foreground">
|
|
439
|
-
{
|
|
438
|
+
{m.story_attachmentDialog_descOptional()}
|
|
440
439
|
</label>
|
|
441
440
|
<Textarea
|
|
442
441
|
id="attachment-desc"
|
|
443
|
-
placeholder={
|
|
442
|
+
placeholder={m.story_attachmentDialog_descPlaceholder()}
|
|
444
443
|
value={description}
|
|
445
444
|
onChange={(e) => setDescription(e.target.value)}
|
|
446
445
|
disabled={isBatch}
|
|
447
446
|
className="min-h-16 resize-none mt-1.5"
|
|
448
447
|
/>
|
|
449
|
-
{isBatch && <p className="text-xs text-muted-foreground">{
|
|
448
|
+
{isBatch && <p className="text-xs text-muted-foreground">{m.story_attachmentDialog_batchDescDisabled()}</p>}
|
|
450
449
|
</div>
|
|
451
450
|
{/* 操作按钮行 */}
|
|
452
451
|
<div className="flex items-center justify-between gap-2">
|
|
453
452
|
{hasFiles && !isEdit && (
|
|
454
453
|
<Button variant="outline" size="sm" onClick={() => inputRef.current?.click()}>
|
|
455
454
|
<UploadCloud className="size-3.5 mr-1.5" />
|
|
456
|
-
{
|
|
455
|
+
{m.story_attachmentDialog_continueUpload()}
|
|
457
456
|
</Button>
|
|
458
457
|
)}
|
|
459
458
|
<div className="flex items-center gap-2 ml-auto">
|
|
460
459
|
{hasDuplicates && (
|
|
461
|
-
<span className="text-xs mr-2 text-amber-600 dark:text-amber-400">{
|
|
460
|
+
<span className="text-xs mr-2 text-amber-600 dark:text-amber-400">{m.story_attachmentDialog_duplicateHint()}</span>
|
|
462
461
|
)}
|
|
463
462
|
<Button variant="outline" disabled={uploading} onClick={() => handleClose(false)}>
|
|
464
|
-
{
|
|
463
|
+
{m.story_attachmentDialog_cancel()}
|
|
465
464
|
</Button>
|
|
466
465
|
<Button
|
|
467
466
|
disabled={staged.length === 0 || uploading}
|
|
468
467
|
onClick={() => void handleConfirm()}
|
|
469
468
|
>
|
|
470
|
-
{uploading ?
|
|
469
|
+
{uploading ? m.story_attachmentDialog_uploading() : m.story_attachmentDialog_confirmUpload()}
|
|
471
470
|
</Button>
|
|
472
471
|
</div>
|
|
473
472
|
</div>
|
|
@@ -1,32 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
// AllBlue - 理想之海
|
|
3
|
-
// Copyright (C) 2026 AllBlue Contributors
|
|
4
|
-
//
|
|
5
|
-
// This program is free software: you can redistribute it and/or modify
|
|
6
|
-
// it under the terms of the GNU Affero General Public License as published by
|
|
7
|
-
// the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
// (at your option) any later version.
|
|
9
|
-
//
|
|
10
|
-
// This program is distributed in the hope that it will be useful,
|
|
11
|
-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
// GNU Affero General Public License for more details.
|
|
14
|
-
//
|
|
15
|
-
// You should have received a copy of the GNU Affero General Public License
|
|
16
|
-
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
1
|
+
import { m } from '@/paraglide/messages.js'
|
|
17
2
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
summary: "knowledgeDialog.groupSummary",
|
|
26
|
-
};
|
|
3
|
+
const GROUP_LABELS: Record<string, () => string> = {
|
|
4
|
+
legal: m.story_knowledgeDialog_groupLegal,
|
|
5
|
+
compliance: m.story_knowledgeDialog_groupCompliance,
|
|
6
|
+
dictionary: m.story_knowledgeDialog_groupDictionary,
|
|
7
|
+
bookmark: m.story_knowledgeDialog_groupBookmark,
|
|
8
|
+
summary: m.story_knowledgeDialog_groupSummary,
|
|
9
|
+
}
|
|
27
10
|
|
|
28
|
-
/** 通用知识库分组 key →
|
|
29
|
-
export function generalGroupLabel(
|
|
30
|
-
const
|
|
31
|
-
return
|
|
11
|
+
/** 通用知识库分组 key → 标签(未知 key 原样返回) */
|
|
12
|
+
export function generalGroupLabel(group: string): string {
|
|
13
|
+
const labelFn = GROUP_LABELS[group]
|
|
14
|
+
return labelFn ? labelFn() : group
|
|
32
15
|
}
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import * as React from "react";
|
|
19
|
-
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { useServerFn } from "@tanstack/react-start";
|
|
21
20
|
import { toast } from "sonner";
|
|
22
21
|
import { BookMarked, BookOpenText, Bookmark, Check, ChevronsUpDown, Scale, ShieldCheck, Sprout } from "lucide-react";
|
|
@@ -42,6 +41,7 @@ import {
|
|
|
42
41
|
} from "@/server/serverFns/story";
|
|
43
42
|
import { generalGroupLabel } from "./general-groups";
|
|
44
43
|
import type { DocBrief } from "../types";
|
|
44
|
+
import { m } from "@/paraglide/messages.js";
|
|
45
45
|
|
|
46
46
|
interface KbBrief {
|
|
47
47
|
id: string;
|
|
@@ -86,7 +86,6 @@ export function KnowledgeSelectDialog({
|
|
|
86
86
|
onUpdate,
|
|
87
87
|
onActivity,
|
|
88
88
|
}: KnowledgeSelectDialogProps) {
|
|
89
|
-
const { t } = useTranslation("story");
|
|
90
89
|
const listKbs = useServerFn(listStoryAvailableKbsFn);
|
|
91
90
|
const searchDocs = useServerFn(searchKbDocsFn);
|
|
92
91
|
const linkDocs = useServerFn(linkDocsFn);
|
|
@@ -117,13 +116,13 @@ export function KnowledgeSelectDialog({
|
|
|
117
116
|
});
|
|
118
117
|
setItems(res.items as SearchDocRow[]);
|
|
119
118
|
} catch (err) {
|
|
120
|
-
toast.error((err as Error)?.message ||
|
|
119
|
+
toast.error((err as Error)?.message || m.story_knowledgeDialog_linkFailed());
|
|
121
120
|
setItems([]);
|
|
122
121
|
} finally {
|
|
123
122
|
setLoading(false);
|
|
124
123
|
}
|
|
125
124
|
},
|
|
126
|
-
[searchDocs, storyId
|
|
125
|
+
[searchDocs, storyId],
|
|
127
126
|
);
|
|
128
127
|
|
|
129
128
|
React.useEffect(() => {
|
|
@@ -233,12 +232,12 @@ export function KnowledgeSelectDialog({
|
|
|
233
232
|
<span className="min-w-0 flex-1 truncate text-sm">{row.title}</span>
|
|
234
233
|
{kbFilter === null && (
|
|
235
234
|
<span className="shrink-0 text-xs text-muted-foreground">
|
|
236
|
-
{isGeneral ? generalGroupLabel(
|
|
235
|
+
{isGeneral ? generalGroupLabel(row.kbName) : row.kbName}
|
|
237
236
|
</span>
|
|
238
237
|
)}
|
|
239
238
|
{linkedIds.has(row.id) && (
|
|
240
239
|
<Badge variant="secondary" className="shrink-0 text-[10px]">
|
|
241
|
-
{
|
|
240
|
+
{m.story_knowledgeDialog_linked()}
|
|
242
241
|
</Badge>
|
|
243
242
|
)}
|
|
244
243
|
</div>,
|
|
@@ -265,7 +264,7 @@ export function KnowledgeSelectDialog({
|
|
|
265
264
|
if (toAdd.length > 0) {
|
|
266
265
|
const res = await linkDocs({ data: { storyId, docIds: toAdd } });
|
|
267
266
|
if (res.failed.length > 0) {
|
|
268
|
-
toast.warning(
|
|
267
|
+
toast.warning(m.story_knowledgeDialog_partialFailed({ count: res.failed.length }));
|
|
269
268
|
}
|
|
270
269
|
if (res.activity) onActivity?.(res.activity);
|
|
271
270
|
const addedIds = new Set(res.linked);
|
|
@@ -276,7 +275,7 @@ export function KnowledgeSelectDialog({
|
|
|
276
275
|
} onUpdate(nextDocs);
|
|
277
276
|
onOpenChange(false);
|
|
278
277
|
} catch (err) {
|
|
279
|
-
toast.error((err as Error)?.message ||
|
|
278
|
+
toast.error((err as Error)?.message || m.story_knowledgeDialog_linkFailed());
|
|
280
279
|
} finally {
|
|
281
280
|
setSubmitting(false);
|
|
282
281
|
}
|
|
@@ -288,12 +287,12 @@ export function KnowledgeSelectDialog({
|
|
|
288
287
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
289
288
|
<DialogContent className="sm:max-w-260 -mt-50">
|
|
290
289
|
<DialogHeader>
|
|
291
|
-
<DialogTitle>{
|
|
290
|
+
<DialogTitle>{m.story_knowledgeDialog_title()}</DialogTitle>
|
|
292
291
|
</DialogHeader>
|
|
293
292
|
|
|
294
293
|
<div className="flex items-center gap-2">
|
|
295
294
|
<Input
|
|
296
|
-
placeholder={
|
|
295
|
+
placeholder={m.story_knowledgeDialog_searchPlaceholder()}
|
|
297
296
|
value={search}
|
|
298
297
|
onChange={(e) => handleSearch(e.target.value)}
|
|
299
298
|
className="h-8"
|
|
@@ -305,8 +304,8 @@ export function KnowledgeSelectDialog({
|
|
|
305
304
|
{activeKb
|
|
306
305
|
? activeKb.name
|
|
307
306
|
: kbFilter?.type === "general"
|
|
308
|
-
? generalGroupLabel(
|
|
309
|
-
:
|
|
307
|
+
? generalGroupLabel(kbFilter.group)
|
|
308
|
+
: m.story_knowledgeDialog_allKbs()}
|
|
310
309
|
<ChevronsUpDown className="size-3.5 opacity-50" />
|
|
311
310
|
</Button>
|
|
312
311
|
</PopoverTrigger>
|
|
@@ -316,11 +315,11 @@ export function KnowledgeSelectDialog({
|
|
|
316
315
|
className="flex w-full items-center justify-between rounded-sm px-2 py-1.5 mt-1 text-sm hover:bg-muted"
|
|
317
316
|
onClick={() => handleKbSelect(null)}
|
|
318
317
|
>
|
|
319
|
-
{
|
|
318
|
+
{m.story_knowledgeDialog_allKbs()}
|
|
320
319
|
{kbFilter === null && <Check className="size-3.5" />}
|
|
321
320
|
</button>
|
|
322
321
|
<div className="border-t px-2 pt-3 text-xs font-medium text-muted-foreground">
|
|
323
|
-
{
|
|
322
|
+
{m.story_knowledgeDialog_userKbs()}
|
|
324
323
|
</div>
|
|
325
324
|
{kbs.map((kb) => (
|
|
326
325
|
<button
|
|
@@ -334,7 +333,7 @@ export function KnowledgeSelectDialog({
|
|
|
334
333
|
</button>
|
|
335
334
|
))}
|
|
336
335
|
<div className=" border-t px-2 pt-3 text-xs font-medium text-muted-foreground">
|
|
337
|
-
{
|
|
336
|
+
{m.story_knowledgeDialog_generalKbs()}
|
|
338
337
|
</div>
|
|
339
338
|
{GENERAL_GROUP_META.map((group) => {
|
|
340
339
|
const Icon = GENERAL_GROUP_ICONS[group.key];
|
|
@@ -347,7 +346,7 @@ export function KnowledgeSelectDialog({
|
|
|
347
346
|
>
|
|
348
347
|
<span className="flex min-w-0 items-center gap-2">
|
|
349
348
|
<Icon className="size-3.5 shrink-0 text-muted-foreground" />
|
|
350
|
-
<span className="truncate">{generalGroupLabel(
|
|
349
|
+
<span className="truncate">{generalGroupLabel(group.key)}</span>
|
|
351
350
|
</span>
|
|
352
351
|
{kbFilter?.type === "general" && kbFilter.group === group.key && <Check className="size-3.5" />}
|
|
353
352
|
</button>
|
|
@@ -364,7 +363,7 @@ export function KnowledgeSelectDialog({
|
|
|
364
363
|
renderRows(null, 0)
|
|
365
364
|
) : (
|
|
366
365
|
<div className="flex h-full items-center justify-center text-sm text-muted-foreground">
|
|
367
|
-
{
|
|
366
|
+
{m.story_knowledgeDialog_empty()}
|
|
368
367
|
</div>
|
|
369
368
|
)}
|
|
370
369
|
</div>
|
|
@@ -376,24 +375,24 @@ export function KnowledgeSelectDialog({
|
|
|
376
375
|
checked={allSelected ? true : someSelected ? "indeterminate" : false}
|
|
377
376
|
onCheckedChange={toggleSelectAll}
|
|
378
377
|
disabled={listedIds.length === 0}
|
|
379
|
-
aria-label={
|
|
378
|
+
aria-label={m.story_knowledgeDialog_selectAll()}
|
|
380
379
|
/>
|
|
381
380
|
<label
|
|
382
381
|
htmlFor="kb-select-all"
|
|
383
382
|
className="cursor-pointer text-xs text-muted-foreground select-none"
|
|
384
383
|
>
|
|
385
|
-
{
|
|
384
|
+
{m.story_knowledgeDialog_selectAll()}
|
|
386
385
|
</label>
|
|
387
386
|
<span className="text-xs text-muted-foreground">
|
|
388
|
-
{
|
|
387
|
+
{m.story_knowledgeDialog_selectedCount({ count: selected.size })}
|
|
389
388
|
</span>
|
|
390
389
|
</div>
|
|
391
390
|
<div className="flex gap-2">
|
|
392
391
|
<Button variant="outline" onClick={() => onOpenChange(false)}>
|
|
393
|
-
{
|
|
392
|
+
{m.story_knowledgeDialog_cancel()}
|
|
394
393
|
</Button>
|
|
395
394
|
<Button onClick={handleConfirm} disabled={submitting}>
|
|
396
|
-
{
|
|
395
|
+
{m.story_knowledgeDialog_confirm()}
|
|
397
396
|
</Button>
|
|
398
397
|
</div>
|
|
399
398
|
</DialogFooter>
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import * as React from "react";
|
|
19
|
-
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { useServerFn } from "@tanstack/react-start";
|
|
21
20
|
import { toast } from "sonner";
|
|
22
21
|
import { Button } from "@/components/ui/button";
|
|
@@ -30,6 +29,7 @@ import {
|
|
|
30
29
|
} from "@/components/ui/dialog";
|
|
31
30
|
import { addLinkFn, updateLinkFn } from "@/server/serverFns/story";
|
|
32
31
|
import type { StoryLinkItem } from "../types";
|
|
32
|
+
import { m } from "@/paraglide/messages.js";
|
|
33
33
|
|
|
34
34
|
export interface LinkManageDialogProps {
|
|
35
35
|
open: boolean;
|
|
@@ -52,7 +52,6 @@ export function LinkManageDialog({
|
|
|
52
52
|
onActivity,
|
|
53
53
|
initialEdit = null,
|
|
54
54
|
}: LinkManageDialogProps) {
|
|
55
|
-
const { t } = useTranslation("story");
|
|
56
55
|
const addLink = useServerFn(addLinkFn);
|
|
57
56
|
const updateLink = useServerFn(updateLinkFn);
|
|
58
57
|
const [editing, setEditing] = React.useState<StoryLinkItem | null>(null);
|
|
@@ -84,7 +83,7 @@ export function LinkManageDialog({
|
|
|
84
83
|
description: form.description || undefined,
|
|
85
84
|
},
|
|
86
85
|
});
|
|
87
|
-
toast.success(
|
|
86
|
+
toast.success(m.story_linkDialog_updated());
|
|
88
87
|
if (updated.activity) onActivity?.(updated.activity);
|
|
89
88
|
onUpdate(
|
|
90
89
|
data.map((l) =>
|
|
@@ -102,7 +101,7 @@ export function LinkManageDialog({
|
|
|
102
101
|
description: form.description || undefined,
|
|
103
102
|
},
|
|
104
103
|
});
|
|
105
|
-
toast.success(
|
|
104
|
+
toast.success(m.story_linkDialog_added());
|
|
106
105
|
if (created.activity) onActivity?.(created.activity);
|
|
107
106
|
onUpdate([
|
|
108
107
|
...data,
|
|
@@ -118,7 +117,7 @@ export function LinkManageDialog({
|
|
|
118
117
|
setEditing(null);
|
|
119
118
|
onOpenChange(false);
|
|
120
119
|
} catch (err) {
|
|
121
|
-
toast.error((err as Error)?.message ||
|
|
120
|
+
toast.error((err as Error)?.message || m.story_linkDialog_saveFailed());
|
|
122
121
|
} finally {
|
|
123
122
|
setSubmitting(false);
|
|
124
123
|
}
|
|
@@ -129,7 +128,7 @@ export function LinkManageDialog({
|
|
|
129
128
|
<DialogContent className="sm:max-w-130">
|
|
130
129
|
<DialogHeader>
|
|
131
130
|
<DialogTitle className="text-xl">
|
|
132
|
-
{
|
|
131
|
+
{editing ? m.story_linkDialog_editTitle() : m.story_linkDialog_title()}
|
|
133
132
|
</DialogTitle>
|
|
134
133
|
</DialogHeader>
|
|
135
134
|
<form onSubmit={handleSubmit} className="flex h-96 flex-col gap-4 overflow-y-auto px-1 pb-1">
|
|
@@ -141,7 +140,7 @@ export function LinkManageDialog({
|
|
|
141
140
|
id="link-url"
|
|
142
141
|
type="url"
|
|
143
142
|
required
|
|
144
|
-
placeholder={
|
|
143
|
+
placeholder={m.story_linkDialog_urlPlaceholder()}
|
|
145
144
|
value={form.url}
|
|
146
145
|
onChange={(e) => setForm({ ...form, url: e.target.value })}
|
|
147
146
|
className="h-10 text-base"
|
|
@@ -149,11 +148,11 @@ export function LinkManageDialog({
|
|
|
149
148
|
</div>
|
|
150
149
|
<div className="space-y-1.5">
|
|
151
150
|
<label htmlFor="link-title" className="text-xs font-medium text-muted-foreground">
|
|
152
|
-
{
|
|
151
|
+
{m.story_linkDialog_titleOptional()}
|
|
153
152
|
</label>
|
|
154
153
|
<Input
|
|
155
154
|
id="link-title"
|
|
156
|
-
placeholder={
|
|
155
|
+
placeholder={m.story_linkDialog_titlePlaceholder()}
|
|
157
156
|
value={form.title}
|
|
158
157
|
onChange={(e) => setForm({ ...form, title: e.target.value })}
|
|
159
158
|
className="h-10"
|
|
@@ -161,11 +160,11 @@ export function LinkManageDialog({
|
|
|
161
160
|
</div>
|
|
162
161
|
<div className="flex min-h-0 flex-1 flex-col gap-1.5">
|
|
163
162
|
<label htmlFor="link-desc" className="text-xs font-medium text-muted-foreground">
|
|
164
|
-
{
|
|
163
|
+
{m.story_linkDialog_descOptional()}
|
|
165
164
|
</label>
|
|
166
165
|
<Textarea
|
|
167
166
|
id="link-desc"
|
|
168
|
-
placeholder={
|
|
167
|
+
placeholder={m.story_linkDialog_descPlaceholder()}
|
|
169
168
|
value={form.description}
|
|
170
169
|
onChange={(e) => setForm({ ...form, description: e.target.value })}
|
|
171
170
|
className="min-h-20 flex-1 resize-none"
|
|
@@ -178,11 +177,11 @@ export function LinkManageDialog({
|
|
|
178
177
|
variant="outline"
|
|
179
178
|
onClick={() => onOpenChange(false)}
|
|
180
179
|
>
|
|
181
|
-
{
|
|
180
|
+
{m.story_linkDialog_cancel()}
|
|
182
181
|
</Button>
|
|
183
182
|
)}
|
|
184
183
|
<Button type="submit" disabled={submitting}>
|
|
185
|
-
{
|
|
184
|
+
{editing ? m.story_linkDialog_save() : m.story_linkDialog_add()}
|
|
186
185
|
</Button>
|
|
187
186
|
</div>
|
|
188
187
|
</form>
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import * as React from "react";
|
|
19
|
-
import { useTranslation } from "react-i18next";
|
|
20
19
|
import { Archive, MoreHorizontal, Trash2, Waypoints, CalendarCheck, CalendarPlus2 } from "lucide-react";
|
|
21
20
|
import { Button } from "@/components/ui/button";
|
|
22
21
|
import { Checkbox } from "@/components/ui/checkbox";
|
|
@@ -50,6 +49,7 @@ import type {
|
|
|
50
49
|
DependencyGroup,
|
|
51
50
|
} from "../types";
|
|
52
51
|
import type { DependencyTypeOption } from "../constants";
|
|
52
|
+
import { m } from "@/paraglide/messages.js";
|
|
53
53
|
|
|
54
54
|
/** 行内编辑/归档/删除后回传给面板的补丁载荷(StoryPatch 字段 + 面板控制信号) */
|
|
55
55
|
export type StoryRelationPatch = StoryPatch & {
|
|
@@ -97,7 +97,6 @@ export function StoryRefRow({
|
|
|
97
97
|
onDependencyTypeChange,
|
|
98
98
|
currentIdentifier,
|
|
99
99
|
}: StoryRefRowProps) {
|
|
100
|
-
const { t } = useTranslation("story");
|
|
101
100
|
const [storyState, setStoryState] = React.useState(story);
|
|
102
101
|
React.useEffect(() => {
|
|
103
102
|
setStoryState(story);
|
|
@@ -119,7 +118,7 @@ export function StoryRefRow({
|
|
|
119
118
|
onStoryRefresh(story.id, patch);
|
|
120
119
|
} catch (e) {
|
|
121
120
|
setStoryState(story);
|
|
122
|
-
toast.error((e as Error)?.message ||
|
|
121
|
+
toast.error((e as Error)?.message || m.story_children_updateFailed());
|
|
123
122
|
}
|
|
124
123
|
};
|
|
125
124
|
|
|
@@ -134,15 +133,15 @@ export function StoryRefRow({
|
|
|
134
133
|
|
|
135
134
|
const handleArchive = async () => {
|
|
136
135
|
if (!canArchiveSingle) {
|
|
137
|
-
toast.error(
|
|
136
|
+
toast.error(m.story_children_archiveOnlyDone());
|
|
138
137
|
return;
|
|
139
138
|
}
|
|
140
139
|
try {
|
|
141
140
|
await archiveStory({ data: { storyId: story.id } });
|
|
142
141
|
onStoryRefresh(story.id, { archived: true, archivedAt: new Date().toISOString() });
|
|
143
|
-
toast.success(
|
|
142
|
+
toast.success(m.story_children_archived());
|
|
144
143
|
} catch (e) {
|
|
145
|
-
toast.error((e as Error)?.message ||
|
|
144
|
+
toast.error((e as Error)?.message || m.story_children_archiveFailed());
|
|
146
145
|
}
|
|
147
146
|
};
|
|
148
147
|
|
|
@@ -150,9 +149,9 @@ export function StoryRefRow({
|
|
|
150
149
|
try {
|
|
151
150
|
await unarchiveStory({ data: { storyId: story.id } });
|
|
152
151
|
onStoryRefresh(story.id, { archived: false, archivedAt: null });
|
|
153
|
-
toast.success(
|
|
152
|
+
toast.success(m.story_children_unarchived());
|
|
154
153
|
} catch (e) {
|
|
155
|
-
toast.error((e as Error)?.message ||
|
|
154
|
+
toast.error((e as Error)?.message || m.story_children_unarchiveFailed());
|
|
156
155
|
}
|
|
157
156
|
};
|
|
158
157
|
|
|
@@ -160,9 +159,9 @@ export function StoryRefRow({
|
|
|
160
159
|
try {
|
|
161
160
|
await deleteStory({ data: { storyId: story.id } });
|
|
162
161
|
onStoryRefresh(story.id, { deleted: true });
|
|
163
|
-
toast.success(
|
|
162
|
+
toast.success(m.story_children_deleted());
|
|
164
163
|
} catch (e) {
|
|
165
|
-
toast.error((e as Error)?.message ||
|
|
164
|
+
toast.error((e as Error)?.message || m.story_children_deleteFailed());
|
|
166
165
|
}
|
|
167
166
|
};
|
|
168
167
|
|
|
@@ -175,7 +174,7 @@ export function StoryRefRow({
|
|
|
175
174
|
<Checkbox
|
|
176
175
|
checked={selected}
|
|
177
176
|
onCheckedChange={() => onToggle(story.id)}
|
|
178
|
-
aria-label={
|
|
177
|
+
aria-label={m.story_children_selectStory({ name: story.name })}
|
|
179
178
|
className={cn(
|
|
180
179
|
"shrink-0 transition-opacity",
|
|
181
180
|
selected ? "opacity-100" : "opacity-0 group-hover:opacity-100",
|
|
@@ -197,7 +196,7 @@ export function StoryRefRow({
|
|
|
197
196
|
</span>
|
|
198
197
|
</TooltipTrigger>
|
|
199
198
|
<TooltipContent side="top" sideOffset={6} className="flex flex-col items-start gap-0.5 text-xs">
|
|
200
|
-
<span className="opacity-80">{
|
|
199
|
+
<span className="opacity-80">{m.story_children_crossProject()}</span>
|
|
201
200
|
<span className="font-medium">{storyProjectInfo.name}</span>
|
|
202
201
|
</TooltipContent>
|
|
203
202
|
</Tooltip>
|
|
@@ -219,7 +218,7 @@ export function StoryRefRow({
|
|
|
219
218
|
</span>
|
|
220
219
|
</TooltipTrigger>
|
|
221
220
|
<TooltipContent side="top" sideOffset={6} className="flex flex-col items-start gap-0.5 text-xs">
|
|
222
|
-
<span className="opacity-80">{
|
|
221
|
+
<span className="opacity-80">{m.story_children_crossProject()}</span>
|
|
223
222
|
<span className="font-medium">{storyProjectInfo.name}</span>
|
|
224
223
|
</TooltipContent>
|
|
225
224
|
</Tooltip>
|
|
@@ -247,10 +246,10 @@ export function StoryRefRow({
|
|
|
247
246
|
<AssigneeEditor assignee={storyState.assignee} users={users} onChange={(v) => updateField({ assigneeId: v })} variant="button" />
|
|
248
247
|
)}
|
|
249
248
|
{properties.includes("startDate") && (
|
|
250
|
-
<DateEditor value={storyState.startDate} onChange={(v) => updateField({ startDate: v })} label={
|
|
249
|
+
<DateEditor value={storyState.startDate} onChange={(v) => updateField({ startDate: v })} label={m.story_children_startDate()} icon={CalendarPlus2} />
|
|
251
250
|
)}
|
|
252
251
|
{properties.includes("dueDate") && (
|
|
253
|
-
<DateEditor value={storyState.targetDate} onChange={(v) => updateField({ targetDate: v })} label={
|
|
252
|
+
<DateEditor value={storyState.targetDate} onChange={(v) => updateField({ targetDate: v })} label={m.story_children_dueDate()} icon={CalendarCheck} overdue={overdue} />
|
|
254
253
|
)}
|
|
255
254
|
{properties.includes("labels") && (
|
|
256
255
|
<LabelsEditor labelIds={currentLabelIds} labels={labels} onChange={(v) => updateField({ labelIds: v })} variant="button" aiContext={{ name: () => storyState.name }} />
|
|
@@ -273,7 +272,7 @@ export function StoryRefRow({
|
|
|
273
272
|
<>
|
|
274
273
|
<DropdownMenuItem onClick={handleArchive}>
|
|
275
274
|
<Archive className="mr-2 size-4" />
|
|
276
|
-
{
|
|
275
|
+
{m.story_children_archive()}
|
|
277
276
|
</DropdownMenuItem>
|
|
278
277
|
<DropdownMenuSeparator />
|
|
279
278
|
</>
|
|
@@ -283,13 +282,13 @@ export function StoryRefRow({
|
|
|
283
282
|
className="text-destructive focus:text-destructive"
|
|
284
283
|
>
|
|
285
284
|
<Trash2 className="mr-2 size-4" />
|
|
286
|
-
{
|
|
285
|
+
{m.story_children_delete()}
|
|
287
286
|
</DropdownMenuItem>
|
|
288
287
|
</>
|
|
289
288
|
) : (
|
|
290
289
|
<DropdownMenuItem onClick={handleUnarchive}>
|
|
291
290
|
<Archive className="mr-2 size-4" />
|
|
292
|
-
{
|
|
291
|
+
{m.story_children_unarchive()}
|
|
293
292
|
</DropdownMenuItem>
|
|
294
293
|
)}
|
|
295
294
|
</DropdownMenuContent>
|
|
@@ -298,9 +297,9 @@ export function StoryRefRow({
|
|
|
298
297
|
<NameConfirmDialog
|
|
299
298
|
open={deleteDialogOpen}
|
|
300
299
|
onOpenChange={setDeleteDialogOpen}
|
|
301
|
-
title={
|
|
302
|
-
description={
|
|
303
|
-
confirmText={
|
|
300
|
+
title={m.story_children_deleteTitle()}
|
|
301
|
+
description={m.story_children_deleteDescription()}
|
|
302
|
+
confirmText={m.story_children_delete()}
|
|
304
303
|
expectedName={storyState.identifier ?? storyState.id ?? ""}
|
|
305
304
|
onConfirm={handleDelete}
|
|
306
305
|
/>
|
|
@@ -16,13 +16,11 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import { z } from "zod"
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
const t = (key: string) => getClientI18n().t(key)
|
|
19
|
+
import { m } from '@/paraglide/messages.js'
|
|
22
20
|
|
|
23
21
|
export const createStorySchema = z.object({
|
|
24
|
-
name: z.string().min(1,
|
|
25
|
-
projectId: z.string().min(1,
|
|
22
|
+
name: z.string().min(1, m.common_form_storyTitleRequired()),
|
|
23
|
+
projectId: z.string().min(1, m.common_form_projectRequired()),
|
|
26
24
|
state: z.string().default("backlog"),
|
|
27
25
|
priority: z.string().default("none"),
|
|
28
26
|
assigneeId: z.string().default("none"),
|