@parhelia/core 0.1.12534 → 0.1.12555
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 +4 -6
- package/dist/agents-view/AgentCard.js +24 -143
- package/dist/agents-view/AgentCard.js.map +1 -1
- package/dist/agents-view/AgentsInbox.d.ts +1 -1
- package/dist/agents-view/AgentsInbox.js +92 -7
- package/dist/agents-view/AgentsInbox.js.map +1 -1
- package/dist/agents-view/AgentsTitlebar.js +2 -3
- package/dist/agents-view/AgentsTitlebar.js.map +1 -1
- package/dist/agents-view/AgentsView.d.ts +7 -6
- package/dist/agents-view/AgentsView.js +97 -186
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/agents-view/AgentsWorkspaceView.d.ts +6 -2
- package/dist/agents-view/AgentsWorkspaceView.js +113 -266
- package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
- package/dist/agents-view/ProfileAgentsGroup.d.ts +1 -2
- package/dist/agents-view/ProfileAgentsGroup.js +3 -4
- 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 +4 -2
- 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 +10 -6
- 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 +1 -4
- 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 +4 -12
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/copy-button.d.ts +1 -2
- 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 +126 -21
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/input.d.ts +1 -1
- package/dist/components/ui/input.js +3 -5
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/paste-button.d.ts +1 -2
- 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 +9 -1
- 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 +11 -4
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/config/config.d.ts +2 -2
- package/dist/config/config.js +70 -215
- package/dist/config/config.js.map +1 -1
- package/dist/config/types/workspace.d.ts +0 -6
- package/dist/config/types.d.ts +12 -58
- package/dist/config/types.js.map +1 -1
- package/dist/editor/ComponentInfo.d.ts +4 -0
- package/dist/editor/ComponentInfo.js +41 -0
- package/dist/editor/ComponentInfo.js.map +1 -0
- package/dist/editor/ConfirmationDialog.js +4 -20
- package/dist/editor/ConfirmationDialog.js.map +1 -1
- package/dist/editor/ContentTree.d.ts +1 -2
- package/dist/editor/ContentTree.js +32 -93
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/Editor.js +18 -72
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FieldHistory.js +36 -84
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/FieldListField.js +9 -21
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/FieldListFieldWithFallbacks.js +2 -23
- package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
- package/dist/editor/GlobalMenuBar.js +2 -29
- package/dist/editor/GlobalMenuBar.js.map +1 -1
- package/dist/editor/ItemInfo.js +1 -36
- package/dist/editor/ItemInfo.js.map +1 -1
- package/dist/editor/LinkEditorDialog.js +0 -3
- package/dist/editor/LinkEditorDialog.js.map +1 -1
- package/dist/editor/MainLayout.d.ts +2 -0
- package/dist/editor/MainLayout.js +5 -4
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/MigrationsView.js +5 -29
- package/dist/editor/MigrationsView.js.map +1 -1
- package/dist/editor/MobileLayout.js +12 -37
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/PictureCropper.js +45 -54
- package/dist/editor/PictureCropper.js.map +1 -1
- package/dist/editor/PictureEditor.js +13 -12
- 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 +12 -52
- package/dist/editor/SetupWizard.js.map +1 -1
- package/dist/editor/Titlebar.js +2 -7
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/ai/AgentCostDisplay.d.ts +0 -1
- package/dist/editor/ai/AgentCostDisplay.js +1 -1
- package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
- package/dist/editor/ai/AgentDocumentList.js +14 -32
- package/dist/editor/ai/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/AgentGreeting.js +2 -3
- package/dist/editor/ai/AgentGreeting.js.map +1 -1
- package/dist/editor/ai/AgentProfileSelector.js +1 -2
- package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
- package/dist/editor/ai/AgentStatusBadge.d.ts +5 -0
- package/dist/editor/ai/AgentStatusBadge.js +65 -67
- package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.d.ts +2 -14
- package/dist/editor/ai/AgentTerminal.js +482 -2350
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.d.ts +3 -8
- package/dist/editor/ai/AgentTerminalStatusBar.js +56 -460
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/Agents.js +101 -91
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/AiResponseMessage.d.ts +1 -10
- package/dist/editor/ai/AiResponseMessage.js +23 -238
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.d.ts +3 -2
- package/dist/editor/ai/ContextInfoBar.js +7 -64
- package/dist/editor/ai/ContextInfoBar.js.map +1 -1
- package/dist/editor/ai/GuidanceOverlay.js +11 -17
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/HelpTerminal.d.ts +5 -0
- package/dist/editor/ai/HelpTerminal.js +166 -0
- package/dist/editor/ai/HelpTerminal.js.map +1 -0
- package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
- package/dist/editor/ai/InlineAiDialog.js +192 -514
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +12 -115
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/MediaImage.js +8 -40
- package/dist/editor/ai/MediaImage.js.map +1 -1
- package/dist/editor/ai/SpawnedAgentsPanel.js +12 -10
- package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
- package/dist/editor/ai/ToolCallDisplay.d.ts +2 -22
- package/dist/editor/ai/ToolCallDisplay.js +147 -518
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +8 -1
- package/dist/editor/ai/dialogs/AgentDialogHandler.js +42 -379
- package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
- package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +1 -5
- package/dist/editor/ai/dialogs/QuestionnaireInline.js +60 -628
- package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
- package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +0 -115
- package/dist/editor/ai/dialogs/agentDialogTypes.js +0 -2
- package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
- package/dist/editor/ai/types.d.ts +1 -3
- package/dist/editor/ai/useAgentStatus.d.ts +0 -1
- package/dist/editor/ai/useAgentStatus.js +96 -79
- package/dist/editor/ai/useAgentStatus.js.map +1 -1
- package/dist/editor/ai/useInlineAiPosition.js +5 -45
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/client/AboutDialog.js +2 -4
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.js +212 -581
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +19 -28
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/helpers.js +0 -6
- package/dist/editor/client/helpers.js.map +1 -1
- package/dist/editor/client/hooks/useEditorUrlSync.js +2 -1
- package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
- package/dist/editor/client/hooks/useEditorWebSocket.d.ts +0 -10
- package/dist/editor/client/hooks/useEditorWebSocket.js +14 -209
- package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
- package/dist/editor/client/hooks/useQuota.d.ts +0 -8
- package/dist/editor/client/hooks/useQuota.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +7 -68
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.js +6 -10
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/navigation.d.ts +21 -0
- package/dist/editor/client/navigation.js +98 -0
- package/dist/editor/client/navigation.js.map +1 -0
- package/dist/editor/client/operations.d.ts +3 -6
- package/dist/editor/client/operations.js +30 -208
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +31 -4
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.d.ts +6 -0
- package/dist/editor/client/ui/EditorChrome.js +72 -55
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/client/ui/FullscreenControls.js +3 -5
- package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
- package/dist/editor/commands/commands.d.ts +1 -11
- package/dist/editor/commands/commands.js +1 -12
- package/dist/editor/commands/commands.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +55 -109
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/commands/customCommandConverter.d.ts +1 -8
- package/dist/editor/commands/customCommandConverter.js +5 -35
- package/dist/editor/commands/customCommandConverter.js.map +1 -1
- package/dist/editor/commands/handlers/agentHandler.js +1 -2
- package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
- package/dist/editor/commands/handlers/uiActionHandlers.js +3 -4
- package/dist/editor/commands/handlers/uiActionHandlers.js.map +1 -1
- package/dist/editor/commands/itemCommands.d.ts +0 -3
- package/dist/editor/commands/itemCommands.js +10 -93
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/commands/undo.d.ts +15 -9
- package/dist/editor/commands/undo.js +0 -24
- package/dist/editor/commands/undo.js.map +1 -1
- package/dist/editor/context-menu/InsertMenu.js +39 -83
- 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/ReactQuill.d.ts +125 -0
- package/dist/editor/field-types/ReactQuill.js +385 -0
- package/dist/editor/field-types/ReactQuill.js.map +1 -0
- package/dist/editor/field-types/RichTextEditor.js +2 -4
- package/dist/editor/field-types/RichTextEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +3 -37
- 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 +2 -3
- package/dist/editor/field-types/TreeListEditor.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.css +5 -23
- package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +0 -2
- package/dist/editor/field-types/richtext/components/ReactSlate.js +4 -28
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ToolbarButton.js +2 -4
- package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +0 -13
- package/dist/editor/field-types/richtext/contextMenuFactory.js +22 -177
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +0 -2
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/field-types/richtext/utils/plugins.js +0 -4
- package/dist/editor/field-types/richtext/utils/plugins.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 +1 -7
- package/dist/editor/media-selector/MediaSelector.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +35 -40
- 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 +2 -4
- 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 +147 -26
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/Separator.js +1 -1
- package/dist/editor/menubar/VersionSelector.js +4 -2
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/menubar/WorkflowButton.js +12 -39
- package/dist/editor/menubar/WorkflowButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +36 -7
- 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 +0 -1
- package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -6
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +219 -500
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js +1 -10
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/CommentHighlighting.js +1 -42
- 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 +48 -97
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +17 -38
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +11 -17
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +298 -283
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.js +11 -69
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.d.ts +4 -2
- package/dist/editor/page-viewer/MiniMap.js +28 -91
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.d.ts +1 -3
- package/dist/editor/page-viewer/PageViewer.js +19 -92
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +1 -2
- package/dist/editor/page-viewer/PageViewerFrame.js +109 -292
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/RenderingParametersSection.js +3 -2
- package/dist/editor/page-viewer/RenderingParametersSection.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +49 -114
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
- package/dist/editor/page-viewer/pageViewContext.d.ts +0 -1
- package/dist/editor/page-viewer/pageViewContext.js +14 -51
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/pageModel.d.ts +1 -14
- package/dist/editor/reviews/Comment.js +11 -23
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentDisplayPopover.js +4 -4
- package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.js +4 -19
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.js +72 -89
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js +177 -281
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/DecisionsMatrix.js +25 -96
- package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
- package/dist/editor/reviews/DiffView.js +14 -7
- package/dist/editor/reviews/DiffView.js.map +1 -1
- package/dist/editor/reviews/EditReviewSettingsDialog.js +4 -6
- package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
- package/dist/editor/reviews/MultiReviewManager.js +3 -25
- package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
- package/dist/editor/reviews/PagesPanel.js +15 -31
- package/dist/editor/reviews/PagesPanel.js.map +1 -1
- package/dist/editor/reviews/PreviewInfo.js +4 -1
- package/dist/editor/reviews/PreviewInfo.js.map +1 -1
- package/dist/editor/reviews/ReviewCard.js +7 -13
- package/dist/editor/reviews/ReviewCard.js.map +1 -1
- package/dist/editor/reviews/ReviewDetail.js +2 -3
- package/dist/editor/reviews/ReviewDetail.js.map +1 -1
- package/dist/editor/reviews/ReviewsList.js +3 -7
- package/dist/editor/reviews/ReviewsList.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +3 -34
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -31
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/commentAi.js +6 -21
- package/dist/editor/reviews/commentAi.js.map +1 -1
- package/dist/editor/reviews/reviewCommands.js +1 -4
- 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 +30 -12
- package/dist/editor/reviews/useReviews.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +5 -229
- package/dist/editor/services/agentService.js +39 -292
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +1 -57
- package/dist/editor/services/aiService.js +6 -79
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/contentService.d.ts +3 -6
- package/dist/editor/services/contentService.js +12 -13
- package/dist/editor/services/contentService.js.map +1 -1
- package/dist/editor/services/editService.d.ts +1 -50
- package/dist/editor/services/editService.js +2 -91
- 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 +6 -3
- package/dist/editor/services/reviewsService.js +11 -2
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/services/serviceHelper.d.ts +1 -2
- package/dist/editor/services/serviceHelper.js +20 -112
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/services/systemService.d.ts +1 -2
- package/dist/editor/services/systemService.js +0 -3
- package/dist/editor/services/systemService.js.map +1 -1
- package/dist/editor/services-server/graphQL.d.ts +29 -0
- package/dist/editor/services-server/graphQL.js +53 -0
- package/dist/editor/services-server/graphQL.js.map +1 -0
- package/dist/editor/settings/About.js +3 -317
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/editor/settings/AllAgentsPanel.d.ts +5 -0
- package/dist/editor/settings/AllAgentsPanel.js +139 -0
- package/dist/editor/settings/AllAgentsPanel.js.map +1 -0
- package/dist/editor/settings/LatestFeedback.d.ts +1 -0
- package/dist/editor/settings/LatestFeedback.js +136 -0
- package/dist/editor/settings/LatestFeedback.js.map +1 -0
- package/dist/editor/settings/QuotaInfo.js +4 -210
- package/dist/editor/settings/QuotaInfo.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +21 -23
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/Setup.d.ts +1 -0
- package/dist/editor/settings/Setup.js +211 -0
- package/dist/editor/settings/Setup.js.map +1 -0
- package/dist/editor/settings/Status.js +4 -5
- package/dist/editor/settings/Status.js.map +1 -1
- package/dist/editor/settings/index/useIndexStatus.js +22 -20
- package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
- package/dist/editor/settings/panels/AgentsPanel.d.ts +4 -0
- package/dist/editor/settings/panels/AgentsPanel.js +121 -95
- package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
- package/dist/editor/settings/panels/DatabasePanel.d.ts +6 -0
- package/dist/editor/settings/panels/DatabasePanel.js +50 -0
- package/dist/editor/settings/panels/DatabasePanel.js.map +1 -0
- package/dist/editor/settings/panels/ModelsPanel.js +108 -329
- package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.js +59 -86
- 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 +2 -3
- package/dist/editor/settings/panels/index.js +2 -3
- package/dist/editor/settings/panels/index.js.map +1 -1
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js +21 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +5 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +44 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +1 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js +36 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js +111 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SetupOverview.d.ts +14 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js +38 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js.map +1 -0
- package/dist/editor/settings/status/coreStatusChecks.js +19 -124
- package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
- package/dist/editor/settings/status/useStartupChecks.d.ts +1 -3
- package/dist/editor/settings/status/useStartupChecks.js +5 -9
- package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
- package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +1 -2
- package/dist/editor/setup-wizard/steps/CompleteStep.js +1 -2
- package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
- package/dist/editor/sidebar/ComponentPalette.js +1 -2
- package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.d.ts +1 -8
- package/dist/editor/sidebar/ComponentTree.js +69 -216
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/Debug.d.ts +1 -0
- package/dist/editor/sidebar/Debug.js +70 -0
- package/dist/editor/sidebar/Debug.js.map +1 -0
- package/dist/editor/sidebar/EditHistory.js +46 -7
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/Favorites.js +8 -4
- package/dist/editor/sidebar/Favorites.js.map +1 -1
- package/dist/editor/sidebar/GraphQL.d.ts +2 -0
- package/dist/editor/sidebar/GraphQL.js +234 -0
- package/dist/editor/sidebar/GraphQL.js.map +1 -0
- package/dist/editor/sidebar/LeftToolbar.d.ts +1 -0
- package/dist/editor/sidebar/LeftToolbar.js +12 -0
- package/dist/editor/sidebar/LeftToolbar.js.map +1 -0
- package/dist/editor/sidebar/MainContentTree.js +3 -4
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/sidebar/NavigationPanelItem.js +1 -1
- package/dist/editor/sidebar/NavigationPanelItem.js.map +1 -1
- package/dist/editor/sidebar/NavigationSidebar.d.ts +4 -0
- package/dist/editor/sidebar/NavigationSidebar.js +254 -0
- package/dist/editor/sidebar/NavigationSidebar.js.map +1 -0
- package/dist/editor/sidebar/OperationItem.js +6 -20
- package/dist/editor/sidebar/OperationItem.js.map +1 -1
- package/dist/editor/sidebar/SidebarPanel.js +7 -30
- package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
- package/dist/editor/sidebar/SidebarStack.js +0 -1
- package/dist/editor/sidebar/SidebarStack.js.map +1 -1
- package/dist/editor/sidebar/Validation.js +12 -22
- package/dist/editor/sidebar/Validation.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +3 -53
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/sidebar/WorkspaceRail.d.ts +1 -0
- package/dist/editor/sidebar/WorkspaceRail.js +167 -56
- package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
- package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +10 -3
- package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
- package/dist/editor/tree-indicators/GutterColumns.d.ts +1 -3
- package/dist/editor/tree-indicators/GutterColumns.js +5 -26
- package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
- package/dist/editor/tree-indicators/GutterContext.d.ts +0 -4
- package/dist/editor/tree-indicators/GutterContext.js +0 -23
- package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
- package/dist/editor/tree-indicators/GutterSelector.d.ts +5 -0
- package/dist/editor/tree-indicators/GutterSelector.js +91 -0
- package/dist/editor/tree-indicators/GutterSelector.js.map +1 -0
- package/dist/editor/tree-indicators/index.d.ts +1 -0
- package/dist/editor/tree-indicators/index.js +1 -0
- package/dist/editor/tree-indicators/index.js.map +1 -1
- package/dist/editor/tree-indicators/types.d.ts +1 -12
- 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 +0 -2
- package/dist/editor/ui/ItemNameDialogNew.js +17 -33
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/editor/ui/ItemSearch.js +11 -7
- 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 +0 -1
- package/dist/editor/ui/SimpleTabs.js +25 -45
- package/dist/editor/ui/SimpleTabs.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +0 -1
- package/dist/editor/ui/Splitter.js +86 -102
- 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 +1 -6
- package/dist/editor/ui/TreeListSelector.js +2 -2
- package/dist/editor/ui/TreeListSelector.js.map +1 -1
- package/dist/editor/utils/keyboardNavigation.d.ts +20 -6
- package/dist/editor/utils/keyboardNavigation.js +139 -48
- package/dist/editor/utils/keyboardNavigation.js.map +1 -1
- package/dist/editor/utils.js +9 -19
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/views/CompareView.d.ts +1 -3
- package/dist/editor/views/CompareView.js +4 -6
- 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 +34 -27
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/editor/views/ItemEditor.js +3 -7
- 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 +6 -5
- package/dist/editor/views/ParheliaView.js.map +1 -1
- package/dist/editor/views/SingleEditView.d.ts +1 -2
- package/dist/editor/views/SingleEditView.js +8 -10
- package/dist/editor/views/SingleEditView.js.map +1 -1
- package/dist/editor/views/editorSlotContext.js +6 -35
- package/dist/editor/views/editorSlotContext.js.map +1 -1
- package/dist/index.d.ts +2 -14
- package/dist/index.js +0 -10
- package/dist/index.js.map +1 -1
- package/dist/licensing/LicenseContext.d.ts +3 -1
- package/dist/licensing/LicenseContext.js +55 -38
- package/dist/licensing/LicenseContext.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/setup/services/setupWizardService.d.ts +13 -40
- package/dist/setup/services/setupWizardService.js +17 -32
- package/dist/setup/services/setupWizardService.js.map +1 -1
- package/dist/setup/wizard/steps/AddModelDialog.js +3 -12
- package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
- package/dist/setup/wizard/steps/ImportModelDialog.js +22 -39
- package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
- package/dist/splash-screen/ModernSplashScreen.js +32 -110
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +50 -33
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +6 -2
- package/dist/splash-screen/OpenPage.js.map +1 -1
- package/dist/splash-screen/ParheliaAssistantChat.js +29 -12
- package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
- package/dist/splash-screen/ParheliaLogo.js +37 -87
- 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/task-board/TaskBoardWorkspace.js +34 -6
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/components/AssignAgentDialog.js +13 -1
- package/dist/task-board/components/AssignAgentDialog.js.map +1 -1
- package/dist/task-board/components/TaskAgentPanel.js +11 -1
- package/dist/task-board/components/TaskAgentPanel.js.map +1 -1
- package/dist/task-board/components/TaskAssigneePicker.js +14 -4
- package/dist/task-board/components/TaskAssigneePicker.js.map +1 -1
- package/dist/task-board/components/WizardCommunicationCenter.js +18 -9
- package/dist/task-board/components/WizardCommunicationCenter.js.map +1 -1
- package/dist/tour/Tour.d.ts +1 -2
- package/dist/tour/Tour.js +75 -256
- package/dist/tour/Tour.js.map +1 -1
- package/dist/tour/default-tour.js +96 -222
- package/dist/tour/default-tour.js.map +1 -1
- package/dist/types.d.ts +29 -63
- package/package.json +13 -17
- package/styles.css +10 -14
|
@@ -3,28 +3,20 @@ 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 {
|
|
6
|
+
import { Input } from "../../components/ui/input";
|
|
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";
|
|
7
11
|
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";
|
|
8
17
|
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
|
-
}
|
|
25
18
|
export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems, }) {
|
|
26
19
|
const editContext = useEditContext();
|
|
27
|
-
const [step, setStep] = useState("details");
|
|
28
20
|
const [title, setTitle] = useState("");
|
|
29
21
|
const [language, setLanguage] = useState(editContext?.currentItemDescriptor?.language || "en");
|
|
30
22
|
const [languageMode, setLanguageMode] = useState("single");
|
|
@@ -46,14 +38,9 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
46
38
|
const [showSecretFields, setShowSecretFields] = useState(false);
|
|
47
39
|
const [requiredApprovals, setRequiredApprovals] = useState("1");
|
|
48
40
|
const [updateWorkflowOnCompletion, setUpdateWorkflowOnCompletion] = useState(false);
|
|
49
|
-
const [shareCommentsAndSuggestions, setShareCommentsAndSuggestions] = useState(false);
|
|
50
41
|
const [selectedInTree, setSelectedInTree] = useState([]);
|
|
51
42
|
const [selectedFromList, setSelectedFromList] = useState([]);
|
|
52
43
|
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);
|
|
57
44
|
const CONTENT_ROOT_ID = "0de95ae4-41ab-4d01-9eb0-67441b7c2450"; // /sitecore/content
|
|
58
45
|
// Memoize rootItemIds to prevent unnecessary re-renders of ContentTree
|
|
59
46
|
const rootItemIds = useMemo(() => [CONTENT_ROOT_ID], []);
|
|
@@ -103,10 +90,8 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
103
90
|
// This prevents resetting user changes (like includeSubitems toggles) when context changes
|
|
104
91
|
const initializeItems = async () => {
|
|
105
92
|
let currentDescriptor = editContext.currentItemDescriptor;
|
|
106
|
-
// If the descriptor is missing name
|
|
107
|
-
if ((!currentDescriptor.name ||
|
|
108
|
-
!currentDescriptor.displayName ||
|
|
109
|
-
!currentDescriptor.path) &&
|
|
93
|
+
// If the descriptor is missing name or path, fetch it from the server
|
|
94
|
+
if ((!currentDescriptor.name || !currentDescriptor.path) &&
|
|
110
95
|
editContext.itemsRepository) {
|
|
111
96
|
try {
|
|
112
97
|
const stubs = await editContext.itemsRepository.getItemsStubs([
|
|
@@ -116,7 +101,6 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
116
101
|
currentDescriptor = {
|
|
117
102
|
...currentDescriptor,
|
|
118
103
|
name: stubs[0].name || currentDescriptor.name,
|
|
119
|
-
displayName: stubs[0].displayName || currentDescriptor.displayName,
|
|
120
104
|
path: stubs[0].path || currentDescriptor.path,
|
|
121
105
|
};
|
|
122
106
|
}
|
|
@@ -127,8 +111,8 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
127
111
|
}
|
|
128
112
|
let itemsToSet;
|
|
129
113
|
if (initialItems) {
|
|
130
|
-
// Fetch missing names/
|
|
131
|
-
const itemsToFetch = initialItems.filter((i) => !i.name || !i.
|
|
114
|
+
// Fetch missing names/paths for initial items as well
|
|
115
|
+
const itemsToFetch = initialItems.filter((i) => !i.name || !i.path);
|
|
132
116
|
if (itemsToFetch.length > 0 && editContext.itemsRepository) {
|
|
133
117
|
try {
|
|
134
118
|
const stubs = await editContext.itemsRepository.getItemsStubs(itemsToFetch);
|
|
@@ -139,7 +123,6 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
139
123
|
descriptor: {
|
|
140
124
|
...i,
|
|
141
125
|
name: stub?.name || i.name,
|
|
142
|
-
displayName: stub?.displayName || i.displayName,
|
|
143
126
|
path: stub?.path || i.path,
|
|
144
127
|
},
|
|
145
128
|
includeSubitems: false,
|
|
@@ -184,119 +167,6 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
|
|
|
184
167
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
185
168
|
return emailRegex.test(email);
|
|
186
169
|
};
|
|
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
|
-
};
|
|
300
170
|
const emailAlreadyExists = (email) => {
|
|
301
171
|
return reviewers.some((r) => r.email.toLowerCase() === email.toLowerCase());
|
|
302
172
|
};
|
|
@@ -328,85 +198,40 @@ Homepage and Navigation Content Review
|
|
|
328
198
|
const removeItem = (index) => {
|
|
329
199
|
setItems(items.filter((_, i) => i !== index));
|
|
330
200
|
};
|
|
331
|
-
const
|
|
332
|
-
|
|
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);
|
|
201
|
+
const handleCreate = async () => {
|
|
202
|
+
setShowErrors(true);
|
|
344
203
|
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 = () => {
|
|
360
204
|
if (items.length === 0) {
|
|
361
|
-
|
|
205
|
+
setError("Please select at least one page/item");
|
|
206
|
+
return;
|
|
362
207
|
}
|
|
363
208
|
if (reviewers.length === 0) {
|
|
364
|
-
|
|
209
|
+
setError("Please add at least one reviewer");
|
|
210
|
+
return;
|
|
365
211
|
}
|
|
212
|
+
// Validate language selection based on mode
|
|
366
213
|
if (languageMode === "single" && !language) {
|
|
367
|
-
|
|
214
|
+
setError("Language is required");
|
|
215
|
+
return;
|
|
368
216
|
}
|
|
369
217
|
if (languageMode === "multiple" && selectedLanguages.length === 0) {
|
|
370
|
-
|
|
218
|
+
setError("Please select at least one language");
|
|
219
|
+
return;
|
|
371
220
|
}
|
|
372
221
|
if (showSecretFields && secret !== secretConfirm) {
|
|
373
|
-
|
|
222
|
+
setError("Secrets do not match");
|
|
223
|
+
return;
|
|
374
224
|
}
|
|
225
|
+
// Validate RequiredApprovals
|
|
375
226
|
const requiredApprovalsNum = requiredApprovals
|
|
376
227
|
? parseInt(requiredApprovals, 10)
|
|
377
228
|
: 1;
|
|
378
229
|
if (isNaN(requiredApprovalsNum) || requiredApprovalsNum < 1) {
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
if (requiredApprovalsNum > reviewers.length) {
|
|
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);
|
|
230
|
+
setError("Required Approvals must be at least 1");
|
|
392
231
|
return;
|
|
393
232
|
}
|
|
394
|
-
|
|
395
|
-
|
|
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);
|
|
233
|
+
if (requiredApprovalsNum > reviewers.length) {
|
|
234
|
+
setError(`Required Approvals (${requiredApprovalsNum}) cannot exceed the number of reviewers (${reviewers.length})`);
|
|
410
235
|
return;
|
|
411
236
|
}
|
|
412
237
|
setLoading(true);
|
|
@@ -429,13 +254,12 @@ Homepage and Navigation Content Review
|
|
|
429
254
|
languages = selectedLanguages;
|
|
430
255
|
}
|
|
431
256
|
else {
|
|
257
|
+
// Single language mode - use legacy language field for backward compatibility
|
|
432
258
|
languages = [language];
|
|
433
259
|
}
|
|
434
|
-
const requiredApprovalsNum = requiredApprovals
|
|
435
|
-
? parseInt(requiredApprovals, 10)
|
|
436
|
-
: 1;
|
|
437
260
|
const request = {
|
|
438
261
|
title: title || undefined,
|
|
262
|
+
language: languageMode === "single" ? language : undefined, // Keep for backward compatibility
|
|
439
263
|
languages,
|
|
440
264
|
reviewers,
|
|
441
265
|
items,
|
|
@@ -443,44 +267,38 @@ Homepage and Navigation Content Review
|
|
|
443
267
|
secret: showSecretFields && secret ? secret : undefined,
|
|
444
268
|
requiredApprovals: requiredApprovalsNum,
|
|
445
269
|
updateWorkflowOnCompletion: updateWorkflowOnCompletion,
|
|
446
|
-
shareCommentsAndSuggestions: shareCommentsAndSuggestions,
|
|
447
270
|
};
|
|
448
271
|
const { createReview, getReviewStatus, sendInvitations } = await import("../services/reviewsService");
|
|
449
272
|
const result = await createReview(request);
|
|
450
273
|
if (result.data?.reviewId) {
|
|
451
|
-
setCreatedReviewId(result.data.reviewId);
|
|
452
274
|
// Get assignments to send invitations
|
|
453
275
|
const statusResult = await getReviewStatus(result.data.reviewId);
|
|
454
276
|
if (statusResult.data?.assignments) {
|
|
455
|
-
const
|
|
456
|
-
|
|
457
|
-
|
|
277
|
+
const assignmentIds = statusResult.data.assignments
|
|
278
|
+
.filter((a) => !a.invitationSentDate)
|
|
279
|
+
.map((a) => a.assignmentId);
|
|
458
280
|
if (assignmentIds.length > 0) {
|
|
459
|
-
|
|
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
|
-
}
|
|
281
|
+
await sendInvitations(assignmentIds);
|
|
475
282
|
}
|
|
476
|
-
setSentInvitationCount(assignmentIds.length);
|
|
477
|
-
setSentInvitationEmails(reviewerEmails);
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
480
|
-
setSentInvitationCount(0);
|
|
481
|
-
setSentInvitationEmails([]);
|
|
482
283
|
}
|
|
483
|
-
|
|
284
|
+
onCreated(result.data.reviewId);
|
|
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);
|
|
484
302
|
}
|
|
485
303
|
else {
|
|
486
304
|
setError("Failed to create review");
|
|
@@ -493,12 +311,11 @@ Homepage and Navigation Content Review
|
|
|
493
311
|
setLoading(false);
|
|
494
312
|
}
|
|
495
313
|
};
|
|
496
|
-
const addToList = async (
|
|
314
|
+
const addToList = async () => {
|
|
497
315
|
const newItems = [...items];
|
|
498
|
-
const
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
const nodesNeedingFetch = nodesToAdd.filter((node) => !node.path || !node.name || !node.displayName);
|
|
316
|
+
const nodesToAdd = selectedInTree.filter((node) => !newItems.some((x) => x.descriptor.id === node.id));
|
|
317
|
+
// Fetch missing paths/names if needed
|
|
318
|
+
const nodesNeedingFetch = nodesToAdd.filter((node) => !node.path || !node.name);
|
|
502
319
|
if (nodesNeedingFetch.length > 0 && editContext?.itemsRepository) {
|
|
503
320
|
try {
|
|
504
321
|
const descriptorsToFetch = nodesNeedingFetch.map((node) => ({
|
|
@@ -516,7 +333,6 @@ Homepage and Navigation Content Review
|
|
|
516
333
|
language: node.language || language,
|
|
517
334
|
version: node.version || 1,
|
|
518
335
|
name: stub?.name || node.name || "",
|
|
519
|
-
displayName: stub?.displayName || node.displayName || "",
|
|
520
336
|
path: stub?.path || node.path || node.idPath || "",
|
|
521
337
|
},
|
|
522
338
|
includeSubitems: false,
|
|
@@ -533,7 +349,6 @@ Homepage and Navigation Content Review
|
|
|
533
349
|
language: node.language || language,
|
|
534
350
|
version: node.version || 1,
|
|
535
351
|
name: node.name || "",
|
|
536
|
-
displayName: node.displayName || "",
|
|
537
352
|
path: node.path || node.idPath || "",
|
|
538
353
|
},
|
|
539
354
|
includeSubitems: false,
|
|
@@ -550,7 +365,6 @@ Homepage and Navigation Content Review
|
|
|
550
365
|
language: node.language || language,
|
|
551
366
|
version: node.version || 1,
|
|
552
367
|
name: node.name || "",
|
|
553
|
-
displayName: node.displayName || "",
|
|
554
368
|
path: node.path || node.idPath || "",
|
|
555
369
|
},
|
|
556
370
|
includeSubitems: false,
|
|
@@ -573,12 +387,10 @@ Homepage and Navigation Content Review
|
|
|
573
387
|
language: item.language || language,
|
|
574
388
|
version: item.version || 1,
|
|
575
389
|
name: item.name || "",
|
|
576
|
-
displayName: item.displayName || "",
|
|
577
390
|
path: item.path || item.idPath || "",
|
|
578
391
|
};
|
|
579
|
-
// Fetch missing path/name
|
|
580
|
-
if ((!item.path || !item.name
|
|
581
|
-
editContext?.itemsRepository) {
|
|
392
|
+
// Fetch missing path/name if needed
|
|
393
|
+
if ((!item.path || !item.name) && editContext?.itemsRepository) {
|
|
582
394
|
try {
|
|
583
395
|
const stubs = await editContext.itemsRepository.getItemsStubs([
|
|
584
396
|
{
|
|
@@ -591,7 +403,6 @@ Homepage and Navigation Content Review
|
|
|
591
403
|
itemDescriptor = {
|
|
592
404
|
...itemDescriptor,
|
|
593
405
|
name: stubs[0].name || itemDescriptor.name || "",
|
|
594
|
-
displayName: stubs[0].displayName || itemDescriptor.displayName || "",
|
|
595
406
|
path: stubs[0].path || itemDescriptor.path || "",
|
|
596
407
|
};
|
|
597
408
|
}
|
|
@@ -609,36 +420,121 @@ Homepage and Navigation Content Review
|
|
|
609
420
|
]);
|
|
610
421
|
}
|
|
611
422
|
};
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
423
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, 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: _jsx(ClipboardCheck, { strokeWidth: 1 }), title: "Create Review" }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: [_jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-6 pb-4", children: _jsxs("div", { className: "flex flex-col gap-6 pt-6", children: [_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("label", { htmlFor: "title", className: "text-sm font-semibold text-gray-900", children: ["Review Name", _jsx("span", { className: "text-muted-foreground ml-1 text-xs font-normal", children: "(optional)" })] }), _jsx(Input, { id: "title", "data-testid": "review-title-input", value: title, onChange: (e) => setTitle(e.target.value), placeholder: "e.g., Homepage Q4 Review", className: "max-w-md bg-white" })] }), _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: "Pages & Items" }), _jsxs("span", { className: "bg-primary/10 text-primary rounded-full px-2.5 py-0.5 text-xs font-semibold", children: [items.length, " selected"] })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Select the content items to include in this review. Double-click to add items quickly." }), _jsx("div", { className: "overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm", style: { height: "340px" }, children: _jsx(Splitter, { className: "h-full", direction: "horizontal", localStorageKey: "create-review-dialog-splitter", panels: [
|
|
424
|
+
{
|
|
425
|
+
name: "treeSelector",
|
|
426
|
+
defaultSize: 50,
|
|
427
|
+
content: (_jsx(TreeListSelector, { language: language, rootItemIds: rootItemIds, selectedItemIds: selectedInTree.map((item) => item.id), onSelectionChange: setSelectedInTree, onDoubleClick: handleAddItem, onItemSelected: handleAddItem })),
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
name: "selectedItems",
|
|
431
|
+
defaultSize: 50,
|
|
432
|
+
content: (_jsxs("div", { className: "flex h-full min-h-0 flex-col overflow-hidden bg-gray-50/30", children: [_jsx("div", { className: "flex h-[37px] flex-shrink-0 items-center border-b border-gray-100 bg-gray-50/50 px-3", children: _jsx("span", { className: "text-xs font-semibold tracking-wider text-gray-600 uppercase", children: "Selected Items" }) }), items.length > 0 ? (_jsx("div", { className: "min-h-0 flex-1 space-y-2 overflow-y-auto p-3", children: items.map((item, index) => (_jsxs("div", { className: `group flex cursor-pointer flex-col gap-2 rounded-lg border p-3 transition-all ${selectedFromList.includes(item)
|
|
433
|
+
? "border-primary/30 bg-primary/5 ring-primary/20 ring-1"
|
|
434
|
+
: "hover:border-primary/20 border-gray-200 bg-white hover:shadow-sm"}`, onClick: (e) => {
|
|
435
|
+
if (e.ctrlKey || e.metaKey) {
|
|
436
|
+
if (selectedFromList.includes(item)) {
|
|
437
|
+
setSelectedFromList(selectedFromList.filter((i) => i !== item));
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
setSelectedFromList([
|
|
441
|
+
...selectedFromList,
|
|
442
|
+
item,
|
|
443
|
+
]);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
if (selectedFromList.length === 1 &&
|
|
448
|
+
selectedFromList.includes(item)) {
|
|
449
|
+
setSelectedFromList([]);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
setSelectedFromList([item]);
|
|
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") })] })] })] }) }));
|
|
643
539
|
}
|
|
644
540
|
//# sourceMappingURL=CreateReviewDialog.js.map
|