@parhelia/core 0.1.12928 → 0.1.12931

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 (138) hide show
  1. package/dist/agents-view/AgentCard.js +4 -1
  2. package/dist/agents-view/AgentCard.js.map +1 -1
  3. package/dist/agents-view/AgentProfileIcon.js +8 -8
  4. package/dist/agents-view/AgentProfileIcon.js.map +1 -1
  5. package/dist/agents-view/AgentsView.js +1 -1
  6. package/dist/components/WorkspaceHomeView.d.ts +13 -0
  7. package/dist/components/WorkspaceHomeView.js +13 -0
  8. package/dist/components/WorkspaceHomeView.js.map +1 -0
  9. package/dist/components/ui/styled-dialog-title.d.ts +3 -1
  10. package/dist/components/ui/styled-dialog-title.js +2 -2
  11. package/dist/components/ui/styled-dialog-title.js.map +1 -1
  12. package/dist/config/config.js +7 -19
  13. package/dist/config/config.js.map +1 -1
  14. package/dist/config/notificationRoutes.js +1 -1
  15. package/dist/config/notificationRoutes.js.map +1 -1
  16. package/dist/editor/ConfirmationDialog.js +1 -1
  17. package/dist/editor/ConfirmationDialog.js.map +1 -1
  18. package/dist/editor/ImageEditButton.js +14 -2
  19. package/dist/editor/ImageEditButton.js.map +1 -1
  20. package/dist/editor/ImageEditor.js +1 -1
  21. package/dist/editor/ImageEditor.js.map +1 -1
  22. package/dist/editor/PictureEditor.js +1 -1
  23. package/dist/editor/PictureEditor.js.map +1 -1
  24. package/dist/editor/ai/Agents.js +15 -79
  25. package/dist/editor/ai/Agents.js.map +1 -1
  26. package/dist/editor/ai/terminal/components/AgentMemoryPanel.d.ts +12 -0
  27. package/dist/editor/ai/terminal/components/AgentMemoryPanel.js +131 -0
  28. package/dist/editor/ai/terminal/components/AgentMemoryPanel.js.map +1 -0
  29. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +10 -2
  30. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  31. package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js +11 -0
  32. package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js.map +1 -1
  33. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +27 -20
  34. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
  35. package/dist/editor/ai/terminal/useAgentSettingsData.js +4 -4
  36. package/dist/editor/ai/terminal/useAgentSettingsData.js.map +1 -1
  37. package/dist/editor/client/EditorShell.js +11 -51
  38. package/dist/editor/client/EditorShell.js.map +1 -1
  39. package/dist/editor/client/editContext.d.ts +3 -1
  40. package/dist/editor/client/operations.js +20 -1
  41. package/dist/editor/client/operations.js.map +1 -1
  42. package/dist/editor/commands/componentCommands.js +2 -1
  43. package/dist/editor/commands/componentCommands.js.map +1 -1
  44. package/dist/editor/context-menu/InsertMenu.js +1 -1
  45. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  46. package/dist/editor/menubar/PageSelector.js +1 -1
  47. package/dist/editor/menubar/PageSelector.js.map +1 -1
  48. package/dist/editor/menubar/toolbar-sections/EditControls.js +1 -2
  49. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  50. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +6 -0
  51. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  52. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +5 -5
  53. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  54. package/dist/editor/page-editor-chrome/DragInsertionOverlay.d.ts +8 -1
  55. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js +154 -34
  56. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js.map +1 -1
  57. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.d.ts +10 -0
  58. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.js +236 -0
  59. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.js.map +1 -0
  60. package/dist/editor/page-editor-chrome/PageEditorChrome.js +2 -1
  61. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  62. package/dist/editor/page-editor-chrome/PictureEditorOverlay.d.ts +3 -0
  63. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +1 -1
  64. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  65. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -2
  66. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  67. package/dist/editor/page-editor-chrome/overlay/placeholderZones.d.ts +10 -0
  68. package/dist/editor/page-editor-chrome/overlay/placeholderZones.js +18 -0
  69. package/dist/editor/page-editor-chrome/overlay/placeholderZones.js.map +1 -1
  70. package/dist/editor/page-viewer/EditorForm.js +40 -2
  71. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  72. package/dist/editor/page-viewer/MiniMap.js +70 -5
  73. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  74. package/dist/editor/page-viewer/PageViewerFrame.js +123 -29
  75. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  76. package/dist/editor/page-viewer/minimapVisibility.d.ts +33 -0
  77. package/dist/editor/page-viewer/minimapVisibility.js +72 -0
  78. package/dist/editor/page-viewer/minimapVisibility.js.map +1 -0
  79. package/dist/editor/page-viewer/renderUrl.js +29 -7
  80. package/dist/editor/page-viewer/renderUrl.js.map +1 -1
  81. package/dist/editor/reviews/CreateReviewConfirmStep.js +5 -4
  82. package/dist/editor/reviews/CreateReviewConfirmStep.js.map +1 -1
  83. package/dist/editor/reviews/CreateReviewDialog.js +120 -202
  84. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  85. package/dist/editor/reviews/CreateReviewItemsStep.d.ts +18 -0
  86. package/dist/editor/reviews/CreateReviewItemsStep.js +6 -0
  87. package/dist/editor/reviews/CreateReviewItemsStep.js.map +1 -0
  88. package/dist/editor/reviews/CreateReviewLanguagesStep.d.ts +9 -0
  89. package/dist/editor/reviews/CreateReviewLanguagesStep.js +36 -0
  90. package/dist/editor/reviews/CreateReviewLanguagesStep.js.map +1 -0
  91. package/dist/editor/reviews/CreateReviewReviewersStep.d.ts +17 -0
  92. package/dist/editor/reviews/CreateReviewReviewersStep.js +33 -0
  93. package/dist/editor/reviews/CreateReviewReviewersStep.js.map +1 -0
  94. package/dist/editor/reviews/CreateReviewSettingsStep.d.ts +21 -0
  95. package/dist/editor/reviews/CreateReviewSettingsStep.js +33 -0
  96. package/dist/editor/reviews/CreateReviewSettingsStep.js.map +1 -0
  97. package/dist/editor/reviews/MultiReviewManager.js +1 -4
  98. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  99. package/dist/editor/reviews/openCommentsFeedback.d.ts +2 -6
  100. package/dist/editor/reviews/openCommentsFeedback.js +3 -11
  101. package/dist/editor/reviews/openCommentsFeedback.js.map +1 -1
  102. package/dist/editor/services/agentService.d.ts +36 -0
  103. package/dist/editor/services/agentService.js +42 -0
  104. package/dist/editor/services/agentService.js.map +1 -1
  105. package/dist/editor/services/aiService.d.ts +4 -2
  106. package/dist/editor/services/aiService.js.map +1 -1
  107. package/dist/editor/services/editService.d.ts +1 -1
  108. package/dist/editor/services/editService.js +2 -2
  109. package/dist/editor/services/editService.js.map +1 -1
  110. package/dist/editor/services/reviewsService.d.ts +6 -0
  111. package/dist/editor/services/reviewsService.js +15 -0
  112. package/dist/editor/services/reviewsService.js.map +1 -1
  113. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +2 -1
  114. package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
  115. package/dist/editor/sidebar/ComponentTree.js +21 -1
  116. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  117. package/dist/editor/tree-indicators/GutterColumns.js +24 -6
  118. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  119. package/dist/editor/ui/ItemCollectionEditor.js +4 -4
  120. package/dist/editor/ui/ItemCollectionEditor.js.map +1 -1
  121. package/dist/editor/ui/PerfectTree.js +5 -5
  122. package/dist/editor/ui/PerfectTree.js.map +1 -1
  123. package/dist/editor/ui/PublishItemDialog.js +1 -1
  124. package/dist/editor/ui/PublishItemDialog.js.map +1 -1
  125. package/dist/editor/ui/PublishRestrictionsDialog.js +179 -148
  126. package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
  127. package/dist/editor/utils/keyboardNavigation.js +7 -0
  128. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  129. package/dist/editor/views/SingleEditView.js +32 -2
  130. package/dist/editor/views/SingleEditView.js.map +1 -1
  131. package/dist/index.d.ts +2 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/revision.d.ts +2 -2
  135. package/dist/revision.js +2 -2
  136. package/dist/task-board/components/TaskBoardHomeView.js +3 -6
  137. package/dist/task-board/components/TaskBoardHomeView.js.map +1 -1
  138. package/package.json +1 -1
