@parhelia/core 0.3.12831 → 0.3.12832
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/agent-changes/agentChangeTargets.d.ts +58 -0
- package/dist/editor/agent-changes/agentChangeTargets.js +174 -0
- package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -0
- package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +57 -0
- package/dist/editor/agent-changes/agentChangeTextHighlight.js +109 -0
- package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -0
- package/dist/editor/ai/activityRowNavigation.d.ts +28 -0
- package/dist/editor/ai/activityRowNavigation.js +53 -0
- package/dist/editor/ai/activityRowNavigation.js.map +1 -0
- package/dist/editor/ai/terminal/activeReasoningModel.d.ts +9 -0
- package/dist/editor/ai/terminal/activeReasoningModel.js +20 -0
- package/dist/editor/ai/terminal/activeReasoningModel.js.map +1 -0
- package/dist/editor/ai/terminal/agentDurations.d.ts +27 -0
- package/dist/editor/ai/terminal/agentDurations.js +89 -0
- package/dist/editor/ai/terminal/agentDurations.js.map +1 -0
- package/dist/editor/ai/terminal/agentTurnTiming.d.ts +35 -0
- package/dist/editor/ai/terminal/agentTurnTiming.js +128 -0
- package/dist/editor/ai/terminal/agentTurnTiming.js.map +1 -0
- package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.d.ts +9 -0
- package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.js +75 -0
- package/dist/editor/ai/terminal/components/AgentMemorySettingsSection.js.map +1 -0
- package/dist/editor/ai/terminal/components/AgentProfileRecovery.d.ts +10 -0
- package/dist/editor/ai/terminal/components/AgentProfileRecovery.js +12 -0
- package/dist/editor/ai/terminal/components/AgentProfileRecovery.js.map +1 -0
- package/dist/editor/ai/terminal/components/CreateItemToolCallContent.d.ts +3 -0
- package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +47 -0
- package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -0
- package/dist/editor/ai/terminal/components/ResponseTurnDuration.d.ts +15 -0
- package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +63 -0
- package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -0
- package/dist/editor/ai/terminal/components/toolCallResultJson.d.ts +1 -0
- package/dist/editor/ai/terminal/components/toolCallResultJson.js +46 -0
- package/dist/editor/ai/terminal/components/toolCallResultJson.js.map +1 -0
- package/dist/editor/ai/terminal/reasoningEffortLevels.d.ts +8 -0
- package/dist/editor/ai/terminal/reasoningEffortLevels.js +54 -0
- package/dist/editor/ai/terminal/reasoningEffortLevels.js.map +1 -0
- package/dist/editor/ai/terminal/requestUsage.d.ts +3 -0
- package/dist/editor/ai/terminal/requestUsage.js +22 -0
- package/dist/editor/ai/terminal/requestUsage.js.map +1 -0
- package/dist/editor/ai/terminal/useAgentProviderWait.d.ts +18 -0
- package/dist/editor/ai/terminal/useAgentProviderWait.js +23 -0
- package/dist/editor/ai/terminal/useAgentProviderWait.js.map +1 -0
- package/dist/editor/ai/terminal/useAgentReasoningEffortState.d.ts +5 -0
- package/dist/editor/ai/terminal/useAgentReasoningEffortState.js +10 -0
- package/dist/editor/ai/terminal/useAgentReasoningEffortState.js.map +1 -0
- package/dist/editor/bridge/bridgeKeys.d.ts +5 -0
- package/dist/editor/bridge/bridgeKeys.js +8 -0
- package/dist/editor/bridge/bridgeKeys.js.map +1 -0
- package/dist/editor/client/SessionsDialog.d.ts +2 -0
- package/dist/editor/client/SessionsDialog.js +27 -0
- package/dist/editor/client/SessionsDialog.js.map +1 -0
- package/dist/editor/client/agentLoadItemPolicy.d.ts +22 -0
- package/dist/editor/client/agentLoadItemPolicy.js +60 -0
- package/dist/editor/client/agentLoadItemPolicy.js.map +1 -0
- package/dist/editor/client/localUserEditActivity.d.ts +3 -0
- package/dist/editor/client/localUserEditActivity.js +12 -0
- package/dist/editor/client/localUserEditActivity.js.map +1 -0
- package/dist/editor/commands/mediaCommands.d.ts +5 -0
- package/dist/editor/commands/mediaCommands.js +59 -0
- package/dist/editor/commands/mediaCommands.js.map +1 -0
- package/dist/editor/componentVisualMode.d.ts +14 -0
- package/dist/editor/componentVisualMode.js +43 -0
- package/dist/editor/componentVisualMode.js.map +1 -0
- package/dist/editor/field-types/FieldHistoryBoundary.d.ts +7 -0
- package/dist/editor/field-types/FieldHistoryBoundary.js +19 -0
- package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -0
- package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +18 -0
- package/dist/editor/field-types/richtext/utils/changeHighlight.js +57 -0
- package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -0
- package/dist/editor/itemContextMenuGroups.d.ts +16 -0
- package/dist/editor/itemContextMenuGroups.js +48 -0
- package/dist/editor/itemContextMenuGroups.js.map +1 -0
- package/dist/editor/media-selector/UploadMediaFileDialog.d.ts +5 -0
- package/dist/editor/media-selector/UploadMediaFileDialog.js +14 -0
- package/dist/editor/media-selector/UploadMediaFileDialog.js.map +1 -0
- package/dist/editor/menubar/OpenPublishedPageButton.d.ts +1 -0
- package/dist/editor/menubar/OpenPublishedPageButton.js +22 -0
- package/dist/editor/menubar/OpenPublishedPageButton.js.map +1 -0
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +20 -0
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +31 -0
- package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -0
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +33 -0
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +290 -0
- package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -0
- package/dist/editor/page-editor-chrome/diffRulerSegments.d.ts +18 -0
- package/dist/editor/page-editor-chrome/diffRulerSegments.js +37 -0
- package/dist/editor/page-editor-chrome/diffRulerSegments.js.map +1 -0
- package/dist/editor/page-viewer/PreviewModeNotice.d.ts +7 -0
- package/dist/editor/page-viewer/PreviewModeNotice.js +19 -0
- package/dist/editor/page-viewer/PreviewModeNotice.js.map +1 -0
- package/dist/editor/page-viewer/previewEditAttempt.d.ts +31 -0
- package/dist/editor/page-viewer/previewEditAttempt.js +68 -0
- package/dist/editor/page-viewer/previewEditAttempt.js.map +1 -0
- package/dist/editor/services/migrationService.d.ts +31 -0
- package/dist/editor/services/migrationService.js +22 -0
- package/dist/editor/services/migrationService.js.map +1 -0
- package/dist/editor/services/publicSiteService.d.ts +40 -0
- package/dist/editor/services/publicSiteService.js +5 -0
- package/dist/editor/services/publicSiteService.js.map +1 -0
- package/dist/editor/settings/MigrationJournalCard.d.ts +12 -0
- package/dist/editor/settings/MigrationJournalCard.js +114 -0
- package/dist/editor/settings/MigrationJournalCard.js.map +1 -0
- package/dist/editor/settings/panels/PublicSiteEntryDialog.d.ts +8 -0
- package/dist/editor/settings/panels/PublicSiteEntryDialog.js +113 -0
- package/dist/editor/settings/panels/PublicSiteEntryDialog.js.map +1 -0
- package/dist/editor/settings/panels/PublicSitesPanel.d.ts +1 -0
- package/dist/editor/settings/panels/PublicSitesPanel.js +153 -0
- package/dist/editor/settings/panels/PublicSitesPanel.js.map +1 -0
- package/dist/editor/settings/panels/publicSiteHelpers.d.ts +6 -0
- package/dist/editor/settings/panels/publicSiteHelpers.js +30 -0
- package/dist/editor/settings/panels/publicSiteHelpers.js.map +1 -0
- package/dist/editor/sidebar/OperationDetailsContent.d.ts +14 -0
- package/dist/editor/sidebar/OperationDetailsContent.js +521 -0
- package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -0
- package/dist/editor/sidebar/liveComponentThumbnails.d.ts +53 -0
- package/dist/editor/sidebar/liveComponentThumbnails.js +204 -0
- package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -0
- package/dist/editor/ui/PublishReadinessSummary.d.ts +12 -0
- package/dist/editor/ui/PublishReadinessSummary.js +34 -0
- package/dist/editor/ui/PublishReadinessSummary.js.map +1 -0
- package/dist/editor/ui/publishReadiness.d.ts +98 -0
- package/dist/editor/ui/publishReadiness.js +307 -0
- package/dist/editor/ui/publishReadiness.js.map +1 -0
- package/dist/editor/ui/usePublishingItem.d.ts +8 -0
- package/dist/editor/ui/usePublishingItem.js +47 -0
- package/dist/editor/ui/usePublishingItem.js.map +1 -0
- package/dist/editor/utils/linkDisplay.d.ts +12 -0
- package/dist/editor/utils/linkDisplay.js +23 -0
- package/dist/editor/utils/linkDisplay.js.map +1 -0
- package/dist/editor/validation/ValidationIssuesPopover.d.ts +39 -0
- package/dist/editor/validation/ValidationIssuesPopover.js +51 -0
- package/dist/editor/validation/ValidationIssuesPopover.js.map +1 -0
- package/dist/editor/validation/navigateToValidationIssue.d.ts +13 -0
- package/dist/editor/validation/navigateToValidationIssue.js +43 -0
- package/dist/editor/validation/navigateToValidationIssue.js.map +1 -0
- package/dist/editor/validation/validationFixAgent.d.ts +26 -0
- package/dist/editor/validation/validationFixAgent.js +124 -0
- package/dist/editor/validation/validationFixAgent.js.map +1 -0
- package/dist/editor/validation/validationSeverity.d.ts +15 -0
- package/dist/editor/validation/validationSeverity.js +47 -0
- package/dist/editor/validation/validationSeverity.js.map +1 -0
- package/dist/lib/viewportClip.d.ts +18 -0
- package/dist/lib/viewportClip.js +22 -0
- package/dist/lib/viewportClip.js.map +1 -0
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/task-board/components/ProjectProgressIndicator.d.ts +8 -0
- package/dist/task-board/components/ProjectProgressIndicator.js +17 -0
- package/dist/task-board/components/ProjectProgressIndicator.js.map +1 -0
- package/dist/task-board/components/commentAuthor.d.ts +14 -0
- package/dist/task-board/components/commentAuthor.js +25 -0
- package/dist/task-board/components/commentAuthor.js.map +1 -0
- package/dist/task-board/utils/projectDashboardModel.d.ts +68 -0
- package/dist/task-board/utils/projectDashboardModel.js +355 -0
- package/dist/task-board/utils/projectDashboardModel.js.map +1 -0
- package/dist/task-board/views/ProjectDashboardView.d.ts +28 -0
- package/dist/task-board/views/ProjectDashboardView.js +316 -0
- package/dist/task-board/views/ProjectDashboardView.js.map +1 -0
- package/dist/tour/TourInputBoundary.d.ts +6 -0
- package/dist/tour/TourInputBoundary.js +82 -0
- package/dist/tour/TourInputBoundary.js.map +1 -0
- package/dist/tour/sandbox-tour.js +5 -3
- package/dist/tour/sandbox-tour.js.map +1 -1
- package/dist/tour/tour-utils.d.ts +6 -0
- package/dist/tour/tour-utils.js +10 -0
- package/dist/tour/tour-utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
export function isReadyToPublish(item) {
|
|
2
|
+
return item.isPublishable && !item.isPublished;
|
|
3
|
+
}
|
|
4
|
+
export function classifyPublishStatus(status) {
|
|
5
|
+
const normalized = status.trim().toLowerCase();
|
|
6
|
+
if (normalized === "published")
|
|
7
|
+
return { outcome: "published", impact: "none" };
|
|
8
|
+
if (normalized.startsWith("item is not yet published") ||
|
|
9
|
+
normalized.startsWith("language version is not yet published.")) {
|
|
10
|
+
return { outcome: "pending", impact: "never-published" };
|
|
11
|
+
}
|
|
12
|
+
if (normalized.startsWith("version is not yet published: currently published version:") ||
|
|
13
|
+
normalized.startsWith("version is not yet published. published revision:") ||
|
|
14
|
+
normalized.startsWith("published item has a different name:")) {
|
|
15
|
+
return { outcome: "pending", impact: "stale" };
|
|
16
|
+
}
|
|
17
|
+
if (normalized.startsWith("item has no valid version, but version")) {
|
|
18
|
+
return { outcome: "will-not-publish", impact: "stale" };
|
|
19
|
+
}
|
|
20
|
+
if (normalized.startsWith("this item has no valid version and will not be published.")) {
|
|
21
|
+
return { outcome: "will-not-publish", impact: "never-published" };
|
|
22
|
+
}
|
|
23
|
+
if (normalized.startsWith("this version is still published even though it is not the valid version.") ||
|
|
24
|
+
normalized.startsWith("this version will not be published. valid version is")) {
|
|
25
|
+
const match = status.match(/valid version is (\d+)/i);
|
|
26
|
+
return {
|
|
27
|
+
outcome: "will-not-publish",
|
|
28
|
+
impact: "other-version",
|
|
29
|
+
...(match ? { validVersion: Number(match[1]) } : {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return { outcome: "unknown", impact: "unknown" };
|
|
33
|
+
}
|
|
34
|
+
const matchStatus = (status, pattern) => status.trim().match(pattern);
|
|
35
|
+
/**
|
|
36
|
+
* Turns a canonical Sitecore publish status into a short badge label plus an
|
|
37
|
+
* optional detail line, so the table stays scannable and the specifics
|
|
38
|
+
* (published revision, currently published version, valid version, published
|
|
39
|
+
* name) move into a tooltip. Unknown statuses are shown verbatim.
|
|
40
|
+
*/
|
|
41
|
+
export function describePublishStatus(status) {
|
|
42
|
+
const normalized = status.trim().toLowerCase();
|
|
43
|
+
let match;
|
|
44
|
+
if (normalized === "published")
|
|
45
|
+
return { label: "Published" };
|
|
46
|
+
if (normalized === "item is not yet published")
|
|
47
|
+
return { label: "Not yet published" };
|
|
48
|
+
if (normalized === "language version is not yet published.")
|
|
49
|
+
return {
|
|
50
|
+
label: "Not yet published",
|
|
51
|
+
detail: "This language version has never been published.",
|
|
52
|
+
};
|
|
53
|
+
if ((match = matchStatus(status, /^version is not yet published: currently published version: (\d+)/i)))
|
|
54
|
+
return {
|
|
55
|
+
label: "Not yet published",
|
|
56
|
+
detail: `Version ${match[1]} is currently published.`,
|
|
57
|
+
};
|
|
58
|
+
if ((match = matchStatus(status, /^version is not yet published\. published revision: (\S+)/i)))
|
|
59
|
+
return {
|
|
60
|
+
label: "Changes not published",
|
|
61
|
+
detail: `An earlier revision of this version is live. Published revision: ${match[1]}`,
|
|
62
|
+
};
|
|
63
|
+
if ((match = matchStatus(status, /^published item has a different name: (.+)$/i)))
|
|
64
|
+
return {
|
|
65
|
+
label: "Name changed",
|
|
66
|
+
detail: `The published item is still named "${(match[1] ?? "").trim()}".`,
|
|
67
|
+
};
|
|
68
|
+
if ((match = matchStatus(status, /^item has no valid version, but version (\d+) is still published/i)))
|
|
69
|
+
return {
|
|
70
|
+
label: "No valid version",
|
|
71
|
+
detail: `Version ${match[1]} is still published. Check the publish restrictions.`,
|
|
72
|
+
};
|
|
73
|
+
if (normalized.startsWith("this item has no valid version and will not be published"))
|
|
74
|
+
return {
|
|
75
|
+
label: "Will not publish",
|
|
76
|
+
detail: "No valid version. Check the publish restrictions.",
|
|
77
|
+
};
|
|
78
|
+
if ((match = matchStatus(status, /^this version is still published even though it is not the valid version\. valid version is (\d+)/i)))
|
|
79
|
+
return {
|
|
80
|
+
label: "Not the valid version",
|
|
81
|
+
detail: `This version is still published, but version ${match[1]} is the valid version.`,
|
|
82
|
+
};
|
|
83
|
+
if ((match = matchStatus(status, /^this version will not be published\. valid version is (\d+)/i)))
|
|
84
|
+
return {
|
|
85
|
+
label: "Will not publish",
|
|
86
|
+
detail: `Version ${match[1]} is the valid version, not this one.`,
|
|
87
|
+
};
|
|
88
|
+
return { label: status.trim() };
|
|
89
|
+
}
|
|
90
|
+
function normalizeDescriptorId(id) {
|
|
91
|
+
return (id ?? "").replace(/[{}]/g, "").toLowerCase();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compares descriptors the way the workbox does: ids without braces and
|
|
95
|
+
* case-insensitive, languages case-insensitive. A version of 0/undefined means
|
|
96
|
+
* "latest" (the editor keeps the *requested* descriptor when an item is opened
|
|
97
|
+
* from the tree) and matches any concrete version of that item.
|
|
98
|
+
*/
|
|
99
|
+
export function isSameDescriptor(a, b) {
|
|
100
|
+
return (normalizeDescriptorId(a.id) === normalizeDescriptorId(b.id) &&
|
|
101
|
+
(a.language ?? "").toLowerCase() === (b.language ?? "").toLowerCase() &&
|
|
102
|
+
(!a.version || !b.version || a.version === b.version));
|
|
103
|
+
}
|
|
104
|
+
/** The workbox row for the item currently open in the editor, if listed. */
|
|
105
|
+
export function findCurrentWorkboxItem(workboxItems, currentItem) {
|
|
106
|
+
return currentItem
|
|
107
|
+
? workboxItems.find((item) => isSameDescriptor(item.item, currentItem))
|
|
108
|
+
: undefined;
|
|
109
|
+
}
|
|
110
|
+
const compareText = (left, right) => (left ?? "").localeCompare(right ?? "", undefined, {
|
|
111
|
+
sensitivity: "base",
|
|
112
|
+
numeric: true,
|
|
113
|
+
});
|
|
114
|
+
/**
|
|
115
|
+
* Display order for the Publish dialog: the current item stays first, then the
|
|
116
|
+
* related items grouped by template name and ordered by item path, so media,
|
|
117
|
+
* layouts and datasources cluster together instead of following the link
|
|
118
|
+
* database's order. Returns a new array; the input is left untouched.
|
|
119
|
+
*/
|
|
120
|
+
export function sortWorkboxItemsForPublish(workboxItems, currentItem) {
|
|
121
|
+
const isCurrent = (item) => !!currentItem && isSameDescriptor(item.item, currentItem);
|
|
122
|
+
return [...workboxItems].sort((left, right) => Number(isCurrent(right)) - Number(isCurrent(left)) ||
|
|
123
|
+
compareText(left.templateName, right.templateName) ||
|
|
124
|
+
compareText(left.path, right.path) ||
|
|
125
|
+
compareText(left.name, right.name) ||
|
|
126
|
+
compareText(left.item.language, right.item.language) ||
|
|
127
|
+
(left.item.version ?? 0) - (right.item.version ?? 0));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Counts the validation issues that affect the listed workbox items. The
|
|
131
|
+
* server only reports failing validators, so every result is an issue; a
|
|
132
|
+
* page's entry also carries results for its embedded components, which are
|
|
133
|
+
* counted with the page.
|
|
134
|
+
*/
|
|
135
|
+
export function getPublishValidationSummary(workboxItems, validationResults) {
|
|
136
|
+
if (!validationResults?.length)
|
|
137
|
+
return { itemCount: 0, issueCount: 0 };
|
|
138
|
+
return workboxItems.reduce((summary, item) => {
|
|
139
|
+
const issueCount = validationResults
|
|
140
|
+
.filter((result) => isSameDescriptor(result.item, item.item))
|
|
141
|
+
.reduce((count, result) => count + result.results.length, 0);
|
|
142
|
+
return issueCount
|
|
143
|
+
? {
|
|
144
|
+
itemCount: summary.itemCount + 1,
|
|
145
|
+
issueCount: summary.issueCount + issueCount,
|
|
146
|
+
}
|
|
147
|
+
: summary;
|
|
148
|
+
}, { itemCount: 0, issueCount: 0 });
|
|
149
|
+
}
|
|
150
|
+
/** True when `path` lies strictly below `rootPath` (Sitecore paths are case-insensitive). */
|
|
151
|
+
export function isDescendantPath(path, rootPath) {
|
|
152
|
+
if (!path || !rootPath)
|
|
153
|
+
return false;
|
|
154
|
+
const root = rootPath.toLowerCase();
|
|
155
|
+
const prefix = root.endsWith("/") ? root : `${root}/`;
|
|
156
|
+
return path.toLowerCase() !== root && path.toLowerCase().startsWith(prefix);
|
|
157
|
+
}
|
|
158
|
+
const impactSeverity = {
|
|
159
|
+
none: 0,
|
|
160
|
+
unknown: 1,
|
|
161
|
+
"other-version": 2,
|
|
162
|
+
stale: 3,
|
|
163
|
+
"never-published": 4,
|
|
164
|
+
};
|
|
165
|
+
function getItemReadiness(item, blockedByWorkflow) {
|
|
166
|
+
const targets = Object.entries(item.publishStatus).map(([target, status]) => ({
|
|
167
|
+
target,
|
|
168
|
+
...classifyPublishStatus(status),
|
|
169
|
+
}));
|
|
170
|
+
const unpublished = targets.filter((target) => target.outcome !== "published");
|
|
171
|
+
const restricted = targets.filter((target) => target.outcome === "will-not-publish");
|
|
172
|
+
const worst = unpublished.reduce((result, target) => !result || impactSeverity[target.impact] > impactSeverity[result.impact]
|
|
173
|
+
? target
|
|
174
|
+
: result, undefined);
|
|
175
|
+
const restriction = restricted.reduce((result, target) => !result || impactSeverity[target.impact] > impactSeverity[result.impact]
|
|
176
|
+
? target
|
|
177
|
+
: result, undefined);
|
|
178
|
+
const reason = blockedByWorkflow
|
|
179
|
+
? { kind: "workflow", workflowState: item.workflowState }
|
|
180
|
+
: restriction
|
|
181
|
+
? restriction.impact === "other-version"
|
|
182
|
+
? { kind: "not-valid-version", validVersion: restriction.validVersion }
|
|
183
|
+
: { kind: "no-valid-version" }
|
|
184
|
+
: undefined;
|
|
185
|
+
return {
|
|
186
|
+
reason,
|
|
187
|
+
impact: worst?.impact ?? (targets.length ? "none" : "unknown"),
|
|
188
|
+
validVersion: worst?.validVersion,
|
|
189
|
+
affectedTargets: (blockedByWorkflow ? unpublished : restricted).map(({ target }) => target),
|
|
190
|
+
targetCount: targets.length,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
export function getPublishReadiness({ workboxItems, currentItem, pagePath, includeSubitems, }) {
|
|
194
|
+
const coveredBySubitems = (item) => includeSubitems &&
|
|
195
|
+
(item.item.language || currentItem?.language) === currentItem?.language &&
|
|
196
|
+
isDescendantPath(item.path, pagePath);
|
|
197
|
+
// Preserve the existing batch even when a target warns: other targets may
|
|
198
|
+
// still need publishing, or Sitecore may publish the valid version instead.
|
|
199
|
+
const batchDescriptors = workboxItems
|
|
200
|
+
.filter(isReadyToPublish)
|
|
201
|
+
.filter((item) => !coveredBySubitems(item))
|
|
202
|
+
.map((item) => ({
|
|
203
|
+
...item.item,
|
|
204
|
+
language: item.item.language || currentItem?.language,
|
|
205
|
+
}))
|
|
206
|
+
.filter((descriptor) => !!descriptor.language &&
|
|
207
|
+
(!currentItem ||
|
|
208
|
+
!isSameDescriptor(descriptor, currentItem)));
|
|
209
|
+
const page = findCurrentWorkboxItem(workboxItems, currentItem);
|
|
210
|
+
const blockedByWorkflow = !!page?.workflowState && !page.isPublishable;
|
|
211
|
+
const currentPage = page
|
|
212
|
+
? {
|
|
213
|
+
item: page,
|
|
214
|
+
blockedByWorkflow,
|
|
215
|
+
...getItemReadiness(page, blockedByWorkflow),
|
|
216
|
+
}
|
|
217
|
+
: undefined;
|
|
218
|
+
const entries = workboxItems
|
|
219
|
+
.filter((item) => !currentItem || !isSameDescriptor(item.item, currentItem))
|
|
220
|
+
.map((item) => {
|
|
221
|
+
const details = getItemReadiness(item, !item.isPublishable);
|
|
222
|
+
const category = item.isPublished
|
|
223
|
+
? "already-published"
|
|
224
|
+
: !item.isPublishable
|
|
225
|
+
? "blocked-by-workflow"
|
|
226
|
+
: details.reason
|
|
227
|
+
? "will-not-publish"
|
|
228
|
+
: coveredBySubitems(item)
|
|
229
|
+
? "covered-by-subitems"
|
|
230
|
+
: "will-publish";
|
|
231
|
+
const descriptor = {
|
|
232
|
+
...item.item,
|
|
233
|
+
language: item.item.language || currentItem?.language,
|
|
234
|
+
};
|
|
235
|
+
return {
|
|
236
|
+
item,
|
|
237
|
+
// Matches WorkboxItemsTable's row key; a future Show action can use it.
|
|
238
|
+
key: [
|
|
239
|
+
item.item.id?.toLowerCase(),
|
|
240
|
+
item.item.language?.toLowerCase(),
|
|
241
|
+
item.item.version ?? 0,
|
|
242
|
+
item.item.database?.toLowerCase() ?? "",
|
|
243
|
+
].join("|"),
|
|
244
|
+
category,
|
|
245
|
+
inBatch: isReadyToPublish(item) &&
|
|
246
|
+
!coveredBySubitems(item) &&
|
|
247
|
+
!!descriptor.language &&
|
|
248
|
+
(!currentItem ||
|
|
249
|
+
!isSameDescriptor(descriptor, currentItem)),
|
|
250
|
+
...details,
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
currentPage,
|
|
255
|
+
entries,
|
|
256
|
+
batchDescriptors,
|
|
257
|
+
leftBehind: entries.filter((entry) => entry.category === "blocked-by-workflow" ||
|
|
258
|
+
entry.category === "will-not-publish"),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
export function getPublishReasonText(reason, affectedTargets, targetCount) {
|
|
262
|
+
const prefix = targetCount > 1 && affectedTargets.length
|
|
263
|
+
? `On ${affectedTargets.join(", ")}: `
|
|
264
|
+
: "";
|
|
265
|
+
switch (reason.kind) {
|
|
266
|
+
case "workflow":
|
|
267
|
+
return (prefix +
|
|
268
|
+
(reason.workflowState
|
|
269
|
+
? `In workflow state "${reason.workflowState}".`
|
|
270
|
+
: "Not in a final workflow state."));
|
|
271
|
+
case "no-valid-version":
|
|
272
|
+
return prefix + "No valid version. Check its publish restrictions.";
|
|
273
|
+
case "not-valid-version":
|
|
274
|
+
return (prefix +
|
|
275
|
+
(reason.validVersion !== undefined
|
|
276
|
+
? `Version ${reason.validVersion} is the valid version, not this one.`
|
|
277
|
+
: "Not the valid version."));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export function getPublishImpactText(impact, validVersion) {
|
|
281
|
+
switch (impact) {
|
|
282
|
+
case "never-published":
|
|
283
|
+
return "Visitors will see nothing for this item until it is published.";
|
|
284
|
+
case "stale":
|
|
285
|
+
return "Visitors will still see the previous version.";
|
|
286
|
+
case "other-version":
|
|
287
|
+
return validVersion !== undefined
|
|
288
|
+
? `Visitors will see version ${validVersion} instead.`
|
|
289
|
+
: "Visitors will see a different version.";
|
|
290
|
+
default:
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
export function getPublishReadinessHeadline(readiness) {
|
|
295
|
+
const count = readiness.leftBehind.length;
|
|
296
|
+
const related = `${count} related item${count === 1 ? "" : "s"}`;
|
|
297
|
+
if (readiness.currentPage?.blockedByWorkflow)
|
|
298
|
+
return count
|
|
299
|
+
? `This page cannot be published yet, and ${related} cannot either.`
|
|
300
|
+
: "This page cannot be published yet.";
|
|
301
|
+
if (readiness.currentPage?.reason)
|
|
302
|
+
return count
|
|
303
|
+
? `This page will not go live as it is, and ${related} cannot publish.`
|
|
304
|
+
: "This page will not go live as it is.";
|
|
305
|
+
return count ? `This page can publish, but ${related} cannot.` : undefined;
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=publishReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishReadiness.js","sourceRoot":"","sources":["../../../src/editor/ui/publishReadiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FullItem } from "../pageModel";
|
|
2
|
+
/** Resolve the owner before showing publish options or allowing a publish. */
|
|
3
|
+
export declare function usePublishingItem(source: FullItem | undefined): {
|
|
4
|
+
item: FullItem | undefined;
|
|
5
|
+
isLoading: boolean;
|
|
6
|
+
error: string | undefined;
|
|
7
|
+
isEmbedded: boolean;
|
|
8
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { useEditContext } from "../client/editContext";
|
|
3
|
+
/** Resolve the owner before showing publish options or allowing a publish. */
|
|
4
|
+
export function usePublishingItem(source) {
|
|
5
|
+
const editContext = useEditContext();
|
|
6
|
+
const repository = editContext?.itemsRepository;
|
|
7
|
+
const mainItemId = source?.mainItemId;
|
|
8
|
+
const isEmbedded = !!mainItemId &&
|
|
9
|
+
mainItemId.replace(/[{}]/g, "").toLowerCase() !==
|
|
10
|
+
source?.id.replace(/[{}]/g, "").toLowerCase();
|
|
11
|
+
const [resolved, setResolved] = useState();
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!isEmbedded || !source || !repository)
|
|
14
|
+
return;
|
|
15
|
+
let cancelled = false;
|
|
16
|
+
repository
|
|
17
|
+
.getItem({ ...source.descriptor, id: mainItemId })
|
|
18
|
+
.then((item) => {
|
|
19
|
+
if (!cancelled)
|
|
20
|
+
setResolved({
|
|
21
|
+
source,
|
|
22
|
+
item,
|
|
23
|
+
error: item
|
|
24
|
+
? undefined
|
|
25
|
+
: "Failed to load the main item for publishing.",
|
|
26
|
+
});
|
|
27
|
+
})
|
|
28
|
+
.catch(() => {
|
|
29
|
+
if (!cancelled)
|
|
30
|
+
setResolved({
|
|
31
|
+
source,
|
|
32
|
+
error: "Failed to load the main item for publishing.",
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
cancelled = true;
|
|
37
|
+
};
|
|
38
|
+
}, [isEmbedded, source, mainItemId, repository]);
|
|
39
|
+
const current = resolved?.source === source ? resolved : undefined;
|
|
40
|
+
return {
|
|
41
|
+
item: isEmbedded ? current?.item : source,
|
|
42
|
+
isLoading: isEmbedded && !current,
|
|
43
|
+
error: isEmbedded ? current?.error : undefined,
|
|
44
|
+
isEmbedded,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=usePublishingItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePublishingItem.js","sourceRoot":"","sources":["../../../src/editor/ui/usePublishingItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,MAA4B;IAC5D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,WAAW,EAAE,eAAe,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,CAAC;IACtC,MAAM,UAAU,GACd,CAAC,CAAC,UAAU;QACZ,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;YAC3C,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAIpC,CAAC;IAEL,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;YAAE,OAAO;QAClD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,UAAU;aACP,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,UAAW,EAAE,CAAC;aAClD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,SAAS;gBACZ,WAAW,CAAC;oBACV,MAAM;oBACN,IAAI;oBACJ,KAAK,EAAE,IAAI;wBACT,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,8CAA8C;iBACnD,CAAC,CAAC;QACP,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,SAAS;gBACZ,WAAW,CAAC;oBACV,MAAM;oBACN,KAAK,EAAE,8CAA8C;iBACtD,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM;QACzC,SAAS,EAAE,UAAU,IAAI,CAAC,OAAO;QACjC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;QAC9C,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the URL shown for a general link field: the resolved target URL with
|
|
3
|
+
* the configured anchor appended as a fragment.
|
|
4
|
+
*
|
|
5
|
+
* The backend keeps `url` and `anchor` separate so the link dialog can edit
|
|
6
|
+
* them independently; this is the read-only composition of the two.
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatLinkDisplayUrl(value: {
|
|
9
|
+
url?: string | null;
|
|
10
|
+
anchor?: string | null;
|
|
11
|
+
type?: string;
|
|
12
|
+
}): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the URL shown for a general link field: the resolved target URL with
|
|
3
|
+
* the configured anchor appended as a fragment.
|
|
4
|
+
*
|
|
5
|
+
* The backend keeps `url` and `anchor` separate so the link dialog can edit
|
|
6
|
+
* them independently; this is the read-only composition of the two.
|
|
7
|
+
*/
|
|
8
|
+
export function formatLinkDisplayUrl(value) {
|
|
9
|
+
const url = value.url ?? "";
|
|
10
|
+
const anchor = (value.anchor ?? "").trim().replace(/^#/, "");
|
|
11
|
+
// Sitecore's own "anchor" link type stores the fragment name as the url.
|
|
12
|
+
if (value.type === "anchor") {
|
|
13
|
+
const name = anchor || url.replace(/^#/, "");
|
|
14
|
+
return name ? `#${name}` : "";
|
|
15
|
+
}
|
|
16
|
+
if (!anchor)
|
|
17
|
+
return url;
|
|
18
|
+
// Anchor-only links (url="#section") already carry their fragment.
|
|
19
|
+
if (url.includes("#"))
|
|
20
|
+
return url;
|
|
21
|
+
return `${url}#${anchor}`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=linkDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkDisplay.js","sourceRoot":"","sources":["../../../src/editor/utils/linkDisplay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAIpC;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE7D,yEAAyE;IACzE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,mEAAmE;IACnE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from "react";
|
|
2
|
+
import { PopoverContent } from "../../components/ui/popover";
|
|
3
|
+
import { SingleValidatorResult } from "../../types";
|
|
4
|
+
import { ItemDescriptor } from "../pageModel";
|
|
5
|
+
import { ValidationSeverity } from "./validationSeverity";
|
|
6
|
+
/** The coloured pill used as popover trigger on every surface. */
|
|
7
|
+
export declare const ValidationSeverityBadge: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children"> & {
|
|
8
|
+
severity: ValidationSeverity;
|
|
9
|
+
label: ReactNode;
|
|
10
|
+
}, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
11
|
+
export type ValidationIssuesPopoverProps = {
|
|
12
|
+
/** Issues to list; pass them pre-filtered (filterValidationIssues). */
|
|
13
|
+
issues: readonly SingleValidatorResult[];
|
|
14
|
+
/** The item the issues belong to. */
|
|
15
|
+
item: ItemDescriptor;
|
|
16
|
+
/** Scope of the list when it was opened from a single field. */
|
|
17
|
+
field?: {
|
|
18
|
+
fieldId: string;
|
|
19
|
+
fieldName?: string;
|
|
20
|
+
};
|
|
21
|
+
trigger: ReactNode;
|
|
22
|
+
open?: boolean;
|
|
23
|
+
onOpenChange?: (open: boolean) => void;
|
|
24
|
+
/** Show each issue's field name (item-scoped lists). */
|
|
25
|
+
showFieldName?: boolean;
|
|
26
|
+
/** Row click; when set, rows render as buttons. */
|
|
27
|
+
onSelectIssue?: (issue: SingleValidatorResult) => void | Promise<void>;
|
|
28
|
+
/** Footer "Show all validation results". Default: opens the sidebar. */
|
|
29
|
+
showAllAction?: boolean;
|
|
30
|
+
onShowAll?: () => void;
|
|
31
|
+
/** Called after any footer or row action fired (e.g. to close a dialog). */
|
|
32
|
+
onAction?: () => void;
|
|
33
|
+
side?: ComponentProps<typeof PopoverContent>["side"];
|
|
34
|
+
align?: ComponentProps<typeof PopoverContent>["align"];
|
|
35
|
+
sideOffset?: number;
|
|
36
|
+
collisionPadding?: number;
|
|
37
|
+
contentClassName?: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function ValidationIssuesPopover({ issues, item, field, trigger, open, onOpenChange, showFieldName, onSelectIssue, showAllAction, onShowAll, onAction, side, align, sideOffset, collisionPadding, contentClassName, }: ValidationIssuesPopoverProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { ListChecks, WandSparkles } from "lucide-react";
|
|
4
|
+
import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
|
|
5
|
+
import { cn } from "../../lib/utils";
|
|
6
|
+
import { useEditContext } from "../client/editContext";
|
|
7
|
+
import { hasAgentsPanel, openAiAgentForValidationIssues, } from "./validationFixAgent";
|
|
8
|
+
import { formatValidationIssueCount, getValidationSeverity, validationSeverityStyles, } from "./validationSeverity";
|
|
9
|
+
const footerButtonClassName = "hover:bg-neutral-grey-5 flex w-full items-center gap-2 rounded px-3 py-2 text-xs transition-colors";
|
|
10
|
+
/** The coloured pill used as popover trigger on every surface. */
|
|
11
|
+
export const ValidationSeverityBadge = forwardRef(function ValidationSeverityBadge({ severity, label, className, ...props }, ref) {
|
|
12
|
+
const style = validationSeverityStyles[severity];
|
|
13
|
+
const Icon = style.icon;
|
|
14
|
+
return (_jsxs("button", { ref: ref, type: "button", className: cn(style.badge, "inline-flex cursor-pointer items-center gap-1 rounded px-1 py-0.5 text-[10px] leading-none whitespace-nowrap transition-opacity hover:opacity-80", className), ...props, children: [_jsx(Icon, { className: "h-3 w-3 shrink-0", strokeWidth: 1.5 }), label] }));
|
|
15
|
+
});
|
|
16
|
+
export function ValidationIssuesPopover({ issues, item, field, trigger, open, onOpenChange, showFieldName, onSelectIssue, showAllAction = true, onShowAll, onAction, side = "bottom", align = "start", sideOffset, collisionPadding, contentClassName, }) {
|
|
17
|
+
const editContext = useEditContext();
|
|
18
|
+
const canFix = hasAgentsPanel(editContext) && issues.length > 0;
|
|
19
|
+
const close = () => onOpenChange?.(false);
|
|
20
|
+
const handleFix = () => {
|
|
21
|
+
const started = openAiAgentForValidationIssues({ item, issues, field }, editContext);
|
|
22
|
+
close();
|
|
23
|
+
if (started)
|
|
24
|
+
onAction?.();
|
|
25
|
+
};
|
|
26
|
+
const handleShowAll = () => {
|
|
27
|
+
if (onShowAll)
|
|
28
|
+
onShowAll();
|
|
29
|
+
else
|
|
30
|
+
editContext?.openSidebar("validation");
|
|
31
|
+
close();
|
|
32
|
+
onAction?.();
|
|
33
|
+
};
|
|
34
|
+
const handleSelect = (issue) => {
|
|
35
|
+
close();
|
|
36
|
+
onAction?.();
|
|
37
|
+
void onSelectIssue?.(issue);
|
|
38
|
+
};
|
|
39
|
+
return (_jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: trigger }), _jsxs(PopoverContent, { className: cn("w-80 max-w-[calc(100vw-2rem)] p-0", contentClassName), side: side, align: align, sideOffset: sideOffset, collisionPadding: collisionPadding, "data-testid": "validation-issues-popover",
|
|
40
|
+
// The content is portaled, but React still bubbles its clicks to the
|
|
41
|
+
// React parent (e.g. a clickable table row). Keep them here.
|
|
42
|
+
onClick: (event) => event.stopPropagation(), children: [_jsxs("div", { className: "border-neutral-grey-10 flex items-center justify-between border-b px-3 py-2", children: [_jsx("span", { className: "text-xs font-medium", children: "Validation" }), _jsx("span", { className: "text-neutral-grey-50 text-[10px]", children: formatValidationIssueCount(issues.length) })] }), _jsx("ul", { className: "max-h-72 overflow-y-auto p-1", children: issues.map((issue) => {
|
|
43
|
+
const severity = getValidationSeverity(issue.result);
|
|
44
|
+
const style = validationSeverityStyles[severity];
|
|
45
|
+
const Icon = style.icon;
|
|
46
|
+
const body = (_jsxs(_Fragment, { children: [_jsx(Icon, { className: `${style.text} mt-0.5 h-3.5 w-3.5 shrink-0`, strokeWidth: 1.5 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "text-neutral-grey-50 flex flex-wrap items-baseline gap-x-1.5 text-[10px] leading-tight", children: [showFieldName && issue.fieldName && (_jsx("span", { className: "text-neutral-grey-100 font-medium", children: issue.fieldName })), _jsx("span", { children: issue.validator })] }), _jsx("div", { className: "break-words select-text", children: issue.message })] })] }));
|
|
47
|
+
const key = `${issue.itemId}|${issue.fieldId}|${issue.validator}`;
|
|
48
|
+
return (_jsx("li", { "data-testid": "validation-issue-row", children: onSelectIssue ? (_jsx("button", { type: "button", className: "hover:bg-neutral-grey-5 flex w-full items-start gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors", onClick: () => handleSelect(issue), children: body })) : (_jsx("div", { className: "flex items-start gap-2 rounded px-2 py-1.5 text-xs", children: body })) }, key));
|
|
49
|
+
}) }), (canFix || showAllAction) && (_jsxs("div", { className: "border-neutral-grey-10 border-t p-1", children: [canFix && (_jsxs("button", { type: "button", className: footerButtonClassName, onClick: handleFix, "data-testid": "validation-fix-with-agent", children: [_jsx(WandSparkles, { strokeWidth: 1, className: "h-4 w-4" }), "Fix with agent"] })), showAllAction && (_jsxs("button", { type: "button", className: footerButtonClassName, onClick: handleShowAll, "data-testid": "validation-show-all", children: [_jsx(ListChecks, { strokeWidth: 1, className: "h-4 w-4" }), "Show all validation results"] }))] }))] })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ValidationIssuesPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationIssuesPopover.js","sourceRoot":"","sources":["../../../src/editor/validation/ValidationIssuesPopover.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EditContextType } from "../client/editContext";
|
|
2
|
+
export declare const VALIDATION_SLOT_TAG = "validation";
|
|
3
|
+
export type ValidationIssueTarget = {
|
|
4
|
+
itemId: string;
|
|
5
|
+
language: string;
|
|
6
|
+
version: number;
|
|
7
|
+
fieldId?: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Opens the item a validation issue belongs to and focuses the field.
|
|
11
|
+
* Shared by the Validation sidebar rows and the issue popovers.
|
|
12
|
+
*/
|
|
13
|
+
export declare function navigateToValidationIssue(editContext: EditContextType, target: ValidationIssueTarget, setFocusedField?: EditContextType["setFocusedField"] | undefined): Promise<void>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { stripGuid } from "../utils";
|
|
2
|
+
// All validation click-throughs open in this one shared slot (EditorSlot.tag).
|
|
3
|
+
export const VALIDATION_SLOT_TAG = "validation";
|
|
4
|
+
/**
|
|
5
|
+
* Opens the item a validation issue belongs to and focuses the field.
|
|
6
|
+
* Shared by the Validation sidebar rows and the issue popovers.
|
|
7
|
+
*/
|
|
8
|
+
export async function navigateToValidationIssue(editContext, target, setFocusedField = editContext.setFocusedField) {
|
|
9
|
+
const itemDescriptor = {
|
|
10
|
+
id: target.itemId,
|
|
11
|
+
language: target.language,
|
|
12
|
+
version: target.version,
|
|
13
|
+
};
|
|
14
|
+
const slots = editContext.editorSlots ?? [];
|
|
15
|
+
const openSlot = slots.find((slot) => stripGuid(slot.itemDescriptor?.id ?? "") === stripGuid(itemDescriptor.id) &&
|
|
16
|
+
slot.itemDescriptor?.language?.toLowerCase() ===
|
|
17
|
+
itemDescriptor.language?.toLowerCase() &&
|
|
18
|
+
slot.itemDescriptor?.version === itemDescriptor.version);
|
|
19
|
+
if (openSlot) {
|
|
20
|
+
editContext.setActiveSlot(openSlot.slotId);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Open the result in the shared validation slot instead of replacing the
|
|
24
|
+
// reviewed page: replacing the page collapses the workbox scope and
|
|
25
|
+
// re-scopes the validation list to the single clicked item. Every click
|
|
26
|
+
// routes into the same tagged slot, so stepping through results never
|
|
27
|
+
// accumulates panes.
|
|
28
|
+
const validationSlot = slots.find((slot) => slot.tag === VALIDATION_SLOT_TAG);
|
|
29
|
+
const loadedItem = await editContext.loadItem(itemDescriptor, validationSlot
|
|
30
|
+
? { targetSlotId: validationSlot.slotId }
|
|
31
|
+
: { openInNewSlot: true, newSlotTag: VALIDATION_SLOT_TAG });
|
|
32
|
+
if (!loadedItem)
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Selection first: it keeps the component highlighted on its page canvas,
|
|
36
|
+
// and the focus-clearing effect only retains focusedField while
|
|
37
|
+
// selection[0] matches its item id.
|
|
38
|
+
editContext.select?.([target.itemId]);
|
|
39
|
+
if (target.fieldId) {
|
|
40
|
+
await setFocusedField?.({ item: itemDescriptor, fieldId: target.fieldId }, false);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=navigateToValidationIssue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigateToValidationIssue.js","sourceRoot":"","sources":["../../../src/editor/validation/navigateToValidationIssue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAShD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAA4B,EAC5B,MAA6B,EAC7B,eAAe,GAAmD,WAAW,CAAC,eAAe;IAE7F,MAAM,cAAc,GAAG;QACrB,EAAE,EAAE,MAAM,CAAC,MAAM;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,CAAC,IAAI,EAAE,EAAE,CACP,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC1C,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE;QACxC,IAAI,CAAC,cAAc,EAAE,OAAO,KAAK,cAAc,CAAC,OAAO,CAC1D,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,oEAAoE;QACpE,wEAAwE;QACxE,sEAAsE;QACtE,qBAAqB;QACrB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAC/B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,mBAAmB,CAC3C,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,CAC3C,cAAc,EACd,cAAc;YACZ,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,MAAM,EAAE;YACzC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAC7D,CAAC;QACF,IAAI,CAAC,UAAU;YAAE,OAAO;IAC1B,CAAC;IAED,0EAA0E;IAC1E,gEAAgE;IAChE,oCAAoC;IACpC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,eAAe,EAAE,CACrB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EACjD,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SingleValidatorResult } from "../../types";
|
|
2
|
+
import { EditContextType } from "../client/editContext";
|
|
3
|
+
import { ItemDescriptor } from "../pageModel";
|
|
4
|
+
export type ValidationFixTarget = {
|
|
5
|
+
/** The item the issues belong to (a page or an embedded component item). */
|
|
6
|
+
item: ItemDescriptor;
|
|
7
|
+
issues: readonly SingleValidatorResult[];
|
|
8
|
+
/** Set when the button was clicked on a single field of the item. */
|
|
9
|
+
field?: {
|
|
10
|
+
fieldId: string;
|
|
11
|
+
fieldName?: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare function hasAgentsPanel(editContext?: EditContextType): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Prompt for the agent. The vocabulary (field, validator, level, message)
|
|
17
|
+
* mirrors the validate-items tool's findings so the agent can match them
|
|
18
|
+
* after re-running the validation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildValidationFixPrompt(target: ValidationFixTarget): string;
|
|
21
|
+
/**
|
|
22
|
+
* Opens the Agents panel and starts a new agent that fixes the given
|
|
23
|
+
* validation issues. Mirrors openAiAgentForComment (reviews/commentAi.ts).
|
|
24
|
+
* Returns false when nothing was started (no panel, quota exceeded, error).
|
|
25
|
+
*/
|
|
26
|
+
export declare function openAiAgentForValidationIssues(target: ValidationFixTarget, editContext?: EditContextType): boolean;
|