@next-dll/editor-bricks-helper 0.40.2 → 0.40.4

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack://[name]/webpack/bootstrap","webpack://[name]/external \"DllOfReactDnd\"","webpack://[name]/delegated ./node_modules/@babel/runtime/helpers/objectSpread2.js from dll-reference dll","webpack://[name]/delegated ./node_modules/@next-core/brick-utils/dist/index.esm.js from dll-reference dll","webpack://[name]/delegated ./node_modules/@babel/runtime/helpers/decorate.js from dll-reference dll","webpack://[name]/delegated ./node_modules/react-dnd/dist/esm/index.js from dll-reference DllOfReactDnd","webpack://[name]/delegated ./node_modules/lodash/lodash.js from dll-reference dll","webpack://[name]/delegated ./node_modules/@babel/runtime/helpers/objectWithoutProperties.js from dll-reference dll","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/interfaces.ts","webpack://[name]/./node_modules/node_modules/classnames/index.js","webpack://[name]/./node_modules/node_modules/@ungap/event-target/esm/index.js","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/getUniqueNodeId.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/expandTemplateEdges.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/reorderBuilderEdges.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/deleteNodeFromTree.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/processors/getRelatedNodesBasedOnEvents.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/getBuilderNode.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/getAppendingNodesAndEdges.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/isParentExpandableTemplate.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DropZone/reverseNormalize.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DropZone/getSnippetNodeDetail.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/getObjectIdByNode.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/internal/BuilderDataManager.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/BuilderContext.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderDataManager.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderData.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderNode.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderContextMenuStatus.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useShowRelatedNodesBasedOnEvents.ts","webpack://[name]/./node_modules/node_modules/style-inject/dist/style-inject.es.js","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorContainer/isCurrentTargetByClassName.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useHoverNodeUid.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useHighlightNodes.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useDroppingStatus.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorContainer/EditorContainer.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorBrickAsComponent/getEditorBrick.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorBrickAsComponent/EditorBrickAsComponent.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useStoryList.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorBrickAsComponent/getBrickDoc.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useSharedEditorMap.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderGroupedChildNodes.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useCanDrop.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DropZone/getDropPosition.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/processors/getSortedIdsAfterDropped.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useCanvasList.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DropZone/DropZone.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DropZone/processDrop.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/SlotContainer/SlotContainer.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/BuilderProvider.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/EditorElementFactory.tsx","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/DroppingStatusContext.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderNodeMountPoints.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useBuilderParentNode.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useRouteList.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useActiveNodeUid.ts","webpack://[name]/./node_modules/@next-core/editor-bricks-helper/src/hooks/useOutlineEnabled.ts","webpack://[name]/external \"dll\"","webpack://[name]/delegated ./node_modules/js-yaml/index.js from dll-reference dll","webpack://[name]/delegated ./node_modules/react-dom/index.js from dll-reference dll","webpack://[name]/delegated ./node_modules/@babel/runtime/helpers/defineProperty.js from dll-reference dll","webpack://[name]/delegated ./node_modules/react/index.js from dll-reference DllOfReactDnd","webpack://[name]/delegated ./node_modules/react-dnd-html5-backend/dist/esm/index.js from dll-reference DllOfReactDnd","webpack://[name]/delegated ./node_modules/@next-core/brick-kit/dist/index.esm.js from dll-reference dll","webpack://[name]/delegated ./node_modules/@babel/runtime/helpers/asyncToGenerator.js from dll-reference dll"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","DllOfReactDnd","BuilderDataTransferType","EditorBrickType","EditorSelfLayout","EditorSlotContentLayout","hasOwn","classNames","classes","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","join","default","window","self","EventTarget","constructor","wm","proto","set","this","define","target","configurable","writable","dispatch","info","options","once","removeEventListener","type","listener","handleEvent","_stopImmediatePropagationFlag","secret","listeners","event","slice","some","currentTarget","splice","WeakMap","uniqueIdCursor","getUniqueNodeId","expandTemplateEdges","nodes","edges","rootId","newEdges","reorderedEdgesMap","walk","uid","callback","node","find","item","$$uid","childEdges","sortBy","filter","edge","parent","sort","child","expandEdgesThroughTemplateChain","mountPoint","childUid","proxySlotConf","delegateToParentUid","$$isExpandableTemplate","$$templateProxy","slots","$$templateRefToUid","ref","nextNode","nextMountPoint","refSlot","expandedEdge","undefined","$$isTemplateExpanded","siblingEdges","internalEdges","$$isTemplateInternal","refPosition","clampedRefPosition","clamp","findIndex","forEach","index","childEdge","map","reorderBuilderEdges","parentUid","nodeUids","indexOf","deleteNodeFromTree","nodeUid","wrapperNode","idsToDelete","Set","collectIdsToDelete","add","ids","id","has","collectRelatedNodes","handlers","nodesMap","targetMap","targetRefMap","handler","targetNodeUid","downstreamNodes","upstreamNodes","targetRef","concat","targetRefNodeUid","callbackHandlers","values","nodeIgnoreFields","computationRegExp","getBuilderNode","nodeData","isTemplateInternalNode","matchedSelectors","brick","replace","parsedId","parsedTestId","normalized","normalizeBuilderNode","parsedFields","field","parsed","cloneDeep","upperFirst","tempParsedTestId","tempParsedId","dataset","testid","test","isBrick","isBrickNode","brickName","split","pop","unreachable","if","isRouteNode","check","computeConstantCondition","fromEntries","entries","entry","includes","alias","getAppendingNodesAndEdges","templateSourceMap","isRoot","currentUid","processedTemplateSet","inheritedTemplateRefToUid","layoutType","templateSource","builderNode","startsWith","children","proxy","JSON","parse","templateRefToUid","Map","Infinity","$$isTemplateInternalNode","processDelegatingSlots","cursorNode","rootMountPoint","slotEntries","slotName","slotConf","refUid","refNode","$$delegatedSlots","delegatedSlotsByRefSlot","templateUid","templateMountPoint","processDelegatingProperties","previousPropertyName","properties","propertyEntries","propertyName","propertyConf","$$parsedProperties","isBasicRefProperty","propertyValue","refProperty","overrideChildrenMountPoint","$$isTemplateDelegated","propRef","isParentExpandableTemplate","jsonFieldsInBrick","yamlFieldsInBrick","ignoredFieldsInBrick","reverseNormalize","brickConf","ctx","stringify","yaml","safeDump","Boolean","template","isPortalCanvas","portal","getSnippetNodeDetail","bg","flatMap","bricks","childBrickConf","BuilderInternalEventType","getObjectIdByNode","isCustomTemplateNode","isSnippetNode","BuilderDataManager","active","JsonStorage","localStorage","localJsonStorage","getItem","getData","data","getContextMenuStatus","contextMenuStatus","getRelatedNodesBasedOnEventsMap","relatedNodesBasedOnEventsMap","sharedEditorListInit","sharedEditorList","eventTarget","dispatchEvent","CustomEvent","SHARED_EDITOR_LIST_CHANGE","getSharedEditorList","onSharedEditorListChange","fn","addEventListener","routeListInit","routeList","ROUTE_LIST_CHANGE","getRouteList","storyListInit","storyList","getStoryList","onRouteListChange","dataInit","root","newData","triggerDataChange","rootNodeIsCustomTemplate","selector","$$matchedSelectors","isEmpty","$$parsedEvents","flat","$$parsedLifeCycle","lifeCycleName","lifeCycleConf","messageConf","console","warn","getRelatedNodesBasedOnEvents","DATA_CHANGE","detail","runAddNodeAction","addNodes","addEdges","omit","updateBrick","updateNode","instanceId","newNodes","$$normalized","$$unreachable","NODE_UPDATE","redirectMountPoint","redirectSnippetMountPoint","nodeDetails","nodeAdd","NODE_ADD","nodeAddStored","snippetApply","appendingNodes","appendingEdges","SNIPPET_APPLY","snippetApplyStored","flattenNodeDetails","found","nodeMove","NODE_MOVE","moveNode","direction","relatedEdges","mountPoints","getRelatedEdgesAndMountPoint","orderedSiblingEdges","moveItemInList","orderedEdges","reorder","getDragInfo","sortIndex","dragNodeUid","dragOverNodeUid","dragStatus","isDragRoot","dragEdge","dragOverEdge","parentEdge","parnetNodeData","siblingEdge","sortUids","sortNodeIds","sortNodeInstanceIds","Math","max","overIndex","workbenchNodeAdd","isNeedUpdateSnippet","dragOverInstanceId","parentInstanceId","newNodeUid","realDragStatus","overEdge","nodeIds","nodeInstanceIds","snippetData","sortData","workbenchTreeNodeMove","originEdge","originParentUid","originParentNode","WORKBENCH_TREE_NODE_MOVE","nodeInstanceId","objectId","moveMountPoint","orderedMountPoints","childUids","childIds","NODE_REORDER","contextUpdated","context","nodeReorder","nodeDelete","nodeClick","setActiveNodeUid","NODE_CLICK","contextMenuChange","CONTEXT_MENU_CHANGE","onDataChange","onNodeAdd","onSnippetApply","onNodeReorder","onNodeMove","onWorkbenchTreeNodeMove","onNodeClick","onNodeUpdate","onContextMenuChange","setShowRelatedNodesBasedOnEvents","show","showRelatedNodesBasedOnEvents","SHOW_RELATED_NODES_BASED_ON_EVENTS","getShowRelatedNodesBasedOnEvents","onShowRelatedNodesBasedOnEventsChange","setHoverNodeUid","hoverNodeUid","HOVER_NODE_CHANGE","getHoverNodeUid","onHoverNodeChange","activeNodeUid","ACTIVE_NODE_CHANGE","getActiveNodeUid","onActiveNodeChange","toggleOutline","outlineDisabledNodes","delete","setItem","from","OUTLINE_DISABLED_NODES_CHANGE","isOutlineEnabled","onOutlineEnabledNodesChange","setHighlightNodes","highlightNodes","HIGHLIGHT_NODES_CHANGE","getHighlightNodes","onHighlightNodesChange","updateDroppingStatus","isDraggingOver","nodeStatus","droppingStatus","DROPPING_STATUS_CHANGE","getDroppingStatus","onDroppingStatusChange","mountPointSet","list","upperIndex","BuilderContext","React","createContext","useBuilderDataManager","manager","useContext","Error","useBuilderData","setData","useState","useEffect","useBuilderNode","isWrapper","useMemo","useBuilderContextMenuStatus","status","setStatus","useShowRelatedNodesBasedOnEvents","styleInject","css","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","isCurrentTargetByClassName","targetElement","currentElement","element","classList","contains","editorContainerStyles","editorContainer","parentElement","useHoverNodeUid","useHighlightNodes","useDroppingStatus","setDroppingStatus","EditorContainer","isTransparentContainer","editorContainerStyle","editorBodyStyle","editorContainerRef","useRef","isUpstreamNode","setIsUpstreamNode","isDownstreamNode","setIsDownstreamNode","showRelatedEvents","hover","setHover","editorType","DEFAULT","hoverNodeUidRef","current","handleMouseOver","useCallback","stopPropagation","handleMouseOut","relatedNodes","isCurrentTarget","handleClick","handleContextMenu","preventDefault","x","clientX","y","clientY","className","styles","transparentContainer","dropping","highlight","onClick","onContextMenu","nodeAlias","arrow","editorBody","editor","tryEditorBricks","editorBrick","developHelper","loadEditorBricks","error","customElements","EditorBrickAsComponent","slotContentLayout","initialized","setInitialized","setEditorBrick","loadEditorError","setLoadEditorError","hasChildren","installedBricksEnabled","getRuntime","getFeatureFlags","brickDoc","storyId","doc","getBrickDoc","editorMap","getSharedEditorMap","conf","useSharedEditorMap","editorConf","editorName","editorError","getEditorBrick","message","editorProps","selfLayout","layout","CONTAINER","INLINE","isDragging","dragRef","useDrag","NODE_TO_MOVE","nodeId","dropEffect","collect","monitor","BLOCK","__isTemplateInternalNode","draggable","useBrick","useBuilderGroupedChildNodes","doNotExpandTemplates","getBuilderGroupedChildNodes","groups","childNode","childNodes","useCanDrop","draggingUid","traverse","parentId","getDropPosition","dropZone","dropZoneGrid","positions","zoneRect","getBoundingClientRect","gridItemList","currentRow","cells","rows","gridItem","rect","cell","top","bottom","left","right","prevCell","compareApproximately","min","lastRectBottom","nextCursorTop","row","rowIndex","rectBottom","cursor","nextRow","lastRectRight","nextCursorLeft","cursorDefault","isVertical","height","cellIndex","rectRight","getDropPositions","a","b","diff","abs","getSortedIdsAfterDropped","droppingInfo","draggingNodeUid","draggingNodeId","draggingIndex","droppingMountPoint","droppingSiblingGroups","droppingIndex","draggingNodeUids","fullChildNodes","group","uids","useCanvasList","rootChildNodes","mainCanvas","portalCanvasList","DropZone","separateCanvas","independentPortalCanvas","canvasIndex","fullscreen","delegatedContext","dropZoneStyle","dropZoneBodyStyle","showOutlineIfEmpty","hiddenWrapper","emptyClassName","dropZoneBody","dropPositionCursor","setDropPositionCursor","dropPositionCursorRef","groupedChildNodes","isGeneralizedPortalCanvas","hasTabs","canDrop","refinedSlotContentLayout","selfChildNodes","canvasList","selfChildNodesInCurrentCanvas","Number","canvasSettings","_canvas_","getDroppingIndexInFullCanvas","droppingIndexInCurrentCanvas","getDroppingContext","siblingGroups","droppingParentUid","droppingParentInstanceId","droppingChildNodes","isDraggingOverCurrent","dropRef","useDrop","accept","NODE_TO_ADD","SNIPPET_TO_APPLY","isOver","shallow","getClientOffset","drop","didDrop","brickType","draggingNodeInstanceId","processDrop","droppable","dropZoneRef","dropZoneRefCallback","String","isSlot","slotContentLayoutBlock","slotContentLayoutInline","slotContentLayoutGrid","GRID","data-slot-id","dropCursor","dropCursorVertical","dropCursorHorizontal","SlotContainer","slotContainerStyle","delegatedSlots","BuilderProvider","memo","LegacyBuilderProvider","instanceSymbol","for","createSingletonBuilderContext","refCount","Provider","EditorElementFactory","EditorComponent","attribute","display","brickStyle","_render","ReactDOM","unmountComponentAtNode","isConnected","render","backend","HTML5Backend","UpdatingElement","DroppingStatusContext","useBuilderNodeMountPoints","useBuilderParentNode","useRouteList","useActiveNodeUid","useOutlineEnabled","inapplicable","enabled","setEnabled","dll"],"mappings":"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","file":"dll-of-editor-bricks-helper.c7439882.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","module.exports = DllOfReactDnd;","module.exports = (__webpack_require__(\"XuQu\"))(\"3tO9\");","module.exports = (__webpack_require__(\"XuQu\"))(\"A+yw\");","module.exports = (__webpack_require__(\"XuQu\"))(\"ACCw\");","module.exports = (__webpack_require__(\"/8r5\"))(\"IYwU\");","module.exports = (__webpack_require__(\"XuQu\"))(\"LvDl\");","module.exports = (__webpack_require__(\"XuQu\"))(\"QILm\");","import {\n BrickEventsMap,\n BuilderRouteOrBrickNode,\n CustomTemplateProxy,\n ContextConf,\n BrickLifeCycle,\n BrickConf,\n RouteConf,\n} from \"@next-core/brick-types\";\n\nexport interface BuilderCanvasData {\n rootId: number;\n nodes: BuilderRuntimeNode[];\n edges: BuilderRuntimeEdge[];\n wrapperNode?: BuilderRuntimeNode;\n}\n\nexport interface BuilderCanvasSettings {\n mode: \"page\" | \"dialog\";\n}\n\nexport type BuilderRuntimeNode<P = Record<string, unknown>> =\n BuilderRouteOrBrickNode & {\n displayName?: string;\n $$uid?: number;\n $$parsedProperties?: P;\n $$parsedEvents?: BrickEventsMap;\n $$parsedLifeCycle?: BrickLifeCycle;\n $$matchedSelectors?: string[];\n $$isTemplateInternalNode?: boolean;\n $$isExpandableTemplate?: boolean;\n $$templateProxy?: CustomTemplateProxy;\n $$templateRefToUid?: Map<string, number>;\n $$delegatedSlots?: Map<string, TemplateDelegatedContext[]>;\n $$normalized?: BrickConf | RouteConf | null;\n $$unreachable?: boolean;\n };\n\nexport interface BuilderRuntimeEdge {\n child: number;\n parent: number;\n mountPoint: string;\n sort: number;\n $$isTemplateInternal?: boolean;\n $$isTemplateDelegated?: boolean;\n $$isTemplateExpanded?: boolean;\n}\n\nexport interface TemplateDelegatedContext {\n templateUid: number;\n templateMountPoint: string;\n}\n\nexport interface BuilderGroupedChildNode {\n mountPoint: string;\n childNodes: BuilderRuntimeNode[];\n}\n\nexport interface EventDetailOfNodeAdd {\n nodeUid: number;\n parentUid: number;\n nodeUids: number[];\n nodeIds: string[];\n nodeData: NodeInstance;\n sort?: number;\n}\n\nexport interface EventDetailOfContextUpdated {\n context: ContextConf[];\n}\n\nexport interface NodeInstance {\n parent: string;\n type: \"brick\" | \"provider\" | \"template\";\n brick: string;\n mountPoint: string;\n bg?: boolean;\n portal?: boolean;\n properties?: string;\n events?: string;\n lifeCycle?: string;\n sort?: number;\n}\n\nexport interface EventDetailOfNodeAddStored {\n nodeUid: number;\n nodeData: BuilderRouteOrBrickNode;\n}\n\nexport interface EventDetailOfSnippetApply {\n parentUid: number;\n /** First level node only. */\n nodeUids: number[];\n /** First level node only. */\n nodeIds: string[];\n nodeDetails: SnippetNodeDetail[];\n}\n\nexport interface SnippetNodeDetail {\n nodeUid: number;\n parentUid: number;\n nodeData: SnippetNodeInstance;\n children: SnippetNodeDetail[];\n}\n\nexport type SnippetNodeInstance = Omit<NodeInstance, \"parent\"> & {\n parent?: string;\n};\n\nexport interface EventDetailOfSnippetApplyStored {\n flattenNodeDetails: EventDetailOfNodeAddStored[];\n}\n\nexport type EventDetailOfNodeMove = Omit<EventDetailOfNodeAdd, \"nodeData\"> & {\n nodeInstanceId: string;\n nodeData: {\n parent: string;\n mountPoint: string;\n };\n};\n\nexport type EventDetailOfWorkbenchTreeNodeMove = {\n nodeUid: number;\n nodeInstanceId: string;\n nodeIds: string[];\n objectId: string;\n nodeData?: {\n parent: string;\n mountPoint: string;\n };\n};\n\nexport type dragStatus = \"inside\" | \"top\" | \"bottom\";\n\nexport interface WorkbenchNodeData extends NodeInstance {\n instanceId: string;\n id: string;\n}\nexport interface WorkbenchNodeAdd {\n nodeData: WorkbenchNodeData & {\n bricks: BrickConf[];\n $$uid?: number;\n };\n mountPoint: string;\n dragOverInstanceId: string;\n /**\n * @deprecated 请使用 parent。\n * @internal\n */\n parentInstanceId?: string;\n parent: string;\n dragStatus: dragStatus;\n sortData?: {\n nodeUids: number[];\n nodeIds: string[];\n nodeInstanceIds: string[];\n };\n}\nexport interface WorkbenchTreeNodeMoveProps {\n dragNodeUid: number;\n dragOverNodeUid: number;\n dragParentNodeUid: number;\n dragStatus: \"inside\" | \"top\" | \"bottom\";\n}\n\nexport interface EventDetailOfNodeReorder {\n nodeUids: number[];\n parentUid: number;\n nodeIds: string[];\n objectId?: string;\n}\n\nexport interface EventDetailOfNodeDragStart {\n nodeUid: number;\n}\n\nexport interface BuilderContextMenuStatus {\n active: boolean;\n node?: BuilderRuntimeNode;\n /** `x` is relative to the viewport. */\n x?: number;\n /** `y` is relative to the viewport. */\n y?: number;\n}\n\nexport enum BuilderDataTransferType {\n NODE_TO_ADD = \"builder/node-to-add\",\n NODE_TO_MOVE = \"builder/node-to-move\",\n SNIPPET_TO_APPLY = \"builder/snippet-to-apply\",\n}\n\nexport interface BuilderDataTransferPayloadOfNodeToAdd {\n brickType?: \"brick\" | \"provider\" | \"template\";\n brick: string;\n}\n\nexport interface BuilderDataTransferPayloadOfNodeToMove {\n nodeUid: number;\n nodeInstanceId: string;\n nodeId: string;\n}\n\nexport interface BuilderDataTransferPayloadOfSnippetToApply {\n bricks: BrickConf[];\n}\n\nexport enum EditorBrickType {\n DEFAULT = \"editorOfDefault\",\n CONTAINER = \"editorOfContainer\",\n TRANSPARENT_CONTAINER = \"editorOfTransparentContainer\",\n}\n\nexport enum EditorSelfLayout {\n BLOCK = \"block\",\n INLINE = \"inline\",\n CONTAINER = \"container\",\n}\n\nexport enum EditorSlotContentLayout {\n BLOCK = \"block\",\n INLINE = \"inline\",\n GRID = \"grid\",\n}\n\nexport interface SharedEditorConf {\n id: string;\n editor: string;\n editorProps?: Record<string, unknown>;\n}\n\nexport type BuilderDroppingStatus = Map<number, Map<string, boolean>>;\n","/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","/*! (c) Andrea Giammarchi - ISC */\nvar self = {};\ntry {\n self.EventTarget = (new EventTarget).constructor;\n} catch(EventTarget) {\n (function (Object, wm) {\n var create = Object.create;\n var defineProperty = Object.defineProperty;\n var proto = EventTarget.prototype;\n define(proto, 'addEventListener', function (type, listener, options) {\n for (var\n secret = wm.get(this),\n listeners = secret[type] || (secret[type] = []),\n i = 0, length = listeners.length; i < length; i++\n ) {\n if (listeners[i].listener === listener)\n return;\n }\n listeners.push({target: this, listener: listener, options: options});\n });\n define(proto, 'dispatchEvent', function (event) {\n var secret = wm.get(this);\n var listeners = secret[event.type];\n if (listeners) {\n define(event, 'target', this);\n define(event, 'currentTarget', this);\n listeners.slice(0).some(dispatch, event);\n delete event.currentTarget;\n delete event.target;\n }\n return true;\n });\n define(proto, 'removeEventListener', function (type, listener) {\n for (var\n secret = wm.get(this),\n /* istanbul ignore next */\n listeners = secret[type] || (secret[type] = []),\n i = 0, length = listeners.length; i < length; i++\n ) {\n if (listeners[i].listener === listener) {\n listeners.splice(i, 1);\n return;\n }\n }\n });\n self.EventTarget = EventTarget;\n function EventTarget() {'use strict';\n wm.set(this, create(null));\n }\n function define(target, name, value) {\n defineProperty(\n target,\n name,\n {\n configurable: true,\n writable: true,\n value: value\n }\n );\n }\n function dispatch(info) {\n var options = info.options;\n if (options && options.once)\n info.target.removeEventListener(this.type, info.listener);\n if (typeof info.listener === 'function')\n info.listener.call(info.target, this);\n else\n info.listener.handleEvent(this);\n return this._stopImmediatePropagationFlag;\n }\n }(Object, new WeakMap));\n}\nexport default self.EventTarget;\n","let uniqueIdCursor = 0;\n\nexport function getUniqueNodeId(): number {\n return (uniqueIdCursor += 1);\n}\n","import { clamp, sortBy } from \"lodash\";\nimport { CustomTemplateProxySlot } from \"@next-core/brick-types\";\nimport { hasOwnProperty } from \"@next-core/brick-utils\";\nimport {\n BuilderCanvasData,\n BuilderRuntimeEdge,\n BuilderRuntimeNode,\n} from \"../interfaces\";\n\nexport function expandTemplateEdges({\n nodes,\n // Here expanded edges should be excluded.\n edges,\n rootId,\n}: BuilderCanvasData): BuilderRuntimeEdge[] {\n const newEdges = edges.slice();\n const reorderedEdgesMap = new WeakMap<BuilderRuntimeEdge, number>();\n\n const walk = (\n uid: number,\n callback: (\n node: BuilderRuntimeNode,\n childEdges: BuilderRuntimeEdge[]\n ) => void\n ): void => {\n const node = nodes.find((item) => item.$$uid === uid);\n const childEdges = sortBy(\n edges.filter((edge) => edge.parent === node.$$uid),\n (edge) => edge.sort\n );\n callback(node, childEdges);\n for (const edge of childEdges) {\n walk(edge.child, callback);\n }\n };\n\n const expandEdgesThroughTemplateChain = (\n node: BuilderRuntimeNode,\n mountPoint: string,\n childUid: number\n ): void => {\n let proxySlotConf: CustomTemplateProxySlot;\n let delegateToParentUid: number;\n if (\n node.$$isExpandableTemplate &&\n node.$$templateProxy?.slots &&\n hasOwnProperty(node.$$templateProxy.slots, mountPoint) &&\n (proxySlotConf = node.$$templateProxy.slots[mountPoint]) &&\n (delegateToParentUid = node.$$templateRefToUid.get(proxySlotConf.ref))\n ) {\n const nextNode = nodes.find((n) => n.$$uid === delegateToParentUid);\n const nextMountPoint = proxySlotConf.refSlot;\n if (nextNode.$$isExpandableTemplate) {\n expandEdgesThroughTemplateChain(nextNode, nextMountPoint, childUid);\n } else {\n const expandedEdge: BuilderRuntimeEdge = {\n child: childUid,\n parent: delegateToParentUid,\n mountPoint: nextMountPoint,\n sort: undefined,\n $$isTemplateExpanded: true,\n };\n const siblingEdges = sortBy(\n newEdges.filter((edge) => edge.parent === delegateToParentUid),\n (edge) => reorderedEdgesMap.get(edge) ?? edge.sort\n );\n const internalEdges = siblingEdges.filter(\n (edge) => edge.$$isTemplateInternal\n );\n // For more details about refPosition implementation detail,\n // see `packages/brick-kit/src/core/CustomTemplates/expandCustomTemplate.ts`.\n const refPosition = proxySlotConf.refPosition ?? -1;\n const clampedRefPosition = clamp(\n refPosition < 0\n ? internalEdges.length + 1 + refPosition\n : refPosition,\n 0,\n internalEdges.length\n );\n siblingEdges.splice(\n clampedRefPosition < internalEdges.length\n ? siblingEdges.findIndex(\n (edge) => edge === internalEdges[clampedRefPosition]\n )\n : siblingEdges.length,\n 0,\n expandedEdge\n );\n siblingEdges.forEach((edge, index) => {\n reorderedEdgesMap.set(edge, index);\n });\n newEdges.push(expandedEdge);\n }\n }\n };\n\n walk(rootId, (node, childEdges) => {\n if (!node.$$isExpandableTemplate) {\n return;\n }\n for (const childEdge of childEdges) {\n // Recursively expand templates.\n expandEdgesThroughTemplateChain(\n node,\n childEdge.mountPoint,\n childEdge.child\n );\n }\n });\n\n if (newEdges.length > edges.length) {\n return newEdges.map((edge) => {\n const sort = reorderedEdgesMap.get(edge);\n return sort === undefined\n ? edge\n : {\n ...edge,\n sort,\n };\n });\n }\n\n return edges;\n}\n","import { BuilderCanvasData, BuilderRuntimeEdge } from \"../interfaces\";\nimport { expandTemplateEdges } from \"./expandTemplateEdges\";\n\nexport function reorderBuilderEdges(\n { rootId, nodes, edges }: BuilderCanvasData,\n {\n parentUid,\n nodeUids,\n }: {\n parentUid: number;\n nodeUids: number[];\n }\n): BuilderRuntimeEdge[] {\n // When we do edge-reordering, we simply remove existed\n // expanded edges and re-expand them.\n const edgesExcludeExpanded = edges.filter(\n (edge) => !edge.$$isTemplateExpanded\n );\n\n return expandTemplateEdges({\n rootId,\n nodes,\n edges: edgesExcludeExpanded.map((edge) => {\n // `nodeUids` are sorted, so reorder related edges based on it.\n const index =\n edge.parent === parentUid ? nodeUids.indexOf(edge.child) : -1;\n return index >= 0\n ? {\n ...edge,\n sort: index,\n }\n : edge;\n }),\n });\n}\n","import { BuilderCanvasData, BuilderRuntimeEdge } from \"../interfaces\";\n\nexport function deleteNodeFromTree(\n nodeUid: number,\n { rootId, nodes, edges, wrapperNode }: BuilderCanvasData\n): BuilderCanvasData {\n const idsToDelete = new Set<number>();\n collectIdsToDelete(nodeUid, edges, idsToDelete);\n return {\n rootId,\n nodes: nodes.filter((node) => !idsToDelete.has(node.$$uid)),\n edges: edges.filter(\n (edge) => !idsToDelete.has(edge.parent) && !idsToDelete.has(edge.child)\n ),\n wrapperNode: wrapperNode?.$$uid === nodeUid ? null : wrapperNode,\n };\n}\n\nfunction collectIdsToDelete(\n nodeUid: number,\n edges: BuilderRuntimeEdge[],\n idsToDelete: Set<number>\n): void {\n idsToDelete.add(nodeUid);\n const ids = new Set<number>();\n for (const edge of edges) {\n if (edge.parent === nodeUid) {\n ids.add(edge.child);\n }\n }\n for (const id of ids) {\n collectIdsToDelete(id, edges, idsToDelete);\n }\n}\n","import { BuilderRuntimeNode } from \"../interfaces\";\nimport {\n BrickEventHandler,\n ExecuteCustomBrickEventHandler,\n MessageConf,\n} from \"@next-core/brick-types\";\nimport { isEmpty } from \"lodash\";\n\nexport type RelatedNodesBasedOnEventsMap = Map<\n number,\n {\n upstreamNodes: Set<number>;\n downstreamNodes: Set<number>;\n }\n>;\n\nexport function getRelatedNodesBasedOnEvents(\n nodes: BuilderRuntimeNode[],\n rootNodeIsCustomTemplate?: boolean\n): RelatedNodesBasedOnEventsMap {\n const nodesMap: RelatedNodesBasedOnEventsMap = new Map();\n\n const targetMap = new Map<string, number>();\n const targetRefMap = new Map<string, number>();\n for (const n of nodes) {\n nodesMap.set(n.$$uid, {\n upstreamNodes: new Set<number>(),\n downstreamNodes: new Set<number>(),\n });\n for (const selector of n.$$matchedSelectors) {\n if (!targetMap.get(selector)) {\n targetMap.set(selector, n.$$uid);\n }\n }\n if (rootNodeIsCustomTemplate) {\n if (n.ref) {\n targetRefMap.set(n.ref as string, n.$$uid);\n }\n }\n }\n\n for (const node of nodes) {\n let handlers: BrickEventHandler[] = [];\n if (!isEmpty(node.$$parsedEvents)) {\n handlers = Object.values(node.$$parsedEvents).flat();\n }\n if (!isEmpty(node.$$parsedLifeCycle)) {\n handlers = handlers.concat(\n Object.entries(node.$$parsedLifeCycle).flatMap(\n ([lifeCycleName, lifeCycleConf]) => {\n switch (lifeCycleName) {\n case \"onBeforePageLoad\":\n case \"onPageLoad\":\n case \"onPageLeave\":\n case \"onBeforePageLeave\":\n case \"onAnchorLoad\":\n case \"onAnchorUnload\":\n case \"onMessageClose\":\n return lifeCycleConf as BrickEventHandler[];\n case \"onMessage\":\n return ([] as MessageConf[])\n .concat(lifeCycleConf)\n .flatMap((messageConf) =>\n ([] as BrickEventHandler[]).concat(messageConf.handlers)\n );\n default:\n // eslint-disable-next-line no-console\n console.warn(`unknown lifeCycle: ${lifeCycleName}`);\n return [];\n }\n }\n )\n );\n }\n if (handlers.length > 0) {\n collectRelatedNodes(node, handlers, nodesMap, targetMap, targetRefMap);\n }\n }\n\n return nodesMap;\n}\n\nfunction collectRelatedNodes(\n node: BuilderRuntimeNode,\n handlers: BrickEventHandler[],\n nodesMap: RelatedNodesBasedOnEventsMap,\n targetMap: Map<string, number>,\n targetRefMap: Map<string, number>\n): void {\n for (const handler of handlers as ExecuteCustomBrickEventHandler[]) {\n if (handler) {\n if (handler.target) {\n const targetNodeUid = targetMap.get(handler.target as string);\n if (targetNodeUid) {\n nodesMap.get(node.$$uid).downstreamNodes.add(targetNodeUid);\n nodesMap.get(targetNodeUid).upstreamNodes.add(node.$$uid);\n }\n } else if (handler.targetRef) {\n for (const ref of [].concat(handler.targetRef)) {\n const targetRefNodeUid = targetRefMap.get(ref);\n if (targetRefNodeUid) {\n nodesMap.get(node.$$uid).downstreamNodes.add(targetRefNodeUid);\n nodesMap.get(targetRefNodeUid).upstreamNodes.add(node.$$uid);\n }\n }\n }\n if (handler.callback) {\n for (const callbackHandlers of Object.values(handler.callback)) {\n collectRelatedNodes(\n node,\n [].concat(callbackHandlers),\n nodesMap,\n targetMap,\n targetRefMap\n );\n }\n }\n }\n }\n}\n","import { cloneDeep, upperFirst } from \"lodash\";\nimport {\n computeConstantCondition,\n normalizeBuilderNode,\n} from \"@next-core/brick-utils\";\nimport { BuilderRouteOrBrickNode } from \"@next-core/brick-types\";\nimport { BuilderRuntimeNode } from \"../interfaces\";\nimport { isBrickNode, isRouteNode } from \"../assertions\";\n\nconst nodeIgnoreFields = [\"parent\", \"children\", \"graphInfo\", \"mountPoint\"];\n\n// Match evaluations and placeholders,\n// E.g.: `<% QUERY.x %>` or `${QUERY.x}`.\nconst computationRegExp = /[<{]/;\n\nexport function getBuilderNode(\n nodeData: BuilderRouteOrBrickNode,\n nodeUid: number,\n isTemplateInternalNode?: boolean\n): BuilderRuntimeNode {\n const matchedSelectors: string[] = [];\n\n if (nodeData.brick) {\n matchedSelectors.push((nodeData.brick as string).replace(/\\./g, \"\\\\.\"));\n }\n\n const normalized = normalizeBuilderNode(nodeData);\n\n const jsonFieldsInBrick = [\"properties\", \"events\", \"lifeCycle\"];\n const parsedFields: [string, unknown][] = [];\n let parsedId: string;\n let parsedTestId: string;\n\n for (const field of jsonFieldsInBrick) {\n const parsed = cloneDeep(\n (normalized as Record<string, unknown>)?.[field]\n ) as Record<string, unknown>;\n parsedFields.push([`$$parsed${upperFirst(field)}`, parsed ?? {}]);\n\n if (field === \"properties\") {\n let tempParsedId: string;\n let tempParsedTestId: string;\n if (\n ((tempParsedTestId = (parsed?.dataset as Record<string, string>)\n ?.testid),\n typeof tempParsedTestId === \"string\") &&\n !computationRegExp.test(tempParsedTestId)\n ) {\n parsedTestId = tempParsedTestId;\n } else if (\n ((tempParsedId = parsed?.id as string),\n typeof tempParsedId === \"string\") &&\n !computationRegExp.test(tempParsedId)\n ) {\n parsedId = tempParsedId;\n matchedSelectors.push(`#${parsedId}`);\n }\n }\n }\n\n const isBrick = isBrickNode(nodeData);\n const brickName = isBrick ? nodeData.brick.split(\".\").pop() : null;\n\n let unreachable = false;\n if (normalized?.if !== undefined && (isBrick || isRouteNode(nodeData))) {\n const check = { if: normalized.if };\n computeConstantCondition(check);\n if (check.if === false) {\n unreachable = true;\n }\n }\n\n return Object.fromEntries(\n Object.entries(nodeData)\n .filter((entry) => !nodeIgnoreFields.includes(entry[0]))\n .concat([\n [\n \"displayName\",\n // Ignore alias which equals to brick name.\n (!(isBrick && nodeData.alias === brickName) && nodeData.alias) ||\n (isBrick\n ? nodeData.ref || parsedTestId || parsedId || brickName\n : undefined),\n ],\n [\"$$uid\", nodeUid],\n [\"$$matchedSelectors\", matchedSelectors],\n [\"$$isTemplateInternalNode\", isTemplateInternalNode],\n [\"$$normalized\", normalized],\n [\"$$unreachable\", unreachable],\n ])\n .concat(parsedFields)\n ) as BuilderRuntimeNode;\n}\n","import { sortBy } from \"lodash\";\nimport { hasOwnProperty } from \"@next-core/brick-utils\";\nimport {\n BuilderRouteOrBrickNode,\n BuilderCustomTemplateNode,\n CustomTemplateProxyProperty,\n CustomTemplateProxyBasicProperty,\n Story,\n TemplateLayoutType,\n} from \"@next-core/brick-types\";\nimport { BuilderRuntimeEdge, BuilderRuntimeNode } from \"../interfaces\";\nimport { getBuilderNode } from \"./getBuilderNode\";\nimport { getUniqueNodeId } from \"./getUniqueNodeId\";\nimport { isBrickNode } from \"../assertions\";\n\nexport function getAppendingNodesAndEdges(\n nodeData: BuilderRouteOrBrickNode,\n nodeUid: number,\n templateSourceMap: Map<string, BuilderCustomTemplateNode>,\n storyList: Story[] = [],\n isRoot?: boolean\n): {\n nodes: BuilderRuntimeNode[];\n edges: BuilderRuntimeEdge[];\n wrapperNode?: BuilderRuntimeNode;\n} {\n const nodes: BuilderRuntimeNode[] = [];\n const edges: BuilderRuntimeEdge[] = [];\n let wrapperNode: BuilderRuntimeNode;\n\n const walk = (\n nodeData: BuilderRouteOrBrickNode,\n currentUid: number,\n processedTemplateSet: Set<string>,\n isTemplateInternalNode?: boolean,\n inheritedTemplateRefToUid?: Map<string, number>,\n layoutType?: TemplateLayoutType\n ): void => {\n const builderNode = getBuilderNode(\n nodeData,\n currentUid,\n isTemplateInternalNode\n );\n nodes.push(builderNode);\n\n if (inheritedTemplateRefToUid && builderNode.ref) {\n inheritedTemplateRefToUid.set(builderNode.ref as string, currentUid);\n }\n\n let templateSource: BuilderCustomTemplateNode;\n\n if (\n isBrickNode(builderNode) &&\n !builderNode.brick.includes(\".\") &&\n builderNode.brick.startsWith(\"tpl-\") &&\n !processedTemplateSet.has(builderNode.brick) &&\n (templateSource = templateSourceMap?.get(builderNode.brick)) &&\n templateSource.children?.length > 0\n ) {\n if (templateSource.layoutType === \"wrapper\") {\n builderNode.layoutType = \"wrapper\";\n }\n // Avoid nesting the same templates.\n processedTemplateSet.add(builderNode.brick);\n builderNode.$$isExpandableTemplate = true;\n builderNode.$$templateProxy =\n templateSource.proxy && JSON.parse(templateSource.proxy);\n const templateRefToUid = new Map<string, number>();\n builderNode.$$templateRefToUid = templateRefToUid;\n\n const sortedChildren = sortBy(templateSource.children, [\n (item) => item.sort ?? -Infinity,\n ]);\n sortedChildren.forEach((child, index) => {\n const childUid = getUniqueNodeId();\n walk(\n child,\n childUid,\n // Each child should be a branch.\n new Set(processedTemplateSet),\n true,\n templateRefToUid,\n layoutType\n );\n edges.push({\n child: childUid,\n parent: currentUid,\n mountPoint: \"\",\n sort: index,\n $$isTemplateInternal: true,\n });\n });\n\n if (!builderNode.$$isTemplateInternalNode) {\n // Here all internal nodes of the template including nested templates are ready.\n const processDelegatingSlots = (\n cursorNode: BuilderRuntimeNode,\n mountPoint?: string,\n rootMountPoint?: string\n ): void => {\n if (cursorNode.$$templateProxy?.slots) {\n const slotEntries = Object.entries(\n cursorNode.$$templateProxy?.slots\n ).filter(\n (entry) => mountPoint === undefined || entry[0] === mountPoint\n );\n for (const [slotName, slotConf] of slotEntries) {\n const refUid = cursorNode.$$templateRefToUid.get(slotConf.ref);\n if (refUid) {\n const refNode = nodes.find((node) => node.$$uid === refUid);\n if (refNode.$$isExpandableTemplate) {\n processDelegatingSlots(refNode, slotConf.refSlot, slotName);\n } else {\n if (!refNode.$$delegatedSlots) {\n refNode.$$delegatedSlots = new Map();\n }\n let delegatedSlotsByRefSlot = refNode.$$delegatedSlots.get(\n slotConf.refSlot\n );\n if (!delegatedSlotsByRefSlot) {\n delegatedSlotsByRefSlot = [];\n refNode.$$delegatedSlots.set(\n slotConf.refSlot,\n delegatedSlotsByRefSlot\n );\n }\n delegatedSlotsByRefSlot.push({\n templateUid: builderNode.$$uid,\n templateMountPoint: rootMountPoint || slotName,\n });\n }\n }\n }\n }\n };\n processDelegatingSlots(builderNode);\n\n const processDelegatingProperties = (\n cursorNode: BuilderRuntimeNode,\n previousPropertyName?: string\n ): void => {\n if (cursorNode.$$templateProxy?.properties) {\n const propertyEntries = Object.entries(\n cursorNode.$$templateProxy?.properties\n ).filter(\n (entry) =>\n previousPropertyName === undefined ||\n entry[0] === previousPropertyName\n );\n for (const [propertyName, propertyConf] of propertyEntries) {\n if (\n hasOwnProperty(cursorNode.$$parsedProperties, propertyName) &&\n isBasicRefProperty(propertyConf)\n ) {\n const refUid = cursorNode.$$templateRefToUid.get(\n propertyConf.ref\n );\n const propertyValue =\n cursorNode.$$parsedProperties[propertyName];\n if (refUid) {\n const refNode = nodes.find((node) => node.$$uid === refUid);\n refNode.$$parsedProperties[propertyConf.refProperty] =\n propertyValue;\n if (refNode.$$isExpandableTemplate) {\n processDelegatingProperties(\n refNode,\n propertyConf.refProperty\n );\n }\n }\n }\n }\n }\n };\n processDelegatingProperties(builderNode);\n }\n }\n\n if (Array.isArray(nodeData.children)) {\n // For routes and custom-templates, their children are fixed\n // and mount points should be ignored. To unify tree edge\n // data structure, just override their mount points.\n let overrideChildrenMountPoint: string;\n switch (builderNode.type) {\n case \"bricks\":\n case \"custom-template\":\n case \"snippet\":\n overrideChildrenMountPoint = \"bricks\";\n break;\n case \"routes\":\n overrideChildrenMountPoint = \"routes\";\n break;\n }\n const sortedChildren = sortBy(nodeData.children, [\n (item) => item.sort ?? -Infinity,\n ]);\n sortedChildren.forEach((child, index) => {\n const childUid = getUniqueNodeId();\n walk(\n child,\n childUid,\n // Each child should be a branch.\n new Set(processedTemplateSet),\n isTemplateInternalNode,\n inheritedTemplateRefToUid\n );\n edges.push({\n child: childUid,\n parent: currentUid,\n mountPoint: overrideChildrenMountPoint ?? child.mountPoint,\n sort: index,\n $$isTemplateInternal: isTemplateInternalNode,\n $$isTemplateDelegated: builderNode.$$isExpandableTemplate,\n });\n });\n }\n };\n walk(nodeData, nodeUid, new Set());\n for (let i = 0; i < nodes.length; i++) {\n // 布局模板属于第一层\n const item = nodes[i];\n if (\n item.layoutType === \"wrapper\" &&\n isRoot &&\n edges.find((edge) => edge.child === item.$$uid).parent === nodeUid\n ) {\n if (!wrapperNode) {\n wrapperNode = item;\n }\n break;\n }\n }\n return {\n nodes,\n edges,\n wrapperNode,\n };\n}\n\nexport function isBasicRefProperty(\n propRef: CustomTemplateProxyProperty\n): propRef is CustomTemplateProxyBasicProperty {\n return (\n !!(propRef as CustomTemplateProxyBasicProperty).ref &&\n !!(propRef as CustomTemplateProxyBasicProperty).refProperty\n );\n}\n","import { BuilderRuntimeNode } from \"../interfaces\";\n\nexport function isParentExpandableTemplate(\n nodes: BuilderRuntimeNode[],\n parentUid: number\n): boolean {\n return nodes.find((node) => node.$$uid === parentUid).$$isExpandableTemplate;\n}\n","import yaml from \"js-yaml\";\nimport { BrickConf } from \"@next-core/brick-types\";\nimport { SnippetNodeInstance } from \"../interfaces\";\n\nconst jsonFieldsInBrick = [\n \"properties\",\n \"events\",\n \"lifeCycle\",\n \"params\",\n \"if\",\n \"transform\",\n];\nconst yamlFieldsInBrick = [\"permissionsPreCheck\", \"transformFrom\"];\nconst ignoredFieldsInBrick = [\n \"brick\",\n \"template\",\n \"portal\",\n \"slots\",\n \"id\",\n \"children\",\n \"instanceId\",\n];\n\nexport interface ReverseNormalizeContext {\n isPortalCanvas: boolean;\n nodeData: {\n type: \"brick\" | \"template\" | \"provider\";\n parent: string;\n mountPoint: string;\n sort: number;\n };\n}\n\n// The reverse operation of *normalize*.\n// https://github.com/easyops-cn/next-basics/blob/5a6710d567821bcb4a0c71e22d55212193d8b0cb/bricks/next-builder/src/shared/storyboard/buildStoryboard.ts#L394\nexport function reverseNormalize(\n brickConf: BrickConf,\n ctx: ReverseNormalizeContext\n): SnippetNodeInstance {\n return Object.fromEntries(\n Object.entries(brickConf)\n .map<[string, unknown]>(([key, value]) =>\n value === undefined || ignoredFieldsInBrick.includes(key)\n ? undefined\n : jsonFieldsInBrick.includes(key)\n ? [key, JSON.stringify(value)]\n : yamlFieldsInBrick.includes(key)\n ? [key, yaml.safeDump(value)]\n : [key, value]\n )\n .filter(Boolean)\n .concat(Object.entries(ctx.nodeData), [\n [\n \"brick\",\n ctx.nodeData.type === \"template\"\n ? brickConf.template\n : brickConf.brick,\n ],\n [\"portal\", ctx.isPortalCanvas || brickConf.portal],\n ])\n ) as SnippetNodeInstance;\n}\n","import { BrickConf, SlotConfOfBricks } from \"@next-core/brick-types\";\nimport { SnippetNodeDetail } from \"../interfaces\";\nimport { getUniqueNodeId } from \"../internal/getUniqueNodeId\";\nimport { reverseNormalize } from \"./reverseNormalize\";\n\nexport function getSnippetNodeDetail({\n parent,\n parentUid,\n mountPoint,\n nodeUid,\n brickConf,\n isPortalCanvas,\n sort,\n}: {\n parent?: string;\n parentUid: number;\n mountPoint: string;\n nodeUid: number;\n brickConf: BrickConf;\n isPortalCanvas?: boolean;\n sort?: number;\n}): SnippetNodeDetail {\n const type = brickConf.template\n ? \"template\"\n : brickConf.bg\n ? \"provider\"\n : \"brick\";\n\n return {\n nodeUid,\n parentUid,\n nodeData: reverseNormalize(brickConf, {\n isPortalCanvas,\n nodeData: {\n type,\n parent,\n mountPoint,\n sort,\n },\n }),\n children: brickConf.slots\n ? Object.entries(brickConf.slots)\n .flatMap(([mountPoint, slotConf]) =>\n (slotConf as SlotConfOfBricks).bricks.map((childBrickConf) => ({\n childBrickConf,\n mountPoint,\n }))\n )\n .map(({ childBrickConf, mountPoint }, index) =>\n getSnippetNodeDetail({\n parentUid: nodeUid,\n mountPoint,\n nodeUid: getUniqueNodeId(),\n brickConf: childBrickConf,\n sort: index,\n })\n )\n : [],\n };\n}\n","import { BuilderRuntimeNode } from \"../interfaces\";\nimport {\n isRouteNode,\n isBrickNode,\n isCustomTemplateNode,\n isSnippetNode,\n} from \"@next-core/brick-utils\";\n\nexport const getObjectIdByNode = (node: BuilderRuntimeNode): string => {\n if (isRouteNode(node)) return \"STORYBOARD_ROUTE\";\n if (isBrickNode(node)) return \"STORYBOARD_BRICK\";\n if (isCustomTemplateNode(node)) return \"STORYBOARD_TEMPLATE\";\n if (isSnippetNode(node)) return \"STORYBOARD_SNIPPET\";\n};\n","import { omit, sortBy } from \"lodash\";\nimport EventTarget from \"@ungap/event-target\";\nimport {\n BuilderRouteOrBrickNode,\n BuilderRouteNode,\n Story,\n BuilderCustomTemplateNode,\n} from \"@next-core/brick-types\";\nimport { computeConstantCondition, JsonStorage } from \"@next-core/brick-utils\";\nimport {\n BuilderCanvasData,\n BuilderContextMenuStatus,\n BuilderRuntimeEdge,\n BuilderRuntimeNode,\n EventDetailOfNodeAdd,\n EventDetailOfNodeAddStored,\n EventDetailOfNodeMove,\n EventDetailOfNodeReorder,\n EventDetailOfContextUpdated,\n SnippetNodeDetail,\n EventDetailOfSnippetApply,\n EventDetailOfSnippetApplyStored,\n SharedEditorConf,\n BuilderDroppingStatus,\n WorkbenchTreeNodeMoveProps,\n EventDetailOfWorkbenchTreeNodeMove,\n WorkbenchNodeAdd,\n} from \"../interfaces\";\nimport { getUniqueNodeId } from \"./getUniqueNodeId\";\nimport { reorderBuilderEdges } from \"./reorderBuilderEdges\";\nimport { deleteNodeFromTree } from \"./deleteNodeFromTree\";\nimport {\n getRelatedNodesBasedOnEvents,\n RelatedNodesBasedOnEventsMap,\n} from \"../processors/getRelatedNodesBasedOnEvents\";\nimport { expandTemplateEdges } from \"./expandTemplateEdges\";\nimport { getAppendingNodesAndEdges } from \"./getAppendingNodesAndEdges\";\nimport { isParentExpandableTemplate } from \"./isParentExpandableTemplate\";\nimport { getSnippetNodeDetail } from \"../DropZone/getSnippetNodeDetail\";\nimport { getObjectIdByNode } from \"./getObjectIdByNode\";\nimport { isBrickNode, isRouteNode } from \"../assertions\";\n\nenum BuilderInternalEventType {\n NODE_ADD = \"builder.node.add\",\n NODE_MOVE = \"builder.node.move\",\n NODE_REORDER = \"builder.node.reorder\",\n NODE_CLICK = \"builder.node.click\",\n NODE_UPDATE = \"builder.node.update\",\n SNIPPET_APPLY = \"builder.snippet.apply\",\n CONTEXT_MENU_CHANGE = \"builder.contextMenu.change\",\n DATA_CHANGE = \"builder.data.change\",\n SHARED_EDITOR_LIST_CHANGE = \"builder.sharedEditorList.change\",\n ROUTE_LIST_CHANGE = \"builder.routeList.change\",\n HOVER_NODE_CHANGE = \"builder.hoverNode.change\",\n ACTIVE_NODE_CHANGE = \"builder.activeNode.change\",\n SHOW_RELATED_NODES_BASED_ON_EVENTS = \"builder.showRelatedNodesBasedOnEvents.change\",\n HIGHLIGHT_NODES_CHANGE = \"builder.highlightNodes.change\",\n OUTLINE_DISABLED_NODES_CHANGE = \"builder.outlineDisabledNodes.change\",\n DROPPING_STATUS_CHANGE = \"builder.droppingStatus.change\",\n WORKBENCH_TREE_NODE_MOVE = \"workbench.tree.node.move\",\n}\n\nconst storageKeyOfOutlineDisabledNodes = \"builder-outline-disabled-nodes\";\n\nexport class BuilderDataManager {\n private data: BuilderCanvasData = {\n rootId: null,\n nodes: [],\n edges: [],\n wrapperNode: null,\n };\n\n private hoverNodeUid: number;\n private activeNodeUid: number;\n\n private sharedEditorList: SharedEditorConf[];\n\n private routeList: BuilderRouteNode[];\n\n private storyList: Story[];\n\n private readonly eventTarget = new EventTarget();\n\n private contextMenuStatus: BuilderContextMenuStatus = {\n active: false,\n };\n\n private showRelatedNodesBasedOnEvents: boolean;\n\n private relatedNodesBasedOnEventsMap: RelatedNodesBasedOnEventsMap;\n\n private highlightNodes: Set<number> = new Set();\n\n private templateSourceMap: Map<string, BuilderCustomTemplateNode>;\n\n private droppingStatus: BuilderDroppingStatus = new Map();\n\n private readonly localJsonStorage = new JsonStorage<{\n [storageKeyOfOutlineDisabledNodes]: string[];\n }>(localStorage);\n\n private readonly outlineDisabledNodes: Set<string> = new Set(\n this.localJsonStorage.getItem(storageKeyOfOutlineDisabledNodes) ?? []\n );\n\n getData(): BuilderCanvasData {\n return this.data;\n }\n\n getContextMenuStatus(): BuilderContextMenuStatus {\n return this.contextMenuStatus;\n }\n\n getRelatedNodesBasedOnEventsMap(): RelatedNodesBasedOnEventsMap {\n return this.relatedNodesBasedOnEventsMap;\n }\n\n sharedEditorListInit(data: SharedEditorConf[]): void {\n this.sharedEditorList = data;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.SHARED_EDITOR_LIST_CHANGE)\n );\n }\n\n getSharedEditorList(): SharedEditorConf[] {\n return this.sharedEditorList ?? [];\n }\n\n onSharedEditorListChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.SHARED_EDITOR_LIST_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.SHARED_EDITOR_LIST_CHANGE,\n fn\n );\n };\n }\n\n routeListInit(data: BuilderRouteNode[]): void {\n this.routeList = data;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.ROUTE_LIST_CHANGE)\n );\n }\n\n getRouteList(): BuilderRouteNode[] {\n return this.routeList ?? [];\n }\n\n storyListInit(data: Story[]): void {\n this.storyList = data;\n }\n\n getStoryList(): Story[] {\n return this.storyList;\n }\n\n onRouteListChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.ROUTE_LIST_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.ROUTE_LIST_CHANGE,\n fn\n );\n };\n }\n\n dataInit(\n root: BuilderRuntimeNode,\n templateSourceMap?: Map<string, BuilderCustomTemplateNode>\n ): void {\n this.templateSourceMap = templateSourceMap;\n const rootId = getUniqueNodeId();\n const newData = {\n rootId,\n ...getAppendingNodesAndEdges(\n root,\n rootId,\n templateSourceMap,\n this.storyList,\n true\n ),\n };\n this.data = {\n ...newData,\n edges: expandTemplateEdges(newData),\n };\n this.triggerDataChange();\n }\n\n private triggerDataChange(): void {\n const { rootId, nodes } = this.data;\n const rootNode = nodes.find((node) => node.$$uid === rootId);\n const rootNodeIsCustomTemplate = rootNode.type === \"custom-template\";\n this.relatedNodesBasedOnEventsMap = getRelatedNodesBasedOnEvents(\n nodes,\n rootNodeIsCustomTemplate\n );\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.DATA_CHANGE, {\n detail: this.data,\n })\n );\n }\n\n private runAddNodeAction(detail: EventDetailOfNodeAdd): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const { nodeUid, parentUid, nodeUids, nodeData, sort } = detail;\n\n const { nodes: addNodes, edges: addEdges } = getAppendingNodesAndEdges(\n omit(nodeData, [\n \"parent\",\n ]) as Partial<BuilderRouteOrBrickNode> as BuilderRouteOrBrickNode,\n nodeUid,\n this.templateSourceMap,\n this.getStoryList()\n );\n const newNodes = nodes.concat(addNodes);\n const newEdges = edges\n .concat({\n parent: parentUid,\n child: nodeUid,\n mountPoint: nodeData.mountPoint,\n sort: sort ?? undefined,\n $$isTemplateDelegated: isParentExpandableTemplate(nodes, parentUid),\n })\n .concat(addEdges);\n\n const newData = {\n rootId,\n nodes: newNodes,\n edges: newEdges,\n wrapperNode,\n };\n this.data = {\n ...newData,\n edges: reorderBuilderEdges(newData, {\n parentUid,\n nodeUids,\n }),\n };\n this.triggerDataChange();\n }\n\n updateBrick(detail: EventDetailOfNodeAdd): void {\n this.data = deleteNodeFromTree(detail.nodeUid, this.data);\n\n this.runAddNodeAction(detail);\n }\n\n updateNode(instanceId: string, detail: BuilderRuntimeNode): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const updateNode = nodes.find((item) => item.instanceId === instanceId);\n const newNodes = nodes.map((item) => {\n if (item.instanceId === instanceId) {\n let unreachable = false;\n const normalized = detail.$$normalized;\n if (\n normalized?.if !== undefined &&\n (isBrickNode(item) || isRouteNode(item))\n ) {\n const check = { if: normalized.if };\n computeConstantCondition(check);\n if (check.if === false) {\n unreachable = true;\n }\n }\n return {\n ...item,\n ...detail,\n $$unreachable: unreachable,\n };\n }\n return item;\n });\n const newEdges =\n detail.mountPoint === undefined || detail.mountPoint === null\n ? edges\n : edges.map((item) => {\n if (item.child === updateNode.$$uid) {\n return {\n ...item,\n mountPoint: detail.mountPoint,\n };\n }\n return item;\n });\n this.data = {\n rootId,\n nodes: newNodes,\n edges: newEdges,\n wrapperNode,\n };\n this.triggerDataChange();\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_UPDATE, {\n detail: this.data,\n })\n );\n }\n\n private redirectMountPoint(\n detail: EventDetailOfNodeAdd | EventDetailOfNodeMove | SnippetNodeDetail\n ): void {\n const { rootId, wrapperNode } = this.data;\n if (detail.parentUid === rootId) {\n detail.nodeData.mountPoint = \"bricks\";\n }\n if (wrapperNode && wrapperNode.instanceId === detail.nodeData.parent) {\n detail.nodeData.mountPoint = \"content\";\n }\n }\n\n private redirectSnippetMountPoint(detail: EventDetailOfSnippetApply): void {\n detail.nodeDetails?.forEach((item) => {\n this.redirectMountPoint(item);\n });\n }\n\n nodeAdd(detail: EventDetailOfNodeAdd): void {\n this.redirectMountPoint(detail);\n this.runAddNodeAction(detail);\n\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_ADD, { detail })\n );\n }\n\n nodeAddStored(detail: EventDetailOfNodeAddStored): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const { nodeUid, nodeData } = detail;\n this.data = {\n rootId,\n nodes: nodes.map((node) =>\n node.$$uid === nodeUid\n ? { ...node, id: nodeData.id, instanceId: nodeData.instanceId }\n : node\n ),\n edges,\n wrapperNode,\n };\n this.triggerDataChange();\n }\n\n snippetApply(detail: EventDetailOfSnippetApply): void {\n this.redirectSnippetMountPoint(detail);\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const { nodeDetails, parentUid, nodeUids } = detail;\n\n const newNodes: BuilderRuntimeNode[] = nodes.slice();\n const newEdges: BuilderRuntimeEdge[] = edges.slice();\n\n const walk = ({\n parentUid,\n nodeUid,\n nodeData,\n children,\n }: SnippetNodeDetail): void => {\n const { nodes: appendingNodes, edges: appendingEdges } =\n getAppendingNodesAndEdges(\n omit(nodeData, [\n \"parent\",\n ]) as Partial<BuilderRouteOrBrickNode> as BuilderRouteOrBrickNode,\n nodeUid,\n this.templateSourceMap,\n this.storyList\n );\n newNodes.push(...appendingNodes);\n newEdges.push(\n {\n parent: parentUid,\n child: nodeUid,\n mountPoint: nodeData.mountPoint,\n sort: nodeData.sort,\n $$isTemplateDelegated: isParentExpandableTemplate(\n newNodes,\n parentUid\n ),\n },\n ...appendingEdges\n );\n for (const item of children) {\n walk(item);\n }\n };\n\n for (const item of nodeDetails) {\n walk(item);\n }\n\n const newData = {\n rootId,\n nodes: newNodes,\n edges: newEdges,\n wrapperNode,\n };\n this.data = {\n ...newData,\n edges: reorderBuilderEdges(newData, {\n parentUid,\n nodeUids,\n }),\n };\n this.triggerDataChange();\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.SNIPPET_APPLY, { detail })\n );\n }\n\n snippetApplyStored(detail: EventDetailOfSnippetApplyStored): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const { flattenNodeDetails } = detail;\n this.data = {\n rootId,\n nodes: nodes.map((node) => {\n const found = flattenNodeDetails.find((n) => n.nodeUid === node.$$uid);\n return found\n ? {\n ...node,\n id: found.nodeData.id,\n instanceId: found.nodeData.instanceId,\n }\n : node;\n }),\n edges,\n wrapperNode,\n };\n this.triggerDataChange();\n }\n\n /**\n * Move node anywhere by drag-n-drop.\n * @deprecated use `moveNode` instead.\n */\n nodeMove(detail: EventDetailOfNodeMove): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n this.redirectMountPoint(detail);\n const { nodeUid, parentUid, nodeUids, nodeData } = detail;\n const newData = {\n rootId,\n nodes,\n edges: edges\n .filter((edge) => edge.child !== nodeUid)\n .concat({\n parent: parentUid,\n child: nodeUid,\n mountPoint: nodeData.mountPoint,\n sort: undefined,\n $$isTemplateDelegated: isParentExpandableTemplate(nodes, parentUid),\n }),\n wrapperNode,\n };\n this.data = {\n ...newData,\n edges: reorderBuilderEdges(newData, {\n parentUid,\n nodeUids,\n }),\n };\n this.triggerDataChange();\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_MOVE, { detail })\n );\n }\n\n /**\n * Move node up or down.\n */\n moveNode(\n { $$uid: nodeUid }: BuilderRuntimeNode,\n direction: \"up\" | \"down\"\n ): void {\n const { parent: parentUid, mountPoint } = this.data.edges.find(\n (edge) => edge.child === nodeUid\n );\n const { relatedEdges, mountPoints } = getRelatedEdgesAndMountPoint(\n this.data.edges,\n parentUid\n );\n /** Edges of the same mount-point */\n const siblingEdges = relatedEdges.filter(\n (edge) => edge.mountPoint === mountPoint\n );\n const index = siblingEdges.findIndex((edge) => edge.child === nodeUid);\n const orderedSiblingEdges = moveItemInList(siblingEdges, index, direction);\n if (!orderedSiblingEdges) {\n return;\n }\n const orderedEdges = sortBy(\n relatedEdges,\n (edge) => mountPoints.indexOf(edge.mountPoint),\n (edge) => orderedSiblingEdges.indexOf(edge)\n );\n this.reorder(parentUid, orderedEdges);\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_UPDATE, {\n detail: this.data,\n })\n );\n }\n\n private getDragInfo({\n nodeData,\n dragNodeUid,\n dragOverNodeUid,\n dragStatus,\n }: {\n nodeData: BuilderRuntimeNode;\n dragNodeUid: number;\n dragOverNodeUid: number;\n dragStatus: string;\n }) {\n const { rootId, nodes, edges } = this.data;\n const isDragRoot = dragOverNodeUid === rootId;\n /*\n * 如果找不到edge, 则为新增状态, 否则为移动状态\n */\n const dragEdge = edges.find((item) => item.child === dragNodeUid);\n const dragOverEdge = edges.find((item) => item.child === dragOverNodeUid);\n /**\n * 如果是根节点, 则mountPoint强制等于 bricks\n * 如果是属于拖动进某个节点中, 默认使用 content\n * 其他情况, 使用被拖拽节点的mountPoint\n */\n const mountPoint = isDragRoot\n ? \"bricks\"\n : dragStatus === \"inside\"\n ? \"content\"\n : dragOverEdge.mountPoint;\n\n const parentEdge = edges.find((item) => item.child === dragOverNodeUid);\n /**\n * 如果是根节点, parentUid强制等于rootId\n * 如果是拖动进某个节点, 则当前节点为该节点parent\n * 否则, 等于该节点的父节点\n */\n const parentUid = isDragRoot\n ? rootId\n : dragStatus === \"inside\"\n ? parentEdge.child\n : parentEdge.parent;\n const parnetNodeData = nodes.find((item) => item.$$uid === parentUid);\n // 找到节点父亲等于拖动节点的父节点(寻找兄弟节点)\n const siblingEdge = edges.filter(\n (edge) => edge.child !== dragNodeUid && edge.parent === parentUid\n );\n const sortUids = sortBy(siblingEdge, \"sort\").map((item) => item.child);\n const sortNodeIds: string[] = [];\n const sortNodeInstanceIds: string[] = [];\n sortUids.forEach((item) => {\n const node = nodes.find((node) => node.$$uid === item);\n sortNodeIds.push(node.id);\n sortNodeInstanceIds.push(node.instanceId);\n });\n let sortIndex: number;\n if (dragStatus === \"inside\") {\n sortIndex = siblingEdge.length\n ? Math.max(...siblingEdge.map((item) => item.sort)) + 1\n : 0;\n // 插入默认插最后\n sortNodeIds.push(nodeData.id);\n sortNodeInstanceIds.push(nodeData.instanceId);\n } else if (dragStatus === \"top\" || dragStatus === \"bottom\") {\n const overIndex = sortUids.findIndex((item) => item === dragOverNodeUid);\n sortIndex = dragStatus === \"top\" ? overIndex : overIndex + 1;\n // 排序修正\n sortNodeIds.splice(sortIndex, 0, nodeData.id);\n // 如果是新增的情况下, 没有edge, 则取dragNodeUid(新创建的uid)\n sortUids.splice(sortIndex, 0, dragEdge?.child ?? dragNodeUid);\n sortNodeInstanceIds.splice(sortIndex, 0, nodeData.instanceId);\n }\n\n return {\n parentUid,\n mountPoint,\n sortIndex,\n parnetNodeData,\n sortUids,\n sortNodeIds,\n sortNodeInstanceIds,\n };\n }\n\n workbenchNodeAdd(\n detail: WorkbenchNodeAdd,\n isNeedUpdateSnippet = true\n ): void | EventDetailOfSnippetApply {\n const { nodes, edges, rootId } = this.data;\n const { nodeData, dragOverInstanceId, dragStatus, mountPoint } = detail;\n if (nodeData.instanceId && !nodeData.instanceId.startsWith(\"mock\")) {\n // move\n } else {\n // insert\n const parentInstanceId = detail.parent || detail.parentInstanceId;\n const newNodeUid = nodeData.$$uid || getUniqueNodeId();\n const overNode = nodes.find(\n (item) => item.instanceId === dragOverInstanceId\n );\n let dragOverNodeUid = overNode.$$uid;\n let realDragStatus = dragStatus;\n if (dragOverNodeUid === rootId) {\n realDragStatus = \"inside\";\n } else {\n const overEdge = edges.find((item) => item.child === dragOverNodeUid);\n const overParentNode = nodes.find((item) =>\n dragStatus === \"inside\"\n ? item.$$uid === overEdge.child\n : item.$$uid === overEdge.parent\n );\n\n if (overParentNode.instanceId !== parentInstanceId) {\n // 如果instanceId不相同, 说明父元素被修改, dragStatus强制等于inside, uid也需要切换成实际父元素的uid\n realDragStatus = \"inside\";\n dragOverNodeUid = nodes.find(\n (item) => item.instanceId === parentInstanceId\n ).$$uid;\n }\n }\n\n const {\n parentUid,\n sortIndex,\n sortUids: nodeUids,\n sortNodeIds: nodeIds,\n sortNodeInstanceIds: nodeInstanceIds,\n } = this.getDragInfo({\n nodeData: {\n id: nodeData.id ?? null,\n instanceId: nodeData.instanceId ?? null,\n } as BuilderRuntimeNode,\n dragNodeUid: newNodeUid,\n dragOverNodeUid,\n dragStatus: realDragStatus,\n });\n\n nodeData.parent = parentInstanceId;\n nodeData.mountPoint = mountPoint;\n nodeData.sort = sortIndex;\n\n if (nodeData.bricks) {\n // snippet\n const snippetData = {\n parentUid,\n nodeDetails: nodeData.bricks.map((brickConf) =>\n getSnippetNodeDetail({\n parent: parentInstanceId,\n parentUid: parentUid,\n mountPoint: mountPoint,\n nodeUid: newNodeUid,\n brickConf: brickConf,\n isPortalCanvas: false,\n })\n ),\n nodeIds,\n nodeUids,\n };\n if (isNeedUpdateSnippet) {\n this.snippetApply(snippetData);\n } else {\n return snippetData;\n }\n }\n\n this.runAddNodeAction({\n nodeUid: newNodeUid,\n parentUid,\n nodeUids,\n nodeIds,\n nodeData,\n sort: sortIndex,\n });\n const sortData = {\n nodeUids,\n nodeInstanceIds,\n nodeIds,\n };\n detail.sortData = sortData;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_ADD, {\n detail: {\n nodeUid: newNodeUid,\n parentUid,\n nodeUids,\n nodeInstanceIds,\n nodeIds,\n nodeData,\n },\n })\n );\n }\n }\n\n workbenchTreeNodeMove(detail: WorkbenchTreeNodeMoveProps): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n const { dragNodeUid, dragOverNodeUid, dragStatus } = detail;\n const nodeData = nodes.find((item) => item.$$uid === dragNodeUid);\n const originEdge = edges.find((edge) => edge.child === nodeData.$$uid);\n const originParentUid = originEdge.parent;\n const originParentNode = nodes.find(\n (node) => node.$$uid === originParentUid\n );\n const {\n parentUid,\n parnetNodeData,\n mountPoint,\n sortIndex,\n sortUids: nodeUids,\n sortNodeIds: nodeIds,\n } = this.getDragInfo({\n nodeData,\n dragNodeUid,\n dragOverNodeUid,\n dragStatus,\n });\n\n const newData = {\n rootId,\n nodes,\n edges: edges\n .filter((edge) => edge.child !== dragNodeUid)\n .concat({\n parent: parentUid,\n child: dragNodeUid,\n mountPoint: mountPoint,\n sort: sortIndex,\n $$isTemplateDelegated: isParentExpandableTemplate(nodes, parentUid),\n }),\n wrapperNode,\n };\n this.data = {\n ...newData,\n edges: reorderBuilderEdges(newData, {\n parentUid,\n nodeUids,\n }),\n };\n this.triggerDataChange();\n this.eventTarget.dispatchEvent(\n new CustomEvent<EventDetailOfWorkbenchTreeNodeMove>(\n BuilderInternalEventType.WORKBENCH_TREE_NODE_MOVE,\n {\n detail: {\n nodeUid: dragNodeUid,\n nodeInstanceId: nodeData.instanceId,\n nodeIds,\n ...(originParentNode.instanceId !== parnetNodeData.instanceId ||\n originEdge.mountPoint !== mountPoint\n ? {\n nodeData: {\n parent: parnetNodeData.instanceId,\n mountPoint: mountPoint,\n },\n }\n : {}),\n objectId: getObjectIdByNode(nodeData),\n },\n }\n )\n );\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_UPDATE, {\n detail: this.data,\n })\n );\n }\n\n /**\n * Move mount-point up or down.\n */\n moveMountPoint(\n { $$uid: parentUid }: BuilderRuntimeNode,\n mountPoint: string,\n direction: \"up\" | \"down\"\n ): void {\n const { relatedEdges, mountPoints } = getRelatedEdgesAndMountPoint(\n this.data.edges,\n parentUid\n );\n const index = mountPoints.indexOf(mountPoint);\n const orderedMountPoints = moveItemInList(mountPoints, index, direction);\n if (!orderedMountPoints) {\n return;\n }\n const orderedEdges = sortBy(\n relatedEdges,\n (edge) => orderedMountPoints.indexOf(edge.mountPoint),\n \"sort\"\n );\n this.reorder(parentUid, orderedEdges);\n }\n\n private reorder(parentUid: number, orderedEdges: BuilderRuntimeEdge[]): void {\n const { nodes } = this.data;\n const childUids = orderedEdges.map((edge) => edge.child);\n this.data = {\n ...this.data,\n edges: reorderBuilderEdges(this.data, { parentUid, nodeUids: childUids }),\n };\n this.triggerDataChange();\n const childIds = childUids\n .map((uid) => nodes.find((node) => node.$$uid === uid))\n .map((node) => node.id);\n this.eventTarget.dispatchEvent(\n new CustomEvent<EventDetailOfNodeReorder>(\n BuilderInternalEventType.NODE_REORDER,\n {\n detail: {\n nodeUids: childUids,\n parentUid,\n nodeIds: childIds,\n objectId: getObjectIdByNode(\n nodes.find((node) => node.$$uid === parentUid)\n ),\n },\n }\n )\n );\n }\n\n contextUpdated(detail: EventDetailOfContextUpdated): void {\n const { rootId, nodes, edges, wrapperNode } = this.data;\n this.data = {\n rootId,\n edges,\n nodes: nodes.map((node) =>\n node.$$uid === rootId ? { ...node, context: detail.context } : node\n ),\n wrapperNode,\n };\n this.triggerDataChange();\n }\n\n nodeReorder(detail: EventDetailOfNodeReorder): void {\n const { nodeUids, parentUid } = detail;\n this.data = {\n ...this.data,\n edges: reorderBuilderEdges(this.data, { parentUid, nodeUids }),\n };\n this.triggerDataChange();\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_REORDER, { detail })\n );\n }\n\n nodeDelete(detail: BuilderRuntimeNode): void {\n this.data = deleteNodeFromTree(detail.$$uid, this.data);\n this.triggerDataChange();\n }\n\n nodeClick(detail: BuilderRuntimeNode): void {\n this.setActiveNodeUid(detail.$$uid);\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.NODE_CLICK, { detail })\n );\n }\n\n contextMenuChange(detail: BuilderContextMenuStatus): void {\n this.contextMenuStatus = detail;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.CONTEXT_MENU_CHANGE)\n );\n }\n\n onDataChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(BuilderInternalEventType.DATA_CHANGE, fn);\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.DATA_CHANGE,\n fn\n );\n };\n }\n\n onNodeAdd(\n fn: (event: CustomEvent<EventDetailOfNodeAdd>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.NODE_ADD,\n fn as EventListener\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.NODE_ADD,\n fn as EventListener\n );\n };\n }\n\n onSnippetApply(\n fn: (event: CustomEvent<EventDetailOfSnippetApply>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.SNIPPET_APPLY,\n fn as EventListener\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.SNIPPET_APPLY,\n fn as EventListener\n );\n };\n }\n\n onNodeReorder(\n fn: (event: CustomEvent<EventDetailOfNodeReorder>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.NODE_REORDER,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.NODE_REORDER,\n fn as EventListener\n );\n };\n }\n\n onNodeMove(\n fn: (event: CustomEvent<EventDetailOfNodeMove>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.NODE_MOVE,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.NODE_MOVE,\n fn as EventListener\n );\n };\n }\n\n onWorkbenchTreeNodeMove(\n fn: (event: CustomEvent<EventDetailOfNodeMove>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.WORKBENCH_TREE_NODE_MOVE,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.WORKBENCH_TREE_NODE_MOVE,\n fn as EventListener\n );\n };\n }\n\n onNodeClick(\n fn: (event: CustomEvent<BuilderRuntimeNode>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.NODE_CLICK,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.NODE_CLICK,\n fn as EventListener\n );\n };\n }\n\n onNodeUpdate(\n fn: (event: CustomEvent<BuilderCanvasData>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.NODE_UPDATE,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.NODE_UPDATE,\n fn as EventListener\n );\n };\n }\n\n onContextMenuChange(\n fn: (event: CustomEvent<BuilderContextMenuStatus>) => void\n ): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.CONTEXT_MENU_CHANGE,\n fn as EventListener\n );\n return () => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.CONTEXT_MENU_CHANGE,\n fn as EventListener\n );\n };\n }\n\n setShowRelatedNodesBasedOnEvents(show: boolean): void {\n this.showRelatedNodesBasedOnEvents = show;\n this.eventTarget.dispatchEvent(\n new CustomEvent(\n BuilderInternalEventType.SHOW_RELATED_NODES_BASED_ON_EVENTS\n )\n );\n }\n\n getShowRelatedNodesBasedOnEvents(): boolean {\n return this.showRelatedNodesBasedOnEvents;\n }\n\n onShowRelatedNodesBasedOnEventsChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.SHOW_RELATED_NODES_BASED_ON_EVENTS,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.SHOW_RELATED_NODES_BASED_ON_EVENTS,\n fn\n );\n };\n }\n\n setHoverNodeUid(uid: number): void {\n if (this.hoverNodeUid !== uid) {\n this.hoverNodeUid = uid;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.HOVER_NODE_CHANGE)\n );\n }\n }\n\n getHoverNodeUid(): number {\n return this.hoverNodeUid;\n }\n\n onHoverNodeChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.HOVER_NODE_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.HOVER_NODE_CHANGE,\n fn\n );\n };\n }\n\n setActiveNodeUid(uid: number): void {\n if (this.activeNodeUid !== uid) {\n this.activeNodeUid = uid;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.ACTIVE_NODE_CHANGE)\n );\n }\n }\n\n getActiveNodeUid(): number {\n return this.activeNodeUid;\n }\n\n onActiveNodeChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.ACTIVE_NODE_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.ACTIVE_NODE_CHANGE,\n fn\n );\n };\n }\n\n toggleOutline(nodeInstanceId: string): void {\n if (this.outlineDisabledNodes.has(nodeInstanceId)) {\n this.outlineDisabledNodes.delete(nodeInstanceId);\n } else {\n this.outlineDisabledNodes.add(nodeInstanceId);\n }\n this.localJsonStorage.setItem(\n storageKeyOfOutlineDisabledNodes,\n Array.from(this.outlineDisabledNodes)\n );\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.OUTLINE_DISABLED_NODES_CHANGE)\n );\n }\n\n isOutlineEnabled(nodeInstanceId: string): boolean {\n return !this.outlineDisabledNodes.has(nodeInstanceId);\n }\n\n onOutlineEnabledNodesChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.OUTLINE_DISABLED_NODES_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.OUTLINE_DISABLED_NODES_CHANGE,\n fn\n );\n };\n }\n\n setHighlightNodes(nodeUids: Set<number>): void {\n this.highlightNodes = nodeUids;\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.HIGHLIGHT_NODES_CHANGE)\n );\n }\n\n getHighlightNodes(): Set<number> {\n return this.highlightNodes;\n }\n\n onHighlightNodesChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.HIGHLIGHT_NODES_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.HIGHLIGHT_NODES_CHANGE,\n fn\n );\n };\n }\n\n updateDroppingStatus(\n nodeUid: number,\n mountPoint: string,\n isDraggingOver: boolean\n ): void {\n const nodeStatus = this.droppingStatus.get(nodeUid);\n this.droppingStatus = new Map(\n Array.from(this.droppingStatus.entries()).concat([\n [\n nodeUid,\n new Map(\n (nodeStatus ? Array.from(nodeStatus) : []).concat([\n [mountPoint, isDraggingOver],\n ])\n ),\n ],\n ])\n );\n this.eventTarget.dispatchEvent(\n new CustomEvent(BuilderInternalEventType.DROPPING_STATUS_CHANGE)\n );\n\n // When dragging nodes over `EditorContainer`, the `mouseout` events\n // are not triggered, which causes hover status does not get cleared.\n // So we manually reset hover status once dragging starts.\n if (\n this.hoverNodeUid &&\n Array.from(this.droppingStatus.values())\n .flatMap((nodeStatus) => Array.from(nodeStatus.values()))\n .some(Boolean)\n ) {\n this.setHoverNodeUid(undefined);\n }\n }\n\n getDroppingStatus(): BuilderDroppingStatus {\n return this.droppingStatus;\n }\n\n onDroppingStatusChange(fn: EventListener): () => void {\n this.eventTarget.addEventListener(\n BuilderInternalEventType.DROPPING_STATUS_CHANGE,\n fn\n );\n return (): void => {\n this.eventTarget.removeEventListener(\n BuilderInternalEventType.DROPPING_STATUS_CHANGE,\n fn\n );\n };\n }\n}\n\nfunction getRelatedEdgesAndMountPoint(\n edges: BuilderRuntimeEdge[],\n parentUid: number\n): {\n /** Edges of the same parent */\n relatedEdges: BuilderRuntimeEdge[];\n /** Mount-point of the same parent */\n mountPoints: string[];\n} {\n const relatedEdges = sortBy(\n edges.filter(\n (edge) => edge.parent === parentUid && !edge.$$isTemplateExpanded\n ),\n \"sort\"\n );\n const mountPointSet = new Set<string>();\n for (const edge of relatedEdges) {\n mountPointSet.add(edge.mountPoint);\n }\n const mountPoints = Array.from(mountPointSet);\n return { relatedEdges, mountPoints };\n}\n\nfunction moveItemInList<T>(\n list: T[],\n index: number,\n direction: \"up\" | \"down\"\n): T[] | undefined {\n let upperIndex: number;\n if (direction === \"up\") {\n if (index <= 0) {\n return;\n }\n upperIndex = index - 1;\n } else {\n if (index === -1 || index >= list.length - 1) {\n return;\n }\n upperIndex = index;\n }\n return [\n ...list.slice(0, upperIndex),\n list[upperIndex + 1],\n list[upperIndex],\n ...list.slice(upperIndex + 2),\n ];\n}\n","import React from \"react\";\nimport { BuilderDataManager } from \"./internal/BuilderDataManager\";\n\nexport interface ContextOfBuilder {\n manager?: BuilderDataManager;\n}\n\nexport const BuilderContext = React.createContext<ContextOfBuilder>({});\n\nexport function createBuilderContext(): ContextOfBuilder {\n return {\n manager: new BuilderDataManager(),\n };\n}\n","import React from \"react\";\nimport { BuilderContext } from \"../BuilderContext\";\nimport { BuilderDataManager } from \"../internal/BuilderDataManager\";\n\nexport function useBuilderDataManager(): BuilderDataManager {\n const { manager } = React.useContext(BuilderContext);\n if (!manager) {\n throw new Error(\"Expected builder data context\");\n }\n return manager;\n}\n","import { useEffect, useState } from \"react\";\nimport { BuilderCanvasData } from \"../interfaces\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useBuilderData(): BuilderCanvasData {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getData());\n useEffect(\n () =>\n manager.onDataChange(() => {\n setData(manager.getData());\n }),\n [manager]\n );\n return data;\n}\n","import { useMemo } from \"react\";\nimport { BuilderRuntimeNode } from \"../interfaces\";\nimport { useBuilderData } from \"./useBuilderData\";\n\nexport function useBuilderNode<P = Record<string, unknown>>({\n nodeUid,\n isRoot,\n isWrapper,\n}: {\n nodeUid?: number;\n isRoot?: boolean;\n isWrapper?: boolean;\n}): BuilderRuntimeNode<P> {\n const { rootId, nodes, wrapperNode } = useBuilderData();\n const currentUid = isRoot ? rootId : nodeUid;\n return useMemo(() => {\n if (isWrapper) {\n return wrapperNode as BuilderRuntimeNode<P>;\n }\n return nodes.find(\n (node) => node.$$uid === currentUid\n ) as BuilderRuntimeNode<P>;\n }, [nodes, currentUid, isWrapper, wrapperNode]);\n}\n","import { useEffect, useState } from \"react\";\nimport { BuilderContextMenuStatus } from \"../interfaces\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useBuilderContextMenuStatus(): BuilderContextMenuStatus {\n const manager = useBuilderDataManager();\n const [status, setStatus] = useState(manager.getContextMenuStatus());\n useEffect(\n () =>\n manager.onContextMenuChange(() => {\n setStatus(manager.getContextMenuStatus());\n }),\n [manager]\n );\n return status;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useShowRelatedNodesBasedOnEvents(): boolean {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getShowRelatedNodesBasedOnEvents());\n useEffect(\n () =>\n manager.onShowRelatedNodesBasedOnEventsChange(() => {\n setData(manager.getShowRelatedNodesBasedOnEvents());\n }),\n [manager]\n );\n return data;\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import editorContainerStyles from \"./EditorContainer.module.css\";\n\nexport function isCurrentTargetByClassName(\n targetElement: HTMLElement,\n currentElement: HTMLElement\n): boolean {\n // Traverse DOM from bottom to top.\n let element = targetElement;\n while (element) {\n if (element === currentElement) {\n return true;\n }\n if (\n element.classList.contains(editorContainerStyles.editorContainer) &&\n !element.classList.contains(editorContainerStyles.isTemplateInternalNode)\n ) {\n // It's not the current target if\n // matches another editor container first.\n return false;\n }\n element = element.parentElement;\n }\n return false;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useHoverNodeUid(): number {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getHoverNodeUid());\n useEffect(\n () =>\n manager.onHoverNodeChange(() => {\n setData(manager.getHoverNodeUid());\n }),\n [manager]\n );\n return data;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useHighlightNodes(): Set<number> {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getHighlightNodes());\n useEffect(\n () =>\n manager.onHighlightNodesChange(() => {\n setData(manager.getHighlightNodes());\n }),\n [manager]\n );\n return data;\n}\n","import { useEffect, useState } from \"react\";\nimport { BuilderDroppingStatus } from \"../interfaces\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useDroppingStatus(): BuilderDroppingStatus {\n const manager = useBuilderDataManager();\n const [droppingStatus, setDroppingStatus] = useState(\n manager.getDroppingStatus()\n );\n useEffect(\n () =>\n manager.onDroppingStatusChange(() => {\n setDroppingStatus(manager.getDroppingStatus());\n }),\n [manager]\n );\n return droppingStatus;\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { EditorBrickType } from \"../interfaces\";\nimport { useBuilderNode } from \"../hooks/useBuilderNode\";\nimport { useBuilderDataManager } from \"../hooks/useBuilderDataManager\";\nimport { useBuilderContextMenuStatus } from \"../hooks/useBuilderContextMenuStatus\";\nimport { useShowRelatedNodesBasedOnEvents } from \"../hooks/useShowRelatedNodesBasedOnEvents\";\nimport { isCurrentTargetByClassName } from \"./isCurrentTargetByClassName\";\nimport { useHoverNodeUid } from \"../hooks/useHoverNodeUid\";\nimport { useHighlightNodes } from \"../hooks/useHighlightNodes\";\nimport { useDroppingStatus } from \"../hooks/useDroppingStatus\";\n\nimport styles from \"./EditorContainer.module.css\";\n\ninterface EditorContainerProps {\n nodeUid: number;\n type?: EditorBrickType;\n isTransparentContainer?: boolean;\n editorContainerStyle?: React.CSSProperties;\n editorBodyStyle?: React.CSSProperties;\n}\n\nexport function EditorContainer({\n nodeUid,\n type,\n isTransparentContainer,\n editorContainerStyle,\n editorBodyStyle,\n children,\n}: React.PropsWithChildren<EditorContainerProps>): React.ReactElement {\n const editorContainerRef = useRef<HTMLDivElement>();\n const highlightNodes = useHighlightNodes();\n const node = useBuilderNode({ nodeUid });\n const [isUpstreamNode, setIsUpstreamNode] = useState(false);\n const [isDownstreamNode, setIsDownstreamNode] = useState(false);\n const contextMenuStatus = useBuilderContextMenuStatus();\n const hoverNodeUid = useHoverNodeUid();\n const showRelatedEvents = useShowRelatedNodesBasedOnEvents();\n const manager = useBuilderDataManager();\n const [hover, setHover] = useState(hoverNodeUid === nodeUid);\n const editorType = type ?? EditorBrickType.DEFAULT;\n const hoverNodeUidRef = useRef(hoverNodeUid);\n const droppingStatus = useDroppingStatus();\n\n useEffect(() => {\n hoverNodeUidRef.current = hoverNodeUid;\n }, [hoverNodeUid]);\n\n const handleMouseOver = useCallback(\n (event: MouseEvent) => {\n event.stopPropagation();\n setHover(true);\n if (hoverNodeUidRef.current !== nodeUid) {\n manager.setHoverNodeUid(nodeUid);\n }\n },\n [nodeUid, manager]\n );\n\n const handleMouseOut = useCallback(\n (event: MouseEvent) => {\n event.stopPropagation();\n setHover(false);\n if (hoverNodeUidRef.current === nodeUid) {\n manager.setHoverNodeUid(undefined);\n }\n },\n [nodeUid, manager]\n );\n\n useEffect(() => {\n if (node.$$isTemplateInternalNode) {\n return;\n }\n // Manually bind listeners since events which cross custom-elements\n // seem not working in React v16.\n const editorContainer = editorContainerRef.current;\n editorContainer.addEventListener(\"mouseover\", handleMouseOver);\n editorContainer.addEventListener(\"mouseout\", handleMouseOut);\n return () => {\n editorContainer.removeEventListener(\"mouseover\", handleMouseOver);\n editorContainer.removeEventListener(\"mouseout\", handleMouseOut);\n };\n }, [handleMouseOver, handleMouseOut, node]);\n\n useEffect(() => {\n if (node.$$isTemplateInternalNode) {\n return;\n }\n setHover(hoverNodeUid === nodeUid);\n if (showRelatedEvents) {\n const relatedNodes = manager.getRelatedNodesBasedOnEventsMap();\n const isUpstreamNode = relatedNodes\n .get(hoverNodeUid)\n ?.upstreamNodes.has(nodeUid);\n setIsUpstreamNode(isUpstreamNode);\n const isDownstreamNode = relatedNodes\n .get(hoverNodeUid)\n ?.downstreamNodes.has(nodeUid);\n setIsDownstreamNode(isDownstreamNode);\n }\n }, [hoverNodeUid, node, nodeUid, showRelatedEvents, manager]);\n\n const isCurrentTarget = useCallback(\n (event: React.MouseEvent) =>\n !node.$$isTemplateInternalNode &&\n isCurrentTargetByClassName(\n event.target as HTMLElement,\n editorContainerRef.current\n ),\n [node]\n );\n\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n // `event.stopPropagation()` not working across bricks.\n if (isCurrentTarget(event)) {\n manager.nodeClick(node);\n }\n },\n [isCurrentTarget, manager, node]\n );\n\n const handleContextMenu = useCallback(\n (event: React.MouseEvent) => {\n // `event.stopPropagation()` not working across bricks.\n if (isCurrentTarget(event)) {\n event.preventDefault();\n manager.contextMenuChange({\n active: true,\n node,\n x: event.clientX,\n y: event.clientY,\n });\n }\n },\n [isCurrentTarget, manager, node]\n );\n\n return (\n <div\n className={classNames(styles.editorContainer, styles[editorType], {\n [styles.transparentContainer]: isTransparentContainer,\n [styles.dropping]: Array.from(\n droppingStatus.get(nodeUid)?.values() ?? []\n ).some(Boolean),\n [styles.hover]: hover,\n [styles.active]:\n contextMenuStatus.active && contextMenuStatus.node.$$uid === nodeUid,\n [styles.isDownstreamNode]: !hover && isDownstreamNode,\n [styles.isUpstreamNode]: !hover && isUpstreamNode,\n [styles.highlight]: highlightNodes.has(nodeUid),\n [styles.isTemplateInternalNode]: node.$$isTemplateInternalNode,\n })}\n style={editorContainerStyle}\n ref={editorContainerRef}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n >\n <div className={styles.nodeAlias}>\n {!hover &&\n (isDownstreamNode ? (\n <span className={styles.arrow}>↓</span>\n ) : isUpstreamNode ? (\n <span className={styles.arrow}>↑</span>\n ) : null)}\n {node.alias || node.brick}\n </div>\n <div className={styles.editorBody} style={editorBodyStyle}>\n {children}\n </div>\n </div>\n );\n}\n","import { developHelper } from \"@next-core/brick-kit\";\nimport { isBrickNode, isRouteNode } from \"../assertions\";\nimport { BuilderRuntimeNode } from \"../interfaces\";\n\nconst ANY_BRICK_EDITOR = \"basic-bricks.any-brick--editor\";\nconst ANY_ROUTE_EDITOR = \"basic-bricks.any-route--editor\";\n\n/**\n * Get editor brick name by node.\n *\n * @param node - Builder node.\n * @param editor - Using shared editor.\n *\n * @returns\n *\n * Returns editor brick name if the node is a brick, will fallback to `basic-bricks.any-brick--editor`\n * if the relevant editor brick is not found.\n *\n * Or returns `basic-bricks.any-route--editor` if the node is a route.\n *\n * And returns undefined if load failed.\n */\nexport async function getEditorBrick(\n node: BuilderRuntimeNode,\n editor?: string\n): Promise<string> {\n const tryEditorBricks: string[] = [];\n if (isRouteNode(node)) {\n tryEditorBricks.push(ANY_ROUTE_EDITOR);\n } else if (isBrickNode(node)) {\n if (node.brick.includes(\"-\")) {\n tryEditorBricks.push(`${node.brick}--editor`);\n }\n\n if (editor) {\n tryEditorBricks.push(editor);\n }\n\n tryEditorBricks.push(ANY_BRICK_EDITOR);\n } else {\n // Currently there should be no custom-template nodes to be rendered as editor.\n throw new Error(`Unsupported node type: ${node.type}`);\n }\n\n for (const editorBrick of tryEditorBricks) {\n try {\n await developHelper.loadEditorBricks([editorBrick]);\n } catch (error) {\n throw new Error(`Load editor brick \"${editorBrick}\" failed`);\n }\n if (customElements.get(editorBrick)) {\n return editorBrick;\n }\n }\n\n throw new Error(`Editor brick \"${tryEditorBricks.join(\", \")}\" not found`);\n}\n","import React, { useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport { useDrag } from \"react-dnd\";\nimport { BrickAsComponent, getRuntime } from \"@next-core/brick-kit\";\nimport { UseBrickConf } from \"@next-core/brick-types\";\nimport { getEditorBrick } from \"./getEditorBrick\";\nimport {\n BuilderDataTransferType,\n BuilderRuntimeNode,\n EditorSelfLayout,\n EditorSlotContentLayout,\n} from \"../interfaces\";\nimport { EditorBrickElementConstructor } from \"../EditorElementFactory\";\nimport { useBuilderData } from \"../hooks/useBuilderData\";\nimport { useStoryList } from \"../hooks/useStoryList\";\nimport { getBrickDoc } from \"./getBrickDoc\";\nimport { useSharedEditorMap } from \"../hooks/useSharedEditorMap\";\nimport { isBrickNode } from \"../assertions\";\n\nimport styles from \"./EditorBrickAsComponent.module.css\";\n\ninterface EditorBrickAsComponentProps {\n node: BuilderRuntimeNode;\n slotContentLayout?: EditorSlotContentLayout;\n}\n\nexport function EditorBrickAsComponent({\n node,\n slotContentLayout,\n}: EditorBrickAsComponentProps): React.ReactElement {\n const [initialized, setInitialized] = React.useState(false);\n const [editorBrick, setEditorBrick] = React.useState<string>();\n const [loadEditorError, setLoadEditorError] = React.useState<string>();\n const { edges } = useBuilderData();\n const storyList = useStoryList();\n const hasChildren = React.useMemo(\n () => edges.some((edge) => edge.parent === node.$$uid),\n [node, edges]\n );\n\n const installedBricksEnabled = useMemo(\n () => getRuntime().getFeatureFlags()[\"next-builder-installed-bricks\"],\n []\n );\n\n const brickDoc = useMemo(\n () => (installedBricksEnabled ? null : getBrickDoc(node, storyList)),\n [installedBricksEnabled, node, storyList]\n );\n\n const editorMap = useSharedEditorMap();\n const editorConf = useMemo(\n () =>\n installedBricksEnabled && isBrickNode(node)\n ? editorMap.get(node.brick)\n : null,\n [editorMap, installedBricksEnabled, node]\n );\n\n React.useEffect(() => {\n (async () => {\n setInitialized(false);\n let editorName: string;\n let editorError: string;\n try {\n editorName = await getEditorBrick(\n node,\n installedBricksEnabled ? editorConf?.editor : brickDoc?.editor\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n editorError = (error as Error).message;\n }\n setEditorBrick(editorName);\n setLoadEditorError(editorError);\n setInitialized(true);\n })();\n }, [brickDoc, editorConf, installedBricksEnabled, node]);\n\n const brickConf = React.useMemo<UseBrickConf>(\n () => ({\n brick: editorBrick,\n properties: {\n nodeUid: node.$$uid,\n editorProps: installedBricksEnabled\n ? editorConf?.editorProps\n : brickDoc?.editorProps,\n },\n }),\n [brickDoc, editorBrick, editorConf, installedBricksEnabled, node.$$uid]\n );\n\n const selfLayout = React.useMemo(() => {\n let layout: EditorSelfLayout;\n if (initialized && editorBrick) {\n const editorConstructor = customElements.get(\n editorBrick\n ) as EditorBrickElementConstructor;\n layout = editorConstructor.selfLayout;\n }\n // For bricks with no editors, display as a container if it has children.\n return (\n layout ??\n (hasChildren ? EditorSelfLayout.CONTAINER : EditorSelfLayout.INLINE)\n );\n }, [initialized, editorBrick, hasChildren]);\n\n const [{ isDragging }, dragRef] = useDrag({\n item: {\n type: BuilderDataTransferType.NODE_TO_MOVE,\n nodeUid: node.$$uid,\n nodeInstanceId: node.instanceId,\n nodeId: node.id,\n },\n options: {\n dropEffect: \"move\",\n },\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n }),\n });\n\n return initialized ? (\n editorBrick ? (\n <div\n className={classNames({\n [styles.slotContentLayoutBlock]:\n slotContentLayout === EditorSlotContentLayout.BLOCK,\n [styles.slotContentLayoutInline]:\n slotContentLayout === EditorSlotContentLayout.INLINE,\n // [styles.slotContentLayoutGrid]: slotContentLayout === EditorSlotContentLayout.GRID,\n [styles.selfLayoutInline]: selfLayout === EditorSelfLayout.INLINE,\n [styles.selfLayoutBlock]: selfLayout === EditorSelfLayout.BLOCK,\n [styles.selfLayoutContainer]:\n selfLayout === EditorSelfLayout.CONTAINER,\n [styles.dragging]: isDragging,\n __isTemplateInternalNode: node.$$isTemplateInternalNode,\n })}\n >\n <div\n ref={node.$$isTemplateInternalNode ? undefined : dragRef}\n draggable={!node.$$isTemplateInternalNode}\n className={classNames({\n [styles.baseView]:\n node.brick === \"basic-bricks.micro-view\" ||\n node.brick === \"basic-bricks.micro-app\" ||\n node.brick === \"basic-bricks.easy-view\",\n })}\n >\n <BrickAsComponent useBrick={brickConf} />\n </div>\n </div>\n ) : (\n <span>{loadEditorError}</span>\n )\n ) : (\n <span>Loading...</span>\n );\n}\n","import { useMemo } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\nimport { Story } from \"@next-core/brick-types\";\n\nexport function useStoryList(): Story[] {\n const manager = useBuilderDataManager();\n const data = useMemo(() => manager.getStoryList(), [manager]);\n\n return data;\n}\n","import { BuilderRuntimeNode } from \"../interfaces\";\nimport { Story, StoryDoc } from \"@next-core/brick-types\";\n\nexport function getBrickDoc(\n node: BuilderRuntimeNode,\n storyList: Story[]\n): StoryDoc {\n const find = storyList?.find((item) => item.storyId === node.brick);\n\n return find?.doc as StoryDoc;\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\nimport { SharedEditorConf } from \"../interfaces\";\n\nexport function useSharedEditorMap(): Map<string, SharedEditorConf> {\n const manager = useBuilderDataManager();\n\n const getSharedEditorMap = useCallback(\n (): Map<string, SharedEditorConf> =>\n new Map(manager.getSharedEditorList().map((conf) => [conf.id, conf])),\n [manager]\n );\n\n const [data, setData] = useState(getSharedEditorMap());\n\n useEffect(\n () =>\n manager.onSharedEditorListChange(() => {\n setData(getSharedEditorMap());\n }),\n [getSharedEditorMap, manager]\n );\n\n return data;\n}\n","import { useMemo } from \"react\";\nimport { sortBy } from \"lodash\";\nimport {\n BuilderGroupedChildNode,\n BuilderRuntimeEdge,\n BuilderRuntimeNode,\n} from \"../interfaces\";\nimport { useBuilderData } from \"./useBuilderData\";\n\nexport function useBuilderGroupedChildNodes({\n nodeUid,\n isRoot,\n doNotExpandTemplates,\n isWrapper,\n}: {\n nodeUid?: number;\n isRoot?: boolean;\n doNotExpandTemplates?: boolean;\n isWrapper?: boolean;\n}): BuilderGroupedChildNode[] {\n const { rootId, nodes, edges, wrapperNode } = useBuilderData();\n return useMemo(\n () =>\n getBuilderGroupedChildNodes({\n nodes,\n edges,\n nodeUid: isRoot ? (isWrapper ? wrapperNode.$$uid : rootId) : nodeUid,\n doNotExpandTemplates,\n isWrapper: isWrapper,\n }),\n [\n doNotExpandTemplates,\n edges,\n isRoot,\n nodeUid,\n nodes,\n rootId,\n isWrapper,\n wrapperNode,\n ]\n );\n}\n\nexport function getBuilderGroupedChildNodes({\n nodeUid,\n nodes,\n edges,\n doNotExpandTemplates,\n isWrapper,\n}: {\n nodeUid: number;\n nodes: BuilderRuntimeNode[];\n edges: BuilderRuntimeEdge[];\n doNotExpandTemplates?: boolean;\n isWrapper?: boolean;\n}): BuilderGroupedChildNode[] {\n const groups = new Map<string, BuilderRuntimeNode[]>();\n const relatedEdges = sortBy(\n edges.filter(\n (edge) =>\n edge.parent === nodeUid &&\n (doNotExpandTemplates\n ? !edge.$$isTemplateInternal\n : !edge.$$isTemplateDelegated)\n ),\n [(edge) => edge.sort]\n );\n for (const edge of relatedEdges) {\n const childNode = nodes.find((node) => node.$$uid === edge.child);\n if (groups.has(edge.mountPoint)) {\n groups.get(edge.mountPoint).push(childNode);\n } else {\n groups.set(edge.mountPoint, [childNode]);\n }\n }\n return Array.from(groups.entries()).map(([mountPoint, childNodes]) => ({\n mountPoint: isWrapper ? \"bricks\" : mountPoint,\n childNodes,\n }));\n}\n","import { useCallback } from \"react\";\nimport { useBuilderData } from \"./useBuilderData\";\n\nexport type CanDrop = (draggingUid: number, nodeUid: number) => boolean;\n\n/**\n * Returns whether the current dragging node can be dropped\n * in specific node.\n *\n * This is useful for checking available drop zone and preventing\n * dragging a node into its internal mount points.\n */\nexport function useCanDrop(): CanDrop {\n const { edges } = useBuilderData();\n return useCallback(\n (draggingUid: number, nodeUid: number) => {\n const traverse = (parentId: number): boolean => {\n if (parentId === nodeUid) {\n return false;\n }\n return !edges.some((edge) => {\n if (edge.parent === parentId) {\n return !traverse(edge.child);\n }\n return false;\n });\n };\n return traverse(draggingUid);\n },\n [edges]\n );\n}\n","/* istanbul-ignore-file */\n// Todo(steve): Ignore tests temporarily for potential breaking change in the future.\nexport interface DropPosition {\n rect: DropPositionRect;\n cursor: DropPositionCursor;\n}\n\nexport interface DropPositionRect {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nexport interface DropPositionCursor {\n index: number;\n y: number;\n isVertical?: boolean;\n x?: number;\n height?: number;\n}\n\nexport interface DropGridRow {\n cells: DropGridCell[];\n top?: number;\n bottom?: number;\n // isInline?: boolean;\n}\n\nexport interface DropGridCell extends DropPositionRect {\n index: number;\n}\n\nconst defaultGapHalf = 6;\n\nexport function getDropPositions(\n dropZone: HTMLElement,\n dropZoneGrid: HTMLElement\n): DropPosition[] {\n const zoneRect = dropZone.getBoundingClientRect();\n // const gridRect = dropZoneGrid.getBoundingClientRect();\n const positions: DropPosition[] = [];\n const gridItemList = Array.from(dropZoneGrid.children).filter(\n (item) => !item.classList.contains(\"__isTemplateInternalNode\")\n );\n if (gridItemList.length > 0) {\n let currentRow: DropGridRow = {\n cells: [],\n };\n const rows: DropGridRow[] = [currentRow];\n gridItemList.forEach((gridItem, index) => {\n const rect = gridItem.getBoundingClientRect();\n const cell: DropGridCell = {\n index,\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n };\n const prevCell =\n currentRow.cells.length > 0 &&\n currentRow.cells[currentRow.cells.length - 1];\n if (\n !prevCell ||\n (compareApproximately(rect.left, prevCell.right) > 0 &&\n compareApproximately(rect.top, prevCell.bottom) < 0)\n ) {\n currentRow.cells.push(cell);\n currentRow.top = Math.min(currentRow.top ?? Infinity, rect.top);\n currentRow.bottom = Math.max(\n currentRow.bottom ?? -Infinity,\n rect.bottom\n );\n } else {\n currentRow = {\n cells: [cell],\n top: rect.top,\n bottom: rect.bottom,\n };\n rows.push(currentRow);\n }\n });\n // console.log(rows);\n\n let lastRectBottom = zoneRect.top;\n let nextCursorTop = zoneRect.top;\n rows.forEach((row, rowIndex) => {\n if (row.cells.length === 1) {\n const cell = row.cells[0];\n const rectBottom = (cell.top + cell.bottom) / 2;\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: rectBottom,\n left: zoneRect.left,\n right: zoneRect.right,\n },\n cursor: {\n index: cell.index,\n y: (nextCursorTop + cell.top) / 2 - zoneRect.top,\n },\n });\n lastRectBottom = rectBottom;\n nextCursorTop = cell.bottom;\n\n // Append one more insert position after reached the end.\n if (rowIndex === rows.length - 1) {\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: zoneRect.bottom,\n left: zoneRect.left,\n right: zoneRect.right,\n },\n cursor: {\n index: cell.index + 1,\n y:\n Math.min(\n cell.bottom + defaultGapHalf,\n (cell.bottom + zoneRect.bottom) / 2\n ) - zoneRect.top,\n },\n });\n } else if (rows[rowIndex + 1].cells.length > 1) {\n const nextRow = rows[rowIndex + 1];\n const rectBottom = (cell.bottom + nextRow.top) / 2;\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: rectBottom,\n left: zoneRect.left,\n right: zoneRect.right,\n },\n cursor: {\n index: cell.index + 1,\n y: rectBottom - zoneRect.top,\n },\n });\n lastRectBottom = rectBottom;\n }\n } else {\n let lastRectRight = zoneRect.left;\n let nextCursorLeft = zoneRect.left;\n const rectBottom =\n rowIndex < rows.length - 1\n ? (rows[rowIndex + 1].top + row.bottom) / 2\n : zoneRect.bottom;\n const cursorDefault: Pick<\n DropPositionCursor,\n \"isVertical\" | \"y\" | \"height\"\n > = {\n isVertical: true,\n y: row.top - zoneRect.top,\n height: row.bottom - row.top,\n };\n row.cells.forEach((cell, cellIndex) => {\n const rectRight = (cell.left + cell.right) / 2;\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: rectBottom,\n left: lastRectRight,\n right: rectRight,\n },\n cursor: {\n ...cursorDefault,\n index: cell.index,\n x: (nextCursorLeft + cell.left) / 2 - zoneRect.left,\n },\n });\n lastRectRight = rectRight;\n nextCursorLeft = cell.right;\n\n // Append one more insert position after reached the row end.\n if (cellIndex === row.cells.length - 1) {\n if (rowIndex === rows.length - 1) {\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: zoneRect.bottom,\n left: lastRectRight,\n right: zoneRect.right,\n },\n cursor: {\n ...cursorDefault,\n index: cell.index + 1,\n x:\n Math.min(nextCursorLeft + defaultGapHalf, zoneRect.right) -\n zoneRect.left,\n },\n });\n } else {\n positions.push({\n rect: {\n top: lastRectBottom,\n bottom: rectBottom,\n left: lastRectRight,\n right: zoneRect.right,\n },\n cursor: {\n ...cursorDefault,\n index: cell.index + 1,\n x:\n Math.min(nextCursorLeft + defaultGapHalf, zoneRect.right) -\n zoneRect.left,\n },\n });\n }\n }\n });\n lastRectBottom = rectBottom;\n nextCursorTop = row.bottom;\n }\n });\n }\n return positions;\n}\n\nexport function getDropPosition(\n x: number,\n y: number,\n dropZone: HTMLElement,\n dropZoneGrid: HTMLElement\n): DropPositionCursor {\n const positions = getDropPositions(dropZone, dropZoneGrid);\n for (const { rect, cursor } of positions) {\n if (\n x >= rect.left &&\n x <= rect.right &&\n y >= rect.top &&\n y <= rect.bottom\n ) {\n // console.log((event.target as HTMLElement).tagName, cursor.isVertical, cursor.index);\n return cursor;\n }\n }\n\n return {\n index: 0,\n y: 5,\n };\n}\n\nfunction compareApproximately(a: number, b: number): number {\n const diff = a - b;\n return Math.abs(diff) < 1 ? 0 : diff;\n}\n","import { BuilderGroupedChildNode } from \"../interfaces\";\n\nexport interface SortedIdsAfterDropped {\n nodeUids: number[];\n nodeIds: string[];\n}\n\nexport interface DroppingInfo {\n draggingNodeUid: number | number[];\n draggingNodeId: string | null;\n draggingIndex?: number;\n droppingMountPoint: string;\n droppingSiblingGroups: BuilderGroupedChildNode[];\n droppingIndex: number;\n}\n\n/**\n * Get sorted uids and ids of all children of the dropping parent node.\n *\n * @remark\n *\n * When dropping a node from library (add a node) or from a position\n * to a new position (move a node), we only reorder the children of\n * the dropping mount point. But the reorder API requires to reorder\n * all the children of the dropping parent, which maybe across multiple\n * mount points. So we also keep the original order among sibling mount\n * points at the same time.\n *\n * `draggingNodeId` will be `null` when adding a node.\n *\n * Params `droppingInfo.droppingIndex` and `droppingInfo.draggingIndex`\n * is relative to the belonged mount point.\n *\n * And `droppingInfo.draggingIndex` is required when moving a node\n * inside a mount point.\n *\n * ```\n * ▸ micro-view\n * ├ toolbar\n * │ │ ←─ [0]\n * │ ├ button-a <0>\n * │ │ ←─ [1]\n * │ └ input-b <1>\n * │ ←─ [2]\n * └ content\n * │ ←─ [0]\n * ├ table-a <0>\n * │ ←─ [1]\n * ├ grid-b <1>\n * │ ←─ [2]\n * └ tabs-c <2>\n * ←─ [3]\n * <m>: draggingIndex\n * [n]: droppingIndex\n * ```\n *\n * @param droppingInfo - Dropping info.\n *\n * @returns Both sorted uids and ids.\n */\nexport function getSortedIdsAfterDropped(\n droppingInfo: DroppingInfo\n): SortedIdsAfterDropped {\n const {\n draggingNodeUid,\n draggingNodeId,\n draggingIndex,\n droppingMountPoint,\n droppingSiblingGroups,\n droppingIndex,\n } = droppingInfo;\n // When applying a snippet, the dragging nodes will be an array.\n const draggingNodeUids = Array.isArray(draggingNodeUid)\n ? draggingNodeUid\n : [draggingNodeUid];\n const fullChildNodes = droppingSiblingGroups.flatMap(\n (group) => group.childNodes\n );\n const nodeUids = droppingSiblingGroups.flatMap((group) => {\n const uids = group.childNodes\n .map((item) => item.$$uid)\n .filter((uid) => !draggingNodeUids.includes(uid));\n if (group.mountPoint === droppingMountPoint) {\n uids.splice(\n (draggingIndex ?? -1) >= 0 && droppingIndex > draggingIndex\n ? droppingIndex - 1\n : droppingIndex,\n 0,\n ...draggingNodeUids\n );\n }\n return uids;\n });\n const nodeIds = nodeUids.map((uid) =>\n draggingNodeUids.includes(uid)\n ? draggingNodeId\n : fullChildNodes.find((item) => item.$$uid === uid).id\n );\n return { nodeUids, nodeIds };\n}\n","import { useMemo } from \"react\";\nimport { BuilderRuntimeNode } from \"../interfaces\";\n\nexport function useCanvasList(\n rootChildNodes: BuilderRuntimeNode[]\n): BuilderRuntimeNode[][] {\n return useMemo(() => {\n const mainCanvas: BuilderRuntimeNode[] = [];\n const portalCanvasList: BuilderRuntimeNode[][] = [];\n for (const child of rootChildNodes) {\n if (child.portal) {\n portalCanvasList.push([child]);\n } else {\n mainCanvas.push(child);\n }\n }\n return [mainCanvas, ...portalCanvasList, []];\n }, [rootChildNodes]);\n}\n","/* istanbul-ignore-file */\n// Todo(steve): Ignore tests temporarily for potential breaking change in the future.\nimport React from \"react\";\nimport { clamp, isEmpty } from \"lodash\";\nimport classNames from \"classnames\";\nimport { DragObjectWithType, useDrop } from \"react-dnd\";\nimport { EditorBrickAsComponent } from \"../EditorBrickAsComponent/EditorBrickAsComponent\";\nimport {\n BuilderCanvasSettings,\n BuilderDataTransferPayloadOfNodeToAdd,\n BuilderDataTransferPayloadOfNodeToMove,\n BuilderDataTransferType,\n BuilderGroupedChildNode,\n BuilderRuntimeNode,\n EditorSlotContentLayout,\n TemplateDelegatedContext,\n} from \"../interfaces\";\nimport { useBuilderNode } from \"../hooks/useBuilderNode\";\nimport {\n getBuilderGroupedChildNodes,\n useBuilderGroupedChildNodes,\n} from \"../hooks/useBuilderGroupedChildNodes\";\nimport { useCanDrop } from \"../hooks/useCanDrop\";\nimport { DropPositionCursor, getDropPosition } from \"./getDropPosition\";\nimport { processDrop } from \"./processDrop\";\nimport { useBuilderDataManager } from \"../hooks/useBuilderDataManager\";\nimport { useCanvasList } from \"../hooks/useCanvasList\";\nimport { useBuilderData } from \"../hooks/useBuilderData\";\nimport { useBuilderContextMenuStatus } from \"../hooks/useBuilderContextMenuStatus\";\nimport { isCurrentTargetByClassName } from \"../EditorContainer/isCurrentTargetByClassName\";\n\nimport styles from \"./DropZone.module.css\";\n\nexport interface DropZoneProps {\n nodeUid?: number;\n isRoot?: boolean;\n separateCanvas?: boolean;\n isPortalCanvas?: boolean;\n independentPortalCanvas?: boolean;\n canvasIndex?: number;\n mountPoint: string;\n fullscreen?: boolean;\n delegatedContext?: TemplateDelegatedContext;\n dropZoneStyle?: React.CSSProperties;\n dropZoneBodyStyle?: React.CSSProperties;\n slotContentLayout?: EditorSlotContentLayout;\n showOutlineIfEmpty?: boolean;\n hiddenWrapper?: boolean;\n emptyClassName?: string;\n}\n\nexport interface DroppingContext {\n droppingParentUid: number;\n droppingParentInstanceId: string;\n droppingMountPoint: string;\n droppingChildNodes: BuilderRuntimeNode[];\n droppingSiblingGroups: BuilderGroupedChildNode[];\n}\n\nexport function DropZone({\n nodeUid,\n isRoot,\n separateCanvas,\n isPortalCanvas,\n independentPortalCanvas,\n canvasIndex,\n mountPoint,\n fullscreen,\n delegatedContext,\n dropZoneStyle,\n dropZoneBodyStyle,\n slotContentLayout,\n showOutlineIfEmpty,\n hiddenWrapper = true,\n emptyClassName,\n}: DropZoneProps): React.ReactElement {\n const dropZoneBody = React.useRef<HTMLDivElement>();\n const [dropPositionCursor, setDropPositionCursor] =\n React.useState<DropPositionCursor>(null);\n const dropPositionCursorRef = React.useRef<DropPositionCursor>();\n const contextMenuStatus = useBuilderContextMenuStatus();\n const manager = useBuilderDataManager();\n const { nodes, edges, wrapperNode } = useBuilderData();\n const isWrapper = hiddenWrapper && isRoot && !isEmpty(wrapperNode);\n const node = useBuilderNode({ nodeUid, isRoot, isWrapper });\n const groupedChildNodes = useBuilderGroupedChildNodes({\n nodeUid,\n isRoot,\n doNotExpandTemplates: isWrapper,\n isWrapper,\n });\n\n const isGeneralizedPortalCanvas = independentPortalCanvas\n ? canvasIndex > 0\n : isPortalCanvas;\n const hasTabs = separateCanvas || independentPortalCanvas;\n\n const canDrop = useCanDrop();\n const refinedSlotContentLayout =\n slotContentLayout ?? EditorSlotContentLayout.BLOCK;\n\n const selfChildNodes = React.useMemo(\n () =>\n groupedChildNodes.find((group) => group.mountPoint === mountPoint)\n ?.childNodes ?? [],\n [groupedChildNodes, mountPoint]\n );\n\n const canvasList = useCanvasList(selfChildNodes);\n\n const selfChildNodesInCurrentCanvas = React.useMemo(\n () =>\n separateCanvas\n ? selfChildNodes.filter((child) =>\n Boolean(Number(Boolean(isPortalCanvas)) ^ Number(!child.portal))\n )\n : independentPortalCanvas\n ? canvasList[clamp(canvasIndex ?? 0, 0, canvasList.length - 1)]\n : selfChildNodes,\n [\n canvasIndex,\n independentPortalCanvas,\n isPortalCanvas,\n selfChildNodes,\n canvasList,\n separateCanvas,\n ]\n );\n\n const canvasSettings = React.useMemo(\n () =>\n selfChildNodesInCurrentCanvas[0]?.$$parsedProperties\n ._canvas_ as BuilderCanvasSettings,\n [selfChildNodesInCurrentCanvas]\n );\n\n const getDroppingIndexInFullCanvas = React.useCallback(\n (droppingIndexInCurrentCanvas: number) => {\n if (!hasTabs) {\n return droppingIndexInCurrentCanvas;\n }\n if (selfChildNodesInCurrentCanvas.length > 0) {\n const cursorNode =\n selfChildNodesInCurrentCanvas[\n droppingIndexInCurrentCanvas === 0\n ? 0\n : droppingIndexInCurrentCanvas - 1\n ];\n return (\n selfChildNodes.findIndex((child) => child === cursorNode) +\n (droppingIndexInCurrentCanvas === 0 ? 0 : 1)\n );\n }\n return isGeneralizedPortalCanvas ? selfChildNodes.length : 0;\n },\n [\n hasTabs,\n selfChildNodesInCurrentCanvas,\n isGeneralizedPortalCanvas,\n selfChildNodes,\n ]\n );\n\n const getDroppingContext = React.useCallback(() => {\n if (delegatedContext) {\n const siblingGroups = getBuilderGroupedChildNodes({\n nodeUid: delegatedContext.templateUid,\n nodes,\n edges,\n doNotExpandTemplates: true,\n });\n return {\n droppingParentUid: delegatedContext.templateUid,\n droppingParentInstanceId: nodes.find(\n (item) => item.$$uid === delegatedContext.templateUid\n ).instanceId,\n droppingMountPoint: delegatedContext.templateMountPoint,\n droppingChildNodes:\n siblingGroups.find(\n (group) => group.mountPoint === delegatedContext.templateMountPoint\n )?.childNodes ?? [],\n droppingSiblingGroups: siblingGroups,\n };\n }\n return {\n droppingParentUid: node.$$uid,\n droppingParentInstanceId: isWrapper\n ? wrapperNode.instanceId\n : node.instanceId,\n droppingMountPoint: mountPoint,\n droppingChildNodes: selfChildNodes,\n droppingSiblingGroups: groupedChildNodes,\n };\n }, [\n delegatedContext,\n edges,\n groupedChildNodes,\n mountPoint,\n node,\n nodes,\n selfChildNodes,\n isWrapper,\n wrapperNode,\n ]);\n\n const [{ isDraggingOverCurrent }, dropRef] = useDrop({\n accept: [\n BuilderDataTransferType.NODE_TO_ADD,\n BuilderDataTransferType.NODE_TO_MOVE,\n BuilderDataTransferType.SNIPPET_TO_APPLY,\n ],\n canDrop: (\n item: DragObjectWithType &\n (\n | BuilderDataTransferPayloadOfNodeToAdd\n | BuilderDataTransferPayloadOfNodeToMove\n )\n ) =>\n independentPortalCanvas && isGeneralizedPortalCanvas\n ? selfChildNodesInCurrentCanvas.length === 0\n : item.type === BuilderDataTransferType.NODE_TO_ADD ||\n item.type === BuilderDataTransferType.SNIPPET_TO_APPLY ||\n isRoot ||\n canDrop(\n (item as BuilderDataTransferPayloadOfNodeToMove).nodeUid,\n nodeUid\n ),\n collect: (monitor) => ({\n isDraggingOverCurrent:\n monitor.isOver({ shallow: true }) && monitor.canDrop(),\n }),\n hover: (item, monitor) => {\n if (monitor.isOver({ shallow: true }) && monitor.canDrop()) {\n const { x, y } = monitor.getClientOffset();\n dropPositionCursorRef.current = getDropPosition(\n x,\n y,\n dropZoneBody.current.parentElement,\n dropZoneBody.current\n );\n setDropPositionCursor(dropPositionCursorRef.current);\n }\n },\n drop: (item, monitor) => {\n if (!monitor.didDrop()) {\n const { type, ...data } = item;\n processDrop({\n type: type as BuilderDataTransferType,\n data,\n droppingIndex: getDroppingIndexInFullCanvas(\n dropPositionCursorRef.current.index\n ),\n isPortalCanvas: isGeneralizedPortalCanvas,\n manager,\n ...getDroppingContext(),\n });\n }\n },\n });\n\n React.useEffect(() => {\n manager.updateDroppingStatus(\n delegatedContext ? delegatedContext.templateUid : node.$$uid,\n delegatedContext ? delegatedContext.templateMountPoint : mountPoint,\n isDraggingOverCurrent\n );\n }, [isDraggingOverCurrent, mountPoint, manager, delegatedContext, node]);\n\n const droppable =\n !!delegatedContext ||\n isWrapper ||\n !(node.$$isExpandableTemplate || node.$$isTemplateInternalNode);\n\n const dropZoneRef = React.useRef<HTMLElement>();\n\n const dropZoneRefCallback = React.useCallback(\n (element: HTMLElement) => {\n dropZoneRef.current = element;\n if (droppable) {\n dropRef(element);\n }\n },\n [dropRef, droppable]\n );\n\n const handleContextMenu = React.useCallback(\n (event: React.MouseEvent) => {\n // `event.stopPropagation()` not working across bricks.\n if (\n !isGeneralizedPortalCanvas &&\n isCurrentTargetByClassName(\n event.target as HTMLElement,\n dropZoneRef.current\n )\n ) {\n event.preventDefault();\n manager.contextMenuChange({\n active: true,\n node,\n x: event.clientX,\n y: event.clientY,\n });\n }\n },\n [isGeneralizedPortalCanvas, manager, node]\n );\n\n return (\n <div\n ref={dropZoneRefCallback}\n className={classNames(\n styles.dropZone,\n isRoot\n ? classNames(\n styles.isRoot,\n canvasSettings?.mode &&\n String(canvasSettings.mode)\n .split(/\\s+/g)\n .map((mode) => styles[`mode-${mode}`]),\n {\n [styles.fullscreen]: fullscreen,\n [styles.hasTabs]: hasTabs,\n }\n )\n : styles.isSlot,\n {\n [styles.isPortalCanvas]: isGeneralizedPortalCanvas,\n [styles.dropping]: isDraggingOverCurrent,\n [styles.active]:\n isRoot &&\n contextMenuStatus.active &&\n contextMenuStatus.node.$$uid === node.$$uid,\n [styles.showOutlineIfEmpty]:\n !isRoot && showOutlineIfEmpty && selfChildNodes.length === 0,\n [styles.slotContentLayoutBlock]:\n refinedSlotContentLayout === EditorSlotContentLayout.BLOCK,\n [styles.slotContentLayoutInline]:\n refinedSlotContentLayout === EditorSlotContentLayout.INLINE,\n [styles.slotContentLayoutGrid]:\n refinedSlotContentLayout === EditorSlotContentLayout.GRID,\n }\n )}\n style={dropZoneStyle}\n onContextMenu={isRoot ? handleContextMenu : null}\n >\n <div\n ref={dropZoneBody}\n className={classNames(\n styles.dropZoneBody,\n selfChildNodesInCurrentCanvas.length === 0 && emptyClassName\n )}\n data-slot-id={mountPoint}\n style={dropZoneBodyStyle}\n >\n {selfChildNodesInCurrentCanvas.map((child) => (\n <EditorBrickAsComponent\n key={child.$$uid}\n node={child}\n slotContentLayout={refinedSlotContentLayout}\n />\n ))}\n </div>\n {\n <div\n className={classNames(\n styles.dropCursor,\n dropPositionCursor?.isVertical\n ? styles.dropCursorVertical\n : styles.dropCursorHorizontal\n )}\n style={{\n top: dropPositionCursor?.y,\n left: dropPositionCursor?.x,\n height: dropPositionCursor?.height,\n }}\n ></div>\n }\n </div>\n );\n}\n","import {\n BuilderDataTransferPayloadOfNodeToAdd,\n BuilderDataTransferPayloadOfNodeToMove,\n BuilderDataTransferPayloadOfSnippetToApply,\n BuilderDataTransferType,\n BuilderGroupedChildNode,\n BuilderRuntimeNode,\n} from \"../interfaces\";\nimport { BuilderDataManager } from \"../internal/BuilderDataManager\";\nimport { getUniqueNodeId } from \"../internal/getUniqueNodeId\";\nimport { getSortedIdsAfterDropped } from \"../processors/getSortedIdsAfterDropped\";\nimport { getSnippetNodeDetail } from \"./getSnippetNodeDetail\";\n\nexport interface HandleDropParams {\n manager: BuilderDataManager;\n type: BuilderDataTransferType;\n data:\n | BuilderDataTransferPayloadOfNodeToAdd\n | BuilderDataTransferPayloadOfNodeToMove\n | BuilderDataTransferPayloadOfSnippetToApply;\n droppingIndex: number;\n droppingParentUid: number;\n droppingParentInstanceId: string;\n droppingMountPoint: string;\n droppingChildNodes: BuilderRuntimeNode[];\n droppingSiblingGroups: BuilderGroupedChildNode[];\n isPortalCanvas?: boolean;\n}\n\nexport function processDrop({\n manager,\n type,\n data,\n droppingIndex,\n droppingParentUid,\n droppingParentInstanceId,\n droppingMountPoint,\n droppingChildNodes,\n droppingSiblingGroups,\n isPortalCanvas,\n}: HandleDropParams): void {\n if (type === BuilderDataTransferType.NODE_TO_ADD) {\n // Drag a new node into canvas.\n const { brickType = \"brick\", brick } =\n data as BuilderDataTransferPayloadOfNodeToAdd;\n const draggingNodeUid = getUniqueNodeId();\n manager.nodeAdd({\n ...getSortedIdsAfterDropped({\n draggingNodeUid,\n draggingNodeId: null,\n droppingIndex,\n droppingMountPoint,\n droppingSiblingGroups,\n }),\n nodeUid: draggingNodeUid,\n parentUid: droppingParentUid,\n nodeData: {\n parent: droppingParentInstanceId,\n type: brickType,\n brick,\n mountPoint: droppingMountPoint,\n bg: !isPortalCanvas && brickType === \"provider\" ? true : undefined,\n portal: isPortalCanvas,\n },\n });\n } else if (type === BuilderDataTransferType.SNIPPET_TO_APPLY) {\n const { bricks } = data as BuilderDataTransferPayloadOfSnippetToApply;\n // https://stackoverflow.com/questions/5501581/javascript-new-arrayn-and-array-prototype-map-weirdness\n const draggingNodeUids = [...new Array(bricks.length)].map(() =>\n getUniqueNodeId()\n );\n manager.snippetApply({\n ...getSortedIdsAfterDropped({\n draggingNodeUid: draggingNodeUids,\n draggingNodeId: null,\n droppingIndex,\n droppingMountPoint,\n droppingSiblingGroups,\n }),\n parentUid: droppingParentUid,\n nodeDetails: bricks.map((brickConf, index) =>\n getSnippetNodeDetail({\n parent: droppingParentInstanceId,\n parentUid: droppingParentUid,\n mountPoint: droppingMountPoint,\n nodeUid: draggingNodeUids[index],\n brickConf,\n isPortalCanvas,\n })\n ),\n });\n } else if (type === BuilderDataTransferType.NODE_TO_MOVE) {\n const {\n nodeUid: draggingNodeUid,\n nodeId: draggingNodeId,\n nodeInstanceId: draggingNodeInstanceId,\n } = data as BuilderDataTransferPayloadOfNodeToMove;\n\n const draggingIndex = droppingChildNodes.findIndex(\n (item) => item.$$uid === draggingNodeUid\n );\n // If found dragging node in the same drop zone,\n // then apply a node reorder, otherwise apply a node move.\n if (draggingIndex >= 0) {\n // If the index is not changed, then there is nothing to do.\n if (\n droppingIndex !== draggingIndex &&\n droppingIndex !== draggingIndex + 1\n ) {\n manager.nodeReorder({\n ...getSortedIdsAfterDropped({\n draggingNodeUid,\n draggingNodeId,\n draggingIndex,\n droppingIndex,\n droppingMountPoint,\n droppingSiblingGroups,\n }),\n parentUid: droppingParentUid,\n });\n }\n } else {\n manager.nodeMove({\n ...getSortedIdsAfterDropped({\n draggingNodeUid,\n draggingNodeId,\n droppingIndex,\n droppingMountPoint,\n droppingSiblingGroups,\n }),\n nodeUid: draggingNodeUid,\n parentUid: droppingParentUid,\n nodeInstanceId: draggingNodeInstanceId,\n nodeData: {\n parent: droppingParentInstanceId,\n mountPoint: droppingMountPoint,\n },\n });\n }\n }\n}\n","/* istanbul-ignore-file */\n// Todo(steve): Ignore tests temporarily for potential breaking change in the future.\nimport React, { useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport { DropZone } from \"../DropZone/DropZone\";\nimport { EditorSlotContentLayout } from \"../interfaces\";\nimport { useBuilderNode } from \"../hooks/useBuilderNode\";\nimport { useDroppingStatus } from \"../hooks/useDroppingStatus\";\n\nimport styles from \"./SlotContainer.module.css\";\n\nexport interface SlotContainerProps {\n nodeUid: number;\n slotName: string;\n slotContainerStyle?: React.CSSProperties;\n dropZoneStyle?: React.CSSProperties;\n dropZoneBodyStyle?: React.CSSProperties;\n slotContentLayout?: EditorSlotContentLayout;\n showOutlineIfEmpty?: boolean;\n emptyClassName?: string;\n}\n\nexport function SlotContainer({\n nodeUid,\n slotName,\n slotContainerStyle,\n dropZoneStyle,\n dropZoneBodyStyle,\n slotContentLayout,\n showOutlineIfEmpty,\n emptyClassName,\n}: SlotContainerProps): React.ReactElement {\n const node = useBuilderNode({ nodeUid });\n const droppingStatus = useDroppingStatus();\n\n const delegatedContext = useMemo(() => {\n const delegatedSlots = node.$$delegatedSlots?.get(slotName);\n // Ignore when there are more than one delegated slots on a single slot.\n return delegatedSlots?.length === 1 ? delegatedSlots[0] : null;\n }, [node, slotName]);\n\n return (\n <div\n className={classNames(styles.slotContainer, {\n [styles.dropping]: droppingStatus\n .get(delegatedContext ? delegatedContext.templateUid : nodeUid)\n ?.get(\n delegatedContext ? delegatedContext.templateMountPoint : slotName\n ),\n })}\n style={slotContainerStyle}\n >\n <div className={styles.slotName}>\n {delegatedContext ? delegatedContext.templateMountPoint : slotName}\n </div>\n <DropZone\n nodeUid={nodeUid}\n mountPoint={slotName}\n delegatedContext={delegatedContext}\n dropZoneStyle={dropZoneStyle}\n dropZoneBodyStyle={dropZoneBodyStyle}\n slotContentLayout={slotContentLayout}\n showOutlineIfEmpty={showOutlineIfEmpty}\n emptyClassName={emptyClassName}\n />\n </div>\n );\n}\n","// See https://github.com/react-dnd/react-dnd/blob/main/packages/react-dnd/src/common/DndProvider.tsx\nimport React from \"react\";\nimport {\n BuilderContext,\n ContextOfBuilder,\n createBuilderContext,\n} from \"./BuilderContext\";\n\nexport const BuilderProvider = React.memo(LegacyBuilderProvider);\n\nconst instanceSymbol = Symbol.for(\"__BRICK_NEXT_BUILDER_CONTEXT_INSTANCE__\");\nfunction createSingletonBuilderContext(): ContextOfBuilder {\n const ctx = window as any;\n if (!ctx[instanceSymbol]) {\n ctx[instanceSymbol] = createBuilderContext();\n }\n return ctx[instanceSymbol];\n}\n\nlet refCount = 0;\n\nfunction LegacyBuilderProvider({\n children,\n}: React.PropsWithChildren<any>): React.ReactElement {\n const context = createSingletonBuilderContext();\n\n /**\n * If the global context was used to store the DND context\n * then where theres no more references to it we should\n * clean it up to avoid memory leaks\n */\n React.useEffect(() => {\n refCount++;\n\n return () => {\n refCount--;\n\n if (refCount === 0) {\n (window as any)[instanceSymbol] = null;\n }\n };\n }, []);\n\n return (\n <BuilderContext.Provider value={context}>\n {children}\n </BuilderContext.Provider>\n );\n}\n","/* istanbul-ignore-file */\n// Todo(steve): Ignore tests temporarily for potential breaking change in the future.\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { DndProvider } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\nimport { UpdatingElement, property, BrickWrapper } from \"@next-core/brick-kit\";\nimport { StoryDoc } from \"@next-core/brick-types\";\nimport { EditorSelfLayout } from \"./interfaces\";\nimport { BuilderProvider } from \"./BuilderProvider\";\n\nexport interface EditorComponentProps {\n nodeUid: number;\n editorProps?: StoryDoc[\"editorProps\"];\n}\n\nexport type EditorComponentType = React.FunctionComponent<EditorComponentProps>;\n\nexport interface EditorBrickElement extends HTMLElement {\n nodeUid: number;\n}\n\nexport interface EditorBrickElementConstructor {\n new (): EditorBrickElement;\n readonly selfLayout: EditorSelfLayout;\n}\n\nexport interface EditorElementOptions {\n brickStyle?: Record<string, string>;\n selfLayout?: EditorSelfLayout;\n}\n\nexport function EditorElementFactory(\n EditorComponent: EditorComponentType,\n options?: EditorElementOptions\n): EditorBrickElementConstructor {\n class NewEditorElement extends UpdatingElement {\n static get selfLayout(): EditorSelfLayout {\n return options?.selfLayout;\n }\n\n @property({ type: Number })\n nodeUid: number;\n\n @property({ attribute: false })\n editorProps: StoryDoc[\"editorProps\"];\n\n connectedCallback(): void {\n // Don't override user's style settings.\n // istanbul ignore else\n if (!this.style.display) {\n this.style.display = \"block\";\n }\n if (options?.brickStyle) {\n for (const [key, value] of Object.entries(options.brickStyle)) {\n (this.style as unknown as Record<string, string>)[key] = value;\n }\n }\n this._render();\n }\n\n disconnectedCallback(): void {\n ReactDOM.unmountComponentAtNode(this);\n }\n\n protected _render(): void {\n // istanbul ignore else\n if (this.isConnected && this.nodeUid) {\n ReactDOM.render(\n <BrickWrapper>\n <BuilderProvider>\n <DndProvider backend={HTML5Backend}>\n <EditorComponent\n nodeUid={this.nodeUid}\n editorProps={this.editorProps}\n />\n </DndProvider>\n </BuilderProvider>\n </BrickWrapper>,\n this\n );\n }\n }\n }\n return NewEditorElement;\n}\n","import { createContext, Dispatch, SetStateAction } from \"react\";\n\n// It indicates which mount point of a container is active dropping zone.\ntype DroppingStatus = {\n [mountPoint: string]: boolean;\n};\n\ninterface ContextOfDroppingStatus {\n droppingStatus?: DroppingStatus;\n setDroppingStatus?: Dispatch<SetStateAction<DroppingStatus>>;\n}\n\n// Todo(steve): remove this file.\n/** @deprecated no more usage but for compatibility only. */\nexport const DroppingStatusContext = createContext<ContextOfDroppingStatus>({});\n","import { useMemo } from \"react\";\nimport { sortBy } from \"lodash\";\nimport { useBuilderData } from \"./useBuilderData\";\n\nexport function useBuilderNodeMountPoints({\n nodeUid,\n isRoot,\n doNotExpandTemplates,\n}: {\n nodeUid?: number;\n isRoot?: boolean;\n doNotExpandTemplates?: boolean;\n}): string[] {\n const { rootId, edges } = useBuilderData();\n const currentUid = isRoot ? rootId : nodeUid;\n return useMemo(() => {\n const mountPoints = new Set<string>();\n const relatedEdges = sortBy(\n edges.filter(\n (edge) =>\n edge.parent === currentUid &&\n (doNotExpandTemplates\n ? !edge.$$isTemplateInternal\n : !edge.$$isTemplateDelegated)\n ),\n [(edge) => edge.sort]\n );\n for (const edge of relatedEdges) {\n mountPoints.add(edge.mountPoint);\n }\n return Array.from(mountPoints);\n }, [currentUid, edges, doNotExpandTemplates]);\n}\n","import { useMemo } from \"react\";\nimport { BuilderRuntimeNode } from \"../interfaces\";\nimport { useBuilderData } from \"./useBuilderData\";\n\nexport function useBuilderParentNode(nodeUid: number): BuilderRuntimeNode {\n const { nodes, edges } = useBuilderData();\n return useMemo(() => {\n const parentUid = edges.find(\n (edge) => edge.child === nodeUid && !edge.$$isTemplateExpanded\n ).parent;\n return nodes.find((node) => node.$$uid === parentUid);\n }, [edges, nodeUid, nodes]);\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\nimport { BuilderRouteNode } from \"@next-core/brick-types\";\n\nexport function useRouteList(): BuilderRouteNode[] {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getRouteList());\n useEffect(\n () =>\n manager.onRouteListChange(() => {\n setData(manager.getRouteList());\n }),\n [manager]\n );\n return data;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useActiveNodeUid(): number {\n const manager = useBuilderDataManager();\n const [data, setData] = useState(manager.getActiveNodeUid());\n useEffect(\n () =>\n manager.onActiveNodeChange(() => {\n setData(manager.getActiveNodeUid());\n }),\n [manager]\n );\n return data;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBuilderDataManager } from \"./useBuilderDataManager\";\n\nexport function useOutlineEnabled(\n nodeInstanceId: string,\n inapplicable?: boolean\n): boolean {\n const manager = useBuilderDataManager();\n const [enabled, setEnabled] = useState(\n inapplicable ? false : manager.isOutlineEnabled(nodeInstanceId)\n );\n useEffect(() => {\n if (!inapplicable) {\n return manager.onOutlineEnabledNodesChange(() => {\n setEnabled(manager.isOutlineEnabled(nodeInstanceId));\n });\n }\n }, [inapplicable, manager, nodeInstanceId]);\n return enabled;\n}\n","module.exports = dll;","module.exports = (__webpack_require__(\"XuQu\"))(\"ZR4k\");","module.exports = (__webpack_require__(\"XuQu\"))(\"i8i4\");","module.exports = (__webpack_require__(\"XuQu\"))(\"lSNA\");","module.exports = (__webpack_require__(\"/8r5\"))(\"q1tI\");","module.exports = (__webpack_require__(\"/8r5\"))(\"qJlv\");","module.exports = (__webpack_require__(\"XuQu\"))(\"tYg3\");","module.exports = (__webpack_require__(\"XuQu\"))(\"yXPU\");"],"sourceRoot":""}