@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.
Files changed (587) hide show
  1. package/dist/agents-view/AgentCard.d.ts +6 -4
  2. package/dist/agents-view/AgentCard.js +143 -24
  3. package/dist/agents-view/AgentCard.js.map +1 -1
  4. package/dist/agents-view/AgentsInbox.d.ts +1 -1
  5. package/dist/agents-view/AgentsInbox.js +7 -92
  6. package/dist/agents-view/AgentsInbox.js.map +1 -1
  7. package/dist/agents-view/AgentsTitlebar.js +3 -2
  8. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  9. package/dist/agents-view/AgentsView.d.ts +6 -7
  10. package/dist/agents-view/AgentsView.js +191 -99
  11. package/dist/agents-view/AgentsView.js.map +1 -1
  12. package/dist/agents-view/AgentsWorkspaceView.d.ts +2 -6
  13. package/dist/agents-view/AgentsWorkspaceView.js +266 -113
  14. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.d.ts +2 -1
  16. package/dist/agents-view/ProfileAgentsGroup.js +4 -3
  17. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  18. package/dist/components/ActionButton.d.ts +1 -1
  19. package/dist/components/ActionButton.js.map +1 -1
  20. package/dist/components/FilterInput.d.ts +1 -1
  21. package/dist/components/FilterInput.js +1 -1
  22. package/dist/components/FilterInput.js.map +1 -1
  23. package/dist/components/ui/LanguageSelector.js +2 -4
  24. package/dist/components/ui/LanguageSelector.js.map +1 -1
  25. package/dist/components/ui/PlaceholderInput.js +3 -3
  26. package/dist/components/ui/PlaceholderInput.js.map +1 -1
  27. package/dist/components/ui/PlaceholderInputTypes.js +1 -1
  28. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
  29. package/dist/components/ui/alert-dialog.d.ts +1 -1
  30. package/dist/components/ui/alert-dialog.js +6 -10
  31. package/dist/components/ui/alert-dialog.js.map +1 -1
  32. package/dist/components/ui/button.d.ts +4 -4
  33. package/dist/components/ui/button.js +4 -1
  34. package/dist/components/ui/button.js.map +1 -1
  35. package/dist/components/ui/context-menu.d.ts +1 -1
  36. package/dist/components/ui/context-menu.js +12 -4
  37. package/dist/components/ui/context-menu.js.map +1 -1
  38. package/dist/components/ui/copy-button.d.ts +2 -1
  39. package/dist/components/ui/copy-button.js +2 -2
  40. package/dist/components/ui/copy-button.js.map +1 -1
  41. package/dist/components/ui/dialog.d.ts +1 -1
  42. package/dist/components/ui/dialog.js +21 -126
  43. package/dist/components/ui/dialog.js.map +1 -1
  44. package/dist/components/ui/input.d.ts +1 -1
  45. package/dist/components/ui/input.js +5 -3
  46. package/dist/components/ui/input.js.map +1 -1
  47. package/dist/components/ui/paste-button.d.ts +2 -1
  48. package/dist/components/ui/paste-button.js +2 -2
  49. package/dist/components/ui/paste-button.js.map +1 -1
  50. package/dist/components/ui/popover.js +1 -9
  51. package/dist/components/ui/popover.js.map +1 -1
  52. package/dist/components/ui/select.js +1 -1
  53. package/dist/components/ui/select.js.map +1 -1
  54. package/dist/components/ui/styled-dialog-title.js +1 -1
  55. package/dist/components/ui/styled-dialog-title.js.map +1 -1
  56. package/dist/components/ui/tabs.d.ts +1 -1
  57. package/dist/components/ui/tabs.js +4 -11
  58. package/dist/components/ui/tabs.js.map +1 -1
  59. package/dist/config/config.d.ts +4 -2
  60. package/dist/config/config.js +250 -70
  61. package/dist/config/config.js.map +1 -1
  62. package/dist/config/notificationRoutes.js +14 -0
  63. package/dist/config/notificationRoutes.js.map +1 -1
  64. package/dist/config/types/workspace.d.ts +6 -0
  65. package/dist/config/types.d.ts +63 -12
  66. package/dist/config/types.js.map +1 -1
  67. package/dist/editor/ConfirmationDialog.js +20 -4
  68. package/dist/editor/ConfirmationDialog.js.map +1 -1
  69. package/dist/editor/ContentTree.d.ts +2 -1
  70. package/dist/editor/ContentTree.js +93 -32
  71. package/dist/editor/ContentTree.js.map +1 -1
  72. package/dist/editor/Editor.js +87 -22
  73. package/dist/editor/Editor.js.map +1 -1
  74. package/dist/editor/FieldHistory.js +84 -36
  75. package/dist/editor/FieldHistory.js.map +1 -1
  76. package/dist/editor/FieldListField.js +21 -9
  77. package/dist/editor/FieldListField.js.map +1 -1
  78. package/dist/editor/FieldListFieldWithFallbacks.js +23 -2
  79. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
  80. package/dist/editor/GlobalMenuBar.js +29 -2
  81. package/dist/editor/GlobalMenuBar.js.map +1 -1
  82. package/dist/editor/ImageEditor.js +5 -2
  83. package/dist/editor/ImageEditor.js.map +1 -1
  84. package/dist/editor/ItemInfo.js +36 -1
  85. package/dist/editor/ItemInfo.js.map +1 -1
  86. package/dist/editor/LinkEditorDialog.js +3 -0
  87. package/dist/editor/LinkEditorDialog.js.map +1 -1
  88. package/dist/editor/MainLayout.d.ts +0 -2
  89. package/dist/editor/MainLayout.js +65 -8
  90. package/dist/editor/MainLayout.js.map +1 -1
  91. package/dist/editor/MigrationsView.js +29 -5
  92. package/dist/editor/MigrationsView.js.map +1 -1
  93. package/dist/editor/MobileLayout.js +37 -12
  94. package/dist/editor/MobileLayout.js.map +1 -1
  95. package/dist/editor/PictureCropper.js +54 -45
  96. package/dist/editor/PictureCropper.js.map +1 -1
  97. package/dist/editor/PictureEditor.js +17 -15
  98. package/dist/editor/PictureEditor.js.map +1 -1
  99. package/dist/editor/QuickItemSwitcher.js +21 -21
  100. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  101. package/dist/editor/SetupWizard.js +52 -12
  102. package/dist/editor/SetupWizard.js.map +1 -1
  103. package/dist/editor/Titlebar.js +7 -2
  104. package/dist/editor/Titlebar.js.map +1 -1
  105. package/dist/editor/ai/AgentCostDisplay.d.ts +1 -0
  106. package/dist/editor/ai/AgentCostDisplay.js +1 -1
  107. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  108. package/dist/editor/ai/AgentDocumentList.js +32 -14
  109. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  110. package/dist/editor/ai/AgentGreeting.js +3 -2
  111. package/dist/editor/ai/AgentGreeting.js.map +1 -1
  112. package/dist/editor/ai/AgentProfileSelector.js +2 -1
  113. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  114. package/dist/editor/ai/AgentStatusBadge.d.ts +0 -5
  115. package/dist/editor/ai/AgentStatusBadge.js +67 -65
  116. package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
  117. package/dist/editor/ai/AgentTerminal.d.ts +14 -2
  118. package/dist/editor/ai/AgentTerminal.js +2406 -496
  119. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  120. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +8 -3
  121. package/dist/editor/ai/AgentTerminalStatusBar.js +481 -56
  122. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  123. package/dist/editor/ai/Agents.js +161 -113
  124. package/dist/editor/ai/Agents.js.map +1 -1
  125. package/dist/editor/ai/AiResponseMessage.d.ts +10 -1
  126. package/dist/editor/ai/AiResponseMessage.js +267 -26
  127. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  128. package/dist/editor/ai/ContextInfoBar.d.ts +2 -3
  129. package/dist/editor/ai/ContextInfoBar.js +64 -7
  130. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  131. package/dist/editor/ai/GuidanceOverlay.js +17 -11
  132. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  133. package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
  134. package/dist/editor/ai/InlineAiDialog.js +514 -192
  135. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  136. package/dist/editor/ai/InlineAiTrigger.js +115 -12
  137. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  138. package/dist/editor/ai/MediaImage.js +40 -8
  139. package/dist/editor/ai/MediaImage.js.map +1 -1
  140. package/dist/editor/ai/SpawnedAgentsPanel.js +10 -12
  141. package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
  142. package/dist/editor/ai/ToolCallDisplay.d.ts +22 -2
  143. package/dist/editor/ai/ToolCallDisplay.js +542 -150
  144. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  145. package/dist/editor/ai/agentDiagnostics.d.ts +7 -0
  146. package/dist/editor/ai/agentDiagnostics.js.map +1 -1
  147. package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +1 -8
  148. package/dist/editor/ai/dialogs/AgentDialogHandler.js +379 -42
  149. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  150. package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +5 -1
  151. package/dist/editor/ai/dialogs/QuestionnaireInline.js +628 -60
  152. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  153. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +115 -0
  154. package/dist/editor/ai/dialogs/agentDialogTypes.js +2 -0
  155. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  156. package/dist/editor/ai/types.d.ts +3 -1
  157. package/dist/editor/ai/useAgentStatus.d.ts +2 -1
  158. package/dist/editor/ai/useAgentStatus.js +90 -100
  159. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  160. package/dist/editor/ai/useInlineAiPosition.js +45 -5
  161. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  162. package/dist/editor/client/AboutDialog.js +4 -2
  163. package/dist/editor/client/AboutDialog.js.map +1 -1
  164. package/dist/editor/client/EditorShell.d.ts +4 -1
  165. package/dist/editor/client/EditorShell.js +770 -237
  166. package/dist/editor/client/EditorShell.js.map +1 -1
  167. package/dist/editor/client/editContext.d.ts +33 -19
  168. package/dist/editor/client/editContext.js.map +1 -1
  169. package/dist/editor/client/helpers.js +6 -0
  170. package/dist/editor/client/helpers.js.map +1 -1
  171. package/dist/editor/client/hooks/useEditorUrlSync.js +1 -2
  172. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
  173. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +10 -0
  174. package/dist/editor/client/hooks/useEditorWebSocket.js +209 -14
  175. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  176. package/dist/editor/client/hooks/useQuota.d.ts +8 -0
  177. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  178. package/dist/editor/client/hooks/useSocketMessageHandler.js +73 -15
  179. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  180. package/dist/editor/client/itemsRepository.js +10 -6
  181. package/dist/editor/client/itemsRepository.js.map +1 -1
  182. package/dist/editor/client/navigation.js +35 -3
  183. package/dist/editor/client/navigation.js.map +1 -1
  184. package/dist/editor/client/operations.d.ts +6 -3
  185. package/dist/editor/client/operations.js +208 -30
  186. package/dist/editor/client/operations.js.map +1 -1
  187. package/dist/editor/client/pageModelBuilder.js +4 -31
  188. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  189. package/dist/editor/client/ui/DevModeIndicator.js +2 -2
  190. package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
  191. package/dist/editor/client/ui/EditorChrome.d.ts +0 -6
  192. package/dist/editor/client/ui/EditorChrome.js +55 -72
  193. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  194. package/dist/editor/client/ui/FullscreenControls.js +5 -3
  195. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  196. package/dist/editor/commands/commands.d.ts +11 -1
  197. package/dist/editor/commands/commands.js +12 -1
  198. package/dist/editor/commands/commands.js.map +1 -1
  199. package/dist/editor/commands/componentCommands.js +109 -55
  200. package/dist/editor/commands/componentCommands.js.map +1 -1
  201. package/dist/editor/commands/customCommandConverter.d.ts +8 -1
  202. package/dist/editor/commands/customCommandConverter.js +35 -5
  203. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  204. package/dist/editor/commands/handlers/agentHandler.js +2 -1
  205. package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
  206. package/dist/editor/commands/itemCommands.d.ts +3 -0
  207. package/dist/editor/commands/itemCommands.js +93 -10
  208. package/dist/editor/commands/itemCommands.js.map +1 -1
  209. package/dist/editor/commands/undo.d.ts +9 -15
  210. package/dist/editor/commands/undo.js +24 -0
  211. package/dist/editor/commands/undo.js.map +1 -1
  212. package/dist/editor/context-menu/InsertMenu.js +83 -39
  213. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  214. package/dist/editor/field-types/MultiLineText.js +1 -1
  215. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  216. package/dist/editor/field-types/RawEditor.js +1 -1
  217. package/dist/editor/field-types/RichTextEditor.js +13 -5
  218. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  219. package/dist/editor/field-types/RichTextEditorComponent.js +37 -3
  220. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  221. package/dist/editor/field-types/SingleLineText.js +1 -1
  222. package/dist/editor/field-types/TreeListEditor.js +3 -2
  223. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  224. package/dist/editor/field-types/richtext/components/ReactSlate.css +23 -5
  225. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +2 -0
  226. package/dist/editor/field-types/richtext/components/ReactSlate.js +28 -4
  227. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  228. package/dist/editor/field-types/richtext/components/ToolbarButton.js +4 -2
  229. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  230. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +13 -0
  231. package/dist/editor/field-types/richtext/contextMenuFactory.js +181 -24
  232. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  233. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  234. package/dist/editor/field-types/richtext/types.js.map +1 -1
  235. package/dist/editor/field-types/richtext/utils/plugins.js +4 -0
  236. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  237. package/dist/editor/field-types/textContextMenuFactory.js +3 -2
  238. package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
  239. package/dist/editor/media-selector/AiImageSearchPrompt.js +4 -2
  240. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
  241. package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
  242. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  243. package/dist/editor/media-selector/MediaSelector.js +7 -1
  244. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  245. package/dist/editor/media-selector/TreeSelector.js +40 -35
  246. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  247. package/dist/editor/menubar/ActiveUsers.js +1 -1
  248. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  249. package/dist/editor/menubar/GenericToolbar.js +4 -2
  250. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  251. package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
  252. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  253. package/dist/editor/menubar/PageSelector.js +26 -147
  254. package/dist/editor/menubar/PageSelector.js.map +1 -1
  255. package/dist/editor/menubar/Separator.js +1 -1
  256. package/dist/editor/menubar/VersionSelector.js +2 -4
  257. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  258. package/dist/editor/menubar/WorkflowButton.js +39 -12
  259. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  260. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +16 -38
  261. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
  262. package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
  263. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  264. package/dist/editor/menubar/toolbar-sections/HelpButton.js +1 -0
  265. package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
  266. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +6 -10
  267. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +597 -220
  268. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  269. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +13 -2
  270. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  271. package/dist/editor/page-editor-chrome/CommentHighlighting.js +42 -1
  272. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
  273. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  274. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  275. package/dist/editor/page-editor-chrome/InlineEditor.js +97 -48
  276. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  277. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +38 -17
  278. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  279. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +17 -11
  280. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  281. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
  282. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  283. package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
  284. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  285. package/dist/editor/page-viewer/EditorForm.js +69 -11
  286. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  287. package/dist/editor/page-viewer/MiniMap.d.ts +2 -4
  288. package/dist/editor/page-viewer/MiniMap.js +91 -28
  289. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  290. package/dist/editor/page-viewer/PageViewer.d.ts +3 -1
  291. package/dist/editor/page-viewer/PageViewer.js +92 -19
  292. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  293. package/dist/editor/page-viewer/PageViewerFrame.d.ts +2 -1
  294. package/dist/editor/page-viewer/PageViewerFrame.js +348 -115
  295. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  296. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +114 -49
  297. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  298. package/dist/editor/page-viewer/pageViewContext.d.ts +1 -0
  299. package/dist/editor/page-viewer/pageViewContext.js +51 -14
  300. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  301. package/dist/editor/pageModel.d.ts +14 -1
  302. package/dist/editor/reviews/Comment.js +26 -12
  303. package/dist/editor/reviews/Comment.js.map +1 -1
  304. package/dist/editor/reviews/CommentDisplayPopover.js +7 -5
  305. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  306. package/dist/editor/reviews/CommentView.js +19 -4
  307. package/dist/editor/reviews/CommentView.js.map +1 -1
  308. package/dist/editor/reviews/Comments.js +89 -72
  309. package/dist/editor/reviews/Comments.js.map +1 -1
  310. package/dist/editor/reviews/CreateReviewDialog.js +281 -177
  311. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  312. package/dist/editor/reviews/DecisionsMatrix.js +96 -25
  313. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  314. package/dist/editor/reviews/DiffView.js +7 -14
  315. package/dist/editor/reviews/DiffView.js.map +1 -1
  316. package/dist/editor/reviews/EditReviewSettingsDialog.js +6 -4
  317. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  318. package/dist/editor/reviews/MultiReviewManager.js +25 -3
  319. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  320. package/dist/editor/reviews/PagesPanel.js +31 -15
  321. package/dist/editor/reviews/PagesPanel.js.map +1 -1
  322. package/dist/editor/reviews/PreviewInfo.js +1 -4
  323. package/dist/editor/reviews/PreviewInfo.js.map +1 -1
  324. package/dist/editor/reviews/ReviewCard.js +13 -7
  325. package/dist/editor/reviews/ReviewCard.js.map +1 -1
  326. package/dist/editor/reviews/ReviewDetail.js +3 -2
  327. package/dist/editor/reviews/ReviewDetail.js.map +1 -1
  328. package/dist/editor/reviews/ReviewsList.js +7 -3
  329. package/dist/editor/reviews/ReviewsList.js.map +1 -1
  330. package/dist/editor/reviews/SuggestedEdit.js +34 -3
  331. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  332. package/dist/editor/reviews/SuggestionDisplayPopover.js +31 -5
  333. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  334. package/dist/editor/reviews/commentAi.js +25 -6
  335. package/dist/editor/reviews/commentAi.js.map +1 -1
  336. package/dist/editor/reviews/reviewCommands.js +4 -1
  337. package/dist/editor/reviews/reviewCommands.js.map +1 -1
  338. package/dist/editor/reviews/useMultiReview.js +2 -2
  339. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  340. package/dist/editor/reviews/useReviews.d.ts +2 -2
  341. package/dist/editor/reviews/useReviews.js +12 -30
  342. package/dist/editor/reviews/useReviews.js.map +1 -1
  343. package/dist/editor/services/agentErrorMessage.d.ts +1 -0
  344. package/dist/editor/services/agentErrorMessage.js +91 -0
  345. package/dist/editor/services/agentErrorMessage.js.map +1 -0
  346. package/dist/editor/services/agentService.d.ts +229 -5
  347. package/dist/editor/services/agentService.js +292 -39
  348. package/dist/editor/services/agentService.js.map +1 -1
  349. package/dist/editor/services/agentStatus.d.ts +1 -0
  350. package/dist/editor/services/agentStatus.js +19 -0
  351. package/dist/editor/services/agentStatus.js.map +1 -1
  352. package/dist/editor/services/aiService.d.ts +57 -1
  353. package/dist/editor/services/aiService.js +79 -6
  354. package/dist/editor/services/aiService.js.map +1 -1
  355. package/dist/editor/services/contentService.d.ts +6 -3
  356. package/dist/editor/services/contentService.js +13 -12
  357. package/dist/editor/services/contentService.js.map +1 -1
  358. package/dist/editor/services/editService.d.ts +52 -1
  359. package/dist/editor/services/editService.js +94 -2
  360. package/dist/editor/services/editService.js.map +1 -1
  361. package/dist/editor/services/indexService.js +1 -1
  362. package/dist/editor/services/indexService.js.map +1 -1
  363. package/dist/editor/services/reviewsService.d.ts +3 -6
  364. package/dist/editor/services/reviewsService.js +2 -11
  365. package/dist/editor/services/reviewsService.js.map +1 -1
  366. package/dist/editor/services/serviceHelper.d.ts +2 -1
  367. package/dist/editor/services/serviceHelper.js +112 -20
  368. package/dist/editor/services/serviceHelper.js.map +1 -1
  369. package/dist/editor/services/systemService.d.ts +2 -1
  370. package/dist/editor/services/systemService.js +3 -0
  371. package/dist/editor/services/systemService.js.map +1 -1
  372. package/dist/editor/services-server/api.d.ts +1 -2
  373. package/dist/editor/services-server/api.js +11 -6
  374. package/dist/editor/services-server/api.js.map +1 -1
  375. package/dist/editor/settings/About.js +317 -3
  376. package/dist/editor/settings/About.js.map +1 -1
  377. package/dist/editor/settings/QuotaInfo.js +210 -4
  378. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  379. package/dist/editor/settings/SettingsView.js +25 -23
  380. package/dist/editor/settings/SettingsView.js.map +1 -1
  381. package/dist/editor/settings/Status.js +7 -6
  382. package/dist/editor/settings/Status.js.map +1 -1
  383. package/dist/editor/settings/index/useIndexStatus.js +20 -22
  384. package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
  385. package/dist/editor/settings/panels/AgentsPanel.d.ts +0 -4
  386. package/dist/editor/settings/panels/AgentsPanel.js +95 -121
  387. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  388. package/dist/editor/settings/panels/ModelsPanel.js +329 -108
  389. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  390. package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
  391. package/dist/editor/settings/panels/ProvidersPanel.js +86 -59
  392. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  393. package/dist/editor/settings/panels/SearchConfigPanel.js +4 -4
  394. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  395. package/dist/editor/settings/panels/index.d.ts +3 -2
  396. package/dist/editor/settings/panels/index.js +3 -2
  397. package/dist/editor/settings/panels/index.js.map +1 -1
  398. package/dist/editor/settings/status/coreStatusChecks.js +124 -19
  399. package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
  400. package/dist/editor/settings/status/useStartupChecks.d.ts +3 -1
  401. package/dist/editor/settings/status/useStartupChecks.js +9 -5
  402. package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
  403. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +2 -1
  404. package/dist/editor/setup-wizard/steps/CompleteStep.js +2 -1
  405. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  406. package/dist/editor/sidebar/ComponentPalette.js +2 -1
  407. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  408. package/dist/editor/sidebar/ComponentTree.d.ts +8 -1
  409. package/dist/editor/sidebar/ComponentTree.js +216 -69
  410. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  411. package/dist/editor/sidebar/EditHistory.js +22 -46
  412. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  413. package/dist/editor/sidebar/Favorites.js +4 -8
  414. package/dist/editor/sidebar/Favorites.js.map +1 -1
  415. package/dist/editor/sidebar/MainContentTree.js +4 -3
  416. package/dist/editor/sidebar/MainContentTree.js.map +1 -1
  417. package/dist/editor/sidebar/OperationItem.js +21 -7
  418. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  419. package/dist/editor/sidebar/SidebarPanel.d.ts +3 -1
  420. package/dist/editor/sidebar/SidebarPanel.js +44 -12
  421. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  422. package/dist/editor/sidebar/SidebarStack.d.ts +2 -1
  423. package/dist/editor/sidebar/SidebarStack.js +4 -3
  424. package/dist/editor/sidebar/SidebarStack.js.map +1 -1
  425. package/dist/editor/sidebar/Validation.js +24 -12
  426. package/dist/editor/sidebar/Validation.js.map +1 -1
  427. package/dist/editor/sidebar/Workbox.js +53 -3
  428. package/dist/editor/sidebar/Workbox.js.map +1 -1
  429. package/dist/editor/sidebar/WorkspaceRail.d.ts +0 -1
  430. package/dist/editor/sidebar/WorkspaceRail.js +56 -167
  431. package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
  432. package/dist/editor/tree-indicators/GutterColumns.d.ts +3 -1
  433. package/dist/editor/tree-indicators/GutterColumns.js +26 -5
  434. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  435. package/dist/editor/tree-indicators/GutterContext.d.ts +4 -0
  436. package/dist/editor/tree-indicators/GutterContext.js +23 -0
  437. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  438. package/dist/editor/tree-indicators/index.d.ts +0 -1
  439. package/dist/editor/tree-indicators/index.js +0 -1
  440. package/dist/editor/tree-indicators/index.js.map +1 -1
  441. package/dist/editor/tree-indicators/types.d.ts +12 -1
  442. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
  443. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
  444. package/dist/editor/ui/Icons.js +1 -1
  445. package/dist/editor/ui/Icons.js.map +1 -1
  446. package/dist/editor/ui/ItemNameDialogNew.d.ts +2 -0
  447. package/dist/editor/ui/ItemNameDialogNew.js +33 -17
  448. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  449. package/dist/editor/ui/ItemSearch.js +7 -11
  450. package/dist/editor/ui/ItemSearch.js.map +1 -1
  451. package/dist/editor/ui/SimpleIconButton.js +1 -1
  452. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  453. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  454. package/dist/editor/ui/SimpleTabs.js +45 -25
  455. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  456. package/dist/editor/ui/Splitter.d.ts +1 -0
  457. package/dist/editor/ui/Splitter.js +102 -86
  458. package/dist/editor/ui/Splitter.js.map +1 -1
  459. package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
  460. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
  461. package/dist/editor/ui/TreeListSelector.d.ts +6 -1
  462. package/dist/editor/ui/TreeListSelector.js +2 -2
  463. package/dist/editor/ui/TreeListSelector.js.map +1 -1
  464. package/dist/editor/utils/keyboardNavigation.d.ts +6 -20
  465. package/dist/editor/utils/keyboardNavigation.js +48 -140
  466. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  467. package/dist/editor/utils.js +19 -9
  468. package/dist/editor/utils.js.map +1 -1
  469. package/dist/editor/views/CompareView.d.ts +3 -1
  470. package/dist/editor/views/CompareView.js +7 -5
  471. package/dist/editor/views/CompareView.js.map +1 -1
  472. package/dist/editor/views/EditView.js +1 -1
  473. package/dist/editor/views/EditView.js.map +1 -1
  474. package/dist/editor/views/EditorSlot.js +27 -34
  475. package/dist/editor/views/EditorSlot.js.map +1 -1
  476. package/dist/editor/views/ItemEditor.js +7 -3
  477. package/dist/editor/views/ItemEditor.js.map +1 -1
  478. package/dist/editor/views/MediaFolderEditView.js +1 -1
  479. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  480. package/dist/editor/views/ParheliaView.js +5 -6
  481. package/dist/editor/views/ParheliaView.js.map +1 -1
  482. package/dist/editor/views/SingleEditView.d.ts +2 -1
  483. package/dist/editor/views/SingleEditView.js +10 -8
  484. package/dist/editor/views/SingleEditView.js.map +1 -1
  485. package/dist/editor/views/editorSlotContext.js +35 -6
  486. package/dist/editor/views/editorSlotContext.js.map +1 -1
  487. package/dist/index.d.ts +16 -2
  488. package/dist/index.js +11 -0
  489. package/dist/index.js.map +1 -1
  490. package/dist/revision.d.ts +2 -2
  491. package/dist/revision.js +2 -2
  492. package/dist/setup/services/setupWizardService.d.ts +40 -13
  493. package/dist/setup/services/setupWizardService.js +32 -17
  494. package/dist/setup/services/setupWizardService.js.map +1 -1
  495. package/dist/setup/wizard/steps/AddModelDialog.js +12 -3
  496. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  497. package/dist/setup/wizard/steps/ImportModelDialog.js +39 -22
  498. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  499. package/dist/splash-screen/ModernSplashScreen.js +112 -32
  500. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  501. package/dist/splash-screen/NewPage.js +33 -50
  502. package/dist/splash-screen/NewPage.js.map +1 -1
  503. package/dist/splash-screen/OpenPage.js +2 -6
  504. package/dist/splash-screen/OpenPage.js.map +1 -1
  505. package/dist/splash-screen/ParheliaAssistantChat.js +12 -29
  506. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  507. package/dist/splash-screen/ParheliaLogo.js +87 -37
  508. package/dist/splash-screen/ParheliaLogo.js.map +1 -1
  509. package/dist/splash-screen/RecentPages.js +3 -3
  510. package/dist/splash-screen/RecentPages.js.map +1 -1
  511. package/dist/tour/Tour.d.ts +2 -1
  512. package/dist/tour/Tour.js +256 -75
  513. package/dist/tour/Tour.js.map +1 -1
  514. package/dist/tour/default-tour.js +222 -96
  515. package/dist/tour/default-tour.js.map +1 -1
  516. package/dist/types.d.ts +63 -29
  517. package/package.json +19 -15
  518. package/styles.css +39 -10
  519. package/dist/editor/ComponentInfo.d.ts +0 -4
  520. package/dist/editor/ComponentInfo.js +0 -41
  521. package/dist/editor/ComponentInfo.js.map +0 -1
  522. package/dist/editor/ai/HelpTerminal.d.ts +0 -5
  523. package/dist/editor/ai/HelpTerminal.js +0 -166
  524. package/dist/editor/ai/HelpTerminal.js.map +0 -1
  525. package/dist/editor/field-types/ReactQuill.d.ts +0 -125
  526. package/dist/editor/field-types/ReactQuill.js +0 -385
  527. package/dist/editor/field-types/ReactQuill.js.map +0 -1
  528. package/dist/editor/services-server/graphQL.d.ts +0 -29
  529. package/dist/editor/services-server/graphQL.js +0 -53
  530. package/dist/editor/services-server/graphQL.js.map +0 -1
  531. package/dist/editor/settings/AllAgentsPanel.d.ts +0 -5
  532. package/dist/editor/settings/AllAgentsPanel.js +0 -139
  533. package/dist/editor/settings/AllAgentsPanel.js.map +0 -1
  534. package/dist/editor/settings/LatestFeedback.d.ts +0 -1
  535. package/dist/editor/settings/LatestFeedback.js +0 -136
  536. package/dist/editor/settings/LatestFeedback.js.map +0 -1
  537. package/dist/editor/settings/Setup.d.ts +0 -1
  538. package/dist/editor/settings/Setup.js +0 -211
  539. package/dist/editor/settings/Setup.js.map +0 -1
  540. package/dist/editor/settings/panels/DatabasePanel.d.ts +0 -6
  541. package/dist/editor/settings/panels/DatabasePanel.js +0 -50
  542. package/dist/editor/settings/panels/DatabasePanel.js.map +0 -1
  543. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +0 -2
  544. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +0 -195
  545. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +0 -1
  546. package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +0 -2
  547. package/dist/editor/settings/setup-steps/AiSetupStep/index.js +0 -21
  548. package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +0 -1
  549. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +0 -1
  550. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +0 -233
  551. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +0 -1
  552. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +0 -15
  553. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +0 -14
  554. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +0 -1
  555. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +0 -1
  556. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +0 -94
  557. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +0 -1
  558. package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +0 -1
  559. package/dist/editor/settings/setup-steps/AiSetupStep/types.js +0 -2
  560. package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +0 -1
  561. package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +0 -5
  562. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +0 -44
  563. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +0 -1
  564. package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +0 -2
  565. package/dist/editor/settings/setup-steps/IndexSetupStep.js +0 -36
  566. package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +0 -1
  567. package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +0 -2
  568. package/dist/editor/settings/setup-steps/SettingsSetupStep.js +0 -111
  569. package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +0 -1
  570. package/dist/editor/settings/setup-steps/SetupOverview.d.ts +0 -14
  571. package/dist/editor/settings/setup-steps/SetupOverview.js +0 -38
  572. package/dist/editor/settings/setup-steps/SetupOverview.js.map +0 -1
  573. package/dist/editor/sidebar/Debug.d.ts +0 -1
  574. package/dist/editor/sidebar/Debug.js +0 -70
  575. package/dist/editor/sidebar/Debug.js.map +0 -1
  576. package/dist/editor/sidebar/GraphQL.d.ts +0 -2
  577. package/dist/editor/sidebar/GraphQL.js +0 -234
  578. package/dist/editor/sidebar/GraphQL.js.map +0 -1
  579. package/dist/editor/sidebar/LeftToolbar.d.ts +0 -1
  580. package/dist/editor/sidebar/LeftToolbar.js +0 -12
  581. package/dist/editor/sidebar/LeftToolbar.js.map +0 -1
  582. package/dist/editor/sidebar/NavigationSidebar.d.ts +0 -4
  583. package/dist/editor/sidebar/NavigationSidebar.js +0 -254
  584. package/dist/editor/sidebar/NavigationSidebar.js.map +0 -1
  585. package/dist/editor/tree-indicators/GutterSelector.d.ts +0 -5
  586. package/dist/editor/tree-indicators/GutterSelector.js +0 -91
  587. 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 { 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";
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 || !currentDescriptor.path) &&
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 handleCreate = async () => {
202
- setShowErrors(true);
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
- setError("Please select at least one page/item");
206
- return;
361
+ return "Please select at least one page/item";
207
362
  }
208
363
  if (reviewers.length === 0) {
209
- setError("Please add at least one reviewer");
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
- setError("Language is required");
215
- return;
367
+ return "Language is required";
216
368
  }
217
369
  if (languageMode === "multiple" && selectedLanguages.length === 0) {
218
- setError("Please select at least one language");
219
- return;
370
+ return "Please select at least one language";
220
371
  }
221
372
  if (showSecretFields && secret !== secretConfirm) {
222
- setError("Secrets do not match");
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
- setError("Required Approvals must be at least 1");
231
- return;
379
+ return "Required Approvals must be at least 1";
232
380
  }
233
381
  if (requiredApprovalsNum > reviewers.length) {
234
- setError(`Required Approvals (${requiredApprovalsNum}) cannot exceed the number of reviewers (${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);
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 assignmentIds = statusResult.data.assignments
278
- .filter((a) => !a.invitationSentDate)
279
- .map((a) => a.assignmentId);
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
- 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);
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 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);
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) && editContext?.itemsRepository) {
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
- 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") })] })] })] }) }));
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