@parhelia/core 0.3.12788 → 0.3.12798
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/LanguageSelector.js +4 -1
- package/dist/components/ui/LanguageSelector.js.map +1 -1
- package/dist/components/ui/PlaceholderInput.js +16 -2
- package/dist/components/ui/PlaceholderInput.js.map +1 -1
- package/dist/components/ui/select.js +12 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/editor/FieldHistory.js +14 -4
- package/dist/editor/FieldHistory.js.map +1 -1
- package/dist/editor/ai/InlineAiDialog.js +35 -8
- package/dist/editor/ai/InlineAiDialog.js.map +1 -1
- package/dist/editor/ai/agentTodoExtraction.d.ts +1 -0
- package/dist/editor/ai/agentTodoExtraction.js +3 -0
- package/dist/editor/ai/agentTodoExtraction.js.map +1 -1
- package/dist/editor/ai/terminal/agentSessionState.js +26 -4
- package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentProjectProgress.d.ts +4 -3
- package/dist/editor/ai/terminal/components/AgentProjectProgress.js +34 -50
- package/dist/editor/ai/terminal/components/AgentProjectProgress.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.d.ts +2 -1
- package/dist/editor/ai/terminal/components/AgentTerminalView.js +2 -2
- package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
- package/dist/editor/ai/terminal/components/AgentThinkingIndicator.js +2 -1
- package/dist/editor/ai/terminal/components/AgentThinkingIndicator.js.map +1 -1
- package/dist/editor/ai/terminal/components/AiResponseMessage.js +55 -41
- package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/terminal/components/ApprovalCard.d.ts +1 -0
- package/dist/editor/ai/terminal/components/ApprovalCard.js +15 -1
- package/dist/editor/ai/terminal/components/ApprovalCard.js.map +1 -1
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.d.ts +24 -0
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js +97 -0
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js.map +1 -0
- package/dist/editor/ai/terminal/components/InitialThinkingSplash.js +2 -1
- package/dist/editor/ai/terminal/components/InitialThinkingSplash.js.map +1 -1
- package/dist/editor/ai/terminal/components/TodoListPanel.js +5 -3
- package/dist/editor/ai/terminal/components/TodoListPanel.js.map +1 -1
- package/dist/editor/ai/terminal/components/ToolCallDisplay.d.ts +4 -1
- package/dist/editor/ai/terminal/components/ToolCallDisplay.js +33 -5
- package/dist/editor/ai/terminal/components/ToolCallDisplay.js.map +1 -1
- package/dist/editor/ai/terminal/components/ValueDiff.d.ts +15 -0
- package/dist/editor/ai/terminal/components/ValueDiff.js +21 -0
- package/dist/editor/ai/terminal/components/ValueDiff.js.map +1 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.d.ts +1 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.js +2 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.js.map +1 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.d.ts +15 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.js +12 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.js.map +1 -0
- package/dist/editor/ai/terminal/useAgentRunResyncSocketHandler.d.ts +1 -0
- package/dist/editor/ai/terminal/useAgentRunResyncSocketHandler.js +6 -1
- package/dist/editor/ai/terminal/useAgentRunResyncSocketHandler.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentStreamPipeline.js +1 -0
- package/dist/editor/ai/terminal/useAgentStreamPipeline.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalController.js +1 -0
- package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.d.ts +1 -0
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.js +2 -1
- package/dist/editor/ai/terminal/useAgentTerminalViewProps.js.map +1 -1
- package/dist/editor/ai/types.d.ts +1 -0
- package/dist/editor/bridge/protocol.d.ts +11 -0
- package/dist/editor/bridge/protocol.js +1 -0
- package/dist/editor/bridge/protocol.js.map +1 -1
- package/dist/editor/client/EditorShell.js +184 -68
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +13 -3
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/activeSessionSnapshots.d.ts +2 -0
- package/dist/editor/client/hooks/activeSessionSnapshots.js +43 -0
- package/dist/editor/client/hooks/activeSessionSnapshots.js.map +1 -0
- package/dist/editor/client/hooks/feedbackSocketState.js +3 -0
- package/dist/editor/client/hooks/feedbackSocketState.js.map +1 -1
- package/dist/editor/client/hooks/operationRefreshDeduplication.d.ts +22 -0
- package/dist/editor/client/hooks/operationRefreshDeduplication.js +45 -0
- package/dist/editor/client/hooks/operationRefreshDeduplication.js.map +1 -0
- package/dist/editor/client/hooks/socketMessageRetention.d.ts +7 -0
- package/dist/editor/client/hooks/socketMessageRetention.js +11 -0
- package/dist/editor/client/hooks/socketMessageRetention.js.map +1 -0
- package/dist/editor/client/hooks/useSocketMessageHandler.js +53 -19
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/hooks/useWorkbox.d.ts +4 -0
- package/dist/editor/client/hooks/useWorkbox.js +132 -2
- package/dist/editor/client/hooks/useWorkbox.js.map +1 -1
- package/dist/editor/client/itemsRepository.d.ts +7 -1
- package/dist/editor/client/itemsRepository.js +55 -19
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +7 -3
- package/dist/editor/client/operations.js +216 -150
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/pageModelBuilder.js +21 -4
- package/dist/editor/client/pageModelBuilder.js.map +1 -1
- package/dist/editor/client/sidebarAvailability.d.ts +4 -0
- package/dist/editor/client/sidebarAvailability.js +15 -0
- package/dist/editor/client/sidebarAvailability.js.map +1 -1
- package/dist/editor/client/waitForEditOperationTerminal.js +1 -1
- package/dist/editor/client/waitForEditOperationTerminal.js.map +1 -1
- package/dist/editor/commands/itemCommands.js +1 -1
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/content-tree/TreeSettingsMenu.js +1 -1
- package/dist/editor/content-tree/TreeSettingsMenu.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +6 -1
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +2 -3
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +6 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +91 -5
- package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
- package/dist/editor/field-types/singleLineTextValue.d.ts +3 -0
- package/dist/editor/field-types/singleLineTextValue.js +9 -0
- package/dist/editor/field-types/singleLineTextValue.js.map +1 -0
- package/dist/editor/menubar/ItemLanguageVersion.js +1 -1
- package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
- package/dist/editor/menubar/VersionSelector.js +18 -6
- package/dist/editor/menubar/VersionSelector.js.map +1 -1
- package/dist/editor/menubar/WorkflowButton.js +8 -3
- package/dist/editor/menubar/WorkflowButton.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/notifications/NotificationCenter.js +26 -7
- package/dist/editor/notifications/NotificationCenter.js.map +1 -1
- package/dist/editor/notifications/useNotifications.d.ts +3 -1
- package/dist/editor/notifications/useNotifications.js +27 -9
- package/dist/editor/notifications/useNotifications.js.map +1 -1
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +18 -0
- package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/DragInsertionOverlay.js +54 -19
- package/dist/editor/page-editor-chrome/DragInsertionOverlay.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js +30 -8
- package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js.map +1 -1
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -8
- package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +4 -0
- package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
- package/dist/editor/page-editor-chrome/overlay/placeholderZones.js +23 -1
- package/dist/editor/page-editor-chrome/overlay/placeholderZones.js.map +1 -1
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +5 -3
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +111 -19
- package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.d.ts +2 -1
- package/dist/editor/page-viewer/EditorForm.js +41 -12
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.d.ts +2 -0
- package/dist/editor/page-viewer/PageViewer.js +11 -2
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +266 -44
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/bridgeFieldPatch.js +1 -0
- package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -1
- package/dist/editor/page-viewer/bridgeInlineAiSelection.d.ts +17 -0
- package/dist/editor/page-viewer/bridgeInlineAiSelection.js +80 -0
- package/dist/editor/page-viewer/bridgeInlineAiSelection.js.map +1 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.d.ts +18 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.js +24 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.js.map +1 -0
- package/dist/editor/page-viewer/bridgeInlineEditSession.d.ts +3 -0
- package/dist/editor/page-viewer/bridgeInlineEditSession.js +30 -0
- package/dist/editor/page-viewer/bridgeInlineEditSession.js.map +1 -1
- package/dist/editor/page-viewer/bridgeItemChangeTarget.d.ts +9 -0
- package/dist/editor/page-viewer/bridgeItemChangeTarget.js +38 -0
- package/dist/editor/page-viewer/bridgeItemChangeTarget.js.map +1 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.d.ts +31 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.js +32 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.js.map +1 -0
- package/dist/editor/page-viewer/renderUrl.d.ts +8 -0
- package/dist/editor/page-viewer/renderUrl.js +10 -0
- package/dist/editor/page-viewer/renderUrl.js.map +1 -1
- package/dist/editor/personalization/PersonalizationPanel.js +52 -25
- package/dist/editor/personalization/PersonalizationPanel.js.map +1 -1
- package/dist/editor/reviews/Comment.js +3 -1
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/reviews/CommentDisplayPopover.js +2 -0
- package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
- package/dist/editor/reviews/Comments.js +16 -3
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/reviews/SuggestedEdit.js +25 -2
- package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
- package/dist/editor/reviews/SuggestionCommentThread.js +2 -0
- package/dist/editor/reviews/SuggestionCommentThread.js.map +1 -1
- package/dist/editor/reviews/applySuggestedEditActions.js +105 -25
- package/dist/editor/reviews/applySuggestedEditActions.js.map +1 -1
- package/dist/editor/reviews/commentState.d.ts +4 -0
- package/dist/editor/reviews/commentState.js +15 -0
- package/dist/editor/reviews/commentState.js.map +1 -0
- package/dist/editor/reviews/feedbackOrdering.d.ts +1 -0
- package/dist/editor/reviews/feedbackOrdering.js +6 -0
- package/dist/editor/reviews/feedbackOrdering.js.map +1 -1
- package/dist/editor/reviews/suggestionContentChange.d.ts +7 -0
- package/dist/editor/reviews/suggestionContentChange.js +10 -0
- package/dist/editor/reviews/suggestionContentChange.js.map +1 -1
- package/dist/editor/reviews/suggestionPatch.js +6 -0
- package/dist/editor/reviews/suggestionPatch.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +6 -0
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/personalizationService.js +30 -6
- package/dist/editor/services/personalizationService.js.map +1 -1
- package/dist/editor/services/suggestedEditsService.d.ts +1 -0
- package/dist/editor/services/suggestedEditsService.js +3 -0
- package/dist/editor/services/suggestedEditsService.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +15 -7
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/panels/MemoriesPanel.js +3 -2
- package/dist/editor/settings/panels/MemoriesPanel.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.d.ts +7 -0
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +232 -21
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/settings/panels/projectTemplateDuplication.d.ts +5 -0
- package/dist/editor/settings/panels/projectTemplateDuplication.js +57 -0
- package/dist/editor/settings/panels/projectTemplateDuplication.js.map +1 -0
- package/dist/editor/setup-wizard/steps/CreateSettingsStep.js +9 -4
- package/dist/editor/setup-wizard/steps/CreateSettingsStep.js.map +1 -1
- package/dist/editor/sidebar/MainContentTree.js +1 -1
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/ui/PerfectTree.js +2 -2
- package/dist/editor/ui/PerfectTree.js.map +1 -1
- package/dist/editor/ui/PublishRestrictionsDialog.js +9 -1
- package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
- package/dist/editor/utils.js +5 -2
- package/dist/editor/utils.js.map +1 -1
- package/dist/editor/views/EditorSlot.js +5 -1
- package/dist/editor/views/EditorSlot.js.map +1 -1
- package/dist/editor/views/SingleEditView.d.ts +4 -1
- package/dist/editor/views/SingleEditView.js +2 -2
- package/dist/editor/views/SingleEditView.js.map +1 -1
- package/dist/licensing/LicenseContext.js +7 -0
- package/dist/licensing/LicenseContext.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/task-board/TaskBoardWorkspace.js +10 -10
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/taskExecutionRecords.d.ts +1 -0
- package/dist/task-board/taskExecutionRecords.js +29 -0
- package/dist/task-board/taskExecutionRecords.js.map +1 -1
- package/dist/task-board/types.d.ts +9 -0
- package/dist/task-board/views/DependencyGraphView.d.ts +1 -0
- package/dist/task-board/views/DependencyGraphView.js +15 -12
- package/dist/task-board/views/DependencyGraphView.js.map +1 -1
- package/package.json +1 -1
|
@@ -396,16 +396,22 @@ export type DragGestureStartedEventPayload = {
|
|
|
396
396
|
componentName?: string;
|
|
397
397
|
clientX: number;
|
|
398
398
|
clientY: number;
|
|
399
|
+
/** Host scroll captured with this pointer sample for race-free coordinate mapping. */
|
|
400
|
+
scroll?: BridgeScroll;
|
|
399
401
|
};
|
|
400
402
|
export type DragGestureMovedEventPayload = {
|
|
401
403
|
pointerId: number;
|
|
402
404
|
clientX: number;
|
|
403
405
|
clientY: number;
|
|
406
|
+
/** Host scroll captured with this pointer sample for race-free coordinate mapping. */
|
|
407
|
+
scroll?: BridgeScroll;
|
|
404
408
|
};
|
|
405
409
|
export type DragGestureEndedEventPayload = {
|
|
406
410
|
pointerId: number;
|
|
407
411
|
clientX: number;
|
|
408
412
|
clientY: number;
|
|
413
|
+
/** Host scroll captured with this pointer sample for race-free coordinate mapping. */
|
|
414
|
+
scroll?: BridgeScroll;
|
|
409
415
|
/** True when the gesture was aborted (Escape / pointercancel) rather than dropped. */
|
|
410
416
|
canceled?: boolean;
|
|
411
417
|
};
|
|
@@ -533,10 +539,14 @@ export type BeginInlineEditCommandPayload = {
|
|
|
533
539
|
export type ApplyFieldPatchCommandPayload = {
|
|
534
540
|
elementKey: string;
|
|
535
541
|
fieldId: string;
|
|
542
|
+
item?: BridgeItemDescriptor;
|
|
536
543
|
value: string;
|
|
537
544
|
isRichText?: boolean;
|
|
538
545
|
source?: "real" | "suggestion-preview" | "reset" | string;
|
|
539
546
|
};
|
|
547
|
+
export type SyncRemoteFieldDraftsCommandPayload = {
|
|
548
|
+
drafts: ApplyFieldPatchCommandPayload[];
|
|
549
|
+
};
|
|
540
550
|
export type ApplyRichTextCommandPayload = {
|
|
541
551
|
elementKey: string;
|
|
542
552
|
fieldId: string;
|
|
@@ -616,6 +626,7 @@ export type BridgeCommandPayloadByName = {
|
|
|
616
626
|
queryGeometry: QueryGeometryCommandPayload;
|
|
617
627
|
beginInlineEdit: BeginInlineEditCommandPayload;
|
|
618
628
|
applyFieldPatch: ApplyFieldPatchCommandPayload;
|
|
629
|
+
syncRemoteFieldDrafts: SyncRemoteFieldDraftsCommandPayload;
|
|
619
630
|
applyRichTextCommand: ApplyRichTextCommandPayload;
|
|
620
631
|
textCompletion: TextCompletionCommandPayload;
|
|
621
632
|
commitInlineEdit: CommitInlineEditCommandPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/editor/bridge/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GACzC,yBAAkC,CAAC;AAsBrC,MAAM,CAAC,MAAM,+BAA+B,GAAkB;IAC5D,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,EAAE;CACV,CAAC;AAuCF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,iEAAiE;IACjE,mEAAmE;IACnE,WAAW,EAAE,aAAa;IAC1B,8EAA8E;IAC9E,iEAAiE;IACjE,WAAW,EAAE,aAAa;CAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/editor/bridge/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ import { showExpandableErrorToast } from "./errorToast";
|
|
|
13
13
|
import { isRedoStackEntry, reconcileNewHistoryOperation, } from "./editHistoryReconciliation";
|
|
14
14
|
import { isManualShowMeFocusTransfer, isManualShowMeTarget, } from "./manualShowMeFocus";
|
|
15
15
|
import { isAgentTerminalFocusTransfer, nextAgentTerminalInteractionAt, } from "./agentTerminalFocus";
|
|
16
|
-
import { getAvailableSidebarsForWorkspace } from "./sidebarAvailability";
|
|
16
|
+
import { getAvailableSidebarsForWorkspace, parseSidebarUrlValue, sidebarUrlValue, } from "./sidebarAvailability";
|
|
17
17
|
import { executeFieldAction as executeFieldServerAction, connectSocket, getEditHistory, getRunningOperations, reconnectSession, releaseFieldLocks, validateItems, } from "../services/editService";
|
|
18
18
|
import { emitAgentDocumentsChanged } from "../services/agentService";
|
|
19
19
|
import { onSocketReconnect as onAgentSocketReconnect } from "../services/agentSubscriptionRegistry";
|
|
@@ -37,6 +37,7 @@ import { EditorFormHintPopover } from "../page-viewer/EditorFormHintPopover";
|
|
|
37
37
|
import { FieldEditorPopup } from "../FieldEditorPopup";
|
|
38
38
|
import { ConcurrentUserLimitDialog } from "../ConcurrentUserLimitDialog";
|
|
39
39
|
import { SessionExpiredOverlay } from "./SessionExpiredOverlay";
|
|
40
|
+
import { filterRemovedComments } from "../reviews/commentState";
|
|
40
41
|
import { post } from "../services/serviceHelper";
|
|
41
42
|
import { CONTENT_TREE_SIDEBAR_ID } from "../sidebar/contentTreeConstants";
|
|
42
43
|
import { PageViewerFrame } from "../page-viewer/PageViewerFrame";
|
|
@@ -89,14 +90,9 @@ function getGlobalHistoryLoadMoreIncrement(filterBySession) {
|
|
|
89
90
|
? GLOBAL_SESSION_HISTORY_LOAD_MORE_INCREMENT
|
|
90
91
|
: GLOBAL_HISTORY_LOAD_MORE_INCREMENT;
|
|
91
92
|
}
|
|
92
|
-
// Sentinel written to the `sidebar` URL param when the user has explicitly closed
|
|
93
|
-
// every sidebar. Distinguishes "no preference yet" (param absent) from "user wants
|
|
94
|
-
// nothing open" (param present with this value) so reload can honor the user's intent.
|
|
95
|
-
const SIDEBAR_NONE_SENTINEL = "none";
|
|
96
93
|
const PARHELIA_SETTINGS_ITEM_ID = "a2f3c168bb2841ff9673ee7f3cc624af";
|
|
97
94
|
const PARHELIA_SETTINGS_ITEM_PATH = "/sitecore/system/parhelia/settings";
|
|
98
95
|
const PARHELIA_SHOW_MINIMAP_FIELD_ID = "e75976d2179e4578b4140147b7525fa5";
|
|
99
|
-
const sidebarUrlValue = (ids) => ids.length ? ids.join(",") : SIDEBAR_NONE_SENTINEL;
|
|
100
96
|
// moved to hooks/useQuota
|
|
101
97
|
function isParheliaSettingsSnapshotChange(changes) {
|
|
102
98
|
return changes.some((change) => {
|
|
@@ -196,6 +192,10 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
196
192
|
const [pageModelReadyToken, setPageModelReadyToken] = useState(0);
|
|
197
193
|
const notifyPageModelReady = useCallback(() => setPageModelReadyToken((c) => c + 1), []);
|
|
198
194
|
const [dragObject, setDragObject] = useState();
|
|
195
|
+
// Pointer gestures can start and end between React's commit and passive-effect
|
|
196
|
+
// phases. Keep the event-time payload synchronous so a bridge listener from
|
|
197
|
+
// the preceding render cannot observe a stale `dragObject` closure at drop.
|
|
198
|
+
const dragObjectRef = useRef(undefined);
|
|
199
199
|
const [clipboard, setClipboard] = useState(null);
|
|
200
200
|
// media selection handled by useMediaSelector hook
|
|
201
201
|
const [scrollIntoView, setScrollIntoView] = useState();
|
|
@@ -373,17 +373,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
373
373
|
// Sidebar state
|
|
374
374
|
const [openSidebars, setOpenSidebars] = useState(() => {
|
|
375
375
|
const sidebarParam = searchParams.get("sidebar");
|
|
376
|
-
let sidebars =
|
|
377
|
-
|
|
378
|
-
if (sidebarParam !== null) {
|
|
379
|
-
sidebars =
|
|
380
|
-
sidebarParam === SIDEBAR_NONE_SENTINEL
|
|
381
|
-
? []
|
|
382
|
-
: sidebarParam.split(",").filter(Boolean);
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
sidebars = getInitialOpenSidebars(configuration, initialWorkspaceId);
|
|
386
|
-
}
|
|
376
|
+
let sidebars = parseSidebarUrlValue(sidebarParam) ??
|
|
377
|
+
getInitialOpenSidebars(configuration, initialWorkspaceId);
|
|
387
378
|
// If workspace=reviews was requested, ensure reviews sidebar is open
|
|
388
379
|
if (isReviewsSidebarRequest && !sidebars.includes("reviews")) {
|
|
389
380
|
sidebars.push("reviews");
|
|
@@ -643,6 +634,9 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
643
634
|
const [itemLanguages, setItemLanguages] = useState([]);
|
|
644
635
|
const [itemVersions, setItemVersions] = useState([]);
|
|
645
636
|
const [isLoadingVersions, setIsLoadingVersions] = useState(false);
|
|
637
|
+
const versionLoadRequestRef = useRef(0);
|
|
638
|
+
const visibleVersionLoadRef = useRef(0);
|
|
639
|
+
const versionLoadsInFlightRef = useRef(new Map());
|
|
646
640
|
const [modifiedFields, setModifiedFields] = useState([]);
|
|
647
641
|
useEffect(() => {
|
|
648
642
|
const stores = getFieldModificationStores();
|
|
@@ -747,8 +741,16 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
747
741
|
const [mode, setModeState] = useState("edit");
|
|
748
742
|
const modeRef = useRef("edit");
|
|
749
743
|
modeRef.current = mode;
|
|
744
|
+
const modeTransitionChainRef = useRef(Promise.resolve());
|
|
750
745
|
const modeChangeParticipantsRef = useRef(new Set());
|
|
751
|
-
const loadSuggestedEditsRef = useRef(async () =>
|
|
746
|
+
const loadSuggestedEditsRef = useRef(async () => undefined);
|
|
747
|
+
const suggestedEditsLoadRequestRef = useRef(0);
|
|
748
|
+
const suggestedEditsAppliedRequestRef = useRef(0);
|
|
749
|
+
const suggestedEditsItemKey = item
|
|
750
|
+
? `${item.descriptor.id}:${item.descriptor.language}:${item.descriptor.version}`
|
|
751
|
+
: undefined;
|
|
752
|
+
const suggestedEditsItemKeyRef = useRef(suggestedEditsItemKey);
|
|
753
|
+
suggestedEditsItemKeyRef.current = suggestedEditsItemKey;
|
|
752
754
|
const [modeTransitionRevision, setModeTransitionRevision] = useState(0);
|
|
753
755
|
const [previewDate, setPreviewDate] = useState();
|
|
754
756
|
const [layoutMode, setLayoutMode] = useState("final");
|
|
@@ -763,12 +765,23 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
763
765
|
if (nextMode === previousMode)
|
|
764
766
|
return;
|
|
765
767
|
const participants = Array.from(modeChangeParticipantsRef.current);
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
768
|
+
// Start event-time capture while the current mode and its live iframe
|
|
769
|
+
// editing session still exist. These promises are awaited in the
|
|
770
|
+
// serialized transition below, but invoking them here prevents the mode
|
|
771
|
+
// render from making an uncommitted DOM value unreachable.
|
|
772
|
+
const captureBarriers = participants.map((participant) => {
|
|
773
|
+
try {
|
|
774
|
+
return Promise.resolve(participant.captureBeforeModeChange?.(nextMode, previousMode, options));
|
|
775
|
+
}
|
|
776
|
+
catch (error) {
|
|
777
|
+
return Promise.reject(error);
|
|
778
|
+
}
|
|
779
|
+
});
|
|
780
|
+
// Reflect the user's requested mode immediately. Persistence barriers
|
|
781
|
+
// still drain in order below, but keeping the old mode visible until a
|
|
782
|
+
// slow host/save round-trip finishes invites duplicate toggle actions
|
|
783
|
+
// and makes the editor appear unresponsive. Inline edit sessions retain
|
|
784
|
+
// modeAtStart, so the in-flight value keeps its original routing.
|
|
772
785
|
flushSync(() => {
|
|
773
786
|
modeRef.current = nextMode;
|
|
774
787
|
setModeState(nextMode);
|
|
@@ -782,9 +795,22 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
782
795
|
setShowComments(true);
|
|
783
796
|
}
|
|
784
797
|
});
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
798
|
+
const transition = modeTransitionChainRef.current
|
|
799
|
+
.catch(() => undefined)
|
|
800
|
+
.then(async () => {
|
|
801
|
+
await Promise.all(captureBarriers);
|
|
802
|
+
for (const participant of participants) {
|
|
803
|
+
await participant.beforeModeChange?.(nextMode, previousMode, options);
|
|
804
|
+
}
|
|
805
|
+
for (const participant of participants) {
|
|
806
|
+
participant.clearInlineDedupe?.(nextMode, previousMode, options);
|
|
807
|
+
}
|
|
808
|
+
if (nextMode === "suggestions" && modeRef.current === nextMode) {
|
|
809
|
+
await loadSuggestedEditsRef.current();
|
|
810
|
+
}
|
|
811
|
+
});
|
|
812
|
+
modeTransitionChainRef.current = transition;
|
|
813
|
+
await transition;
|
|
788
814
|
}, []);
|
|
789
815
|
const setMode = useCallback((nextMode) => {
|
|
790
816
|
const resolvedMode = typeof nextMode === "function" ? nextMode(modeRef.current) : nextMode;
|
|
@@ -1714,11 +1740,8 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
1714
1740
|
}
|
|
1715
1741
|
// Handle sidebar changes — clear when absent so state matches the URL
|
|
1716
1742
|
const sidebarParam = urlParams.get("sidebar");
|
|
1717
|
-
const newSidebars = sidebarParam
|
|
1718
|
-
|
|
1719
|
-
: sidebarParam
|
|
1720
|
-
? sidebarParam.split(",").filter(Boolean)
|
|
1721
|
-
: [];
|
|
1743
|
+
const newSidebars = parseSidebarUrlValue(sidebarParam) ?? [];
|
|
1744
|
+
openSidebarsRef.current = newSidebars;
|
|
1722
1745
|
setOpenSidebars(newSidebars);
|
|
1723
1746
|
// Handle wizard ID changes
|
|
1724
1747
|
const wizardId = urlParams.get("wizardid");
|
|
@@ -2010,7 +2033,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2010
2033
|
if (handleErrorResult(result, ui, state))
|
|
2011
2034
|
return;
|
|
2012
2035
|
setComments((x) => {
|
|
2013
|
-
const loadedComments = result.data;
|
|
2036
|
+
const loadedComments = filterRemovedComments(result.data);
|
|
2014
2037
|
const newComments = x.filter((c) => c.isNew &&
|
|
2015
2038
|
c.mainItemId === currentItemDescriptor.id &&
|
|
2016
2039
|
c.language === currentItemDescriptor.language &&
|
|
@@ -2024,20 +2047,34 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2024
2047
|
// Assuming currentItemDescriptor, ui, state, handleErrorResult, and setSuggestedEdits
|
|
2025
2048
|
// are available in your component context.
|
|
2026
2049
|
const loadSuggestedEdits = useCallback(async () => {
|
|
2050
|
+
const requestId = ++suggestedEditsLoadRequestRef.current;
|
|
2027
2051
|
if (!item)
|
|
2028
|
-
return;
|
|
2052
|
+
return undefined;
|
|
2053
|
+
const requestedItemKey = `${item.descriptor.id}:${item.descriptor.language}:${item.descriptor.version}`;
|
|
2029
2054
|
const reviewId = searchParams.get("reviewId");
|
|
2030
2055
|
const result = await getSuggestedEdits(item.descriptor.id, item.descriptor.language, item.descriptor.version, reviewId ?? undefined);
|
|
2056
|
+
// Item initialization, navigation, and realtime feedback notifications can
|
|
2057
|
+
// overlap. Accept the first response that can populate the current item,
|
|
2058
|
+
// then prevent older snapshots from replacing a newer one. This preserves
|
|
2059
|
+
// useful data while a second post-subscription refresh is still in flight.
|
|
2060
|
+
if (requestedItemKey !== suggestedEditsItemKeyRef.current)
|
|
2061
|
+
return undefined;
|
|
2062
|
+
if (requestId < suggestedEditsAppliedRequestRef.current) {
|
|
2063
|
+
return suggestedEditsRef.current;
|
|
2064
|
+
}
|
|
2031
2065
|
if (handleErrorResult(result, ui, state))
|
|
2032
|
-
return;
|
|
2066
|
+
return undefined;
|
|
2067
|
+
suggestedEditsAppliedRequestRef.current = requestId;
|
|
2033
2068
|
// A refetch can race a locally reverted suggestion's server delete; don't
|
|
2034
2069
|
// resurrect suggestions the user already removed.
|
|
2035
2070
|
const edits = (result.data || []).filter((edit) => !isSuggestedEditRemoved(edit.id));
|
|
2036
2071
|
setSuggestedEdits(edits);
|
|
2072
|
+
return edits;
|
|
2037
2073
|
}, [item, searchParams]);
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2074
|
+
// URL-driven mode initialization runs in an earlier effect. Update the ref
|
|
2075
|
+
// during render so entering suggestions on the first committed frame cannot
|
|
2076
|
+
// observe the initial no-op loader.
|
|
2077
|
+
loadSuggestedEditsRef.current = loadSuggestedEdits;
|
|
2041
2078
|
const loadFavorites = useCallback(async () => {
|
|
2042
2079
|
try {
|
|
2043
2080
|
const result = await getAllFavorites();
|
|
@@ -2551,15 +2588,22 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2551
2588
|
return;
|
|
2552
2589
|
// The previous item's comments don't speak for the new one.
|
|
2553
2590
|
setCommentsLoaded(false);
|
|
2554
|
-
//
|
|
2555
|
-
//
|
|
2556
|
-
//
|
|
2557
|
-
//
|
|
2558
|
-
|
|
2559
|
-
return;
|
|
2591
|
+
// Load an immediate snapshot so an existing comment or suggestion does not
|
|
2592
|
+
// depend on websocket registration latency. The acknowledgement dependency
|
|
2593
|
+
// deliberately runs this effect again after the page topic is subscribed;
|
|
2594
|
+
// that second snapshot closes the gap between the first response and the
|
|
2595
|
+
// realtime event stream.
|
|
2560
2596
|
loadComments();
|
|
2561
2597
|
loadSuggestedEdits();
|
|
2562
|
-
}, [
|
|
2598
|
+
}, [
|
|
2599
|
+
currentItemDescriptor?.id,
|
|
2600
|
+
currentItemDescriptor?.language,
|
|
2601
|
+
currentItemDescriptor?.version,
|
|
2602
|
+
isClientInfoAcknowledged,
|
|
2603
|
+
item?.descriptor.id,
|
|
2604
|
+
item?.descriptor.language,
|
|
2605
|
+
item?.descriptor.version,
|
|
2606
|
+
]);
|
|
2563
2607
|
// Track the previous history mode to detect mode changes
|
|
2564
2608
|
const prevHistoryModeRef = useRef(historyMode);
|
|
2565
2609
|
const historyInitialLoadDoneRef = useRef(false);
|
|
@@ -3237,26 +3281,69 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3237
3281
|
useEffect(() => {
|
|
3238
3282
|
loadItemVersions();
|
|
3239
3283
|
}, [currentItemDescriptor]);
|
|
3240
|
-
const loadItemVersions = useCallback(async () => {
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3284
|
+
const loadItemVersions = useCallback(async (options) => {
|
|
3285
|
+
const descriptor = options?.descriptor
|
|
3286
|
+
? getItemDescriptor(options.descriptor)
|
|
3287
|
+
: currentItemDescriptorRef.current
|
|
3288
|
+
? getItemDescriptor(currentItemDescriptorRef.current)
|
|
3289
|
+
: undefined;
|
|
3290
|
+
if (!descriptor) {
|
|
3291
|
+
if (options?.clearOnMissing !== false) {
|
|
3292
|
+
setItemVersions([]);
|
|
3293
|
+
setItemLanguages([]);
|
|
3294
|
+
}
|
|
3244
3295
|
setIsLoadingVersions(false);
|
|
3245
3296
|
return;
|
|
3246
3297
|
}
|
|
3298
|
+
const descriptorKey = [
|
|
3299
|
+
descriptor.database || "master",
|
|
3300
|
+
descriptor.id,
|
|
3301
|
+
descriptor.language,
|
|
3302
|
+
descriptor.version,
|
|
3303
|
+
]
|
|
3304
|
+
.join(":")
|
|
3305
|
+
.toLowerCase();
|
|
3306
|
+
const requestId = ++versionLoadRequestRef.current;
|
|
3307
|
+
visibleVersionLoadRef.current = requestId;
|
|
3247
3308
|
setIsLoadingVersions(true);
|
|
3248
3309
|
try {
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
setItemVersions([]);
|
|
3255
|
-
setItemLanguages([]);
|
|
3256
|
-
showErrorToast({
|
|
3257
|
-
summary: "Error",
|
|
3258
|
-
details: "Failed to load item versions",
|
|
3310
|
+
let request = versionLoadsInFlightRef.current.get(descriptorKey);
|
|
3311
|
+
if (!request) {
|
|
3312
|
+
request = getLanguagesAndVersions(descriptor, {
|
|
3313
|
+
includePublishingRestrictions: true,
|
|
3314
|
+
includePublishingTargets: true,
|
|
3259
3315
|
});
|
|
3316
|
+
versionLoadsInFlightRef.current.set(descriptorKey, request);
|
|
3317
|
+
const releaseRequest = () => {
|
|
3318
|
+
if (versionLoadsInFlightRef.current.get(descriptorKey) === request) {
|
|
3319
|
+
versionLoadsInFlightRef.current.delete(descriptorKey);
|
|
3320
|
+
}
|
|
3321
|
+
};
|
|
3322
|
+
void request.then(releaseRequest, releaseRequest);
|
|
3323
|
+
}
|
|
3324
|
+
const result = await request;
|
|
3325
|
+
const currentDescriptor = currentItemDescriptorRef.current;
|
|
3326
|
+
const currentDescriptorKey = currentDescriptor
|
|
3327
|
+
? [
|
|
3328
|
+
currentDescriptor.database || "master",
|
|
3329
|
+
currentDescriptor.id,
|
|
3330
|
+
currentDescriptor.language,
|
|
3331
|
+
currentDescriptor.version,
|
|
3332
|
+
]
|
|
3333
|
+
.join(":")
|
|
3334
|
+
.toLowerCase()
|
|
3335
|
+
: undefined;
|
|
3336
|
+
if (currentDescriptorKey !== descriptorKey)
|
|
3337
|
+
return;
|
|
3338
|
+
if (!result?.data) {
|
|
3339
|
+
if (!options?.preserveOnError) {
|
|
3340
|
+
setItemVersions([]);
|
|
3341
|
+
setItemLanguages([]);
|
|
3342
|
+
showErrorToast({
|
|
3343
|
+
summary: "Error",
|
|
3344
|
+
details: "Failed to load item versions",
|
|
3345
|
+
});
|
|
3346
|
+
}
|
|
3260
3347
|
return;
|
|
3261
3348
|
}
|
|
3262
3349
|
const v = [...result.data.versions].reverse() || [];
|
|
@@ -3264,9 +3351,14 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3264
3351
|
setItemLanguages(result.data.languages);
|
|
3265
3352
|
}
|
|
3266
3353
|
finally {
|
|
3267
|
-
|
|
3354
|
+
// A superseded request must not hide the spinner for the descriptor
|
|
3355
|
+
// that is currently loading. Duplicate calls for the same descriptor
|
|
3356
|
+
// share one network request and settle together.
|
|
3357
|
+
if (visibleVersionLoadRef.current === requestId) {
|
|
3358
|
+
setIsLoadingVersions(false);
|
|
3359
|
+
}
|
|
3268
3360
|
}
|
|
3269
|
-
}, [
|
|
3361
|
+
}, [setItemVersions, setItemLanguages]);
|
|
3270
3362
|
const showErrorToast = useCallback((error) => {
|
|
3271
3363
|
showExpandableErrorToast(error);
|
|
3272
3364
|
}, []);
|
|
@@ -3912,6 +4004,23 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3912
4004
|
// workspace defaults are applied by the openSidebars state initializer, while
|
|
3913
4005
|
// explicit sidebar URL state such as sidebar=none is still respected.
|
|
3914
4006
|
const prevWorkspaceIdForDefaultsRef = useRef(null);
|
|
4007
|
+
// Next can retain this shell while hydrating or navigating within the same
|
|
4008
|
+
// route. Keep explicit sidebar URL state authoritative after the initializer
|
|
4009
|
+
// has run; the availability effect below still removes inaccessible panels.
|
|
4010
|
+
const sidebarParam = searchParams.get("sidebar");
|
|
4011
|
+
useEffect(() => {
|
|
4012
|
+
const requested = parseSidebarUrlValue(sidebarParam);
|
|
4013
|
+
if (requested === undefined)
|
|
4014
|
+
return;
|
|
4015
|
+
const current = openSidebarsRef.current;
|
|
4016
|
+
const unchanged = requested.length === current.length &&
|
|
4017
|
+
requested.every((id, index) => id === current[index]);
|
|
4018
|
+
if (unchanged)
|
|
4019
|
+
return;
|
|
4020
|
+
openSidebarsRef.current = requested;
|
|
4021
|
+
setOpenSidebars(requested);
|
|
4022
|
+
setSidebarStacks((prev) => normalizeSidebarStacks(requested, prev));
|
|
4023
|
+
}, [normalizeSidebarStacks, sidebarParam]);
|
|
3915
4024
|
useEffect(() => {
|
|
3916
4025
|
if (!currentWorkspace.supportsSidebars) {
|
|
3917
4026
|
return;
|
|
@@ -3942,6 +4051,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
3942
4051
|
currentWorkspace,
|
|
3943
4052
|
getSidebarsForWorkspace,
|
|
3944
4053
|
normalizeSidebarStacks,
|
|
4054
|
+
sidebarParam,
|
|
3945
4055
|
updateUrl,
|
|
3946
4056
|
workspaceId,
|
|
3947
4057
|
]);
|
|
@@ -4794,21 +4904,24 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4794
4904
|
getComponentCommands: async (components, providerContext) => {
|
|
4795
4905
|
return await getComponentCommands(components, editContext, providerContext);
|
|
4796
4906
|
},
|
|
4797
|
-
dragStart: (
|
|
4907
|
+
dragStart: (nextDragObject) => {
|
|
4798
4908
|
// A drag supersedes any unresolved scroll request (e.g. a comment
|
|
4799
4909
|
// target still waiting for geometry). Left pending, it would replay
|
|
4800
4910
|
// against the post-drop refresh and yank the canvas to a stale spot.
|
|
4801
4911
|
setScrollIntoView(undefined);
|
|
4802
|
-
|
|
4912
|
+
dragObjectRef.current = nextDragObject;
|
|
4913
|
+
setDragObject(nextDragObject);
|
|
4803
4914
|
},
|
|
4804
4915
|
dragEnd: () => {
|
|
4916
|
+
dragObjectRef.current = undefined;
|
|
4805
4917
|
setDragObject(undefined);
|
|
4806
4918
|
},
|
|
4807
4919
|
droppedInPlaceholder: async (placeholderKey, index, spotPositionElement, spotPositionAnchor, insertOption, spotPosition, color) => {
|
|
4808
|
-
const droppedDragObject =
|
|
4920
|
+
const droppedDragObject = dragObjectRef.current;
|
|
4809
4921
|
if ((!droppedDragObject && !insertOption) || !page) {
|
|
4810
4922
|
return { committed: false };
|
|
4811
4923
|
}
|
|
4924
|
+
dragObjectRef.current = undefined;
|
|
4812
4925
|
setDragObject(undefined);
|
|
4813
4926
|
const placeholderKeyComponents = placeholderKey.split("_");
|
|
4814
4927
|
const parentId = placeholderKeyComponents.length === 1
|
|
@@ -4819,8 +4932,11 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4819
4932
|
// the drop target's parent here made the single-selection frame
|
|
4820
4933
|
// FLIP-animate component -> parent -> component around every drop.
|
|
4821
4934
|
let op;
|
|
4822
|
-
|
|
4823
|
-
|
|
4935
|
+
// A placeholder is rendered from this page model, so its insertion
|
|
4936
|
+
// must target the same item. The shell-level descriptor can briefly
|
|
4937
|
+
// lag while slots or a newly created page settle; using it here could
|
|
4938
|
+
// either discard a valid click or write the component to another page.
|
|
4939
|
+
const dropTargetDescriptor = page.item.descriptor;
|
|
4824
4940
|
let insertionSequence;
|
|
4825
4941
|
if ((spotPosition || spotPositionElement) && spotPositionAnchor) {
|
|
4826
4942
|
insertionSequence = ++insertingSequenceRef.current;
|
|
@@ -4838,10 +4954,10 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
4838
4954
|
// can exit cleanly and the editor header updates from "Add Component"
|
|
4839
4955
|
// to the actual component name after the operation completes.
|
|
4840
4956
|
setSelectedForInsertion("");
|
|
4841
|
-
operationPromise = operations.addComponent(insertOption.typeId, placeholderKey, index,
|
|
4957
|
+
operationPromise = operations.addComponent(insertOption.typeId, placeholderKey, index, dropTargetDescriptor, { showIndicator: false });
|
|
4842
4958
|
}
|
|
4843
4959
|
else if (droppedDragObject?.type == "template") {
|
|
4844
|
-
operationPromise = operations.addComponent(droppedDragObject.typeId, placeholderKey, index,
|
|
4960
|
+
operationPromise = operations.addComponent(droppedDragObject.typeId, placeholderKey, index, dropTargetDescriptor, { showIndicator: false });
|
|
4845
4961
|
}
|
|
4846
4962
|
else if (droppedDragObject?.type == "component" ||
|
|
4847
4963
|
(droppedDragObject?.type == "items" && droppedDragObject.items)) {
|