@@ -63,14 +63,36 @@ export function applyParheliaRenderContext(renderUrl, pageItemDescriptor, siteNa
63
63
  renderUrl.searchParams.set("sc_site", siteName);
64
64
  }
65
65
  }
66
- if (!renderUrl.searchParams.has("sc_itemid")) {
67
- renderUrl.searchParams.set("sc_itemid", pageItemDescriptor.id);
68
- }
69
- if (!renderUrl.searchParams.has("sc_lang")) {
70
- renderUrl.searchParams.set("sc_lang", pageItemDescriptor.language);
66
+ // Proxied rendering-host requests (/parhelia/proxy/{name}/...) must not carry
67
+ // sc_* context params: they run through Sitecore's httpRequestBegin pipeline
68
+ // on the shell site, where language resolvers reject languages that are not
69
+ // registered for that site (500 before the proxy controller runs). The host
70
+ // app reads the plain itemid/lang/version params instead.
71
+ const isProxiedHostPath = renderUrl.pathname.startsWith("/parhelia/proxy/");
72
+ if (isProxiedHostPath) {
73
+ renderUrl.searchParams.delete("sc_itemid");
74
+ renderUrl.searchParams.delete("sc_lang");
75
+ renderUrl.searchParams.delete("sc_version");
76
+ if (!renderUrl.searchParams.has("itemid")) {
77
+ renderUrl.searchParams.set("itemid", pageItemDescriptor.id);
78
+ }
79
+ if (!renderUrl.searchParams.has("lang")) {
80
+ renderUrl.searchParams.set("lang", pageItemDescriptor.language);
81
+ }
82
+ if (!renderUrl.searchParams.has("version")) {
83
+ renderUrl.searchParams.set("version", String(pageItemDescriptor.version));
84
+ }
71
85
  }
72
- if (!renderUrl.searchParams.has("sc_version")) {
73
- renderUrl.searchParams.set("sc_version", String(pageItemDescriptor.version));
86
+ else {
87
+ if (!renderUrl.searchParams.has("sc_itemid")) {
88
+ renderUrl.searchParams.set("sc_itemid", pageItemDescriptor.id);
89
+ }
90
+ if (!renderUrl.searchParams.has("sc_lang")) {
91
+ renderUrl.searchParams.set("sc_lang", pageItemDescriptor.language);
92
+ }
93
+ if (!renderUrl.searchParams.has("sc_version")) {
94
+ renderUrl.searchParams.set("sc_version", String(pageItemDescriptor.version));
95
+ }
74
96
  }
75
97
  const routePath = inferRoutePathFromSitecoreItemPath(pageItemDescriptor.path);
76
98
  if (!routePath)
@@ -1 +1 @@
1
- {"version":3,"file":"renderUrl.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/renderUrl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderUrl.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/renderUrl.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Loader2 } from "lucide-react";
3
3
  import { Input } from "../../components/ui/input";
4
+ import { CountBadge } from "../../components/ui/badge";
4
5
  export function CreateReviewConfirmStep({ title, setTitle, isGeneratingTitle, languageSummary, reviewers, items, requiredApprovals, updateWorkflowOnCompletion, expirationDays, showSecretFields, }) {
5
6
  const reviewTitle = title || "Untitled Review";
6
7
  const reviewerName = reviewers[0]?.name || reviewers[0]?.email || "Reviewer";
@@ -29,9 +30,9 @@ Please open your invitation link to start reviewing:
29
30
  [Invitation Link]
30
31
 
31
32
  Thank you.`;
32
- return (_jsxs("div", { className: "flex flex-col gap-6 pt-6", children: [_jsx("div", { className: "border-feedback-blue bg-feedback-blue-light text-feedback-blue rounded-xl border p-4 text-sm", children: "Please confirm these details before sending invitation emails." }), _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Review" }), _jsxs("div", { className: "mt-2 flex flex-col gap-2", children: [_jsxs("label", { htmlFor: "title", className: "text-neutral-grey-100 text-xs font-medium", children: ["Review Name", _jsx("span", { className: "text-muted-foreground ml-1 text-[11px] 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: "bg-white" }), isGeneratingTitle && (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsx(Loader2, { className: "h-3 w-3 animate-spin" }), "Generating suggested name..."] }))] })] }), _jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Languages" }), _jsx("p", { className: "text-neutral-grey-100 mt-2 text-sm font-medium", children: languageSummary })] })] }), _jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsxs("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: ["Reviewers (", reviewers.length, ")"] }), _jsx("div", { className: "mt-3 flex flex-wrap gap-2", children: reviewers.map((reviewer) => (_jsxs("span", { className: "border-border-default bg-neutral-grey-5 text-neutral-grey-100 rounded-full border px-3 py-1 text-xs", children: [reviewer.name || reviewer.email, " (", reviewer.email, ")"] }, reviewer.email))) })] }), _jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsxs("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: ["Pages & Items (", items.length, ")"] }), _jsx("div", { className: "mt-3 max-h-40 space-y-2 overflow-y-auto", children: items.map((item, index) => (_jsxs("div", { className: "border-border-default bg-neutral-grey-5 text-neutral-grey-100 rounded-lg border px-3 py-2 text-xs", children: [_jsx("p", { className: "text-neutral-grey-100 font-medium", children: item.descriptor.displayName ||
33
- item.descriptor.name ||
34
- item.descriptor.path ||
35
- item.descriptor.id }), item.descriptor.path && (_jsx("p", { className: "text-muted-foreground truncate", children: item.descriptor.path })), item.includeSubitems && (_jsx("p", { className: "text-primary mt-1 font-medium", children: "Includes subitems" }))] }, `${item.descriptor.id}-${index}`))) })] }), _jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Advanced Settings" }), _jsxs("div", { className: "text-neutral-grey-100 mt-3 grid gap-2 text-xs sm:grid-cols-2", children: [_jsxs("p", { children: ["Required approvals:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: requiredApprovals || "1" })] }), _jsxs("p", { children: ["Update workflow:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: updateWorkflowOnCompletion ? "Yes" : "No" })] }), _jsxs("p", { children: ["Expiration:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: expirationDays ? `${expirationDays} day(s)` : "None" })] }), _jsxs("p", { children: ["Secret required:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: showSecretFields ? "Yes" : "No" })] })] })] }), _jsxs("div", { className: "border-border-default rounded-xl border bg-white p-4", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Email Preview" }), _jsxs("div", { className: "border-border-default bg-neutral-grey-5 mt-3 space-y-3 rounded-lg border p-3", children: [_jsxs("p", { className: "text-neutral-grey-100 text-xs", children: [_jsx("span", { className: "font-medium", children: "Subject:" }), " ", emailSubject] }), _jsx("pre", { className: "text-neutral-grey-100 text-xs leading-relaxed whitespace-pre-wrap", children: emailBody }), _jsx("p", { className: "text-muted-foreground text-[11px]", children: "Each reviewer receives a personalized invitation link." })] })] })] }));
33
+ return (_jsxs("div", { className: "grid gap-6 p-4 md:grid-cols-2 md:gap-x-10 md:p-6", children: [_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: ["Review Name", _jsx("span", { className: "text-muted-foreground ml-1 text-[11px] font-normal normal-case", 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: "bg-white" }), isGeneratingTitle && (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsx(Loader2, { className: "h-3 w-3 animate-spin" }), "Generating suggested name..."] }))] }), _jsx("div", { className: "border-border-default border-t" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Languages" }), _jsx("p", { className: "text-neutral-grey-100 text-sm font-medium", children: languageSummary })] }), _jsx("div", { className: "border-border-default border-t" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Reviewers" }), _jsx(CountBadge, { children: reviewers.length })] }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: reviewers.map((reviewer) => (_jsxs("span", { className: "border-border-default bg-neutral-grey-5 text-neutral-grey-100 rounded-full border px-2.5 py-0.5 text-xs", children: [reviewer.name || reviewer.email, " (", reviewer.email, ")"] }, reviewer.email))) })] }), _jsx("div", { className: "border-border-default border-t" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Settings" }), _jsxs("div", { className: "text-neutral-grey-100 grid gap-x-4 gap-y-1 text-xs sm:grid-cols-2", children: [_jsxs("p", { children: ["Required approvals:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: requiredApprovals || "1" })] }), _jsxs("p", { children: ["Update workflow:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: updateWorkflowOnCompletion ? "Yes" : "No" })] }), _jsxs("p", { children: ["Expiration:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: expirationDays ? `${expirationDays} day(s)` : "None" })] }), _jsxs("p", { children: ["Secret required:", " ", _jsx("span", { className: "text-neutral-grey-100 font-medium", children: showSecretFields ? "Yes" : "No" })] })] })] }), _jsx("div", { className: "border-border-default border-t" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Pages & Items" }), _jsx(CountBadge, { children: items.length })] }), _jsx("div", { className: "divide-border-default max-h-40 divide-y overflow-y-auto", children: items.map((item, index) => (_jsxs("div", { className: "flex items-baseline gap-2 py-1.5 text-xs first:pt-0 last:pb-0", children: [_jsx("p", { className: "text-neutral-grey-100 shrink-0 font-medium", children: item.descriptor.displayName ||
34
+ item.descriptor.name ||
35
+ item.descriptor.path ||
36
+ item.descriptor.id }), item.includeSubitems && (_jsx("span", { className: "text-primary shrink-0 font-medium", children: "Includes subitems" })), item.descriptor.path && (_jsx("p", { className: "text-muted-foreground min-w-0 truncate", children: item.descriptor.path }))] }, `${item.descriptor.id}-${index}`))) })] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("p", { className: "text-neutral-grey-50 text-xs font-medium tracking-wider", children: "Email Preview" }), _jsxs("div", { className: "border-border-default flex flex-col gap-1.5 border-l-2 pl-3", children: [_jsxs("p", { className: "text-neutral-grey-100 text-xs", children: [_jsx("span", { className: "font-medium", children: "Subject:" }), " ", emailSubject] }), _jsx("pre", { className: "text-neutral-grey-100 font-sans text-xs leading-snug whitespace-pre-wrap", children: emailBody }), _jsx("p", { className: "text-muted-foreground text-[11px]", children: "Each reviewer receives a personalized invitation link." })] })] })] }));
36
37
  }
37
38
  //# sourceMappingURL=CreateReviewConfirmStep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateReviewConfirmStep.js","sourceRoot":"","sources":["../../../src/editor/reviews/CreateReviewConfirmStep.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CreateReviewConfirmStep.js","sourceRoot":"","sources":["../../../src/editor/reviews/CreateReviewConfirmStep.tsx"],"names":[],"mappings":"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"}
@@ -3,15 +3,56 @@ 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, AlertTriangle, } from "lucide-react";
6
+ import { Loader2, ClipboardCheck, CheckCircle2, AlertTriangle, ArrowRight, } from "lucide-react";
7
+ import { cn } from "../../lib/utils";
7
8
  import { useEditContext } from "../client/editContext";
8
9
  import DialogButtons from "../ui/DialogButtons";
9
- import { CreateReviewDetailsStep } from "./CreateReviewDetailsStep";
10
+ import { CreateReviewItemsStep } from "./CreateReviewItemsStep";
11
+ import { CreateReviewReviewersStep } from "./CreateReviewReviewersStep";
12
+ import { CreateReviewLanguagesStep } from "./CreateReviewLanguagesStep";
13
+ import { CreateReviewSettingsStep } from "./CreateReviewSettingsStep";
10
14
  import { CreateReviewConfirmStep } from "./CreateReviewConfirmStep";
11
15
  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;
16
+ import { suggestReviewName } from "../services/reviewsService";
17
+ const WIZARD_STEPS = [
18
+ {
19
+ id: "items",
20
+ name: "Items",
21
+ description: "Select the content items to include in this review.",
22
+ nextButtonLabel: "Select Items",
23
+ },
24
+ {
25
+ id: "reviewers",
26
+ name: "Reviewers",
27
+ description: "Add the people who will review and approve the content.",
28
+ nextButtonLabel: "Add Reviewers",
29
+ },
30
+ {
31
+ id: "languages",
32
+ name: "Languages",
33
+ description: "Choose which language versions to include in the review.",
34
+ nextButtonLabel: "Select Languages",
35
+ },
36
+ {
37
+ id: "settings",
38
+ name: "Settings",
39
+ description: "Configure optional expiration, approval, and security settings.",
40
+ nextButtonLabel: "Configure Settings",
41
+ },
42
+ {
43
+ id: "confirm",
44
+ name: "Confirm",
45
+ description: "Review the details before sending invitation emails.",
46
+ nextButtonLabel: "Confirm Details",
47
+ },
48
+ ];
49
+ function StepIndicatorDots({ steps, currentStepIndex, }) {
50
+ if (steps.length <= 1)
51
+ return null;
52
+ return (_jsx("div", { className: "pointer-events-none absolute top-full left-1/2 mt-8 flex -translate-x-1/2 justify-center gap-3", "aria-hidden": "true", "data-testid": "create-review-step-dots", children: steps.map((step, index) => (_jsx("div", { className: cn("h-1.5 rounded-full transition-all duration-300", index === currentStepIndex
53
+ ? "w-8 bg-white"
54
+ : "w-1.5 bg-neutral-grey-10") }, step.id))) }));
55
+ }
15
56
  function getExecutionErrorMessage(result, fallback) {
16
57
  const summary = result.summary?.trim();
17
58
  const details = result.details?.trim();
@@ -20,22 +61,13 @@ function getExecutionErrorMessage(result, fallback) {
20
61
  }
21
62
  return summary || details || fallback;
22
63
  }
23
- function withTimeout(promise, timeoutMs, timeoutMessage) {
24
- let timeoutId = null;
25
- const timeoutPromise = new Promise((_, reject) => {
26
- timeoutId = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
27
- });
28
- return Promise.race([promise, timeoutPromise]).finally(() => {
29
- if (timeoutId)
30
- clearTimeout(timeoutId);
31
- });
32
- }
33
64
  export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems, }) {
34
65
  const editContext = useEditContext();
35
- const [step, setStep] = useState("details");
66
+ const [stepIndex, setStepIndex] = useState(0);
67
+ const [showSuccess, setShowSuccess] = useState(false);
36
68
  const [title, setTitle] = useState("");
37
69
  const [language, setLanguage] = useState(editContext?.currentItemDescriptor?.language || "en");
38
- const [languageMode, setLanguageMode] = useState("single");
70
+ const [languageMode, setLanguageMode] = useState("multiple");
39
71
  const [selectedLanguages, setSelectedLanguages] = useState([
40
72
  editContext?.currentItemDescriptor?.language || "en",
41
73
  ]);
@@ -47,7 +79,6 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
47
79
  const [items, setItems] = useState([]);
48
80
  const [loading, setLoading] = useState(false);
49
81
  const [error, setError] = useState(null);
50
- const [showErrors, setShowErrors] = useState(false);
51
82
  const [expirationDays, setExpirationDays] = useState("");
52
83
  const [secret, setSecret] = useState("");
53
84
  const [secretConfirm, setSecretConfirm] = useState("");
@@ -57,7 +88,6 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
57
88
  const [shareCommentsAndSuggestions, setShareCommentsAndSuggestions] = useState(false);
58
89
  const [selectedInTree, setSelectedInTree] = useState([]);
59
90
  const [selectedFromList, setSelectedFromList] = useState([]);
60
- const [advancedSettingsOpen, setAdvancedSettingsOpen] = useState(false);
61
91
  const [createdReviewId, setCreatedReviewId] = useState(null);
62
92
  const [sentInvitationCount, setSentInvitationCount] = useState(0);
63
93
  const [sentInvitationEmails, setSentInvitationEmails] = useState([]);
@@ -69,42 +99,24 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
69
99
  // This ensures the array reference only changes when items actually change,
70
100
  // not on every render (e.g., when typing in the Review Name field)
71
101
  const itemIds = useMemo(() => items.map((item) => item.descriptor.id), [items]);
72
- // Compute form validity for enabling/disabling the Create Review button
73
- const isFormValid = useMemo(() => {
74
- // Must have at least one item
75
- if (items.length === 0)
76
- return false;
77
- // Must have at least one reviewer
78
- if (reviewers.length === 0)
79
- return false;
80
- // Validate language selection based on mode
81
- if (languageMode === "single" && !language)
82
- return false;
83
- if (languageMode === "multiple" && selectedLanguages.length === 0)
84
- return false;
85
- // Validate secret confirmation
86
- if (showSecretFields && secret !== secretConfirm)
87
- return false;
88
- // Validate requiredApprovals
89
- const requiredApprovalsNum = requiredApprovals
90
- ? parseInt(requiredApprovals, 10)
91
- : 1;
92
- if (isNaN(requiredApprovalsNum) || requiredApprovalsNum < 1)
93
- return false;
94
- if (requiredApprovalsNum > reviewers.length)
102
+ const currentStep = WIZARD_STEPS[stepIndex] ?? WIZARD_STEPS[0];
103
+ const isLastStep = stepIndex === WIZARD_STEPS.length - 1;
104
+ const nextStep = WIZARD_STEPS[stepIndex + 1];
105
+ const requiredApprovalsValid = useMemo(() => {
106
+ const num = requiredApprovals ? parseInt(requiredApprovals, 10) : 1;
107
+ if (isNaN(num) || num < 1)
95
108
  return false;
96
- return true;
97
- }, [
98
- items.length,
99
- reviewers.length,
100
- languageMode,
101
- language,
102
- selectedLanguages.length,
103
- showSecretFields,
104
- secret,
105
- secretConfirm,
106
- requiredApprovals,
107
- ]);
109
+ return num <= reviewers.length;
110
+ }, [requiredApprovals, reviewers.length]);
111
+ const stepValidity = {
112
+ items: items.length > 0,
113
+ reviewers: reviewers.length > 0,
114
+ languages: languageMode === "all" ? true : selectedLanguages.length > 0,
115
+ settings: requiredApprovalsValid &&
116
+ (!showSecretFields || secret === secretConfirm),
117
+ confirm: true,
118
+ };
119
+ const canProceed = stepValidity[currentStep.id];
108
120
  useEffect(() => {
109
121
  if (open && editContext?.currentItemDescriptor && items.length === 0) {
110
122
  // Initialize with current page if available - but only if items haven't been set yet
@@ -192,104 +204,21 @@ export function CreateReviewDialog({ open, onOpenChange, onCreated, initialItems
192
204
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
193
205
  return emailRegex.test(email);
194
206
  };
195
- const extractReviewTitleFromAgentResponse = (content) => {
196
- if (!content)
197
- return "";
198
- const fencedTitleMatch = content.match(/```(?:suggestion|title)\s*\n([\s\S]*?)```/i);
199
- const fencedGenericMatch = content.match(/```\s*\n([\s\S]*?)```/);
200
- const raw = (fencedTitleMatch?.[1] || fencedGenericMatch?.[1] || content)
201
- .trim()
202
- .replace(/^["']|["']$/g, "");
203
- if (!raw)
204
- return "";
205
- return raw.split("\n")[0]?.trim() || "";
206
- };
207
- const buildReviewTitleSuggestionPrompt = () => {
208
- const languageScope = languageMode === "all"
209
- ? "all languages"
210
- : languageMode === "multiple"
211
- ? selectedLanguages.join(", ")
212
- : language;
213
- const itemNames = items
214
- .slice(0, 5)
215
- .map((item) => item.descriptor.displayName ||
216
- item.descriptor.name ||
217
- item.descriptor.path ||
218
- item.descriptor.id)
219
- .filter(Boolean)
220
- .join(", ");
221
- const reviewerNames = reviewers
222
- .slice(0, 3)
223
- .map((reviewer) => reviewer.name || reviewer.email)
224
- .filter(Boolean)
225
- .join(", ");
226
- return `Generate a concise review name for a Sitecore content review.
227
-
228
- Context:
229
- - Language scope: ${languageScope}
230
- - Items: ${itemNames || "N/A"}
231
- - Number of reviewers: ${reviewers.length}
232
- - First reviewers: ${reviewerNames || "N/A"}
233
- - Includes subitems: ${items.some((x) => x.includeSubitems) ? "yes" : "no"}
234
-
235
- Rules:
236
- - Return a short, clear title (4-10 words).
237
- - Do not use quotes.
238
- - Do not include prefixes like "Review:".
239
- - Output ONLY the title inside a \`\`\`suggestion fenced code block.
240
-
241
- Example:
242
- \`\`\`suggestion
243
- Homepage and Navigation Content Review
244
- \`\`\``;
245
- };
246
207
  const generateReviewTitleSuggestion = async () => {
247
208
  if (title.trim())
248
209
  return null;
249
- if (!editContext?.addSocketMessageListener || !editContext.sessionId) {
210
+ const itemIds = items.map((item) => item.descriptor.id).filter(Boolean);
211
+ if (itemIds.length === 0)
250
212
  return null;
251
- }
252
- const newAgentId = crypto.randomUUID();
213
+ const languages = languageMode === "all" ? ["*"] : [...selectedLanguages].sort();
253
214
  setIsGeneratingTitle(true);
254
215
  try {
255
- const profiles = await withTimeout(loadAiProfiles(editContext.currentItemDescriptor), REVIEW_TITLE_SUGGESTION_TIMEOUT_MS, "Timed out while loading AI profiles");
256
- if (!profiles || profiles.length === 0) {
257
- return null;
258
- }
259
- const configuredProfileId = editContext.parheliaSettings?.commentResolveProfileId;
260
- const selectedProfile = profiles.find((profile) => configuredProfileId &&
261
- profile.id.toLowerCase() === configuredProfileId.toLowerCase()) || profiles[0];
262
- if (!selectedProfile)
263
- return null;
264
- await withTimeout(startAgent({
265
- agentId: newAgentId,
266
- message: buildReviewTitleSuggestionPrompt(),
267
- sessionId: editContext.sessionId,
268
- profileId: selectedProfile.id,
269
- mode: "autonomous",
270
- context: {
271
- items: items.map((item) => ({
272
- id: item.descriptor.id,
273
- language: item.descriptor.language,
274
- version: item.descriptor.version,
275
- name: item.descriptor.name,
276
- path: item.descriptor.path,
277
- })),
278
- additionalData: {
279
- intent: "review-title-suggestion",
280
- reviewerCount: reviewers.length,
281
- },
282
- },
283
- }), REVIEW_TITLE_SUGGESTION_TIMEOUT_MS, "Timed out while starting title suggestion agent");
284
- const result = await awaitAgentResponse({
285
- agentId: newAgentId,
286
- addSocketMessageListener: editContext.addSocketMessageListener,
287
- timeout: REVIEW_TITLE_SUGGESTION_TIMEOUT_MS,
216
+ return await suggestReviewName({
217
+ itemIds,
218
+ languages,
219
+ reviewerCount: reviewers.length,
220
+ includeSubitems: items.some((x) => x.includeSubitems),
288
221
  });
289
- if (!result.success)
290
- return null;
291
- const extractedTitle = extractReviewTitleFromAgentResponse(result.content);
292
- return extractedTitle || null;
293
222
  }
294
223
  catch (err) {
295
224
  console.error("Failed to generate review title suggestion:", err);
@@ -297,12 +226,6 @@ Homepage and Navigation Content Review
297
226
  }
298
227
  finally {
299
228
  setIsGeneratingTitle(false);
300
- try {
301
- await closeAgent(newAgentId);
302
- }
303
- catch (err) {
304
- console.error("Failed to close review title suggestion agent:", err);
305
- }
306
229
  }
307
230
  };
308
231
  const emailAlreadyExists = (email) => {
@@ -310,20 +233,16 @@ Homepage and Navigation Content Review
310
233
  };
311
234
  const addReviewer = () => {
312
235
  if (!newReviewer.name || !newReviewer.email) {
313
- setShowErrors(true);
314
236
  return;
315
237
  }
316
238
  if (!isValidEmail(newReviewer.email)) {
317
- setShowErrors(true);
318
239
  return;
319
240
  }
320
241
  if (emailAlreadyExists(newReviewer.email)) {
321
- setShowErrors(true);
322
242
  return;
323
243
  }
324
244
  setReviewers([...reviewers, { ...newReviewer }]);
325
245
  setNewReviewer({ name: "", email: "" });
326
- setShowErrors(false);
327
246
  };
328
247
  const removeReviewer = (index) => {
329
248
  setReviewers(reviewers.filter((_, i) => i !== index));
@@ -337,7 +256,8 @@ Homepage and Navigation Content Review
337
256
  setItems(items.filter((_, i) => i !== index));
338
257
  };
339
258
  const resetDialogState = () => {
340
- setStep("details");
259
+ setStepIndex(0);
260
+ setShowSuccess(false);
341
261
  setTitle("");
342
262
  setReviewers([]);
343
263
  setItems([]);
@@ -348,14 +268,12 @@ Homepage and Navigation Content Review
348
268
  setRequiredApprovals("1");
349
269
  setUpdateWorkflowOnCompletion(false);
350
270
  setShareCommentsAndSuggestions(false);
351
- setShowErrors(false);
352
271
  setError(null);
353
- setLanguageMode("single");
272
+ setLanguageMode("multiple");
354
273
  setSelectedLanguages([
355
274
  editContext?.currentItemDescriptor?.language || "en",
356
275
  ]);
357
276
  setLanguage(editContext?.currentItemDescriptor?.language || "en");
358
- setAdvancedSettingsOpen(false);
359
277
  setSelectedInTree([]);
360
278
  setSelectedFromList([]);
361
279
  setNewReviewer({ name: "", email: "" });
@@ -371,9 +289,6 @@ Homepage and Navigation Content Review
371
289
  if (reviewers.length === 0) {
372
290
  return "Please add at least one reviewer";
373
291
  }
374
- if (languageMode === "single" && !language) {
375
- return "Language is required";
376
- }
377
292
  if (languageMode === "multiple" && selectedLanguages.length === 0) {
378
293
  return "Please select at least one language";
379
294
  }
@@ -391,16 +306,16 @@ Homepage and Navigation Content Review
391
306
  }
392
307
  return null;
393
308
  };
394
- const handleProceedToConfirm = async () => {
395
- setShowErrors(true);
396
- setError(null);
397
- const validationError = validateForm();
398
- if (validationError) {
399
- setError(validationError);
309
+ const handleNext = () => {
310
+ if (isLastStep) {
311
+ void handleCreate();
400
312
  return;
401
313
  }
402
- setStep("confirm");
403
- if (!title.trim()) {
314
+ setError(null);
315
+ const nextIndex = stepIndex + 1;
316
+ setStepIndex(nextIndex);
317
+ // Kick off the title suggestion when the user reaches the confirm step
318
+ if (WIZARD_STEPS[nextIndex]?.id === "confirm" && !title.trim()) {
404
319
  void (async () => {
405
320
  const suggestedTitle = await generateReviewTitleSuggestion();
406
321
  if (suggestedTitle) {
@@ -409,8 +324,13 @@ Homepage and Navigation Content Review
409
324
  })();
410
325
  }
411
326
  };
327
+ const handlePrevious = () => {
328
+ if (stepIndex > 0) {
329
+ setError(null);
330
+ setStepIndex(stepIndex - 1);
331
+ }
332
+ };
412
333
  const handleCreate = async () => {
413
- setShowErrors(true);
414
334
  setError(null);
415
335
  const validationError = validateForm();
416
336
  if (validationError) {
@@ -429,25 +349,8 @@ Homepage and Navigation Content Review
429
349
  expirationUtc = expirationDate.toISOString();
430
350
  }
431
351
  // Build languages array based on mode
432
- let languages;
433
- if (languageMode === "all") {
434
- languages = ["*"];
435
- }
436
- else if (languageMode === "multiple") {
437
- languages = selectedLanguages;
438
- }
439
- else {
440
- languages = [language];
441
- }
442
- const requestItems = languageMode === "single"
443
- ? items.map((item) => ({
444
- ...item,
445
- descriptor: {
446
- ...item.descriptor,
447
- language,
448
- },
449
- }))
450
- : items;
352
+ const languages = languageMode === "all" ? ["*"] : selectedLanguages;
353
+ const requestItems = items;
451
354
  const requiredApprovalsNum = requiredApprovals
452
355
  ? parseInt(requiredApprovals, 10)
453
356
  : 1;
@@ -504,7 +407,7 @@ Homepage and Navigation Content Review
504
407
  setSentInvitationCount(0);
505
408
  setSentInvitationEmails([]);
506
409
  }
507
- setStep("success");
410
+ setShowSuccess(true);
508
411
  }
509
412
  else {
510
413
  setError("Failed to create review");
@@ -653,16 +556,31 @@ Homepage and Navigation Content Review
653
556
  };
654
557
  const languageSummary = languageMode === "all"
655
558
  ? "All languages"
656
- : languageMode === "multiple"
657
- ? `${selectedLanguages.length} selected (${selectedLanguages.join(", ")})`
658
- : language;
659
- 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"
660
- ? "Review Created"
661
- : step === "confirm"
662
- ? "Confirm Review"
663
- : "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 })), step === "success" && (_jsx(CreateReviewSuccessStep, { sentInvitationCount: sentInvitationCount, sentInvitationEmails: sentInvitationEmails }))] }), step === "confirm" && error && (_jsx("div", { className: "border-border-default shrink-0 border-t bg-white px-6 py-3", children: _jsx("div", { role: "alert", 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, 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: () => {
664
- setError(null);
665
- setStep("details");
666
- }, 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" }))] })] })] }) }));
559
+ : `${selectedLanguages.length} selected (${selectedLanguages.join(", ")})`;
560
+ const renderStepContent = (stepId) => {
561
+ switch (stepId) {
562
+ case "items":
563
+ return (_jsx(CreateReviewItemsStep, { items: items, language: language, rootItemIds: rootItemIds, selectedInTree: selectedInTree, setSelectedInTree: setSelectedInTree, selectedFromList: selectedFromList, setSelectedFromList: setSelectedFromList, addToList: addToList, removeFromList: removeFromList, handleAddItem: handleAddItem, removeItem: removeItem, toggleSubitems: toggleSubitems }));
564
+ case "reviewers":
565
+ return (_jsx(CreateReviewReviewersStep, { items: items, itemIds: itemIds, language: language, reviewers: reviewers, setReviewers: setReviewers, newReviewer: newReviewer, setNewReviewer: setNewReviewer, addReviewer: addReviewer, removeReviewer: removeReviewer, isValidEmail: isValidEmail, emailAlreadyExists: emailAlreadyExists }));
566
+ case "languages":
567
+ return (_jsx(CreateReviewLanguagesStep, { selectedLanguages: selectedLanguages, setSelectedLanguages: setSelectedLanguages, itemLanguages: editContext?.itemLanguages || [] }));
568
+ case "settings":
569
+ return (_jsx(CreateReviewSettingsStep, { reviewers: reviewers, 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 }));
570
+ case "confirm":
571
+ return (_jsx(CreateReviewConfirmStep, { title: title, setTitle: setTitle, isGeneratingTitle: isGeneratingTitle, languageSummary: languageSummary, reviewers: reviewers, items: items, requiredApprovals: requiredApprovals, updateWorkflowOnCompletion: updateWorkflowOnCompletion, expirationDays: expirationDays, showSecretFields: showSecretFields }));
572
+ }
573
+ };
574
+ return (_jsx(Dialog, { open: open, onOpenChange: handleDialogOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[900px] min-h-0 max-w-5xl flex-col overflow-visible", "data-testid": "create-review-dialog", onPointerDownOutside: (e) => e.preventDefault(), "aria-describedby": "create-review-wizard-description", style: {
575
+ width: "min(90vw, 1280px)",
576
+ height: "min(85vh, 900px)",
577
+ }, children: [_jsx(StyledDialogTitle, { icon: showSuccess ? (_jsx(CheckCircle2, { strokeWidth: 1 })) : (_jsx(ClipboardCheck, { strokeWidth: 1 })), title: showSuccess ? "Review Created" : `Create Review · ${currentStep.name}`, subtitle: showSuccess
578
+ ? "Invitation emails have been sent"
579
+ : currentStep.description }), _jsx("div", { id: "create-review-wizard-description", className: "sr-only", children: currentStep.description }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", "data-testid": "create-review-step-content", children: showSuccess ? (_jsx(CreateReviewSuccessStep, { sentInvitationCount: sentInvitationCount, sentInvitationEmails: sentInvitationEmails })) : (_jsx("div", { className: "relative h-full", children: WIZARD_STEPS.map((step, index) => {
580
+ const isActive = index === stepIndex;
581
+ return (_jsx("div", { className: "h-full", style: { display: isActive ? "block" : "none" }, "aria-hidden": !isActive, "data-testid": `step-content-${step.id}`, children: renderStepContent(step.id) }, step.id));
582
+ }) })) }), !showSuccess && error && (_jsx("div", { className: "border-border-default shrink-0 border-t bg-white px-6 py-3", children: _jsx("div", { role: "alert", 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 })] }) }) })), _jsx(DialogButtons, { "data-testid": "create-review-dialog-buttons", className: "rounded-b-2xl", children: showSuccess ? (_jsx(Button, { onClick: handleDone, className: "min-w-[120px] shadow-sm", children: "Done" })) : (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: handleDialogCancel, disabled: loading, className: "w-auto min-w-24 flex-none", "data-testid": "create-review-cancel-button", children: "Cancel" }), _jsxs("div", { className: "ml-auto flex min-w-0 flex-wrap items-center justify-end gap-3", children: [stepIndex > 0 && (_jsx(Button, { onClick: handlePrevious, variant: "outline", disabled: loading, className: "w-auto min-w-32 flex-none", "data-testid": "create-review-previous-button", children: "Previous" })), _jsx(Button, { onClick: handleNext, disabled: !canProceed || loading, className: "w-auto min-w-40 flex-none gap-2 shadow-sm", "data-testid": isLastStep
583
+ ? "create-review-submit-button"
584
+ : "create-review-next-button", children: isLastStep ? (loading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Creating..."] })) : ("Create & Send Emails")) : (_jsxs(_Fragment, { children: [nextStep?.nextButtonLabel ?? "Next", _jsx(ArrowRight, { className: "h-4 w-4", strokeWidth: 2 })] })) })] })] })) })] }), !showSuccess && (_jsx(StepIndicatorDots, { steps: WIZARD_STEPS, currentStepIndex: stepIndex }))] }) }));
667
585
  }
668
586
  //# sourceMappingURL=CreateReviewDialog.js.map