@parhelia/core 0.3.12827 → 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-copy.d.ts +48 -0
- package/dist/tour/sandbox-tour-copy.js +48 -0
- package/dist/tour/sandbox-tour-copy.js.map +1 -0
- package/dist/tour/sandbox-tour.d.ts +3 -0
- package/dist/tour/sandbox-tour.js +212 -0
- package/dist/tour/sandbox-tour.js.map +1 -0
- package/dist/tour/tour-utils.d.ts +32 -0
- package/dist/tour/tour-utils.js +148 -0
- package/dist/tour/tour-utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { InteractionEventPayload } from "../bridge/protocol";
|
|
2
|
+
import type { EditContextType } from "../client/editContext";
|
|
3
|
+
/**
|
|
4
|
+
* Preview mode leaves every canvas field read-only (the bridge flips
|
|
5
|
+
* contenteditable off and blurs the field), so a user who forgot to leave
|
|
6
|
+
* preview clicks into a text and types into the void: no caret, no change, no
|
|
7
|
+
* explanation. These helpers recognise that keystroke and answer it with a
|
|
8
|
+
* toast that names the cause and offers the one-click way out.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PREVIEW_EDIT_ATTEMPT_TOAST_ID = "preview-mode-edit-attempt";
|
|
11
|
+
export declare const PREVIEW_EDIT_ATTEMPT_MODE_CHANGE_REASON = "preview-edit-attempt";
|
|
12
|
+
export declare const PREVIEW_EDIT_ATTEMPT_TITLE = "Preview mode is read-only";
|
|
13
|
+
export declare const PREVIEW_EDIT_ATTEMPT_DESCRIPTION = "Switch to edit mode to change the content of this page.";
|
|
14
|
+
export declare const PREVIEW_EDIT_ATTEMPT_ACTION_LABEL = "Switch to edit mode";
|
|
15
|
+
/**
|
|
16
|
+
* Whether a bridge keydown, delivered while the editor is in preview mode, was
|
|
17
|
+
* meant to change a field's content.
|
|
18
|
+
*
|
|
19
|
+
* Only keystrokes aimed at a field count (the bridge resolves the field from
|
|
20
|
+
* the caret the click left behind). Printable characters, Backspace and Delete
|
|
21
|
+
* qualify, as do paste and cut. Deliberately left out: Space, arrows and the
|
|
22
|
+
* other navigation keys scroll a preview and Enter follows a focused link, so a
|
|
23
|
+
* hint there would interrupt legitimate previewing. A sentence typed into a
|
|
24
|
+
* read-only field trips on its first letter anyway.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isPreviewEditAttemptInteraction(interaction: InteractionEventPayload): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Shows (or refreshes) the single preview-mode hint toast. The stable id keeps
|
|
29
|
+
* a burst of keystrokes from stacking toasts; the action leaves preview mode.
|
|
30
|
+
*/
|
|
31
|
+
export declare function showPreviewEditAttemptToast(editContext: Pick<EditContextType, "changeMode">): void;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { toast } from "sonner";
|
|
2
|
+
/**
|
|
3
|
+
* Preview mode leaves every canvas field read-only (the bridge flips
|
|
4
|
+
* contenteditable off and blurs the field), so a user who forgot to leave
|
|
5
|
+
* preview clicks into a text and types into the void: no caret, no change, no
|
|
6
|
+
* explanation. These helpers recognise that keystroke and answer it with a
|
|
7
|
+
* toast that names the cause and offers the one-click way out.
|
|
8
|
+
*/
|
|
9
|
+
export const PREVIEW_EDIT_ATTEMPT_TOAST_ID = "preview-mode-edit-attempt";
|
|
10
|
+
export const PREVIEW_EDIT_ATTEMPT_MODE_CHANGE_REASON = "preview-edit-attempt";
|
|
11
|
+
export const PREVIEW_EDIT_ATTEMPT_TITLE = "Preview mode is read-only";
|
|
12
|
+
export const PREVIEW_EDIT_ATTEMPT_DESCRIPTION = "Switch to edit mode to change the content of this page.";
|
|
13
|
+
export const PREVIEW_EDIT_ATTEMPT_ACTION_LABEL = "Switch to edit mode";
|
|
14
|
+
const CONTENT_EDITING_KEYS = new Set(["Backspace", "Delete"]);
|
|
15
|
+
// Paste and cut. Identified by physical key as well, so a non-Latin keyboard
|
|
16
|
+
// layout (where the V key reports e.g. "м") is recognised too.
|
|
17
|
+
const CONTENT_EDITING_SHORTCUT_KEYS = new Set(["v", "x"]);
|
|
18
|
+
const CONTENT_EDITING_SHORTCUT_CODES = new Set(["KeyV", "KeyX"]);
|
|
19
|
+
/**
|
|
20
|
+
* Whether a bridge keydown, delivered while the editor is in preview mode, was
|
|
21
|
+
* meant to change a field's content.
|
|
22
|
+
*
|
|
23
|
+
* Only keystrokes aimed at a field count (the bridge resolves the field from
|
|
24
|
+
* the caret the click left behind). Printable characters, Backspace and Delete
|
|
25
|
+
* qualify, as do paste and cut. Deliberately left out: Space, arrows and the
|
|
26
|
+
* other navigation keys scroll a preview and Enter follows a focused link, so a
|
|
27
|
+
* hint there would interrupt legitimate previewing. A sentence typed into a
|
|
28
|
+
* read-only field trips on its first letter anyway.
|
|
29
|
+
*/
|
|
30
|
+
export function isPreviewEditAttemptInteraction(interaction) {
|
|
31
|
+
if (interaction.kind !== "keydown")
|
|
32
|
+
return false;
|
|
33
|
+
if (!interaction.fieldId)
|
|
34
|
+
return false;
|
|
35
|
+
if (interaction.altKey)
|
|
36
|
+
return false;
|
|
37
|
+
const key = interaction.key ?? "";
|
|
38
|
+
if (interaction.ctrlKey || interaction.metaKey) {
|
|
39
|
+
return (CONTENT_EDITING_SHORTCUT_KEYS.has(key.toLowerCase()) ||
|
|
40
|
+
CONTENT_EDITING_SHORTCUT_CODES.has(interaction.code ?? ""));
|
|
41
|
+
}
|
|
42
|
+
if (CONTENT_EDITING_KEYS.has(key))
|
|
43
|
+
return true;
|
|
44
|
+
// Named keys ("ArrowLeft", "Shift", "Dead", "Process", "Unidentified") are
|
|
45
|
+
// longer than a single code point; Space is excluded on purpose.
|
|
46
|
+
return key !== " " && [...key].length === 1;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Shows (or refreshes) the single preview-mode hint toast. The stable id keeps
|
|
50
|
+
* a burst of keystrokes from stacking toasts; the action leaves preview mode.
|
|
51
|
+
*/
|
|
52
|
+
export function showPreviewEditAttemptToast(editContext) {
|
|
53
|
+
toast.info(PREVIEW_EDIT_ATTEMPT_TITLE, {
|
|
54
|
+
id: PREVIEW_EDIT_ATTEMPT_TOAST_ID,
|
|
55
|
+
description: PREVIEW_EDIT_ATTEMPT_DESCRIPTION,
|
|
56
|
+
duration: 8000,
|
|
57
|
+
action: {
|
|
58
|
+
label: PREVIEW_EDIT_ATTEMPT_ACTION_LABEL,
|
|
59
|
+
onClick: () => {
|
|
60
|
+
toast.dismiss(PREVIEW_EDIT_ATTEMPT_TOAST_ID);
|
|
61
|
+
void editContext.changeMode("edit", {
|
|
62
|
+
reason: PREVIEW_EDIT_ATTEMPT_MODE_CHANGE_REASON,
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=previewEditAttempt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"previewEditAttempt.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/previewEditAttempt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAK/B;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,2BAA2B,CAAC;AACzE,MAAM,CAAC,MAAM,uCAAuC,GAAG,sBAAsB,CAAC;AAE9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,2BAA2B,CAAC;AACtE,MAAM,CAAC,MAAM,gCAAgC,GAC3C,yDAAyD,CAAC;AAC5D,MAAM,CAAC,MAAM,iCAAiC,GAAG,qBAAqB,CAAC;AAEvE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9D,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+BAA+B,CAC7C,WAAoC;IAEpC,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,CAAC,WAAW,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,WAAW,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAErC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,EAAE,CAAC;IAElC,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/C,OAAO,CACL,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACpD,8BAA8B,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/C,2EAA2E;IAC3E,iEAAiE;IACjE,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAgD;IAEhD,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE;QACrC,EAAE,EAAE,6BAA6B;QACjC,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE;YACN,KAAK,EAAE,iCAAiC;YACxC,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,KAAK,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE;oBAClC,MAAM,EAAE,uCAAuC;iBAChD,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ExecutionResult } from "./serviceHelper";
|
|
2
|
+
export type MigrationChecksumMismatch = {
|
|
3
|
+
name: string;
|
|
4
|
+
journalChecksum: string;
|
|
5
|
+
currentChecksum: string;
|
|
6
|
+
applied?: string;
|
|
7
|
+
};
|
|
8
|
+
export type MigrationStatus = {
|
|
9
|
+
hasPendingMigrations: boolean;
|
|
10
|
+
pendingMigrations: string[];
|
|
11
|
+
appliedMigrations: string[];
|
|
12
|
+
orphanedMigrations?: string[];
|
|
13
|
+
/** False when the journal has no Checksum column and the app principal could not add it. */
|
|
14
|
+
checksumTrackingAvailable?: boolean;
|
|
15
|
+
/** Applied rows recorded before checksums existed; verified by name only. */
|
|
16
|
+
uncheckedMigrations?: string[];
|
|
17
|
+
/** Applied rows whose recorded checksum differs from the script this build ships. */
|
|
18
|
+
checksumMismatches?: MigrationChecksumMismatch[];
|
|
19
|
+
errorMessage?: string;
|
|
20
|
+
};
|
|
21
|
+
export type MigrationResult = {
|
|
22
|
+
success: boolean;
|
|
23
|
+
errorMessage?: string;
|
|
24
|
+
executedMigrations: string[];
|
|
25
|
+
};
|
|
26
|
+
/** Strips the embedded-resource prefix so "Parhelia.Migrations.0016.sql" reads as "0016.sql". */
|
|
27
|
+
export declare function migrationDisplayName(name: string): string;
|
|
28
|
+
export declare function getMigrationStatus(): Promise<ExecutionResult<MigrationStatus>>;
|
|
29
|
+
export declare function rerunMigration(migration: string): Promise<ExecutionResult<MigrationResult>>;
|
|
30
|
+
export declare function acceptMigrationChecksum(migration: string): Promise<ExecutionResult<MigrationResult>>;
|
|
31
|
+
export declare function adoptMigrationChecksums(): Promise<ExecutionResult<MigrationResult>>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { get, post } from "./serviceHelper";
|
|
2
|
+
/** Strips the embedded-resource prefix so "Parhelia.Migrations.0016.sql" reads as "0016.sql". */
|
|
3
|
+
export function migrationDisplayName(name) {
|
|
4
|
+
return name?.replace(/^Parhelia\.Migrations\./i, "") || name;
|
|
5
|
+
}
|
|
6
|
+
export function getMigrationStatus() {
|
|
7
|
+
return get("/parhelia/migration-status");
|
|
8
|
+
}
|
|
9
|
+
export function rerunMigration(migration) {
|
|
10
|
+
return post("/parhelia/migration-checksums/rerun", {
|
|
11
|
+
migration,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function acceptMigrationChecksum(migration) {
|
|
15
|
+
return post("/parhelia/migration-checksums/accept", {
|
|
16
|
+
migration,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function adoptMigrationChecksums() {
|
|
20
|
+
return post("/parhelia/migration-checksums/adopt", {});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=migrationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrationService.js","sourceRoot":"","sources":["../../../src/editor/services/migrationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAwB,MAAM,iBAAiB,CAAC;AA6BlE,iGAAiG;AACjG,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,EAAE,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB;IAGhC,OAAO,GAAG,CAAkB,4BAA4B,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB;IAEjB,OAAO,IAAI,CAAkB,qCAAqC,EAAE;QAClE,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB;IAEjB,OAAO,IAAI,CAAkB,sCAAsC,EAAE;QACnE,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB;IAGrC,OAAO,IAAI,CAAkB,qCAAqC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type PublicSiteEntry = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
rootItemId: string;
|
|
5
|
+
rootPath?: string;
|
|
6
|
+
rootDisplayName?: string;
|
|
7
|
+
languages: string[];
|
|
8
|
+
origin: string;
|
|
9
|
+
warnings: string[];
|
|
10
|
+
};
|
|
11
|
+
export type EffectivePublicSite = {
|
|
12
|
+
siteName: string;
|
|
13
|
+
rootPath: string;
|
|
14
|
+
startPath: string;
|
|
15
|
+
language: string;
|
|
16
|
+
isDefaultLanguage: boolean;
|
|
17
|
+
database: string;
|
|
18
|
+
isPublishingTarget: boolean;
|
|
19
|
+
origin?: string;
|
|
20
|
+
source?: string;
|
|
21
|
+
sampleUrl?: string;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
};
|
|
24
|
+
export type PublicSitesResponse = {
|
|
25
|
+
entries: PublicSiteEntry[];
|
|
26
|
+
sites: EffectivePublicSite[];
|
|
27
|
+
environmentOverride?: string | null;
|
|
28
|
+
};
|
|
29
|
+
export type SavePublicSiteRequest = {
|
|
30
|
+
id?: string;
|
|
31
|
+
name?: string;
|
|
32
|
+
rootItemId: string;
|
|
33
|
+
languages: string[];
|
|
34
|
+
origin: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const getPublicSites: () => Promise<import("./serviceHelper").ExecutionResult<PublicSitesResponse>>;
|
|
37
|
+
export declare const savePublicSite: (request: SavePublicSiteRequest) => Promise<import("./serviceHelper").ExecutionResult<PublicSiteEntry>>;
|
|
38
|
+
export declare const deletePublicSite: (id: string) => Promise<import("./serviceHelper").ExecutionResult<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
}>>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { get, post } from "./serviceHelper";
|
|
2
|
+
export const getPublicSites = () => get("/parhelia/public-sites");
|
|
3
|
+
export const savePublicSite = (request) => post("/parhelia/public-sites/save", request);
|
|
4
|
+
export const deletePublicSite = (id) => post("/parhelia/public-sites/delete", { id });
|
|
5
|
+
//# sourceMappingURL=publicSiteService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publicSiteService.js","sourceRoot":"","sources":["../../../src/editor/services/publicSiteService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAyC5C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CACjC,GAAG,CAAsB,wBAAwB,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA8B,EAAE,EAAE,CAC/D,IAAI,CAAkB,6BAA6B,EAAE,OAAO,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAE,EAAE,CAC7C,IAAI,CAAuB,+BAA+B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface MigrationJournalCardProps {
|
|
2
|
+
/** Called after a journal change so the surrounding status view can refresh its checks. */
|
|
3
|
+
onChanged?: () => void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Integrity view of Parhelia.DbJournal: are the migrations it records the scripts this build
|
|
7
|
+
* ships? Rows written before checksums existed can only be verified by name and are reported
|
|
8
|
+
* as such; rows whose checksum differs are surfaced for an explicit admin decision - re-run
|
|
9
|
+
* the (idempotent) script or accept the recorded content - and are never re-run on their own.
|
|
10
|
+
*/
|
|
11
|
+
export declare function MigrationJournalCard({ onChanged }: MigrationJournalCardProps): import("react").JSX.Element | null;
|
|
12
|
+
export default MigrationJournalCard;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { CheckCircle, ShieldCheck } from "lucide-react";
|
|
5
|
+
import { SettingsCard as Card } from "./SettingsCard";
|
|
6
|
+
import { Alert, AlertDescription, AlertTitle } from "../../components/ui/alert";
|
|
7
|
+
import { ActionButton } from "../../components/ActionButton";
|
|
8
|
+
import { LoadingState } from "../ui/LoadingState";
|
|
9
|
+
import { acceptMigrationChecksum, adoptMigrationChecksums, getMigrationStatus, migrationDisplayName, rerunMigration, } from "../services/migrationService";
|
|
10
|
+
function shortHash(hash) {
|
|
11
|
+
if (!hash)
|
|
12
|
+
return "none";
|
|
13
|
+
return hash.length > 12 ? `${hash.slice(0, 12)}…` : hash;
|
|
14
|
+
}
|
|
15
|
+
function formatApplied(applied) {
|
|
16
|
+
if (!applied)
|
|
17
|
+
return null;
|
|
18
|
+
const date = new Date(applied);
|
|
19
|
+
return Number.isNaN(date.getTime()) ? applied : date.toLocaleString();
|
|
20
|
+
}
|
|
21
|
+
function resultMessage(res, fallback) {
|
|
22
|
+
if (res.type === "success" && res.data?.success) {
|
|
23
|
+
return { tone: "success", message: fallback };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
tone: "error",
|
|
27
|
+
message: res.data?.errorMessage ||
|
|
28
|
+
res.details ||
|
|
29
|
+
res.summary ||
|
|
30
|
+
"The request failed without an error message.",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Integrity view of Parhelia.DbJournal: are the migrations it records the scripts this build
|
|
35
|
+
* ships? Rows written before checksums existed can only be verified by name and are reported
|
|
36
|
+
* as such; rows whose checksum differs are surfaced for an explicit admin decision - re-run
|
|
37
|
+
* the (idempotent) script or accept the recorded content - and are never re-run on their own.
|
|
38
|
+
*/
|
|
39
|
+
export function MigrationJournalCard({ onChanged }) {
|
|
40
|
+
const [status, setStatus] = useState(null);
|
|
41
|
+
const [loading, setLoading] = useState(true);
|
|
42
|
+
const [hidden, setHidden] = useState(false);
|
|
43
|
+
const [loadError, setLoadError] = useState(null);
|
|
44
|
+
const [busyKey, setBusyKey] = useState(null);
|
|
45
|
+
const [feedback, setFeedback] = useState(null);
|
|
46
|
+
const load = useCallback(async () => {
|
|
47
|
+
setLoading(true);
|
|
48
|
+
try {
|
|
49
|
+
const res = await getMigrationStatus();
|
|
50
|
+
if (res.type === "unauthorized") {
|
|
51
|
+
// Journal details are admin-only; a non-admin simply does not get the card.
|
|
52
|
+
setHidden(true);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (res.type !== "success" || !res.data) {
|
|
56
|
+
setLoadError(res.details || res.summary || "Unable to load the migration journal");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setStatus(res.data);
|
|
60
|
+
setLoadError(res.data.errorMessage ?? null);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
setLoadError(e?.message || "Unable to load the migration journal");
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
setLoading(false);
|
|
67
|
+
}
|
|
68
|
+
}, []);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
load();
|
|
71
|
+
}, [load]);
|
|
72
|
+
const runAction = useCallback(async (key, action, successMessage) => {
|
|
73
|
+
setBusyKey(key);
|
|
74
|
+
setFeedback(null);
|
|
75
|
+
try {
|
|
76
|
+
const res = await action();
|
|
77
|
+
const next = resultMessage(res, successMessage);
|
|
78
|
+
setFeedback(next);
|
|
79
|
+
if (next.tone === "success") {
|
|
80
|
+
await load();
|
|
81
|
+
onChanged?.();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
setFeedback({
|
|
86
|
+
tone: "error",
|
|
87
|
+
message: e?.message || "The request failed.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
setBusyKey(null);
|
|
92
|
+
}
|
|
93
|
+
}, [load, onChanged]);
|
|
94
|
+
if (hidden)
|
|
95
|
+
return null;
|
|
96
|
+
const mismatches = status?.checksumMismatches ?? [];
|
|
97
|
+
const unchecked = status?.uncheckedMigrations ?? [];
|
|
98
|
+
const applied = status?.appliedMigrations ?? [];
|
|
99
|
+
const trackingAvailable = status?.checksumTrackingAvailable !== false;
|
|
100
|
+
const verifiedCount = applied.length - unchecked.length - mismatches.length;
|
|
101
|
+
const healthy = !loadError &&
|
|
102
|
+
trackingAvailable &&
|
|
103
|
+
mismatches.length === 0 &&
|
|
104
|
+
unchecked.length === 0;
|
|
105
|
+
return (_jsx(Card, { icon: _jsx(ShieldCheck, { className: "h-5 w-5", strokeWidth: 1 }), title: "Migration journal", description: "Whether the migrations recorded in Parhelia.DbJournal are the scripts this build ships.", children: loading && !status ? (_jsx(LoadingState, { variant: "inline", message: "Reading migration journal...", spinnerSize: "sm" })) : loadError ? (_jsx("p", { className: "text-feedback-red text-sm", "data-testid": "migration-journal-error", children: loadError })) : (_jsxs("div", { className: "flex flex-col gap-3", children: [!trackingAvailable && (_jsxs(Alert, { variant: "warning", className: "p-4", children: [_jsx(AlertTitle, { className: "text-neutral-grey-100 mb-0", children: "Checksum tracking is unavailable" }), _jsx(AlertDescription, { className: "text-neutral-grey-100", children: "Parhelia.DbJournal has no Checksum column and the Parhelia SQL account could not add it. Migrations are tracked by name only until a DBA runs: ALTER TABLE [dbo].[Parhelia.DbJournal] ADD [Checksum] nvarchar(64) NULL" })] })), mismatches.map((mismatch) => (_jsx(MismatchRow, { mismatch: mismatch, busyKey: busyKey, onRerun: () => runAction(`rerun:${mismatch.name}`, () => rerunMigration(mismatch.name), `${migrationDisplayName(mismatch.name)} was re-run and its checksum recorded.`), onAccept: () => runAction(`accept:${mismatch.name}`, () => acceptMigrationChecksum(mismatch.name), `${migrationDisplayName(mismatch.name)} keeps its recorded content; the shipped checksum is now on file.`) }, mismatch.name))), trackingAvailable && unchecked.length > 0 && (_jsxs(Alert, { variant: "info", className: "p-4", children: [_jsxs(AlertTitle, { className: "text-neutral-grey-100 mb-0", children: [unchecked.length, " applied migration", unchecked.length !== 1 ? "s" : "", " predate checksum tracking"] }), _jsxs(AlertDescription, { className: "text-neutral-grey-50", children: [_jsx("p", { children: "These rows were recorded by name only, so the journal cannot say which content ran. Adopting stamps the shipped checksums onto them. It is refused while any schema check fails, because it asserts that the shipped scripts are what ran here." }), _jsx("p", { className: "mt-2 font-mono text-xs", children: unchecked.map(migrationDisplayName).join(", ") }), _jsx("div", { className: "mt-3", children: _jsx(ActionButton, { variant: "outline", isLoading: busyKey === "adopt", disabled: busyKey !== null, loadingText: "Adopting...", onClick: () => runAction("adopt", adoptMigrationChecksums, "Checksums adopted for every migration that predated tracking."), children: "Adopt current checksums" }) })] })] })), healthy && (_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(CheckCircle, { className: "text-feedback-green h-4 w-4", strokeWidth: 1 }), _jsxs("span", { className: "text-neutral-grey-50", children: ["All ", applied.length, " applied migration", applied.length !== 1 ? "s" : "", " match the scripts in this build."] })] })), !healthy && trackingAvailable && verifiedCount > 0 && (_jsxs("p", { className: "text-neutral-grey-50 text-xs", children: [verifiedCount, " other applied migration", verifiedCount !== 1 ? "s" : "", " verified by checksum."] })), feedback && (_jsx(Alert, { variant: feedback.tone === "success" ? "success" : "destructive", className: "p-4", "data-testid": "migration-journal-feedback", children: _jsx(AlertDescription, { className: "whitespace-pre-wrap", children: feedback.message }) }))] })) }));
|
|
106
|
+
}
|
|
107
|
+
function MismatchRow({ mismatch, busyKey, onRerun, onAccept, }) {
|
|
108
|
+
const applied = formatApplied(mismatch.applied);
|
|
109
|
+
const rerunKey = `rerun:${mismatch.name}`;
|
|
110
|
+
const acceptKey = `accept:${mismatch.name}`;
|
|
111
|
+
return (_jsxs(Alert, { variant: "warning", className: "p-4", "data-testid": "migration-mismatch", children: [_jsx(AlertTitle, { className: "text-neutral-grey-100 mb-0 font-mono", children: migrationDisplayName(mismatch.name) }), _jsxs(AlertDescription, { className: "text-neutral-grey-100", children: [_jsxs("p", { children: ["The journal recorded this name with different content than this build ships", applied ? ` (applied ${applied})` : "", ". Objects the shipped script creates may be missing."] }), _jsxs("p", { className: "mt-1 font-mono text-xs", children: ["recorded ", shortHash(mismatch.journalChecksum), " \u00B7 shipped", " ", shortHash(mismatch.currentChecksum)] }), _jsxs("div", { className: "mt-3 flex flex-wrap gap-2", children: [_jsx(ActionButton, { isLoading: busyKey === rerunKey, disabled: busyKey !== null, loadingText: "Re-running...", onClick: onRerun, children: "Re-run migration" }), _jsx(ActionButton, { variant: "outline", isLoading: busyKey === acceptKey, disabled: busyKey !== null, loadingText: "Accepting...", onClick: onAccept, children: "Accept recorded content" })] })] })] }));
|
|
112
|
+
}
|
|
113
|
+
export default MigrationJournalCard;
|
|
114
|
+
//# sourceMappingURL=MigrationJournalCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationJournalCard.js","sourceRoot":"","sources":["../../../src/editor/settings/MigrationJournalCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type PublicSiteEntry } from "../../services/publicSiteService";
|
|
2
|
+
export declare function PublicSiteEntryDialog({ target, onClose, onSaved, }: {
|
|
3
|
+
target: {
|
|
4
|
+
entry?: PublicSiteEntry;
|
|
5
|
+
} | null;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onSaved: () => void | Promise<void>;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Globe } from "lucide-react";
|
|
4
|
+
import { toast } from "sonner";
|
|
5
|
+
import { Button } from "../../../components/ui/button";
|
|
6
|
+
import { ActionButton } from "../../../components/ActionButton";
|
|
7
|
+
import { Input } from "../../../components/ui/input";
|
|
8
|
+
import { Alert, AlertDescription } from "../../../components/ui/alert";
|
|
9
|
+
import { Dialog, DialogContent, DialogFooter, } from "../../../components/ui/dialog";
|
|
10
|
+
import { StyledDialogTitle } from "../../../components/ui/styled-dialog-title";
|
|
11
|
+
import { LanguageSelectionGrid } from "../../../components/ui/LanguageSelectionGrid";
|
|
12
|
+
import { TreeItemPicker } from "../../personalization/TreeItemPicker";
|
|
13
|
+
import { getLanguages } from "../../services/contentService";
|
|
14
|
+
import { savePublicSite, } from "../../services/publicSiteService";
|
|
15
|
+
import { CONTENT_ROOT_ID } from "./MemoryEntryDialog";
|
|
16
|
+
import { formatPublicSiteLanguages, validateOrigin } from "./publicSiteHelpers";
|
|
17
|
+
export function PublicSiteEntryDialog({ target, onClose, onSaved, }) {
|
|
18
|
+
const [rootItemId, setRootItemId] = useState("");
|
|
19
|
+
const [origin, setOrigin] = useState("");
|
|
20
|
+
const [name, setName] = useState("");
|
|
21
|
+
const [languages, setLanguages] = useState([]);
|
|
22
|
+
const [available, setAvailable] = useState([]);
|
|
23
|
+
const [touched, setTouched] = useState(false);
|
|
24
|
+
const [saving, setSaving] = useState(false);
|
|
25
|
+
const [error, setError] = useState();
|
|
26
|
+
const savingRef = useRef(false);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!target)
|
|
29
|
+
return;
|
|
30
|
+
setRootItemId(target.entry?.rootItemId ?? "");
|
|
31
|
+
setOrigin(target.entry?.origin ?? "");
|
|
32
|
+
setName(target.entry?.name ?? "");
|
|
33
|
+
setLanguages(target.entry?.languages ?? []);
|
|
34
|
+
setTouched(false);
|
|
35
|
+
setError(undefined);
|
|
36
|
+
let active = true;
|
|
37
|
+
void getLanguages()
|
|
38
|
+
.then((result) => {
|
|
39
|
+
if (!active)
|
|
40
|
+
return;
|
|
41
|
+
if (result.type !== "success" || !result.data) {
|
|
42
|
+
setError("Could not load available languages.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
setAvailable(result.data);
|
|
46
|
+
setLanguages((current) => current.map((code) => result.data.find((l) => l.languageCode.toLowerCase() === code.toLowerCase())?.languageCode ?? code));
|
|
47
|
+
})
|
|
48
|
+
.catch(() => {
|
|
49
|
+
if (active)
|
|
50
|
+
setError("Could not load available languages.");
|
|
51
|
+
});
|
|
52
|
+
return () => {
|
|
53
|
+
active = false;
|
|
54
|
+
};
|
|
55
|
+
}, [target]);
|
|
56
|
+
const options = useMemo(() => [
|
|
57
|
+
...available.map((l) => ({
|
|
58
|
+
code: l.languageCode,
|
|
59
|
+
name: l.name,
|
|
60
|
+
icon: l.icon,
|
|
61
|
+
})),
|
|
62
|
+
...languages
|
|
63
|
+
.filter((code) => !available.some((l) => l.languageCode.toLowerCase() === code.toLowerCase()))
|
|
64
|
+
.map((code) => ({ code, name: code + " (unavailable)" })),
|
|
65
|
+
], [available, languages]);
|
|
66
|
+
const validation = validateOrigin(origin);
|
|
67
|
+
const canSave = !!rootItemId && !!validation.origin && name.trim().length <= 100 && !saving;
|
|
68
|
+
const save = async () => {
|
|
69
|
+
if (!target || !canSave || savingRef.current)
|
|
70
|
+
return;
|
|
71
|
+
savingRef.current = true;
|
|
72
|
+
setSaving(true);
|
|
73
|
+
setError(undefined);
|
|
74
|
+
try {
|
|
75
|
+
const result = await savePublicSite({
|
|
76
|
+
id: target.entry?.id,
|
|
77
|
+
name: name.trim() || undefined,
|
|
78
|
+
rootItemId,
|
|
79
|
+
origin: validation.origin,
|
|
80
|
+
languages,
|
|
81
|
+
});
|
|
82
|
+
if (result.type !== "success" || !result.data) {
|
|
83
|
+
setError(result.details || result.summary || "Failed to save mapping.");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
toast.success(target.entry
|
|
87
|
+
? "Public site mapping updated"
|
|
88
|
+
: "Public site mapping added");
|
|
89
|
+
result.data.warnings?.forEach((warning) => toast.warning(warning));
|
|
90
|
+
await onSaved();
|
|
91
|
+
onClose();
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
setError(err instanceof Error ? err.message : "Failed to save mapping.");
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
setSaving(false);
|
|
98
|
+
savingRef.current = false;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
return (_jsx(Dialog, { open: !!target, onOpenChange: (open) => {
|
|
102
|
+
if (!open && !saving)
|
|
103
|
+
onClose();
|
|
104
|
+
}, children: _jsxs(DialogContent, { className: "gap-0 p-0 sm:max-w-xl", "data-testid": "public-sites-entry-dialog", onKeyDown: (event) => {
|
|
105
|
+
if ((event.ctrlKey || event.metaKey) && event.key === "Enter") {
|
|
106
|
+
event.preventDefault();
|
|
107
|
+
void save();
|
|
108
|
+
}
|
|
109
|
+
}, children: [_jsx(StyledDialogTitle, { icon: _jsx(Globe, { strokeWidth: 1 }), title: target?.entry
|
|
110
|
+
? "Edit public site mapping"
|
|
111
|
+
: "Add public site mapping", subtitle: "Choose the public origin for a content root and its languages" }), _jsxs("div", { className: "space-y-4 overflow-y-auto px-8 py-6", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("label", { className: "block text-sm font-medium", children: "Content root" }), _jsx(TreeItemPicker, { value: rootItemId, rootItemId: CONTENT_ROOT_ID, onChange: setRootItemId, disabled: saving })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("label", { htmlFor: "public-site-origin", className: "block text-sm font-medium", children: "Origin" }), _jsx(Input, { id: "public-site-origin", "data-testid": "public-sites-entry-dialog-origin", value: origin, onChange: (e) => setOrigin(e.target.value), onBlur: () => setTouched(true), placeholder: "https://www.example.com", "aria-invalid": touched && !!validation.error, disabled: saving }), touched && validation.error && (_jsx("p", { className: "text-feedback-red text-xs", "data-testid": "public-sites-entry-dialog-origin-error", children: validation.error })), validation.origin && (_jsxs("p", { className: "text-neutral-grey-50 text-xs", "data-testid": "public-sites-entry-dialog-origin-normalized", children: ["Stored as", " ", _jsx("span", { dir: "ltr", className: "font-mono", children: validation.origin })] }))] }), _jsxs("div", { className: "space-y-2", children: [_jsx("label", { htmlFor: "public-site-name", className: "block text-sm font-medium", children: "Name (optional)" }), _jsx(Input, { id: "public-site-name", "data-testid": "public-sites-entry-dialog-name", value: name, onChange: (e) => setName(e.target.value), maxLength: 100, placeholder: "Defaults to the content root's name", disabled: saving })] }), _jsx(LanguageSelectionGrid, { languages: options, selectedLanguageCodes: languages, onSelectedLanguageCodesChange: setLanguages, title: "Languages", testId: "public-sites-entry-dialog-languages" }), _jsxs("p", { className: "text-neutral-grey-50 text-sm", "data-testid": "public-sites-entry-dialog-languages-summary", children: ["Applies to: ", formatPublicSiteLanguages(languages), " below the selected content root."] }), error && (_jsx(Alert, { variant: "destructive", "data-testid": "public-sites-entry-dialog-error", children: _jsx(AlertDescription, { children: error }) }))] }), _jsxs(DialogFooter, { className: "px-8 py-4", children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: saving, children: "Cancel" }), _jsx(ActionButton, { "data-testid": "public-sites-entry-dialog-save", size: "lg", onClick: () => void save(), disabled: !canSave, isLoading: saving, loadingText: "Saving\u2026", children: "Save mapping" })] })] }) }));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=PublicSiteEntryDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicSiteEntryDialog.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/PublicSiteEntryDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function PublicSitesPanel(): import("react").JSX.Element;
|