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