@parhelia/core 0.1.12556 → 0.1.12565
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/dist/agents-view/AgentCard.d.ts +6 -4
- package/dist/agents-view/AgentCard.js +143 -24
- package/dist/agents-view/AgentCard.js.map +1 -1
- package/dist/agents-view/AgentsInbox.d.ts +1 -1
- package/dist/agents-view/AgentsInbox.js +7 -92
- package/dist/agents-view/AgentsInbox.js.map +1 -1
- package/dist/agents-view/AgentsTitlebar.js +3 -2
- package/dist/agents-view/AgentsTitlebar.js.map +1 -1
- package/dist/agents-view/AgentsView.d.ts +6 -7
- package/dist/agents-view/AgentsView.js +191 -99
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.d.ts +2 -6
- package/dist/agents-view/AgentsWorkspaceView.js +266 -113
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/agents-view/ProfileAgentsGroup.d.ts +2 -1
- package/dist/agents-view/ProfileAgentsGroup.js +4 -3
- package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
- package/dist/components/ActionButton.d.ts +1 -1
- package/dist/components/ActionButton.js.map +1 -1
- package/dist/components/FilterInput.d.ts +1 -1
- package/dist/components/FilterInput.js +1 -1
- package/dist/components/FilterInput.js.map +1 -1
- package/dist/components/ui/LanguageSelector.js +2 -4
- package/dist/components/ui/LanguageSelector.js.map +1 -1
- package/dist/components/ui/PlaceholderInput.js +3 -3
- package/dist/components/ui/PlaceholderInput.js.map +1 -1
- package/dist/components/ui/PlaceholderInputTypes.js +1 -1
- package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +1 -1
- package/dist/components/ui/alert-dialog.js +6 -10
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/button.d.ts +4 -4
- package/dist/components/ui/button.js +4 -1
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/context-menu.d.ts +1 -1
- package/dist/components/ui/context-menu.js +12 -4
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/copy-button.d.ts +2 -1
- package/dist/components/ui/copy-button.js +2 -2
- package/dist/components/ui/copy-button.js.map +1 -1
- package/dist/components/ui/dialog.d.ts +1 -1
- package/dist/components/ui/dialog.js +21 -126
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/input.d.ts +1 -1
- package/dist/components/ui/input.js +5 -3
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/paste-button.d.ts +2 -1
- package/dist/components/ui/paste-button.js +2 -2
- package/dist/components/ui/paste-button.js.map +1 -1
- package/dist/components/ui/popover.js +1 -9
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/styled-dialog-title.js +1 -1
- package/dist/components/ui/styled-dialog-title.js.map +1 -1
- package/dist/components/ui/tabs.d.ts +1 -1
- package/dist/components/ui/tabs.js +4 -11
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/config/config.d.ts +4 -2
- package/dist/config/config.js +250 -70
- package/dist/config/config.js.map +1 -1
- package/dist/config/notificationRoutes.js +14 -0
- package/dist/config/notificationRoutes.js.map +1 -1
- package/dist/config/types/workspace.d.ts +6 -0
- package/dist/config/types.d.ts +63 -12
- package/dist/config/types.js.map +1 -1
- package/dist/editor/ConfirmationDialog.js +20 -4
- package/dist/editor/ConfirmationDialog.js.map +1 -1
- package/dist/editor/ContentTree.d.ts +2 -1
- package/dist/editor/ContentTree.js +93 -32
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/Editor.js +87 -22
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FieldHistory.js +84 -36
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/FieldListField.js +21 -9
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/FieldListFieldWithFallbacks.js +23 -2
- package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
- package/dist/editor/GlobalMenuBar.js +29 -2
- package/dist/editor/GlobalMenuBar.js.map +1 -1
- package/dist/editor/ImageEditor.js +5 -2
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/ItemInfo.js +36 -1
- package/dist/editor/ItemInfo.js.map +1 -1
- package/dist/editor/LinkEditorDialog.js +3 -0
- package/dist/editor/LinkEditorDialog.js.map +1 -1
- package/dist/editor/MainLayout.d.ts +0 -2
- package/dist/editor/MainLayout.js +65 -8
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/MigrationsView.js +29 -5
- package/dist/editor/MigrationsView.js.map +1 -1
- package/dist/editor/MobileLayout.js +37 -12
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/PictureCropper.js +54 -45
- package/dist/editor/PictureCropper.js.map +1 -1
- package/dist/editor/PictureEditor.js +17 -15
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/QuickItemSwitcher.js +21 -21
- package/dist/editor/QuickItemSwitcher.js.map +1 -1
- package/dist/editor/SetupWizard.js +52 -12
- package/dist/editor/SetupWizard.js.map +1 -1
- package/dist/editor/Titlebar.js +7 -2
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/ai/AgentCostDisplay.d.ts +1 -0
- package/dist/editor/ai/AgentCostDisplay.js +1 -1
- package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
- package/dist/editor/ai/AgentDocumentList.js +32 -14
- package/dist/editor/ai/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/AgentGreeting.js +3 -2
- package/dist/editor/ai/AgentGreeting.js.map +1 -1
- package/dist/editor/ai/AgentProfileSelector.js +2 -1
- package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
- package/dist/editor/ai/AgentStatusBadge.d.ts +0 -5
- package/dist/editor/ai/AgentStatusBadge.js +67 -65
- package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.d.ts +14 -2
- package/dist/editor/ai/AgentTerminal.js +2406 -496
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.d.ts +8 -3
- package/dist/editor/ai/AgentTerminalStatusBar.js +481 -56
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/Agents.js +161 -113
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/AiResponseMessage.d.ts +10 -1
- package/dist/editor/ai/AiResponseMessage.js +267 -26
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.d.ts +2 -3
- package/dist/editor/ai/ContextInfoBar.js +64 -7
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/GuidanceOverlay.js +17 -11
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
- package/dist/editor/ai/InlineAiDialog.js +514 -192
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +115 -12
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/MediaImage.js +40 -8
- package/dist/editor/ai/MediaImage.js.map +1 -1
- package/dist/editor/ai/SpawnedAgentsPanel.js +10 -12
- package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
- package/dist/editor/ai/ToolCallDisplay.d.ts +22 -2
- package/dist/editor/ai/ToolCallDisplay.js +542 -150
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/ai/agentDiagnostics.d.ts +7 -0
- package/dist/editor/ai/agentDiagnostics.js.map +1 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +1 -8
- package/dist/editor/ai/dialogs/AgentDialogHandler.js +379 -42
- package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
- package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +5 -1
- package/dist/editor/ai/dialogs/QuestionnaireInline.js +628 -60
- package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
- package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +115 -0
- package/dist/editor/ai/dialogs/agentDialogTypes.js +2 -0
- package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
- package/dist/editor/ai/types.d.ts +3 -1
- package/dist/editor/ai/useAgentStatus.d.ts +2 -1
- package/dist/editor/ai/useAgentStatus.js +90 -100
- package/dist/editor/ai/useAgentStatus.js.map +1 -1
- package/dist/editor/ai/useInlineAiPosition.js +45 -5
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/client/AboutDialog.js +4 -2
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.d.ts +4 -1
- package/dist/editor/client/EditorShell.js +770 -237
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +33 -19
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/helpers.js +6 -0
- package/dist/editor/client/helpers.js.map +1 -1
- package/dist/editor/client/hooks/useEditorUrlSync.js +1 -2
- package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.d.ts +10 -0
- package/dist/editor/client/hooks/useEditorWebSocket.js +209 -14
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/client/hooks/useQuota.d.ts +8 -0
- package/dist/editor/client/hooks/useQuota.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +73 -15
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.js +10 -6
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/navigation.js +35 -3
- package/dist/editor/client/navigation.js.map +1 -1
- package/dist/editor/client/operations.d.ts +6 -3
- package/dist/editor/client/operations.js +208 -30
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +4 -31
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/client/ui/DevModeIndicator.js +2 -2
- package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.d.ts +0 -6
- package/dist/editor/client/ui/EditorChrome.js +55 -72
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/client/ui/FullscreenControls.js +5 -3
- package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
- package/dist/editor/commands/commands.d.ts +11 -1
- package/dist/editor/commands/commands.js +12 -1
- package/dist/editor/commands/commands.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +109 -55
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/commands/customCommandConverter.d.ts +8 -1
- package/dist/editor/commands/customCommandConverter.js +35 -5
- package/dist/editor/commands/customCommandConverter.js.map +1 -1
- package/dist/editor/commands/handlers/agentHandler.js +2 -1
- package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
- package/dist/editor/commands/itemCommands.d.ts +3 -0
- package/dist/editor/commands/itemCommands.js +93 -10
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/commands/undo.d.ts +9 -15
- package/dist/editor/commands/undo.js +24 -0
- package/dist/editor/commands/undo.js.map +1 -1
- package/dist/editor/context-menu/InsertMenu.js +83 -39
- package/dist/editor/context-menu/InsertMenu.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +1 -1
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/RawEditor.js +1 -1
- package/dist/editor/field-types/RichTextEditor.js +13 -5
- package/dist/editor/field-types/RichTextEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +37 -3
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +1 -1
- package/dist/editor/field-types/TreeListEditor.js +3 -2
- package/dist/editor/field-types/TreeListEditor.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.css +23 -5
- package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +2 -0
- package/dist/editor/field-types/richtext/components/ReactSlate.js +28 -4
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ToolbarButton.js +4 -2
- package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +13 -0
- package/dist/editor/field-types/richtext/contextMenuFactory.js +181 -24
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +2 -0
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/field-types/richtext/utils/plugins.js +4 -0
- package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
- package/dist/editor/field-types/textContextMenuFactory.js +3 -2
- package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
- package/dist/editor/media-selector/AiImageSearchPrompt.js +4 -2
- package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
- package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
- package/dist/editor/media-selector/MediaSelector.js +7 -1
- package/dist/editor/media-selector/MediaSelector.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +40 -35
- package/dist/editor/media-selector/TreeSelector.js.map +1 -1
- package/dist/editor/menubar/ActiveUsers.js +1 -1
- package/dist/editor/menubar/ActiveUsers.js.map +1 -1
- package/dist/editor/menubar/GenericToolbar.js +4 -2
- package/dist/editor/menubar/GenericToolbar.js.map +1 -1
- package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
- package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +26 -147
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/Separator.js +1 -1
- package/dist/editor/menubar/VersionSelector.js +2 -4
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/menubar/WorkflowButton.js +39 -12
- package/dist/editor/menubar/WorkflowButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +16 -38
- package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/HelpButton.js +1 -0
- package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +6 -10
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +597 -220
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js +13 -2
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/CommentHighlighting.js +42 -1
- package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.js +97 -48
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +38 -17
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +17 -11
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
- package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
- package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.js +69 -11
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.d.ts +2 -4
- package/dist/editor/page-viewer/MiniMap.js +91 -28
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.d.ts +3 -1
- package/dist/editor/page-viewer/PageViewer.js +92 -19
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +2 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +348 -115
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +114 -49
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
- package/dist/editor/page-viewer/pageViewContext.d.ts +1 -0
- package/dist/editor/page-viewer/pageViewContext.js +51 -14
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/pageModel.d.ts +14 -1
- package/dist/editor/reviews/Comment.js +26 -12
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentDisplayPopover.js +7 -5
- package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.js +19 -4
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.js +89 -72
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js +281 -177
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/DecisionsMatrix.js +96 -25
- package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
- package/dist/editor/reviews/DiffView.js +7 -14
- package/dist/editor/reviews/DiffView.js.map +1 -1
- package/dist/editor/reviews/EditReviewSettingsDialog.js +6 -4
- package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
- package/dist/editor/reviews/MultiReviewManager.js +25 -3
- package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
- package/dist/editor/reviews/PagesPanel.js +31 -15
- package/dist/editor/reviews/PagesPanel.js.map +1 -1
- package/dist/editor/reviews/PreviewInfo.js +1 -4
- package/dist/editor/reviews/PreviewInfo.js.map +1 -1
- package/dist/editor/reviews/ReviewCard.js +13 -7
- package/dist/editor/reviews/ReviewCard.js.map +1 -1
- package/dist/editor/reviews/ReviewDetail.js +3 -2
- package/dist/editor/reviews/ReviewDetail.js.map +1 -1
- package/dist/editor/reviews/ReviewsList.js +7 -3
- package/dist/editor/reviews/ReviewsList.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +34 -3
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +31 -5
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/commentAi.js +25 -6
- package/dist/editor/reviews/commentAi.js.map +1 -1
- package/dist/editor/reviews/reviewCommands.js +4 -1
- package/dist/editor/reviews/reviewCommands.js.map +1 -1
- package/dist/editor/reviews/useMultiReview.js +2 -2
- package/dist/editor/reviews/useMultiReview.js.map +1 -1
- package/dist/editor/reviews/useReviews.d.ts +2 -2
- package/dist/editor/reviews/useReviews.js +12 -30
- package/dist/editor/reviews/useReviews.js.map +1 -1
- package/dist/editor/services/agentErrorMessage.d.ts +1 -0
- package/dist/editor/services/agentErrorMessage.js +91 -0
- package/dist/editor/services/agentErrorMessage.js.map +1 -0
- package/dist/editor/services/agentService.d.ts +229 -5
- package/dist/editor/services/agentService.js +292 -39
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/agentStatus.d.ts +1 -0
- package/dist/editor/services/agentStatus.js +19 -0
- package/dist/editor/services/agentStatus.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +57 -1
- package/dist/editor/services/aiService.js +79 -6
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +6 -3
- package/dist/editor/services/contentService.js +13 -12
- package/dist/editor/services/contentService.js.map +1 -1
- package/dist/editor/services/editService.d.ts +52 -1
- package/dist/editor/services/editService.js +94 -2
- package/dist/editor/services/editService.js.map +1 -1
- package/dist/editor/services/indexService.js +1 -1
- package/dist/editor/services/indexService.js.map +1 -1
- package/dist/editor/services/reviewsService.d.ts +3 -6
- package/dist/editor/services/reviewsService.js +2 -11
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/services/serviceHelper.d.ts +2 -1
- package/dist/editor/services/serviceHelper.js +112 -20
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/services/systemService.d.ts +2 -1
- package/dist/editor/services/systemService.js +3 -0
- package/dist/editor/services/systemService.js.map +1 -1
- package/dist/editor/services-server/api.d.ts +1 -2
- package/dist/editor/services-server/api.js +11 -6
- package/dist/editor/services-server/api.js.map +1 -1
- package/dist/editor/settings/About.js +317 -3
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/QuotaInfo.js +210 -4
- package/dist/editor/settings/QuotaInfo.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +25 -23
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/Status.js +7 -6
- package/dist/editor/settings/Status.js.map +1 -1
- package/dist/editor/settings/index/useIndexStatus.js +20 -22
- package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
- package/dist/editor/settings/panels/AgentsPanel.d.ts +0 -4
- package/dist/editor/settings/panels/AgentsPanel.js +95 -121
- package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ModelsPanel.js +329 -108
- package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.js +86 -59
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
- package/dist/editor/settings/panels/SearchConfigPanel.js +4 -4
- package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
- package/dist/editor/settings/panels/index.d.ts +3 -2
- package/dist/editor/settings/panels/index.js +3 -2
- package/dist/editor/settings/panels/index.js.map +1 -1
- package/dist/editor/settings/status/coreStatusChecks.js +124 -19
- package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
- package/dist/editor/settings/status/useStartupChecks.d.ts +3 -1
- package/dist/editor/settings/status/useStartupChecks.js +9 -5
- package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
- package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +2 -1
- package/dist/editor/setup-wizard/steps/CompleteStep.js +2 -1
- package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
- package/dist/editor/sidebar/ComponentPalette.js +2 -1
- package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.d.ts +8 -1
- package/dist/editor/sidebar/ComponentTree.js +216 -69
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/EditHistory.js +22 -46
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/Favorites.js +4 -8
- package/dist/editor/sidebar/Favorites.js.map +1 -1
- package/dist/editor/sidebar/MainContentTree.js +4 -3
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/sidebar/OperationItem.js +21 -7
- package/dist/editor/sidebar/OperationItem.js.map +1 -1
- package/dist/editor/sidebar/SidebarPanel.d.ts +3 -1
- package/dist/editor/sidebar/SidebarPanel.js +44 -12
- package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
- package/dist/editor/sidebar/SidebarStack.d.ts +2 -1
- package/dist/editor/sidebar/SidebarStack.js +4 -3
- package/dist/editor/sidebar/SidebarStack.js.map +1 -1
- package/dist/editor/sidebar/Validation.js +24 -12
- package/dist/editor/sidebar/Validation.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +53 -3
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceRail.d.ts +0 -1
- package/dist/editor/sidebar/WorkspaceRail.js +56 -167
- package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
- package/dist/editor/tree-indicators/GutterColumns.d.ts +3 -1
- package/dist/editor/tree-indicators/GutterColumns.js +26 -5
- package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
- package/dist/editor/tree-indicators/GutterContext.d.ts +4 -0
- package/dist/editor/tree-indicators/GutterContext.js +23 -0
- package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
- package/dist/editor/tree-indicators/index.d.ts +0 -1
- package/dist/editor/tree-indicators/index.js +0 -1
- package/dist/editor/tree-indicators/index.js.map +1 -1
- package/dist/editor/tree-indicators/types.d.ts +12 -1
- package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
- package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
- package/dist/editor/ui/Icons.js +1 -1
- package/dist/editor/ui/Icons.js.map +1 -1
- package/dist/editor/ui/ItemNameDialogNew.d.ts +2 -0
- package/dist/editor/ui/ItemNameDialogNew.js +33 -17
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/editor/ui/ItemSearch.js +7 -11
- package/dist/editor/ui/ItemSearch.js.map +1 -1
- package/dist/editor/ui/SimpleIconButton.js +1 -1
- package/dist/editor/ui/SimpleIconButton.js.map +1 -1
- package/dist/editor/ui/SimpleTabs.d.ts +1 -0
- package/dist/editor/ui/SimpleTabs.js +45 -25
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +1 -0
- package/dist/editor/ui/Splitter.js +102 -86
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
- package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
- package/dist/editor/ui/TreeListSelector.d.ts +6 -1
- package/dist/editor/ui/TreeListSelector.js +2 -2
- package/dist/editor/ui/TreeListSelector.js.map +1 -1
- package/dist/editor/utils/keyboardNavigation.d.ts +6 -20
- package/dist/editor/utils/keyboardNavigation.js +48 -140
- package/dist/editor/utils/keyboardNavigation.js.map +1 -1
- package/dist/editor/utils.js +19 -9
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/views/CompareView.d.ts +3 -1
- package/dist/editor/views/CompareView.js +7 -5
- package/dist/editor/views/CompareView.js.map +1 -1
- package/dist/editor/views/EditView.js +1 -1
- package/dist/editor/views/EditView.js.map +1 -1
- package/dist/editor/views/EditorSlot.js +27 -34
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/editor/views/ItemEditor.js +7 -3
- package/dist/editor/views/ItemEditor.js.map +1 -1
- package/dist/editor/views/MediaFolderEditView.js +1 -1
- package/dist/editor/views/MediaFolderEditView.js.map +1 -1
- package/dist/editor/views/ParheliaView.js +5 -6
- package/dist/editor/views/ParheliaView.js.map +1 -1
- package/dist/editor/views/SingleEditView.d.ts +2 -1
- package/dist/editor/views/SingleEditView.js +10 -8
- package/dist/editor/views/SingleEditView.js.map +1 -1
- package/dist/editor/views/editorSlotContext.js +35 -6
- package/dist/editor/views/editorSlotContext.js.map +1 -1
- package/dist/index.d.ts +16 -2
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/setup/services/setupWizardService.d.ts +40 -13
- package/dist/setup/services/setupWizardService.js +32 -17
- package/dist/setup/services/setupWizardService.js.map +1 -1
- package/dist/setup/wizard/steps/AddModelDialog.js +12 -3
- package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
- package/dist/setup/wizard/steps/ImportModelDialog.js +39 -22
- package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
- package/dist/splash-screen/ModernSplashScreen.js +112 -32
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +33 -50
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +2 -6
- package/dist/splash-screen/OpenPage.js.map +1 -1
- package/dist/splash-screen/ParheliaAssistantChat.js +12 -29
- package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
- package/dist/splash-screen/ParheliaLogo.js +87 -37
- package/dist/splash-screen/ParheliaLogo.js.map +1 -1
- package/dist/splash-screen/RecentPages.js +3 -3
- package/dist/splash-screen/RecentPages.js.map +1 -1
- package/dist/tour/Tour.d.ts +2 -1
- package/dist/tour/Tour.js +256 -75
- package/dist/tour/Tour.js.map +1 -1
- package/dist/tour/default-tour.js +222 -96
- package/dist/tour/default-tour.js.map +1 -1
- package/dist/types.d.ts +63 -29
- package/package.json +19 -15
- package/styles.css +39 -10
- package/dist/editor/ComponentInfo.d.ts +0 -4
- package/dist/editor/ComponentInfo.js +0 -41
- package/dist/editor/ComponentInfo.js.map +0 -1
- package/dist/editor/ai/HelpTerminal.d.ts +0 -5
- package/dist/editor/ai/HelpTerminal.js +0 -166
- package/dist/editor/ai/HelpTerminal.js.map +0 -1
- package/dist/editor/field-types/ReactQuill.d.ts +0 -125
- package/dist/editor/field-types/ReactQuill.js +0 -385
- package/dist/editor/field-types/ReactQuill.js.map +0 -1
- package/dist/editor/services-server/graphQL.d.ts +0 -29
- package/dist/editor/services-server/graphQL.js +0 -53
- package/dist/editor/services-server/graphQL.js.map +0 -1
- package/dist/editor/settings/AllAgentsPanel.d.ts +0 -5
- package/dist/editor/settings/AllAgentsPanel.js +0 -139
- package/dist/editor/settings/AllAgentsPanel.js.map +0 -1
- package/dist/editor/settings/LatestFeedback.d.ts +0 -1
- package/dist/editor/settings/LatestFeedback.js +0 -136
- package/dist/editor/settings/LatestFeedback.js.map +0 -1
- package/dist/editor/settings/Setup.d.ts +0 -1
- package/dist/editor/settings/Setup.js +0 -211
- package/dist/editor/settings/Setup.js.map +0 -1
- package/dist/editor/settings/panels/DatabasePanel.d.ts +0 -6
- package/dist/editor/settings/panels/DatabasePanel.js +0 -50
- package/dist/editor/settings/panels/DatabasePanel.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +0 -2
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +0 -195
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +0 -2
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js +0 -21
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +0 -233
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +0 -15
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +0 -14
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +0 -94
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js +0 -2
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +0 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +0 -5
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +0 -44
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +0 -1
- package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +0 -2
- package/dist/editor/settings/setup-steps/IndexSetupStep.js +0 -36
- package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +0 -1
- package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +0 -2
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js +0 -111
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +0 -1
- package/dist/editor/settings/setup-steps/SetupOverview.d.ts +0 -14
- package/dist/editor/settings/setup-steps/SetupOverview.js +0 -38
- package/dist/editor/settings/setup-steps/SetupOverview.js.map +0 -1
- package/dist/editor/sidebar/Debug.d.ts +0 -1
- package/dist/editor/sidebar/Debug.js +0 -70
- package/dist/editor/sidebar/Debug.js.map +0 -1
- package/dist/editor/sidebar/GraphQL.d.ts +0 -2
- package/dist/editor/sidebar/GraphQL.js +0 -234
- package/dist/editor/sidebar/GraphQL.js.map +0 -1
- package/dist/editor/sidebar/LeftToolbar.d.ts +0 -1
- package/dist/editor/sidebar/LeftToolbar.js +0 -12
- package/dist/editor/sidebar/LeftToolbar.js.map +0 -1
- package/dist/editor/sidebar/NavigationSidebar.d.ts +0 -4
- package/dist/editor/sidebar/NavigationSidebar.js +0 -254
- package/dist/editor/sidebar/NavigationSidebar.js.map +0 -1
- package/dist/editor/tree-indicators/GutterSelector.d.ts +0 -5
- package/dist/editor/tree-indicators/GutterSelector.js +0 -91
- package/dist/editor/tree-indicators/GutterSelector.js.map +0 -1
|
@@ -3,20 +3,28 @@ import { useState, useEffect, useMemo } from "react";
|
|
|
3
3
|
import { Dialog, DialogContent } from "../../components/ui/dialog";
|
|
4
4
|
import { StyledDialogTitle } from "../../components/ui/styled-dialog-title";
|
|
5
5
|
import { Button } from "../../components/ui/button";
|
|
6
|
-
import {
|
|
7
|
-
import { Label } from "../../components/ui/label";
|
|
8
|
-
import { Checkbox } from "../../components/ui/checkbox";
|
|
9
|
-
import { Switch } from "../../components/ui/switch";
|
|
10
|
-
import { Plus, X, Loader2, ChevronRight, ChevronLeft, ChevronDown, Settings2, ClipboardCheck, AlertTriangle, } from "lucide-react";
|
|
6
|
+
import { Loader2, ClipboardCheck, MailCheck, CheckCircle2 } from "lucide-react";
|
|
11
7
|
import { useEditContext } from "../client/editContext";
|
|
12
|
-
import { Splitter } from "../ui/Splitter";
|
|
13
|
-
import { SimpleIconButton } from "../ui/SimpleIconButton";
|
|
14
|
-
import { LanguageSelector } from "../../components/ui/LanguageSelector";
|
|
15
|
-
import { PreconfiguredReviewerSelector } from "./PreconfiguredReviewerSelector";
|
|
16
|
-
import { TreeListSelector } from "../ui/TreeListSelector";
|
|
17
8
|
import DialogButtons from "../ui/DialogButtons";
|
|
9
|
+
import { CreateReviewDetailsStep } from "./CreateReviewDetailsStep";
|
|
10
|
+
import { CreateReviewConfirmStep } from "./CreateReviewConfirmStep";
|
|
11
|
+
import { CreateReviewSuccessStep } from "./CreateReviewSuccessStep";
|
|
12
|
+
import { loadAiProfiles } from "../services/aiService";
|
|
13
|
+
import { awaitAgentResponse, closeAgent, startAgent, } from "../services/agentService";
|
|
14
|
+
const REVIEW_TITLE_SUGGESTION_TIMEOUT_MS = 12000;
|
|
15
|
+
function withTimeout(promise, timeoutMs, timeoutMessage) {
|
|
16
|
+
let timeoutId = null;
|
|
17
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
18
|
+
timeoutId = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
|
|
19
|
+
});
|
|
20
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
21
|
+
if (timeoutId)
|
|
22
|
+
clearTimeout(timeoutId);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
18
25
|
export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems, }) {
|
|
19
26
|
const editContext = useEditContext();
|
|
27
|
+
const [step, setStep] = useState("details");
|
|
20
28
|
const [title, setTitle] = useState("");
|
|
21
29
|
const [language, setLanguage] = useState(editContext?.currentItemDescriptor?.language || "en");
|
|
22
30
|
const [languageMode, setLanguageMode] = useState("single");
|
|
@@ -38,9 +46,14 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
38
46
|
const [showSecretFields, setShowSecretFields] = useState(false);
|
|
39
47
|
const [requiredApprovals, setRequiredApprovals] = useState("1");
|
|
40
48
|
const [updateWorkflowOnCompletion, setUpdateWorkflowOnCompletion] = useState(false);
|
|
49
|
+
const [shareCommentsAndSuggestions, setShareCommentsAndSuggestions] = useState(false);
|
|
41
50
|
const [selectedInTree, setSelectedInTree] = useState([]);
|
|
42
51
|
const [selectedFromList, setSelectedFromList] = useState([]);
|
|
43
52
|
const [advancedSettingsOpen, setAdvancedSettingsOpen] = useState(false);
|
|
53
|
+
const [createdReviewId, setCreatedReviewId] = useState(null);
|
|
54
|
+
const [sentInvitationCount, setSentInvitationCount] = useState(0);
|
|
55
|
+
const [sentInvitationEmails, setSentInvitationEmails] = useState([]);
|
|
56
|
+
const [isGeneratingTitle, setIsGeneratingTitle] = useState(false);
|
|
44
57
|
const CONTENT_ROOT_ID = "0de95ae4-41ab-4d01-9eb0-67441b7c2450"; // /sitecore/content
|
|
45
58
|
// Memoize rootItemIds to prevent unnecessary re-renders of ContentTree
|
|
46
59
|
const rootItemIds = useMemo(() => [CONTENT_ROOT_ID], []);
|
|
@@ -90,8 +103,10 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
90
103
|
// This prevents resetting user changes (like includeSubitems toggles) when context changes
|
|
91
104
|
const initializeItems = async () => {
|
|
92
105
|
let currentDescriptor = editContext.currentItemDescriptor;
|
|
93
|
-
// If the descriptor is missing name or path, fetch it from the server
|
|
94
|
-
if ((!currentDescriptor.name ||
|
|
106
|
+
// If the descriptor is missing name, display name, or path, fetch it from the server
|
|
107
|
+
if ((!currentDescriptor.name ||
|
|
108
|
+
!currentDescriptor.displayName ||
|
|
109
|
+
!currentDescriptor.path) &&
|
|
95
110
|
editContext.itemsRepository) {
|
|
96
111
|
try {
|
|
97
112
|
const stubs = await editContext.itemsRepository.getItemsStubs([
|
|
@@ -101,6 +116,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
101
116
|
currentDescriptor = {
|
|
102
117
|
...currentDescriptor,
|
|
103
118
|
name: stubs[0].name || currentDescriptor.name,
|
|
119
|
+
displayName: stubs[0].displayName || currentDescriptor.displayName,
|
|
104
120
|
path: stubs[0].path || currentDescriptor.path,
|
|
105
121
|
};
|
|
106
122
|
}
|
|
@@ -111,8 +127,8 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
111
127
|
}
|
|
112
128
|
let itemsToSet;
|
|
113
129
|
if (initialItems) {
|
|
114
|
-
// Fetch missing names/paths for initial items as well
|
|
115
|
-
const itemsToFetch = initialItems.filter((i) => !i.name || !i.path);
|
|
130
|
+
// Fetch missing names/display names/paths for initial items as well
|
|
131
|
+
const itemsToFetch = initialItems.filter((i) => !i.name || !i.displayName || !i.path);
|
|
116
132
|
if (itemsToFetch.length > 0 && editContext.itemsRepository) {
|
|
117
133
|
try {
|
|
118
134
|
const stubs = await editContext.itemsRepository.getItemsStubs(itemsToFetch);
|
|
@@ -123,6 +139,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
123
139
|
descriptor: {
|
|
124
140
|
...i,
|
|
125
141
|
name: stub?.name || i.name,
|
|
142
|
+
displayName: stub?.displayName || i.displayName,
|
|
126
143
|
path: stub?.path || i.path,
|
|
127
144
|
},
|
|
128
145
|
includeSubitems: false,
|
|
@@ -167,6 +184,119 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
167
184
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
168
185
|
return emailRegex.test(email);
|
|
169
186
|
};
|
|
187
|
+
const extractReviewTitleFromAgentResponse = (content) => {
|
|
188
|
+
if (!content)
|
|
189
|
+
return "";
|
|
190
|
+
const fencedTitleMatch = content.match(/```(?:suggestion|title)\s*\n([\s\S]*?)```/i);
|
|
191
|
+
const fencedGenericMatch = content.match(/```\s*\n([\s\S]*?)```/);
|
|
192
|
+
const raw = (fencedTitleMatch?.[1] || fencedGenericMatch?.[1] || content)
|
|
193
|
+
.trim()
|
|
194
|
+
.replace(/^["']|["']$/g, "");
|
|
195
|
+
if (!raw)
|
|
196
|
+
return "";
|
|
197
|
+
return raw.split("\n")[0]?.trim() || "";
|
|
198
|
+
};
|
|
199
|
+
const buildReviewTitleSuggestionPrompt = () => {
|
|
200
|
+
const languageScope = languageMode === "all"
|
|
201
|
+
? "all languages"
|
|
202
|
+
: languageMode === "multiple"
|
|
203
|
+
? selectedLanguages.join(", ")
|
|
204
|
+
: language;
|
|
205
|
+
const itemNames = items
|
|
206
|
+
.slice(0, 5)
|
|
207
|
+
.map((item) => item.descriptor.displayName ||
|
|
208
|
+
item.descriptor.name ||
|
|
209
|
+
item.descriptor.path ||
|
|
210
|
+
item.descriptor.id)
|
|
211
|
+
.filter(Boolean)
|
|
212
|
+
.join(", ");
|
|
213
|
+
const reviewerNames = reviewers
|
|
214
|
+
.slice(0, 3)
|
|
215
|
+
.map((reviewer) => reviewer.name || reviewer.email)
|
|
216
|
+
.filter(Boolean)
|
|
217
|
+
.join(", ");
|
|
218
|
+
return `Generate a concise review name for a Sitecore content review.
|
|
219
|
+
|
|
220
|
+
Context:
|
|
221
|
+
- Language scope: ${languageScope}
|
|
222
|
+
- Items: ${itemNames || "N/A"}
|
|
223
|
+
- Number of reviewers: ${reviewers.length}
|
|
224
|
+
- First reviewers: ${reviewerNames || "N/A"}
|
|
225
|
+
- Includes subitems: ${items.some((x) => x.includeSubitems) ? "yes" : "no"}
|
|
226
|
+
|
|
227
|
+
Rules:
|
|
228
|
+
- Return a short, clear title (4-10 words).
|
|
229
|
+
- Do not use quotes.
|
|
230
|
+
- Do not include prefixes like "Review:".
|
|
231
|
+
- Output ONLY the title inside a \`\`\`suggestion fenced code block.
|
|
232
|
+
|
|
233
|
+
Example:
|
|
234
|
+
\`\`\`suggestion
|
|
235
|
+
Homepage and Navigation Content Review
|
|
236
|
+
\`\`\``;
|
|
237
|
+
};
|
|
238
|
+
const generateReviewTitleSuggestion = async () => {
|
|
239
|
+
if (title.trim())
|
|
240
|
+
return null;
|
|
241
|
+
if (!editContext?.addSocketMessageListener || !editContext.sessionId) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
const newAgentId = crypto.randomUUID();
|
|
245
|
+
setIsGeneratingTitle(true);
|
|
246
|
+
try {
|
|
247
|
+
const profiles = await withTimeout(loadAiProfiles(editContext.currentItemDescriptor), REVIEW_TITLE_SUGGESTION_TIMEOUT_MS, "Timed out while loading AI profiles");
|
|
248
|
+
if (!profiles || profiles.length === 0) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
const configuredProfileId = editContext.parheliaSettings?.commentResolveProfileId;
|
|
252
|
+
const selectedProfile = profiles.find((profile) => configuredProfileId &&
|
|
253
|
+
profile.id.toLowerCase() === configuredProfileId.toLowerCase()) || profiles[0];
|
|
254
|
+
if (!selectedProfile)
|
|
255
|
+
return null;
|
|
256
|
+
await withTimeout(startAgent({
|
|
257
|
+
agentId: newAgentId,
|
|
258
|
+
message: buildReviewTitleSuggestionPrompt(),
|
|
259
|
+
sessionId: editContext.sessionId,
|
|
260
|
+
profileId: selectedProfile.id,
|
|
261
|
+
mode: "autonomous",
|
|
262
|
+
context: {
|
|
263
|
+
items: items.map((item) => ({
|
|
264
|
+
id: item.descriptor.id,
|
|
265
|
+
language: item.descriptor.language,
|
|
266
|
+
version: item.descriptor.version,
|
|
267
|
+
name: item.descriptor.name,
|
|
268
|
+
path: item.descriptor.path,
|
|
269
|
+
})),
|
|
270
|
+
additionalData: {
|
|
271
|
+
intent: "review-title-suggestion",
|
|
272
|
+
reviewerCount: reviewers.length,
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
}), REVIEW_TITLE_SUGGESTION_TIMEOUT_MS, "Timed out while starting title suggestion agent");
|
|
276
|
+
const result = await awaitAgentResponse({
|
|
277
|
+
agentId: newAgentId,
|
|
278
|
+
addSocketMessageListener: editContext.addSocketMessageListener,
|
|
279
|
+
timeout: REVIEW_TITLE_SUGGESTION_TIMEOUT_MS,
|
|
280
|
+
});
|
|
281
|
+
if (!result.success)
|
|
282
|
+
return null;
|
|
283
|
+
const extractedTitle = extractReviewTitleFromAgentResponse(result.content);
|
|
284
|
+
return extractedTitle || null;
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
console.error("Failed to generate review title suggestion:", err);
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
setIsGeneratingTitle(false);
|
|
292
|
+
try {
|
|
293
|
+
await closeAgent(newAgentId);
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
console.error("Failed to close review title suggestion agent:", err);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
};
|
|
170
300
|
const emailAlreadyExists = (email) => {
|
|
171
301
|
return reviewers.some((r) => r.email.toLowerCase() === email.toLowerCase());
|
|
172
302
|
};
|
|
@@ -198,40 +328,85 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
198
328
|
const removeItem = (index) => {
|
|
199
329
|
setItems(items.filter((_, i) => i !== index));
|
|
200
330
|
};
|
|
201
|
-
const
|
|
202
|
-
|
|
331
|
+
const resetDialogState = () => {
|
|
332
|
+
setStep("details");
|
|
333
|
+
setTitle("");
|
|
334
|
+
setReviewers([]);
|
|
335
|
+
setItems([]);
|
|
336
|
+
setExpirationDays("");
|
|
337
|
+
setSecret("");
|
|
338
|
+
setSecretConfirm("");
|
|
339
|
+
setShowSecretFields(false);
|
|
340
|
+
setRequiredApprovals("1");
|
|
341
|
+
setUpdateWorkflowOnCompletion(false);
|
|
342
|
+
setShareCommentsAndSuggestions(false);
|
|
343
|
+
setShowErrors(false);
|
|
203
344
|
setError(null);
|
|
345
|
+
setLanguageMode("single");
|
|
346
|
+
setSelectedLanguages([
|
|
347
|
+
editContext?.currentItemDescriptor?.language || "en",
|
|
348
|
+
]);
|
|
349
|
+
setLanguage(editContext?.currentItemDescriptor?.language || "en");
|
|
350
|
+
setAdvancedSettingsOpen(false);
|
|
351
|
+
setSelectedInTree([]);
|
|
352
|
+
setSelectedFromList([]);
|
|
353
|
+
setNewReviewer({ name: "", email: "" });
|
|
354
|
+
setCreatedReviewId(null);
|
|
355
|
+
setSentInvitationCount(0);
|
|
356
|
+
setSentInvitationEmails([]);
|
|
357
|
+
setIsGeneratingTitle(false);
|
|
358
|
+
};
|
|
359
|
+
const validateForm = () => {
|
|
204
360
|
if (items.length === 0) {
|
|
205
|
-
|
|
206
|
-
return;
|
|
361
|
+
return "Please select at least one page/item";
|
|
207
362
|
}
|
|
208
363
|
if (reviewers.length === 0) {
|
|
209
|
-
|
|
210
|
-
return;
|
|
364
|
+
return "Please add at least one reviewer";
|
|
211
365
|
}
|
|
212
|
-
// Validate language selection based on mode
|
|
213
366
|
if (languageMode === "single" && !language) {
|
|
214
|
-
|
|
215
|
-
return;
|
|
367
|
+
return "Language is required";
|
|
216
368
|
}
|
|
217
369
|
if (languageMode === "multiple" && selectedLanguages.length === 0) {
|
|
218
|
-
|
|
219
|
-
return;
|
|
370
|
+
return "Please select at least one language";
|
|
220
371
|
}
|
|
221
372
|
if (showSecretFields && secret !== secretConfirm) {
|
|
222
|
-
|
|
223
|
-
return;
|
|
373
|
+
return "Secrets do not match";
|
|
224
374
|
}
|
|
225
|
-
// Validate RequiredApprovals
|
|
226
375
|
const requiredApprovalsNum = requiredApprovals
|
|
227
376
|
? parseInt(requiredApprovals, 10)
|
|
228
377
|
: 1;
|
|
229
378
|
if (isNaN(requiredApprovalsNum) || requiredApprovalsNum < 1) {
|
|
230
|
-
|
|
231
|
-
return;
|
|
379
|
+
return "Required Approvals must be at least 1";
|
|
232
380
|
}
|
|
233
381
|
if (requiredApprovalsNum > reviewers.length) {
|
|
234
|
-
|
|
382
|
+
return `Required Approvals (${requiredApprovalsNum}) cannot exceed the number of reviewers (${reviewers.length})`;
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
};
|
|
386
|
+
const handleProceedToConfirm = async () => {
|
|
387
|
+
setShowErrors(true);
|
|
388
|
+
setError(null);
|
|
389
|
+
const validationError = validateForm();
|
|
390
|
+
if (validationError) {
|
|
391
|
+
setError(validationError);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
setStep("confirm");
|
|
395
|
+
if (!title.trim()) {
|
|
396
|
+
void (async () => {
|
|
397
|
+
const suggestedTitle = await generateReviewTitleSuggestion();
|
|
398
|
+
if (suggestedTitle) {
|
|
399
|
+
setTitle((currentTitle) => currentTitle.trim() ? currentTitle : suggestedTitle);
|
|
400
|
+
}
|
|
401
|
+
})();
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
const handleCreate = async () => {
|
|
405
|
+
setShowErrors(true);
|
|
406
|
+
setError(null);
|
|
407
|
+
const validationError = validateForm();
|
|
408
|
+
if (validationError) {
|
|
409
|
+
setError(validationError);
|
|
235
410
|
return;
|
|
236
411
|
}
|
|
237
412
|
setLoading(true);
|
|
@@ -254,12 +429,13 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
254
429
|
languages = selectedLanguages;
|
|
255
430
|
}
|
|
256
431
|
else {
|
|
257
|
-
// Single language mode - use legacy language field for backward compatibility
|
|
258
432
|
languages = [language];
|
|
259
433
|
}
|
|
434
|
+
const requiredApprovalsNum = requiredApprovals
|
|
435
|
+
? parseInt(requiredApprovals, 10)
|
|
436
|
+
: 1;
|
|
260
437
|
const request = {
|
|
261
438
|
title: title || undefined,
|
|
262
|
-
language: languageMode === "single" ? language : undefined, // Keep for backward compatibility
|
|
263
439
|
languages,
|
|
264
440
|
reviewers,
|
|
265
441
|
items,
|
|
@@ -267,38 +443,44 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
267
443
|
secret: showSecretFields && secret ? secret : undefined,
|
|
268
444
|
requiredApprovals: requiredApprovalsNum,
|
|
269
445
|
updateWorkflowOnCompletion: updateWorkflowOnCompletion,
|
|
446
|
+
shareCommentsAndSuggestions: shareCommentsAndSuggestions,
|
|
270
447
|
};
|
|
271
448
|
const { createReview, getReviewStatus, sendInvitations } = await import("../services/reviewsService");
|
|
272
449
|
const result = await createReview(request);
|
|
273
450
|
if (result.data?.reviewId) {
|
|
451
|
+
setCreatedReviewId(result.data.reviewId);
|
|
274
452
|
// Get assignments to send invitations
|
|
275
453
|
const statusResult = await getReviewStatus(result.data.reviewId);
|
|
276
454
|
if (statusResult.data?.assignments) {
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
455
|
+
const assignmentsToInvite = statusResult.data.assignments.filter((a) => !a.invitationSentDate);
|
|
456
|
+
const assignmentIds = assignmentsToInvite.map((a) => a.assignmentId);
|
|
457
|
+
const reviewerEmails = Array.from(new Set(assignmentsToInvite.map((a) => a.reviewerEmail)));
|
|
280
458
|
if (assignmentIds.length > 0) {
|
|
281
|
-
await sendInvitations(assignmentIds);
|
|
459
|
+
const invitationResult = await sendInvitations(assignmentIds);
|
|
460
|
+
if (invitationResult.type !== "success") {
|
|
461
|
+
throw new Error(invitationResult.details ||
|
|
462
|
+
invitationResult.summary ||
|
|
463
|
+
"Failed to send invitation emails");
|
|
464
|
+
}
|
|
465
|
+
if (invitationResult.data &&
|
|
466
|
+
typeof invitationResult.data === "object" &&
|
|
467
|
+
"errors" in invitationResult.data &&
|
|
468
|
+
Array.isArray(invitationResult.data.errors) &&
|
|
469
|
+
invitationResult.data.errors.length > 0) {
|
|
470
|
+
const errorMessages = invitationResult.data.errors
|
|
471
|
+
.map((err) => err?.message || String(err))
|
|
472
|
+
.join("; ");
|
|
473
|
+
throw new Error(errorMessages || "Failed to send invitation emails");
|
|
474
|
+
}
|
|
282
475
|
}
|
|
476
|
+
setSentInvitationCount(assignmentIds.length);
|
|
477
|
+
setSentInvitationEmails(reviewerEmails);
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
setSentInvitationCount(0);
|
|
481
|
+
setSentInvitationEmails([]);
|
|
283
482
|
}
|
|
284
|
-
|
|
285
|
-
// Reset form
|
|
286
|
-
setTitle("");
|
|
287
|
-
setReviewers([]);
|
|
288
|
-
setItems([]);
|
|
289
|
-
setExpirationDays("");
|
|
290
|
-
setSecret("");
|
|
291
|
-
setSecretConfirm("");
|
|
292
|
-
setShowSecretFields(false);
|
|
293
|
-
setRequiredApprovals("1");
|
|
294
|
-
setUpdateWorkflowOnCompletion(false);
|
|
295
|
-
setShowErrors(false);
|
|
296
|
-
setLanguageMode("single");
|
|
297
|
-
setSelectedLanguages([
|
|
298
|
-
editContext?.currentItemDescriptor?.language || "en",
|
|
299
|
-
]);
|
|
300
|
-
setLanguage(editContext?.currentItemDescriptor?.language || "en");
|
|
301
|
-
onOpenChange(false);
|
|
483
|
+
setStep("success");
|
|
302
484
|
}
|
|
303
485
|
else {
|
|
304
486
|
setError("Failed to create review");
|
|
@@ -311,11 +493,12 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
311
493
|
setLoading(false);
|
|
312
494
|
}
|
|
313
495
|
};
|
|
314
|
-
const addToList = async () => {
|
|
496
|
+
const addToList = async (itemsToAdd) => {
|
|
315
497
|
const newItems = [...items];
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
498
|
+
const sourceItems = itemsToAdd ?? selectedInTree;
|
|
499
|
+
const nodesToAdd = sourceItems.filter((node) => !newItems.some((x) => x.descriptor.id === node.id));
|
|
500
|
+
// Fetch missing paths/names/display names if needed
|
|
501
|
+
const nodesNeedingFetch = nodesToAdd.filter((node) => !node.path || !node.name || !node.displayName);
|
|
319
502
|
if (nodesNeedingFetch.length > 0 && editContext?.itemsRepository) {
|
|
320
503
|
try {
|
|
321
504
|
const descriptorsToFetch = nodesNeedingFetch.map((node) => ({
|
|
@@ -333,6 +516,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
333
516
|
language: node.language || language,
|
|
334
517
|
version: node.version || 1,
|
|
335
518
|
name: stub?.name || node.name || "",
|
|
519
|
+
displayName: stub?.displayName || node.displayName || "",
|
|
336
520
|
path: stub?.path || node.path || node.idPath || "",
|
|
337
521
|
},
|
|
338
522
|
includeSubitems: false,
|
|
@@ -349,6 +533,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
349
533
|
language: node.language || language,
|
|
350
534
|
version: node.version || 1,
|
|
351
535
|
name: node.name || "",
|
|
536
|
+
displayName: node.displayName || "",
|
|
352
537
|
path: node.path || node.idPath || "",
|
|
353
538
|
},
|
|
354
539
|
includeSubitems: false,
|
|
@@ -365,6 +550,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
365
550
|
language: node.language || language,
|
|
366
551
|
version: node.version || 1,
|
|
367
552
|
name: node.name || "",
|
|
553
|
+
displayName: node.displayName || "",
|
|
368
554
|
path: node.path || node.idPath || "",
|
|
369
555
|
},
|
|
370
556
|
includeSubitems: false,
|
|
@@ -387,10 +573,12 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
387
573
|
language: item.language || language,
|
|
388
574
|
version: item.version || 1,
|
|
389
575
|
name: item.name || "",
|
|
576
|
+
displayName: item.displayName || "",
|
|
390
577
|
path: item.path || item.idPath || "",
|
|
391
578
|
};
|
|
392
|
-
// Fetch missing path/name if needed
|
|
393
|
-
if ((!item.path || !item.name
|
|
579
|
+
// Fetch missing path/name/display name if needed
|
|
580
|
+
if ((!item.path || !item.name || !item.displayName) &&
|
|
581
|
+
editContext?.itemsRepository) {
|
|
394
582
|
try {
|
|
395
583
|
const stubs = await editContext.itemsRepository.getItemsStubs([
|
|
396
584
|
{
|
|
@@ -403,6 +591,7 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
403
591
|
itemDescriptor = {
|
|
404
592
|
...itemDescriptor,
|
|
405
593
|
name: stubs[0].name || itemDescriptor.name || "",
|
|
594
|
+
displayName: stubs[0].displayName || itemDescriptor.displayName || "",
|
|
406
595
|
path: stubs[0].path || itemDescriptor.path || "",
|
|
407
596
|
};
|
|
408
597
|
}
|
|
@@ -420,121 +609,36 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
420
609
|
]);
|
|
421
610
|
}
|
|
422
611
|
};
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
}
|
|
455
|
-
}, onDoubleClick: () => {
|
|
456
|
-
setItems(items.filter((_, i) => i !== index));
|
|
457
|
-
setSelectedFromList([]);
|
|
458
|
-
}, children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "truncate text-sm font-semibold text-gray-900", children: item.descriptor.name ||
|
|
459
|
-
item.descriptor.path ||
|
|
460
|
-
item.descriptor.id }), item.descriptor.path && (_jsx("span", { className: "text-muted-foreground truncate text-[11px]", title: item.descriptor.path, children: item.descriptor.path })), _jsxs("div", { className: "mt-1 flex items-center gap-1.5", children: [_jsx("span", { className: "rounded bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-600 uppercase", children: item.descriptor.language }), _jsxs("span", { className: "text-muted-foreground text-[10px] font-medium", children: ["v", item.descriptor.version] })] })] }), _jsx(Button, { variant: "ghost", size: "sm", className: "text-muted-foreground hover:bg-destructive/10 hover:text-destructive h-7 w-7 shrink-0 p-0 opacity-0 transition-all group-hover:opacity-100", onClick: (e) => {
|
|
461
|
-
e.stopPropagation();
|
|
462
|
-
removeItem(index);
|
|
463
|
-
}, children: _jsx(X, { className: "h-4 w-4" }) })] }), _jsxs("div", { className: "flex items-center gap-2 border-t border-gray-100/50 pt-2", children: [_jsx(Switch, { id: `subpages-${item.descriptor.id}-${index}`, checked: item.includeSubitems, onCheckedChange: () => toggleSubitems(index), onClick: (e) => e.stopPropagation(), className: "scale-75" }), _jsx(Label, { htmlFor: `subpages-${item.descriptor.id}-${index}`, className: "cursor-pointer text-[11px] font-medium text-gray-500", onClick: (e) => e.stopPropagation(), children: "Include subitems" })] })] }, `${item.descriptor.id}-${index}`))) })) : (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col items-center justify-center gap-3 p-8 text-center", children: [_jsx("div", { className: "rounded-full bg-gray-100/50 p-4 ring-8 ring-gray-50", children: _jsx(ClipboardCheck, { className: "h-6 w-6 text-gray-300", strokeWidth: 1 }) }), _jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium text-gray-500", children: "No items selected" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Browse or search to add items" })] })] }))] })),
|
|
464
|
-
},
|
|
465
|
-
], handleContent: (index) => index === 0 ? (_jsxs("div", { className: "flex flex-col items-center gap-1 rounded bg-gray-100 py-1", children: [_jsx(SimpleIconButton, { label: "Add", icon: _jsx(ChevronRight, { size: 14, strokeWidth: 1 }), onClick: addToList, disabled: selectedInTree.length === 0, showTooltip: false, className: "px-0" }), _jsx(SimpleIconButton, { label: "Remove", icon: _jsx(ChevronLeft, { size: 14, strokeWidth: 1 }), onClick: removeFromList, disabled: selectedFromList.length === 0, showTooltip: false, className: "px-0" })] })) : null }) }), showErrors && items.length === 0 && (_jsx("p", { className: "text-destructive text-xs font-medium", children: "Please select at least one page or item" }))] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-sm font-semibold text-gray-900", children: "Reviewers" }), reviewers.length > 0 && (_jsxs("span", { className: "bg-primary/10 text-primary rounded-full px-2.5 py-0.5 text-xs font-semibold", children: [reviewers.length, " added"] }))] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Add people who will review and approve the content." }), reviewers.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2.5", children: reviewers.map((reviewer, index) => (_jsxs("div", { className: "group hover:border-primary/30 flex items-center gap-2.5 rounded-full border border-gray-200 bg-white py-1.5 pr-2 pl-3.5 transition-all hover:shadow-sm", children: [_jsx("div", { className: "bg-primary/10 text-primary ring-primary/5 flex h-6 w-6 items-center justify-center rounded-full text-[10px] font-bold ring-2", children: reviewer.name.charAt(0).toUpperCase() }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-xs leading-none font-semibold text-gray-900", children: reviewer.name }), _jsx("span", { className: "text-muted-foreground mt-1 text-[10px] leading-none", children: reviewer.email })] }), _jsx(Button, { variant: "ghost", size: "sm", className: "text-muted-foreground hover:bg-destructive/10 hover:text-destructive h-6 w-6 rounded-full p-0 opacity-50 transition-all hover:opacity-100", onClick: () => removeReviewer(index), children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, index))) })), _jsxs("div", { className: "flex flex-col gap-4 rounded-xl border border-gray-200 bg-gray-50/50 p-5 shadow-inner", children: [items.length > 0 && (_jsx(PreconfiguredReviewerSelector, { itemIds: itemIds, language: language, onReviewerSelected: (reviewer) => {
|
|
466
|
-
const exists = reviewers.some((r) => r.email.toLowerCase() ===
|
|
467
|
-
reviewer.email.toLowerCase());
|
|
468
|
-
if (!exists) {
|
|
469
|
-
setReviewers([...reviewers, reviewer]);
|
|
470
|
-
}
|
|
471
|
-
}, existingReviewers: reviewers })), _jsxs("div", { className: "flex flex-col gap-2.5", children: [_jsx("label", { className: "text-[11px] font-bold tracking-wider text-gray-500 uppercase", children: "Add new reviewer" }), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "flex flex-1 flex-col gap-1", children: _jsx(Input, { "data-testid": "reviewer-name-input", placeholder: "Full Name", value: newReviewer.name, onChange: (e) => setNewReviewer({
|
|
472
|
-
...newReviewer,
|
|
473
|
-
name: e.target.value,
|
|
474
|
-
}), onKeyDown: (e) => {
|
|
475
|
-
if (e.key === "Enter") {
|
|
476
|
-
e.preventDefault();
|
|
477
|
-
addReviewer();
|
|
478
|
-
}
|
|
479
|
-
}, className: "bg-white" }) }), _jsxs("div", { className: "flex flex-1 flex-col gap-1", children: [_jsx(Input, { "data-testid": "reviewer-email-input", placeholder: "Email address", value: newReviewer.email, onChange: (e) => setNewReviewer({
|
|
480
|
-
...newReviewer,
|
|
481
|
-
email: e.target.value,
|
|
482
|
-
}), onKeyDown: (e) => {
|
|
483
|
-
if (e.key === "Enter") {
|
|
484
|
-
e.preventDefault();
|
|
485
|
-
addReviewer();
|
|
486
|
-
}
|
|
487
|
-
}, className: `bg-white ${newReviewer.email &&
|
|
488
|
-
!isValidEmail(newReviewer.email)
|
|
489
|
-
? "border-destructive/30 focus:border-destructive"
|
|
490
|
-
: ""}` }), newReviewer.email &&
|
|
491
|
-
!isValidEmail(newReviewer.email) && (_jsx("span", { className: "text-destructive text-[10px] font-medium", children: "Invalid email address" })), newReviewer.email &&
|
|
492
|
-
emailAlreadyExists(newReviewer.email) && (_jsx("span", { className: "text-destructive text-[10px] font-medium", children: "Reviewer already added" }))] }), _jsxs(Button, { onClick: addReviewer, size: "sm", "aria-label": "Add Reviewer", "data-testid": "add-reviewer-button", className: "h-9 shrink-0 px-3", children: [_jsx(Plus, { className: "mr-1.5 h-3.5 w-3.5" }), "Add"] })] })] })] }), showErrors && reviewers.length === 0 && (_jsx("p", { className: "text-destructive text-xs font-medium", children: "Please add at least one reviewer to create this review" }))] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("label", { className: "text-sm font-semibold text-gray-900", children: "Language" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Choose which language versions to include in the review." }), _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap gap-6", children: [_jsxs("label", { className: "flex cursor-pointer items-center gap-2", children: [_jsx("input", { type: "radio", name: "languageMode", "data-testid": "language-mode-single", checked: languageMode === "single", onChange: () => {
|
|
493
|
-
setLanguageMode("single");
|
|
494
|
-
setLanguage(selectedLanguages[0] || language);
|
|
495
|
-
}, className: "accent-primary h-4 w-4 cursor-pointer" }), _jsx("span", { className: "text-xs text-gray-700", children: "Single Language" })] }), _jsxs("label", { className: "flex cursor-pointer items-center gap-2", children: [_jsx("input", { type: "radio", name: "languageMode", "data-testid": "language-mode-multiple", checked: languageMode === "multiple", onChange: () => setLanguageMode("multiple"), className: "accent-primary h-4 w-4 cursor-pointer" }), _jsx("span", { className: "text-xs text-gray-700", children: "Multiple Languages" })] }), _jsxs("label", { className: "flex cursor-pointer items-center gap-2", children: [_jsx("input", { type: "radio", name: "languageMode", "data-testid": "language-mode-all", checked: languageMode === "all", onChange: () => setLanguageMode("all"), className: "accent-primary h-4 w-4 cursor-pointer" }), _jsx("span", { className: "text-xs text-gray-700", children: "All Languages" })] })] }), languageMode === "single" && (_jsx("div", { className: "max-w-xs", children: _jsx(LanguageSelector, { selectedLanguage: language, onLanguageSelected: (lang) => {
|
|
496
|
-
setLanguage(lang.languageCode);
|
|
497
|
-
setSelectedLanguages([lang.languageCode]);
|
|
498
|
-
}, showAllLanguages: true }) })), languageMode === "multiple" && (_jsxs("div", { className: "flex max-h-56 flex-col gap-3 overflow-hidden rounded-xl border border-gray-200 bg-white p-4 shadow-sm", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-100 pb-3", children: [_jsx("span", { className: "text-[11px] font-bold tracking-wider text-gray-500 uppercase", children: "Select Languages" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => {
|
|
499
|
-
const allLangs = editContext?.itemLanguages || [];
|
|
500
|
-
setSelectedLanguages(allLangs.map((l) => l.languageCode));
|
|
501
|
-
}, className: "text-primary hover:bg-primary/5 h-7 px-2 text-xs", children: "Select All" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setSelectedLanguages([]), className: "h-7 px-2 text-xs text-gray-500 hover:bg-gray-100", children: "Clear" })] })] }), _jsx("div", { className: "grid grid-cols-2 gap-2 overflow-y-auto pr-2", children: (editContext?.itemLanguages || []).map((lang) => (_jsxs("label", { className: "flex cursor-pointer items-center gap-3 rounded-md p-2 transition-all hover:bg-gray-50", children: [_jsx(Checkbox, { checked: selectedLanguages.includes(lang.languageCode), onCheckedChange: (checked) => {
|
|
502
|
-
if (checked) {
|
|
503
|
-
setSelectedLanguages([
|
|
504
|
-
...selectedLanguages,
|
|
505
|
-
lang.languageCode,
|
|
506
|
-
]);
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
setSelectedLanguages(selectedLanguages.filter((l) => l !== lang.languageCode));
|
|
510
|
-
}
|
|
511
|
-
} }), _jsx("img", { src: lang.icon, className: "h-4 w-4 rounded-sm", alt: lang.name }), _jsx("span", { className: "text-xs font-medium text-gray-700", children: lang.name })] }, lang.languageCode))) }), showErrors && selectedLanguages.length === 0 && (_jsx("p", { className: "text-destructive mt-1 text-center text-xs font-medium", children: "Please select at least one language" }))] })), languageMode === "all" && (_jsx("div", { className: "rounded-lg border border-blue-100 bg-blue-50 p-4 text-sm leading-relaxed font-medium text-blue-700", children: "All available languages will be included in this review. Reviewers will see versions for every language the item exists in." }))] })] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "mb-4 flex flex-col", children: [_jsxs("button", { type: "button", "data-testid": "advanced-settings-button", onClick: () => setAdvancedSettingsOpen(!advancedSettingsOpen), className: "flex w-full items-center justify-between rounded-xl border border-gray-200 bg-gray-50/50 px-5 py-4 text-left transition-all hover:bg-gray-100/80 hover:shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "rounded-lg border border-gray-100 bg-white p-2 shadow-sm", children: _jsx(Settings2, { className: "text-primary h-4 w-4" }) }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-sm leading-tight font-semibold text-gray-900", children: "Advanced Settings" }), _jsx("span", { className: "text-muted-foreground mt-0.5 text-[11px]", children: "Expiration, approvals, security" })] })] }), _jsx(ChevronDown, { className: `h-5 w-5 text-gray-400 transition-transform duration-300 ${advancedSettingsOpen ? "rotate-180" : ""}` })] }), advancedSettingsOpen && (_jsxs("div", { className: "mt-4 flex flex-col gap-6 rounded-xl border border-gray-200 bg-white p-6 shadow-sm", children: [_jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("label", { htmlFor: "requiredApprovals", className: "text-sm font-semibold text-gray-900", children: "Required Approvals" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Number of reviewers that must approve each page or item before it's considered complete." }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Input, { id: "requiredApprovals", "data-testid": "required-approvals-input", type: "number", min: "1", value: requiredApprovals, onChange: (e) => setRequiredApprovals(e.target.value), placeholder: "1", className: "w-24 bg-gray-50/50" }), _jsx("span", { className: "text-xs font-medium text-gray-400", children: "approvals needed" })] }), showErrors &&
|
|
512
|
-
reviewers.length > 0 &&
|
|
513
|
-
requiredApprovals &&
|
|
514
|
-
(() => {
|
|
515
|
-
const num = parseInt(requiredApprovals, 10);
|
|
516
|
-
if (isNaN(num) || num < 1) {
|
|
517
|
-
return (_jsx("p", { className: "text-destructive text-xs font-medium", children: "Must be at least 1" }));
|
|
518
|
-
}
|
|
519
|
-
if (num > reviewers.length) {
|
|
520
|
-
return (_jsxs("p", { className: "text-destructive text-xs font-medium", children: ["Cannot exceed number of reviewers (", reviewers.length, ")"] }));
|
|
521
|
-
}
|
|
522
|
-
return null;
|
|
523
|
-
})()] })] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "flex items-start gap-4", children: [_jsx(Checkbox, { id: "updateWorkflowOnCompletion", "data-testid": "update-workflow-checkbox", checked: updateWorkflowOnCompletion, onCheckedChange: (checked) => setUpdateWorkflowOnCompletion(!!checked), className: "mt-1" }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "updateWorkflowOnCompletion", className: "cursor-pointer text-sm leading-tight font-semibold text-gray-900", children: "Update workflow state on completion" }), _jsx("span", { className: "text-muted-foreground text-xs leading-relaxed", children: "When the review is approved by all required reviewers, automatically execute the \"Approve\" workflow action." })] })] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "flex items-start gap-4", children: [_jsx(Checkbox, { id: "hasExpiration", "data-testid": "set-expiration-checkbox", checked: expirationDays !== "", onCheckedChange: (checked) => {
|
|
524
|
-
if (!checked) {
|
|
525
|
-
setExpirationDays("");
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
setExpirationDays("30");
|
|
529
|
-
}
|
|
530
|
-
}, className: "mt-1" }), _jsxs("div", { className: "flex flex-1 flex-col gap-3", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "hasExpiration", className: "cursor-pointer text-sm leading-tight font-semibold text-gray-900", children: "Set expiration" }), _jsx("span", { className: "text-muted-foreground text-xs leading-relaxed", children: "Automatically close the review after a specified number of days if not completed." })] }), expirationDays !== "" && (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Input, { type: "number", "data-testid": "expiration-days-input", min: "1", value: expirationDays, onChange: (e) => setExpirationDays(e.target.value), placeholder: "30", className: "w-24 bg-gray-50/50" }), _jsx("span", { className: "text-xs font-medium text-gray-400", children: "days remaining" })] }))] })] }), _jsx("div", { className: "border-t border-gray-100" }), _jsxs("div", { className: "flex items-start gap-4", children: [_jsx(Checkbox, { id: "hasSecret", "data-testid": "require-secret-checkbox", checked: showSecretFields, onCheckedChange: (checked) => {
|
|
531
|
-
setShowSecretFields(!!checked);
|
|
532
|
-
if (!checked) {
|
|
533
|
-
setSecret("");
|
|
534
|
-
setSecretConfirm("");
|
|
535
|
-
}
|
|
536
|
-
}, className: "mt-1" }), _jsxs("div", { className: "flex flex-1 flex-col gap-3", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "hasSecret", className: "cursor-pointer text-sm leading-tight font-semibold text-gray-900", children: "Require secret to unlock" }), _jsx("span", { className: "text-muted-foreground text-xs leading-relaxed", children: "Reviewers must enter a shared secret phrase before they can access and review the content." })] }), showSecretFields && (_jsxs("div", { className: "grid max-w-md grid-cols-2 gap-3", children: [_jsx(Input, { "data-testid": "secret-input", type: "password", placeholder: "Create secret phrase", value: secret, onChange: (e) => setSecret(e.target.value), autoComplete: "off", className: "bg-gray-50/50" }), _jsx(Input, { "data-testid": "secret-confirm-input", type: "password", placeholder: "Confirm secret phrase", value: secretConfirm, onChange: (e) => setSecretConfirm(e.target.value), autoComplete: "off", className: "bg-gray-50/50" }), showErrors &&
|
|
537
|
-
secret &&
|
|
538
|
-
secret !== secretConfirm && (_jsx("p", { className: "text-destructive col-span-2 text-xs font-medium", children: "Secret phrases do not match" }))] }))] })] })] }))] }), error && (_jsx("div", { className: "border-destructive/20 bg-destructive/10 text-destructive rounded-xl border p-4 text-sm font-medium shadow-sm", children: _jsxs("div", { className: "flex gap-3", children: [_jsx(AlertTriangle, { className: "h-5 w-5 shrink-0" }), _jsx("p", { children: error })] }) }))] }) }), _jsxs(DialogButtons, { hideBorder: true, className: "bg-gray-50/50", children: [_jsx(Button, { variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(Button, { "data-testid": "create-review-submit-button", onClick: handleCreate, disabled: loading || !isFormValid, className: "min-w-[140px] shadow-sm", children: loading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Creating..."] })) : ("Create Review") })] })] })] }) }));
|
|
612
|
+
const handleDialogCancel = () => {
|
|
613
|
+
if (loading)
|
|
614
|
+
return;
|
|
615
|
+
resetDialogState();
|
|
616
|
+
onOpenChange(false);
|
|
617
|
+
};
|
|
618
|
+
const handleDialogOpenChange = (nextOpen) => {
|
|
619
|
+
if (!nextOpen) {
|
|
620
|
+
handleDialogCancel();
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
onOpenChange(nextOpen);
|
|
624
|
+
};
|
|
625
|
+
const handleDone = () => {
|
|
626
|
+
const reviewId = createdReviewId;
|
|
627
|
+
resetDialogState();
|
|
628
|
+
onCreated(reviewId);
|
|
629
|
+
};
|
|
630
|
+
const languageSummary = languageMode === "all"
|
|
631
|
+
? "All languages"
|
|
632
|
+
: languageMode === "multiple"
|
|
633
|
+
? `${selectedLanguages.length} selected (${selectedLanguages.join(", ")})`
|
|
634
|
+
: language;
|
|
635
|
+
return (_jsx(Dialog, { open: open, onOpenChange: handleDialogOpenChange, children: _jsxs(DialogContent, { className: "flex max-w-5xl overflow-hidden border-none p-0 shadow-2xl", style: { height: "90vh", maxHeight: "90vh" }, children: [_jsx(StyledDialogTitle, { icon: step === "success" ? (_jsx(CheckCircle2, { strokeWidth: 1 })) : step === "confirm" ? (_jsx(MailCheck, { strokeWidth: 1 })) : (_jsx(ClipboardCheck, { strokeWidth: 1 })), title: step === "success"
|
|
636
|
+
? "Review Created"
|
|
637
|
+
: step === "confirm"
|
|
638
|
+
? "Confirm Review"
|
|
639
|
+
: "Create Review" }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-6 pb-4", children: [step === "details" && (_jsx(CreateReviewDetailsStep, { items: items, setItems: setItems, showErrors: showErrors, language: language, setLanguage: setLanguage, rootItemIds: rootItemIds, selectedInTree: selectedInTree, setSelectedInTree: setSelectedInTree, selectedFromList: selectedFromList, setSelectedFromList: setSelectedFromList, addToList: addToList, removeFromList: removeFromList, handleAddItem: handleAddItem, removeItem: removeItem, toggleSubitems: toggleSubitems, reviewers: reviewers, setReviewers: setReviewers, newReviewer: newReviewer, setNewReviewer: setNewReviewer, addReviewer: addReviewer, removeReviewer: removeReviewer, isValidEmail: isValidEmail, emailAlreadyExists: emailAlreadyExists, itemIds: itemIds, languageMode: languageMode, setLanguageMode: setLanguageMode, selectedLanguages: selectedLanguages, setSelectedLanguages: setSelectedLanguages, itemLanguages: editContext?.itemLanguages || [], advancedSettingsOpen: advancedSettingsOpen, setAdvancedSettingsOpen: setAdvancedSettingsOpen, requiredApprovals: requiredApprovals, setRequiredApprovals: setRequiredApprovals, updateWorkflowOnCompletion: updateWorkflowOnCompletion, setUpdateWorkflowOnCompletion: setUpdateWorkflowOnCompletion, shareCommentsAndSuggestions: shareCommentsAndSuggestions, setShareCommentsAndSuggestions: setShareCommentsAndSuggestions, expirationDays: expirationDays, setExpirationDays: setExpirationDays, showSecretFields: showSecretFields, setShowSecretFields: setShowSecretFields, secret: secret, setSecret: setSecret, secretConfirm: secretConfirm, setSecretConfirm: setSecretConfirm, error: error })), step === "confirm" && (_jsx(CreateReviewConfirmStep, { title: title, setTitle: setTitle, isGeneratingTitle: isGeneratingTitle, languageSummary: languageSummary, reviewers: reviewers, items: items, requiredApprovals: requiredApprovals, updateWorkflowOnCompletion: updateWorkflowOnCompletion, expirationDays: expirationDays, showSecretFields: showSecretFields, error: error })), step === "success" && (_jsx(CreateReviewSuccessStep, { sentInvitationCount: sentInvitationCount, sentInvitationEmails: sentInvitationEmails }))] }), _jsxs(DialogButtons, { hideBorder: true, className: "bg-gray-50/50", children: [step === "details" && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: handleDialogCancel, children: "Cancel" }), _jsx(Button, { "data-testid": "create-review-submit-button", onClick: handleProceedToConfirm, disabled: loading || !isFormValid, className: "min-w-[140px] shadow-sm", children: "Continue" })] })), step === "confirm" && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: () => {
|
|
640
|
+
setError(null);
|
|
641
|
+
setStep("details");
|
|
642
|
+
}, disabled: loading, children: "Back" }), _jsx(Button, { "data-testid": "create-review-submit-button", onClick: handleCreate, disabled: loading, className: "min-w-[160px] shadow-sm", children: loading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Creating..."] })) : ("Create & Send Emails") })] })), step === "success" && (_jsx(Button, { onClick: handleDone, className: "min-w-[120px] shadow-sm", children: "Done" }))] })] })] }) }));
|
|
539
643
|
}
|
|
540
644
|
//# sourceMappingURL=CreateReviewDialog.js.map
|