@parhelia/core 0.1.12877 → 0.1.12880
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/components/ui/card.d.ts +1 -3
- package/dist/components/ui/card.js +2 -2
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/context-menu.js +2 -2
- package/dist/config/config.js +6 -23
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.d.ts +1 -0
- package/dist/editor/FieldActionsOverlay.js +45 -1
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.d.ts +1 -1
- package/dist/editor/FieldListField.js +18 -20
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/ImageEditor.d.ts +1 -6
- package/dist/editor/ImageEditor.js +3 -19
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/PictureEditor.d.ts +1 -2
- package/dist/editor/PictureEditor.js +14 -5
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/ai/Agents.js +2 -2
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/GuidanceOverlay.js +11 -1
- package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
- package/dist/editor/ai/InlineAiDialog.js +11 -22
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/InlineAiTrigger.js +57 -17
- package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageDom.js +36 -66
- package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
- package/dist/editor/ai/dialogs/capturePageScreenshot.js +162 -281
- package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
- package/dist/editor/ai/terminal/agentSessionState.d.ts +0 -3
- package/dist/editor/ai/terminal/agentSessionState.js +1 -3
- package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
- package/dist/editor/ai/terminal/agentStartRequest.d.ts +1 -2
- package/dist/editor/ai/terminal/agentStartRequest.js +1 -2
- package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
- package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +0 -7
- package/dist/editor/ai/terminal/components/AgentDocumentList.js +13 -55
- package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +1 -3
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +14 -22
- package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
- package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
- package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +1 -2
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +11 -8
- package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +4 -1
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +13 -29
- package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
- package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +1 -2
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +4 -2
- package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.js +2 -13
- package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
- package/dist/editor/ai/terminal/components/AiResponseMessage.js +14 -16
- package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +26 -37
- package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/UserMessage.d.ts +1 -2
- package/dist/editor/ai/terminal/components/UserMessage.js +8 -130
- package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
- package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +0 -1
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +1 -3
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +3 -9
- package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalController.js +0 -7
- package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +1 -3
- package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
- package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
- package/dist/editor/ai/useInlineAiPosition.js +52 -22
- package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js +62 -30
- package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
- package/dist/editor/client/EditorShell.d.ts +1 -5
- package/dist/editor/client/EditorShell.js +126 -286
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +5 -37
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.js +17 -14
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.d.ts +0 -2
- package/dist/editor/client/itemsRepository.js +8 -15
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -1
- package/dist/editor/client/operations.js +17 -41
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +7 -24
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +3 -10
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/RawEditor.js +1 -8
- package/dist/editor/field-types/RawEditor.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +45 -156
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +3 -10
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -8
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
- package/dist/editor/field-types/richtext/contextMenuFactory.js +303 -100
- package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
- package/dist/editor/field-types/richtext/types.d.ts +0 -2
- package/dist/editor/field-types/richtext/types.js.map +1 -1
- package/dist/editor/media-selector/TreeSelector.js +15 -15
- package/dist/editor/media-selector/TreeSelector.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +2 -8
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/VersionPreviewCard.js +249 -4
- package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -0
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +462 -63
- package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
- package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +2 -5
- package/dist/editor/page-editor-chrome/CommentHighlightings.js +215 -340
- package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +1 -5
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +4 -11
- package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js +13 -21
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +29 -23
- package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +19 -110
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.d.ts +7 -0
- package/dist/editor/page-editor-chrome/InlineEditor.js +1719 -0
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +2 -3
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +45 -148
- package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +0 -2
- package/dist/editor/page-editor-chrome/PageEditorChrome.js +21 -25
- package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +128 -163
- package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +3 -6
- package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +2 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +146 -83
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +2 -5
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +63 -144
- package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +2 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -101
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +1 -10
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +122 -105
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +4 -11
- package/dist/editor/page-editor-chrome/overlay/geometry.js +36 -139
- package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +2 -0
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +21 -0
- package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +1 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +758 -0
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
- package/dist/editor/page-viewer/EditorForm.js +1 -17
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
- package/dist/editor/page-viewer/MiniMap.js +364 -176
- package/dist/editor/page-viewer/MiniMap.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +13 -40
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.d.ts +5 -0
- package/dist/editor/page-viewer/PageViewerFrame.js +1513 -1529
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +796 -0
- package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
- package/dist/editor/page-viewer/pageViewContext.d.ts +0 -32
- package/dist/editor/page-viewer/pageViewContext.js +6 -37
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/reviews/Comment.d.ts +1 -2
- package/dist/editor/reviews/Comment.js +4 -9
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentEditor.js +1 -1
- package/dist/editor/reviews/CommentEditor.js.map +1 -1
- package/dist/editor/reviews/CommentPopover.js +9 -68
- package/dist/editor/reviews/CommentPopover.js.map +1 -1
- package/dist/editor/reviews/CommentView.js +4 -24
- package/dist/editor/reviews/CommentView.js.map +1 -1
- package/dist/editor/reviews/Comments.d.ts +2 -0
- package/dist/editor/reviews/Comments.js +30 -29
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/FeedbackCard.d.ts +2 -4
- package/dist/editor/reviews/FeedbackCard.js +5 -5
- package/dist/editor/reviews/FeedbackCard.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +6 -4
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -3
- package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/feedbackSelection.js +4 -32
- package/dist/editor/reviews/feedbackSelection.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +0 -14
- package/dist/editor/services/agentService.js +1 -11
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/reviewsService.d.ts +2 -2
- package/dist/editor/services/reviewsService.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +2 -2
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProvidersPanel.js +3 -2
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
- package/dist/editor/sidebar/MorePanelsButton.js +1 -1
- package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
- package/dist/editor/sidebar/Workbox.js +1 -1
- package/dist/editor/sidebar/Workbox.js.map +1 -1
- package/dist/editor/ui/IconSelectorDialog.js +1 -1
- package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
- package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
- package/dist/editor/ui/SimpleIconButton.js +1 -1
- package/dist/editor/ui/SimpleIconButton.js.map +1 -1
- package/dist/editor/utils.d.ts +17 -1
- package/dist/editor/utils.js +143 -0
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/version-diff/versionDiffTargets.d.ts +8 -3
- package/dist/editor/version-diff/versionDiffTargets.js +94 -37
- package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/DialogWrappers.js +2 -2
- package/dist/splash-screen/DialogWrappers.js.map +1 -1
- package/dist/splash-screen/ModernSplashScreen.js +3 -11
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/splash-screen/NewPage.js +5 -7
- package/dist/splash-screen/NewPage.js.map +1 -1
- package/dist/splash-screen/OpenPage.js +3 -5
- package/dist/splash-screen/OpenPage.js.map +1 -1
- package/dist/splash-screen/RecentPages.js +3 -3
- package/dist/splash-screen/RecentPages.js.map +1 -1
- package/package.json +1 -2
- package/styles.css +0 -49
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
- package/dist/editor/bridge/BridgeClient.d.ts +0 -80
- package/dist/editor/bridge/BridgeClient.js +0 -416
- package/dist/editor/bridge/BridgeClient.js.map +0 -1
- package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +0 -13
- package/dist/editor/field-types/useFormFieldCaretPresence.js +0 -92
- package/dist/editor/field-types/useFormFieldCaretPresence.js.map +0 -1
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +0 -6
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +0 -123
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +0 -1
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +0 -26
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +0 -222
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +0 -1
- package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +0 -20
- package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -33
- package/dist/editor/page-viewer/bridgeFieldPatch.js.map +0 -1
- package/dist/editor/reviews/commentTransientSelection.d.ts +0 -23
- package/dist/editor/reviews/commentTransientSelection.js +0 -7
- package/dist/editor/reviews/commentTransientSelection.js.map +0 -1
- package/dist/editor/reviews/feedbackOrdering.d.ts +0 -5
- package/dist/editor/reviews/feedbackOrdering.js +0 -27
- package/dist/editor/reviews/feedbackOrdering.js.map +0 -1
- package/dist/editor/reviews/suggestedEditState.d.ts +0 -12
- package/dist/editor/reviews/suggestedEditState.js +0 -90
- package/dist/editor/reviews/suggestedEditState.js.map +0 -1
- package/dist/editor/reviews/suggestionDisplayValue.d.ts +0 -43
- package/dist/editor/reviews/suggestionDisplayValue.js +0 -93
- package/dist/editor/reviews/suggestionDisplayValue.js.map +0 -1
- package/dist/editor/sidebar/BridgeDiagnostics.d.ts +0 -1
- package/dist/editor/sidebar/BridgeDiagnostics.js +0 -41
- package/dist/editor/sidebar/BridgeDiagnostics.js.map +0 -1
|
@@ -46,7 +46,6 @@ import { QuickItemSwitcher } from "../QuickItemSwitcher";
|
|
|
46
46
|
import { useEditorSlotContext, } from "../views/editorSlotContext";
|
|
47
47
|
import { getComments, getAvailableCommentTags, } from "../services/reviewsService";
|
|
48
48
|
import { useReviews } from "../reviews/useReviews";
|
|
49
|
-
import { COMMENT_TRANSIENT_ELEMENT_KEY, COMMENT_TRANSIENT_SELECTION_RECT, } from "../reviews/commentTransientSelection";
|
|
50
49
|
import uuid from "react-uuid";
|
|
51
50
|
import { flushSync } from "react-dom";
|
|
52
51
|
import { getSuggestedEdits } from "../services/suggestedEditsService";
|
|
@@ -68,24 +67,6 @@ import { FeatureGate, LicenseFeatures, LicenseProvider, LicenseOverlay, } from "
|
|
|
68
67
|
// nothing open" (param present with this value) so reload can honor the user's intent.
|
|
69
68
|
const SIDEBAR_NONE_SENTINEL = "none";
|
|
70
69
|
const sidebarUrlValue = (ids) => ids.length ? ids.join(",") : SIDEBAR_NONE_SENTINEL;
|
|
71
|
-
// moved to hooks/useQuota
|
|
72
|
-
function isUsableTextSelectionRange(range) {
|
|
73
|
-
return !!(range &&
|
|
74
|
-
range.text?.trim() &&
|
|
75
|
-
typeof range.startOffset === "number" &&
|
|
76
|
-
typeof range.endOffset === "number" &&
|
|
77
|
-
range.startOffset !== range.endOffset &&
|
|
78
|
-
range.fieldId &&
|
|
79
|
-
range.itemId);
|
|
80
|
-
}
|
|
81
|
-
function selectionRangeMatchesField(range, field) {
|
|
82
|
-
if (!range || !field)
|
|
83
|
-
return false;
|
|
84
|
-
return (cleanId(range.fieldId) === cleanId(field.fieldId) &&
|
|
85
|
-
cleanId(range.itemId) === cleanId(field.item.id) &&
|
|
86
|
-
(!range.language || range.language === field.item.language) &&
|
|
87
|
-
(typeof range.version !== "number" || range.version === field.item.version));
|
|
88
|
-
}
|
|
89
70
|
function reconcileSlotSettingsState(previous, slots, defaults) {
|
|
90
71
|
const next = {};
|
|
91
72
|
let changed = false;
|
|
@@ -153,10 +134,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
153
134
|
const [focusedField, setFocusedField] = useState();
|
|
154
135
|
const focusedFieldRef = useRef(undefined);
|
|
155
136
|
const [selectedRange, setSelectedRange] = useState();
|
|
156
|
-
const lastTextSelectionRangeRef = useRef(undefined);
|
|
157
137
|
const [validating, setValidating] = useState(false);
|
|
158
138
|
const [inserting, setInserting] = useState();
|
|
159
|
-
const insertingSequenceRef = useRef(0);
|
|
160
139
|
const [showFullscreenHint, setShowFullscreenHint] = useState(false);
|
|
161
140
|
// Fullscreen is a shell-level UI mode. Keep it in EditorShell state so the shell can rerender
|
|
162
141
|
// immediately when toggled, while still syncing the active slot's PageViewContext.fullscreen.
|
|
@@ -174,7 +153,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
174
153
|
const [activeFieldActions, setActiveFieldActions] = useState([]);
|
|
175
154
|
const fieldEditorPopupRef = React.useRef(null);
|
|
176
155
|
const [validationResult, setValidationResult] = useState();
|
|
177
|
-
const [bridgeDiagnostics, setBridgeDiagnostics] = useState(undefined);
|
|
178
156
|
const [editHistory, setEditHistory] = useState([]);
|
|
179
157
|
const [historyMode, setHistoryMode] = useState("global");
|
|
180
158
|
const [showOnlyMyChanges, setShowOnlyMyChanges] = useState(true);
|
|
@@ -487,6 +465,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
487
465
|
// The very first URL sync after initial load should replaceState (not pushState)
|
|
488
466
|
// so the initial bare URL isn't left as a dead-end history entry.
|
|
489
467
|
const isFirstUrlSyncRef = useRef(true);
|
|
468
|
+
const [inlineEditingFieldElement, setInlineEditingFieldElement] = useState();
|
|
490
469
|
const [lockedField, setLockedField] = useState();
|
|
491
470
|
const [itemLanguages, setItemLanguages] = useState([]);
|
|
492
471
|
const [itemVersions, setItemVersions] = useState([]);
|
|
@@ -576,67 +555,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
576
555
|
const [isTourActive, setIsTourActive] = useState(tourRestoredFromUrl);
|
|
577
556
|
// Track if tour was restored from URL to skip prepareAction on initial render
|
|
578
557
|
const tourRestoredRef = useRef(tourRestoredFromUrl);
|
|
579
|
-
const [mode,
|
|
580
|
-
const modeRef = useRef("edit");
|
|
581
|
-
modeRef.current = mode;
|
|
582
|
-
const modeChangeParticipantsRef = useRef(new Set());
|
|
583
|
-
const loadSuggestedEditsRef = useRef(async () => { });
|
|
584
|
-
const [modeTransitionRevision, setModeTransitionRevision] = useState(0);
|
|
558
|
+
const [mode, setMode] = useState("edit");
|
|
585
559
|
const [previewDate, setPreviewDate] = useState();
|
|
586
560
|
const [layoutMode, setLayoutMode] = useState("final");
|
|
587
|
-
const registerModeChangeParticipant = useCallback((participant) => {
|
|
588
|
-
modeChangeParticipantsRef.current.add(participant);
|
|
589
|
-
return () => {
|
|
590
|
-
modeChangeParticipantsRef.current.delete(participant);
|
|
591
|
-
};
|
|
592
|
-
}, []);
|
|
593
|
-
const changeMode = useCallback(async (nextMode, options) => {
|
|
594
|
-
const previousMode = modeRef.current;
|
|
595
|
-
if (nextMode === previousMode)
|
|
596
|
-
return;
|
|
597
|
-
const participants = Array.from(modeChangeParticipantsRef.current);
|
|
598
|
-
for (const participant of participants) {
|
|
599
|
-
await participant.beforeModeChange?.(nextMode, previousMode, options);
|
|
600
|
-
}
|
|
601
|
-
for (const participant of participants) {
|
|
602
|
-
participant.clearInlineDedupe?.(nextMode, previousMode, options);
|
|
603
|
-
}
|
|
604
|
-
flushSync(() => {
|
|
605
|
-
modeRef.current = nextMode;
|
|
606
|
-
setModeState(nextMode);
|
|
607
|
-
setModeTransitionRevision((revision) => revision + 1);
|
|
608
|
-
if (nextMode !== "preview") {
|
|
609
|
-
setPreviewDate(undefined);
|
|
610
|
-
}
|
|
611
|
-
if (nextMode === "suggestions") {
|
|
612
|
-
setShowSuggestedEdits(true);
|
|
613
|
-
setWorkspaceId("editor");
|
|
614
|
-
setOpenSidebars((prev) => {
|
|
615
|
-
if (prev.includes("feedback"))
|
|
616
|
-
return prev;
|
|
617
|
-
const next = [...prev, "feedback"];
|
|
618
|
-
openSidebarsRef.current = next;
|
|
619
|
-
return next;
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
else {
|
|
623
|
-
setShowSuggestedEdits(false);
|
|
624
|
-
}
|
|
625
|
-
});
|
|
626
|
-
if (nextMode === "suggestions") {
|
|
627
|
-
void loadSuggestedEditsRef.current();
|
|
628
|
-
}
|
|
629
|
-
}, []);
|
|
630
|
-
const setMode = useCallback((nextMode) => {
|
|
631
|
-
const resolvedMode = typeof nextMode === "function" ? nextMode(modeRef.current) : nextMode;
|
|
632
|
-
void changeMode(resolvedMode);
|
|
633
|
-
}, [changeMode]);
|
|
634
|
-
const workspaceShowsModeControls = !!configuration.editor.workspaces?.find((workspace) => workspace.id === workspaceId)?.toolbarFactory;
|
|
635
|
-
useEffect(() => {
|
|
636
|
-
if (workspaceShowsModeControls || mode !== "suggestions")
|
|
637
|
-
return;
|
|
638
|
-
void changeMode("edit", { reason: "mode-controls-hidden" });
|
|
639
|
-
}, [changeMode, mode, workspaceId, workspaceShowsModeControls]);
|
|
640
561
|
useEffect(() => {
|
|
641
562
|
if (mode !== "preview") {
|
|
642
563
|
setPreviewDate(undefined);
|
|
@@ -742,6 +663,19 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
742
663
|
setSelectedHelpSectionId(helpParam === "contents" || helpParam === "true" ? null : helpParam);
|
|
743
664
|
}
|
|
744
665
|
}, [searchParams, isInitialLoad]);
|
|
666
|
+
useEffect(() => {
|
|
667
|
+
if (mode === "suggestions") {
|
|
668
|
+
// Ensure we're in the editor workspace and open the feedback sidebar
|
|
669
|
+
setWorkspaceId("editor");
|
|
670
|
+
// Open the feedback sidebar if not already open
|
|
671
|
+
setOpenSidebars((prev) => {
|
|
672
|
+
if (!prev.includes("comments")) {
|
|
673
|
+
return [...prev, "comments"];
|
|
674
|
+
}
|
|
675
|
+
return prev;
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
}, [mode]);
|
|
745
679
|
useEffect(() => {
|
|
746
680
|
if (focusedField &&
|
|
747
681
|
selection.length > 0 &&
|
|
@@ -751,19 +685,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
751
685
|
}, [selection]);
|
|
752
686
|
useEffect(() => {
|
|
753
687
|
focusedFieldRef.current = focusedField;
|
|
754
|
-
const lastTextSelection = lastTextSelectionRangeRef.current;
|
|
755
|
-
if (focusedField &&
|
|
756
|
-
lastTextSelection &&
|
|
757
|
-
(focusedField.fieldId !== lastTextSelection.fieldId ||
|
|
758
|
-
focusedField.item.id !== lastTextSelection.itemId)) {
|
|
759
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
760
|
-
}
|
|
761
688
|
}, [focusedField]);
|
|
762
|
-
useEffect(() => {
|
|
763
|
-
if (isUsableTextSelectionRange(selectedRange)) {
|
|
764
|
-
lastTextSelectionRangeRef.current = selectedRange;
|
|
765
|
-
}
|
|
766
|
-
}, [selectedRange]);
|
|
767
689
|
// Track the current page item descriptor for itemsRepository
|
|
768
690
|
const [currentPageItem, setCurrentPageItem] = useState();
|
|
769
691
|
// Create itemsRepository with current page item (will be updated when page loads)
|
|
@@ -1294,8 +1216,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1294
1216
|
const toggleHelpTerminal = useCallback((options) => {
|
|
1295
1217
|
const isCurrentlyOpen = showHelpTerminal;
|
|
1296
1218
|
const requestedTab = options?.activeTab;
|
|
1297
|
-
if (isCurrentlyOpen &&
|
|
1298
|
-
(!requestedTab || requestedTab === helpTerminalActiveTab)) {
|
|
1219
|
+
if (isCurrentlyOpen && (!requestedTab || requestedTab === helpTerminalActiveTab)) {
|
|
1299
1220
|
// Close when toggling the currently active help view.
|
|
1300
1221
|
handleSetShowHelpTerminal(false);
|
|
1301
1222
|
}
|
|
@@ -1498,7 +1419,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1498
1419
|
}
|
|
1499
1420
|
// Handle mode changes — always set to avoid stale-closure mismatch
|
|
1500
1421
|
const urlMode = urlParams.get("mode");
|
|
1501
|
-
|
|
1422
|
+
if (urlMode) {
|
|
1423
|
+
setMode(urlMode);
|
|
1424
|
+
}
|
|
1502
1425
|
// Handle fullscreen changes (shell-level state)
|
|
1503
1426
|
const isFullscreen = urlParams.get("fullscreen") === "true";
|
|
1504
1427
|
if (configuration.forceFullscreen) {
|
|
@@ -1775,9 +1698,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1775
1698
|
const edits = result.data || [];
|
|
1776
1699
|
setSuggestedEdits(edits);
|
|
1777
1700
|
}, [item, searchParams]);
|
|
1778
|
-
useEffect(() => {
|
|
1779
|
-
loadSuggestedEditsRef.current = loadSuggestedEdits;
|
|
1780
|
-
}, [loadSuggestedEdits]);
|
|
1781
1701
|
const loadFavorites = useCallback(async () => {
|
|
1782
1702
|
try {
|
|
1783
1703
|
const result = await getAllFavorites();
|
|
@@ -1790,9 +1710,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1790
1710
|
setFavorites([]);
|
|
1791
1711
|
}
|
|
1792
1712
|
}, []);
|
|
1793
|
-
const refreshFavorites = useCallback(async (opts) => {
|
|
1794
|
-
await loadFavorites();
|
|
1795
|
-
}, [loadFavorites]);
|
|
1796
1713
|
const page = activePageViewContext.page;
|
|
1797
1714
|
const currentHistoryScope = useMemo(() => {
|
|
1798
1715
|
const currentItem = item?.descriptor;
|
|
@@ -2189,9 +2106,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2189
2106
|
globalThis.editorRefreshTimer = undefined;
|
|
2190
2107
|
};
|
|
2191
2108
|
if (mode === "immediate") {
|
|
2192
|
-
if (refreshTimer) {
|
|
2193
|
-
clearTimeout(refreshTimer);
|
|
2194
|
-
}
|
|
2195
2109
|
doRefresh();
|
|
2196
2110
|
return;
|
|
2197
2111
|
}
|
|
@@ -2385,7 +2299,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2385
2299
|
else {
|
|
2386
2300
|
current.set("compare", "true");
|
|
2387
2301
|
}
|
|
2388
|
-
current.set("mode",
|
|
2302
|
+
current.set("mode", mode);
|
|
2389
2303
|
// Handle fullscreen parameter
|
|
2390
2304
|
if (fullscreen) {
|
|
2391
2305
|
current.set("fullscreen", "true");
|
|
@@ -3090,35 +3004,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3090
3004
|
};
|
|
3091
3005
|
}, [promptSessionReconnect]);
|
|
3092
3006
|
const sendSocketMessage = useCallback((message) => {
|
|
3093
|
-
if (message.type === "caret-position" &&
|
|
3094
|
-
message.payload?.source === "form-field") {
|
|
3095
|
-
const payload = message.payload;
|
|
3096
|
-
setRemoteCarets((current) => {
|
|
3097
|
-
if (payload.offset == null) {
|
|
3098
|
-
if (!current[sessionId])
|
|
3099
|
-
return current;
|
|
3100
|
-
const next = { ...current };
|
|
3101
|
-
delete next[sessionId];
|
|
3102
|
-
return next;
|
|
3103
|
-
}
|
|
3104
|
-
if (!payload.fieldId || !payload.item) {
|
|
3105
|
-
return current;
|
|
3106
|
-
}
|
|
3107
|
-
return {
|
|
3108
|
-
...current,
|
|
3109
|
-
[sessionId]: {
|
|
3110
|
-
sessionId,
|
|
3111
|
-
fieldId: payload.fieldId,
|
|
3112
|
-
item: payload.item,
|
|
3113
|
-
offset: payload.offset,
|
|
3114
|
-
value: payload.value,
|
|
3115
|
-
},
|
|
3116
|
-
};
|
|
3117
|
-
});
|
|
3118
|
-
}
|
|
3119
3007
|
// Routes over whichever transport is active (WebSocket preferred, SSE fallback).
|
|
3120
3008
|
getEditorRealtime().send(message);
|
|
3121
|
-
}, [
|
|
3009
|
+
}, []);
|
|
3122
3010
|
// URL update helper - defined early so it can be used by workspace/sidebar functions
|
|
3123
3011
|
const updateUrl = useCallback((params) => {
|
|
3124
3012
|
// Use the actual browser pathname (including any basePath like /parhelia)
|
|
@@ -3596,51 +3484,34 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3596
3484
|
operationsContext.context.markOperationComplete;
|
|
3597
3485
|
}, [operationsContext.context.markOperationComplete]);
|
|
3598
3486
|
// Replace selected text with new content (for inline AI editing)
|
|
3599
|
-
const replaceSelectedText = useCallback(async (newText
|
|
3600
|
-
|
|
3487
|
+
const replaceSelectedText = useCallback(async (newText) => {
|
|
3488
|
+
if (!focusedField)
|
|
3489
|
+
return;
|
|
3601
3490
|
try {
|
|
3602
3491
|
// If we have selected text and a replaceText callback, use it
|
|
3603
|
-
if (
|
|
3604
|
-
|
|
3492
|
+
if (selectedRange?.text && selectedRange.replaceText) {
|
|
3493
|
+
selectedRange.replaceText(newText);
|
|
3605
3494
|
setSelectedRange(undefined);
|
|
3606
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3607
3495
|
return;
|
|
3608
3496
|
}
|
|
3609
3497
|
// If no selection but we have a replaceText callback, try to use it for insertion
|
|
3610
3498
|
// (some editors might support insertion via the same callback)
|
|
3611
|
-
if (!
|
|
3612
|
-
|
|
3499
|
+
if (!selectedRange?.text && selectedRange?.replaceText) {
|
|
3500
|
+
selectedRange.replaceText(newText);
|
|
3613
3501
|
setSelectedRange(undefined);
|
|
3614
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3615
3502
|
return;
|
|
3616
3503
|
}
|
|
3617
|
-
const fieldToReplace = focusedField ??
|
|
3618
|
-
(rangeToReplace?.fieldId &&
|
|
3619
|
-
rangeToReplace.itemId &&
|
|
3620
|
-
rangeToReplace.language &&
|
|
3621
|
-
typeof rangeToReplace.version === "number"
|
|
3622
|
-
? {
|
|
3623
|
-
fieldId: rangeToReplace.fieldId,
|
|
3624
|
-
item: {
|
|
3625
|
-
id: rangeToReplace.itemId,
|
|
3626
|
-
language: rangeToReplace.language,
|
|
3627
|
-
version: rangeToReplace.version,
|
|
3628
|
-
},
|
|
3629
|
-
}
|
|
3630
|
-
: undefined);
|
|
3631
|
-
if (!fieldToReplace)
|
|
3632
|
-
return;
|
|
3633
3504
|
// Fallback: indexOf-based replacement/insertion for plain text fields
|
|
3634
|
-
const { fieldId, item } =
|
|
3505
|
+
const { fieldId, item } = focusedField;
|
|
3635
3506
|
const modifiedField = getActiveSlotContext()?.fieldModificationStore.getField(fieldId, item.id, item.language, item.version);
|
|
3636
3507
|
const currentValue = modifiedField
|
|
3637
3508
|
? modifiedField.value || ""
|
|
3638
|
-
: (await itemsRepository.getField(
|
|
3639
|
-
|
|
3509
|
+
: (await itemsRepository.getField(focusedField))?.value ||
|
|
3510
|
+
"";
|
|
3640
3511
|
let newValue;
|
|
3641
|
-
if (
|
|
3512
|
+
if (selectedRange?.text) {
|
|
3642
3513
|
// Replace selected text
|
|
3643
|
-
const { text: originalSelectedText } =
|
|
3514
|
+
const { text: originalSelectedText } = selectedRange;
|
|
3644
3515
|
const actualPosition = currentValue.indexOf(originalSelectedText);
|
|
3645
3516
|
if (actualPosition === -1) {
|
|
3646
3517
|
console.error("Failed to find selected text in field value");
|
|
@@ -3653,7 +3524,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3653
3524
|
}
|
|
3654
3525
|
else {
|
|
3655
3526
|
// Insert at cursor position (use startOffset if available, otherwise append)
|
|
3656
|
-
const insertPosition =
|
|
3527
|
+
const insertPosition = selectedRange?.startOffset ?? currentValue.length;
|
|
3657
3528
|
newValue =
|
|
3658
3529
|
currentValue.slice(0, insertPosition) +
|
|
3659
3530
|
newText +
|
|
@@ -3661,13 +3532,12 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3661
3532
|
}
|
|
3662
3533
|
// Update the field
|
|
3663
3534
|
await operations.editField({
|
|
3664
|
-
field:
|
|
3535
|
+
field: focusedField,
|
|
3665
3536
|
value: newValue,
|
|
3666
3537
|
refresh: "immediate",
|
|
3667
3538
|
});
|
|
3668
3539
|
// Clear the selection after replacement/insertion
|
|
3669
3540
|
setSelectedRange(undefined);
|
|
3670
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
3671
3541
|
}
|
|
3672
3542
|
catch (error) {
|
|
3673
3543
|
console.error("Failed to replace/insert text:", error);
|
|
@@ -4144,6 +4014,18 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4144
4014
|
};
|
|
4145
4015
|
}
|
|
4146
4016
|
}, [operations.onFieldBlur]);
|
|
4017
|
+
useEffect(() => {
|
|
4018
|
+
if (mode === "suggestions") {
|
|
4019
|
+
setShowSuggestedEdits(true);
|
|
4020
|
+
// Refresh from the server to recover from any missed
|
|
4021
|
+
// `suggested-edit-updated` WebSocket events (e.g. created by an
|
|
4022
|
+
// agent tool while another tab was focused).
|
|
4023
|
+
loadSuggestedEdits();
|
|
4024
|
+
}
|
|
4025
|
+
else {
|
|
4026
|
+
setShowSuggestedEdits(false);
|
|
4027
|
+
}
|
|
4028
|
+
}, [mode, loadSuggestedEdits]);
|
|
4147
4029
|
const isReadOnly = !item ||
|
|
4148
4030
|
!item.canWriteItem ||
|
|
4149
4031
|
!item.canWriteLanguage ||
|
|
@@ -4162,6 +4044,15 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4162
4044
|
// Otherwise, only show workspaces that are in the settings
|
|
4163
4045
|
return workspaceIdsFromSettings.includes(w.id) && !w.visible;
|
|
4164
4046
|
});
|
|
4047
|
+
// Handle initial mode setup from URL (only on initial load)
|
|
4048
|
+
useEffect(() => {
|
|
4049
|
+
if (!isInitialLoad)
|
|
4050
|
+
return;
|
|
4051
|
+
const queryMode = searchParams.get("mode");
|
|
4052
|
+
if (queryMode) {
|
|
4053
|
+
setMode(queryMode);
|
|
4054
|
+
}
|
|
4055
|
+
}, [searchParams, isInitialLoad]);
|
|
4165
4056
|
// Add this new effect for initial fullscreen setup
|
|
4166
4057
|
useEffect(() => {
|
|
4167
4058
|
if (!isInitialLoad)
|
|
@@ -4289,11 +4180,16 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4289
4180
|
dragEnd: () => {
|
|
4290
4181
|
setDragObject(undefined);
|
|
4291
4182
|
},
|
|
4292
|
-
droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption
|
|
4293
|
-
|
|
4294
|
-
if ((!droppedDragObject && !insertOption) || !page)
|
|
4183
|
+
droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption) => {
|
|
4184
|
+
if ((!dragObject && !insertOption) || !page)
|
|
4295
4185
|
return;
|
|
4296
4186
|
setDragObject(undefined);
|
|
4187
|
+
if (spotPositionElement && spotPositionAnchor) {
|
|
4188
|
+
setInserting({
|
|
4189
|
+
positionElement: spotPositionElement,
|
|
4190
|
+
positionAnchor: spotPositionAnchor,
|
|
4191
|
+
});
|
|
4192
|
+
}
|
|
4297
4193
|
const placeholderKeyComponents = placeholderKey.split("_");
|
|
4298
4194
|
const parentId = placeholderKeyComponents.length === 1
|
|
4299
4195
|
? undefined
|
|
@@ -4303,31 +4199,39 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4303
4199
|
let op;
|
|
4304
4200
|
if (!currentItemDescriptorRef.current)
|
|
4305
4201
|
return;
|
|
4306
|
-
let insertionSequence;
|
|
4307
|
-
if ((spotPosition || spotPositionElement) && spotPositionAnchor) {
|
|
4308
|
-
insertionSequence = ++insertingSequenceRef.current;
|
|
4309
|
-
setInserting({
|
|
4310
|
-
position: spotPosition,
|
|
4311
|
-
positionElement: spotPositionElement,
|
|
4312
|
-
positionAnchor: spotPositionAnchor,
|
|
4313
|
-
});
|
|
4314
|
-
}
|
|
4315
|
-
let operationPromise;
|
|
4316
4202
|
if (insertOption) {
|
|
4317
4203
|
// Clear any selected component type for insertion once the component
|
|
4318
4204
|
// has been dropped into a placeholder. This ensures that insert mode
|
|
4319
4205
|
// can exit cleanly and the editor header updates from "Add Component"
|
|
4320
4206
|
// to the actual component name after the operation completes.
|
|
4321
4207
|
setSelectedForInsertion("");
|
|
4322
|
-
|
|
4208
|
+
operations
|
|
4209
|
+
.addComponent(insertOption.typeId, placeholderKey, index, currentItemDescriptorRef.current)
|
|
4210
|
+
.then((result) => {
|
|
4211
|
+
setInserting(undefined);
|
|
4212
|
+
})
|
|
4213
|
+
.catch((err) => {
|
|
4214
|
+
setInserting(undefined);
|
|
4215
|
+
});
|
|
4216
|
+
return;
|
|
4323
4217
|
}
|
|
4324
|
-
|
|
4325
|
-
|
|
4218
|
+
if (!dragObject)
|
|
4219
|
+
return;
|
|
4220
|
+
if (dragObject && dragObject.type == "template") {
|
|
4221
|
+
operations
|
|
4222
|
+
.addComponent(dragObject.typeId, placeholderKey, index, currentItemDescriptorRef.current)
|
|
4223
|
+
.then((result) => {
|
|
4224
|
+
setInserting(undefined);
|
|
4225
|
+
})
|
|
4226
|
+
.catch((err) => {
|
|
4227
|
+
setInserting(undefined);
|
|
4228
|
+
});
|
|
4229
|
+
return;
|
|
4326
4230
|
}
|
|
4327
|
-
|
|
4328
|
-
(
|
|
4231
|
+
if (dragObject.type == "component" ||
|
|
4232
|
+
(dragObject.type == "items" && dragObject.items)) {
|
|
4329
4233
|
const parentComponent = parentId && page ? getComponentById(parentId, page) : null;
|
|
4330
|
-
if (
|
|
4234
|
+
if (dragObject.type == "items" && dragObject.items) {
|
|
4331
4235
|
op = {
|
|
4332
4236
|
type: "link-component",
|
|
4333
4237
|
mainItem: page.item.descriptor,
|
|
@@ -4341,52 +4245,33 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4341
4245
|
placeholderIndex: index,
|
|
4342
4246
|
date: new Date().toISOString(),
|
|
4343
4247
|
id: uuid(),
|
|
4344
|
-
linkedComponentItem:
|
|
4248
|
+
linkedComponentItem: dragObject.items[0],
|
|
4345
4249
|
title: "Link component",
|
|
4346
4250
|
};
|
|
4347
4251
|
}
|
|
4348
4252
|
else {
|
|
4349
|
-
const componentIds =
|
|
4350
|
-
if (componentIds.length
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
}
|
|
4253
|
+
const componentIds = dragObject.components?.map((c) => c.id) ?? [];
|
|
4254
|
+
if (componentIds.length === 0)
|
|
4255
|
+
return;
|
|
4256
|
+
op = {
|
|
4257
|
+
type: "move-component",
|
|
4258
|
+
mainItem: page.item.descriptor,
|
|
4259
|
+
parent: parentId && {
|
|
4260
|
+
id: parentId,
|
|
4261
|
+
language: page.item.descriptor.language,
|
|
4262
|
+
version: page.item.descriptor.version,
|
|
4263
|
+
},
|
|
4264
|
+
placeholderKey,
|
|
4265
|
+
placeholderIndex: index,
|
|
4266
|
+
componentIds,
|
|
4267
|
+
date: new Date().toISOString(),
|
|
4268
|
+
id: uuid(),
|
|
4269
|
+
title: "Move component",
|
|
4270
|
+
};
|
|
4367
4271
|
}
|
|
4368
4272
|
}
|
|
4369
4273
|
if (op)
|
|
4370
|
-
|
|
4371
|
-
if (!operationPromise) {
|
|
4372
|
-
if (insertionSequence !== undefined &&
|
|
4373
|
-
insertingSequenceRef.current === insertionSequence) {
|
|
4374
|
-
setInserting(undefined);
|
|
4375
|
-
}
|
|
4376
|
-
return;
|
|
4377
|
-
}
|
|
4378
|
-
try {
|
|
4379
|
-
await operationPromise;
|
|
4380
|
-
}
|
|
4381
|
-
catch (err) {
|
|
4382
|
-
console.error("Failed to drop component in placeholder", err);
|
|
4383
|
-
}
|
|
4384
|
-
finally {
|
|
4385
|
-
if (insertionSequence !== undefined &&
|
|
4386
|
-
insertingSequenceRef.current === insertionSequence) {
|
|
4387
|
-
setInserting(undefined);
|
|
4388
|
-
}
|
|
4389
|
-
}
|
|
4274
|
+
operations.executeEditOperation(op);
|
|
4390
4275
|
},
|
|
4391
4276
|
page,
|
|
4392
4277
|
triggerFieldAction: async (fieldDescriptor, actionButton, parameters, event) => {
|
|
@@ -4536,8 +4421,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4536
4421
|
inserting,
|
|
4537
4422
|
validating,
|
|
4538
4423
|
validationResult,
|
|
4539
|
-
bridgeDiagnostics,
|
|
4540
|
-
setBridgeDiagnostics,
|
|
4541
4424
|
loadItem,
|
|
4542
4425
|
editHistory: editHistory,
|
|
4543
4426
|
historyMode,
|
|
@@ -4667,50 +4550,27 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4667
4550
|
setShowComments,
|
|
4668
4551
|
showResolvedComments,
|
|
4669
4552
|
setShowResolvedComments,
|
|
4670
|
-
addComment: async (
|
|
4553
|
+
addComment: async () => {
|
|
4671
4554
|
const descriptor = item?.descriptor;
|
|
4672
4555
|
if (!descriptor)
|
|
4673
4556
|
return;
|
|
4674
4557
|
// Snapshot selection context up-front so switching views doesn't change what we comment on.
|
|
4675
|
-
const hintedFieldSnapshot = options?.field;
|
|
4676
4558
|
const focusedFieldSnapshot = focusedFieldRef.current;
|
|
4677
|
-
const
|
|
4678
|
-
|
|
4679
|
-
|
|
4680
|
-
|
|
4681
|
-
selectionRangeMatchesField(selectedRangeCandidate, hintedFieldSnapshot)
|
|
4682
|
-
? selectedRangeCandidate
|
|
4683
|
-
: undefined;
|
|
4684
|
-
const selectedRangeFieldSnapshot = isUsableTextSelectionRange(selectedRangeSnapshot)
|
|
4685
|
-
? {
|
|
4686
|
-
fieldId: selectedRangeSnapshot.fieldId,
|
|
4687
|
-
item: {
|
|
4688
|
-
id: selectedRangeSnapshot.itemId,
|
|
4689
|
-
language: selectedRangeSnapshot.language || descriptor.language,
|
|
4690
|
-
version: typeof selectedRangeSnapshot.version === "number"
|
|
4691
|
-
? selectedRangeSnapshot.version
|
|
4692
|
-
: descriptor.version,
|
|
4693
|
-
},
|
|
4694
|
-
}
|
|
4695
|
-
: undefined;
|
|
4696
|
-
const commentFieldSnapshot = selectedRangeFieldSnapshot ??
|
|
4697
|
-
hintedFieldSnapshot ??
|
|
4698
|
-
focusedFieldSnapshot;
|
|
4699
|
-
const itemId = commentFieldSnapshot?.item.id ||
|
|
4700
|
-
(selection.length > 0 ? selection[0] : undefined) ||
|
|
4559
|
+
const selectionSnapshot = [...selection];
|
|
4560
|
+
const selectedRangeSnapshot = selectedRange;
|
|
4561
|
+
const itemId = focusedFieldSnapshot?.item.id ||
|
|
4562
|
+
(selectionSnapshot.length > 0 ? selectionSnapshot[0] : undefined) ||
|
|
4701
4563
|
descriptor.id;
|
|
4702
4564
|
if (!itemId)
|
|
4703
4565
|
return;
|
|
4704
4566
|
// Ensure the feedback sidebar is open when adding a comment (e.g. command palette / toolbar button).
|
|
4705
4567
|
openSidebar("feedback");
|
|
4706
|
-
const language =
|
|
4707
|
-
const version =
|
|
4708
|
-
? commentFieldSnapshot.item.version
|
|
4709
|
-
: descriptor.version;
|
|
4568
|
+
const language = descriptor.language;
|
|
4569
|
+
const version = descriptor.version;
|
|
4710
4570
|
const getFieldName = async () => {
|
|
4711
|
-
if (!
|
|
4571
|
+
if (!focusedFieldSnapshot)
|
|
4712
4572
|
return "";
|
|
4713
|
-
const field = await itemsRepository.getField(
|
|
4573
|
+
const field = await itemsRepository.getField(focusedFieldSnapshot);
|
|
4714
4574
|
return field?.name;
|
|
4715
4575
|
};
|
|
4716
4576
|
const getItemName = async () => {
|
|
@@ -4726,40 +4586,24 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4726
4586
|
isNew: true,
|
|
4727
4587
|
itemId,
|
|
4728
4588
|
itemName: await getItemName(),
|
|
4729
|
-
fieldId:
|
|
4589
|
+
fieldId: focusedFieldSnapshot?.fieldId,
|
|
4730
4590
|
fieldName: await getFieldName(),
|
|
4731
4591
|
mainItemId: descriptor.id,
|
|
4732
4592
|
language,
|
|
4733
4593
|
version,
|
|
4734
4594
|
position: 0,
|
|
4735
|
-
rangeStart:
|
|
4736
|
-
|
|
4737
|
-
: 0,
|
|
4738
|
-
rangeEnd: isUsableTextSelectionRange(selectedRangeSnapshot)
|
|
4739
|
-
? selectedRangeSnapshot.endOffset
|
|
4740
|
-
: 0,
|
|
4595
|
+
rangeStart: selectedRangeSnapshot?.startOffset || 0,
|
|
4596
|
+
rangeEnd: selectedRangeSnapshot?.endOffset || 0,
|
|
4741
4597
|
author: user?.name,
|
|
4742
4598
|
authorDisplayName: user?.fullName,
|
|
4743
|
-
|
|
4599
|
+
date: new Date().toISOString(),
|
|
4744
4600
|
};
|
|
4745
|
-
if (selectedRangeSnapshot?.clientRect) {
|
|
4746
|
-
newComment[COMMENT_TRANSIENT_SELECTION_RECT] =
|
|
4747
|
-
selectedRangeSnapshot.clientRect;
|
|
4748
|
-
}
|
|
4749
|
-
if (selectedRangeSnapshot?.elementKey) {
|
|
4750
|
-
newComment[COMMENT_TRANSIENT_ELEMENT_KEY] =
|
|
4751
|
-
selectedRangeSnapshot.elementKey;
|
|
4752
|
-
}
|
|
4753
4601
|
setComments([newComment, ...comments]);
|
|
4754
4602
|
setSelectedComment(newComment);
|
|
4755
4603
|
setShowComments(true);
|
|
4756
|
-
lastTextSelectionRangeRef.current = undefined;
|
|
4757
4604
|
},
|
|
4758
4605
|
mode,
|
|
4759
|
-
changeMode,
|
|
4760
4606
|
setMode,
|
|
4761
|
-
registerModeChangeParticipant,
|
|
4762
|
-
modeTransitionRevision,
|
|
4763
4607
|
previewDate,
|
|
4764
4608
|
setPreviewDate,
|
|
4765
4609
|
layoutMode,
|
|
@@ -4827,7 +4671,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4827
4671
|
setCurrentWizardId,
|
|
4828
4672
|
favorites,
|
|
4829
4673
|
loadFavorites,
|
|
4830
|
-
refreshFavorites,
|
|
4831
4674
|
isQuickSwitcherVisible: quickSwitcherVisible,
|
|
4832
4675
|
// Context factory registry methods
|
|
4833
4676
|
registerContextFactory: (name, factory) => {
|
|
@@ -4936,7 +4779,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4936
4779
|
isRefreshing,
|
|
4937
4780
|
favorites,
|
|
4938
4781
|
loadFavorites,
|
|
4939
|
-
refreshFavorites,
|
|
4940
4782
|
currentWizardId,
|
|
4941
4783
|
quickSwitcherVisible,
|
|
4942
4784
|
quickSwitcherSelectedIndex,
|
|
@@ -4947,10 +4789,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4947
4789
|
factoriesRef,
|
|
4948
4790
|
user,
|
|
4949
4791
|
statusMessage,
|
|
4950
|
-
changeMode,
|
|
4951
|
-
setMode,
|
|
4952
|
-
registerModeChangeParticipant,
|
|
4953
|
-
modeTransitionRevision,
|
|
4954
4792
|
previewDate,
|
|
4955
4793
|
layoutMode,
|
|
4956
4794
|
enableCompletions,
|
|
@@ -4994,7 +4832,6 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4994
4832
|
openDialog,
|
|
4995
4833
|
validating,
|
|
4996
4834
|
validationResult,
|
|
4997
|
-
bridgeDiagnostics,
|
|
4998
4835
|
isRefreshing,
|
|
4999
4836
|
executeCommand,
|
|
5000
4837
|
showInfoToast,
|
|
@@ -5017,6 +4854,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5017
4854
|
setLockedField(undefined); // Clear client-side lock state
|
|
5018
4855
|
await releaseFieldLocks(sessionId);
|
|
5019
4856
|
},
|
|
4857
|
+
inlineEditingFieldElement,
|
|
4858
|
+
setInlineEditingFieldElement,
|
|
5020
4859
|
};
|
|
5021
4860
|
// Debug: Track editContext changes
|
|
5022
4861
|
// const prevDependencies = useRef<any[]>([]);
|
|
@@ -5055,6 +4894,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5055
4894
|
// componentDesignerRendering,
|
|
5056
4895
|
// insertMode,
|
|
5057
4896
|
// currentOverlay,
|
|
4897
|
+
// inlineEditingFieldElement,
|
|
5058
4898
|
// lockedField,
|
|
5059
4899
|
// selectedRange,
|
|
5060
4900
|
// pageViewContext,
|
|
@@ -5142,6 +4982,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5142
4982
|
// 'componentDesignerRendering',
|
|
5143
4983
|
// 'insertMode',
|
|
5144
4984
|
// 'currentOverlay',
|
|
4985
|
+
// 'inlineEditingFieldElement',
|
|
5145
4986
|
// 'lockedField',
|
|
5146
4987
|
// 'selectedRange',
|
|
5147
4988
|
// 'pageViewContext',
|
|
@@ -5269,8 +5110,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
5269
5110
|
: window.location.pathname;
|
|
5270
5111
|
window.history.replaceState(getCurrentHistoryState(), "", newUrl);
|
|
5271
5112
|
}, configuration: configuration, restoredFromUrl: tourRestoredRef.current })), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(GuidanceOverlay, {}) }), _jsx(FeatureGate, { feature: LicenseFeatures.AI, children: _jsx(AgentDialogHandler, {}) })] }));
|
|
5272
|
-
|
|
5273
|
-
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), showRefreshSpinner && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
|
|
5113
|
+
return (_jsx(LicenseProvider, { initialLicenseStatus: initialLicenseStatus, initialStatusLoaded: initialLicenseStatusLoaded, children: _jsx("div", { className: `editor h-full w-full`, children: _jsx(OperationsContextProvider, { value: operationsContext.context, children: _jsx(FieldsEditContextProvider, { value: fieldsEditContext, children: _jsx(EditContextProvider, { value: editContext, children: _jsxs(SplashScreenAgentProvider, { children: [_jsx(DevModeIndicator, {}), startupChecks.state === "loading" && _jsx(EditorLoadingOverlay, {}), editContext.isRefreshing && (_jsx("div", { className: "text-neutral-grey-50 pointer-events-none fixed right-0 bottom-0 flex h-24 w-24 items-center justify-center opacity-50 select-none", children: _jsx(Spinner, {}) })), (currentWorkspace.id === "agents" ||
|
|
5274
5114
|
currentWorkspace.id === "taskboard" ||
|
|
5275
5115
|
currentWorkspace.id === "translation-management") &&
|
|
5276
5116
|
showAgentsWorkspaceEditor && (_jsx(AgentsSlotContextBridgeHost, { slots: editorSlots })), startupChecks.state !== "loading" && (children || editorUi), startupChecks.state !== "loading" && dialog, _jsx(Toaster, { position: "top-center" }), " ", _jsx(ConfirmationDialog, { ref: confirmationDialogRef }), _jsx(ConcurrentUserLimitDialog, { open: concurrentUserLimitError !== null, onOpenChange: (open) => {
|