@libs-ui/services-diagram-draw 0.2.357-1 → 0.2.357-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/canvas.service.mjs +3 -3
- package/esm2022/diagram-draw.service.mjs +2 -1
- package/esm2022/interfaces/diagram.interface.mjs +1 -1
- package/fesm2022/libs-ui-services-diagram-draw.mjs +3 -2
- package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -1
- package/interfaces/diagram.interface.d.ts +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-services-diagram-draw.mjs","sources":["../../../../../libs-ui/services/diagram-draw/src/utils/calculator-branch.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/diagram.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/calculator-element.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/horizontal/calculator-branch.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/horizontal/calculator-coordinates.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/navigation/navigation-style.define.ts","../../../../../libs-ui/services/diagram-draw/src/utils/navigation/build-navigation-data.util.ts","../../../../../libs-ui/services/diagram-draw/src/diagram-draw.service.ts","../../../../../libs-ui/services/diagram-draw/src/utils/canvas.util.ts","../../../../../libs-ui/services/diagram-draw/src/canvas.service.ts","../../../../../libs-ui/services/diagram-draw/src/utils/direction.util.ts","../../../../../libs-ui/services/diagram-draw/src/direction.service.ts","../../../../../libs-ui/services/diagram-draw/src/libs-ui-services-diagram-draw.ts"],"sourcesContent":["import { canvasConfigReadonly } from '../diagram-draw.service';\nimport { ICoordinatesDiagramSvg, IDataDiagramConfigSvg } from '../interfaces/coordinates.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { checkMaxLeft, getDistanceFromBranchToFirstBlock, getHeightWaitConfig, MoLibDiagramCalculatorCoordinatesUtil } from './calculator-element.util';\n\nexport class MoLibDiagramCalculatorBranchUtil {\n static drawStraightLine(left: number, lineFormElementToBranching: number, top: number, branch: IDiagramElementBranch, maxHeightBranch: number, config: IDataDiagramConfigSvg) {\n const startDraw = top + lineFormElementToBranching;\n let Ly = startDraw;\n\n Ly += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE; // chiều dài đến element đầu tiên\n Ly += getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên\n if (!branch.elements?.length) {\n Ly += maxHeightBranch;\n Ly += 20; // thêm đoạn nối từ điểm kết thúc nhánh đến hết\n }\n\n const coord1 = {\n mx: left,\n my: top,\n ly: Ly,\n lx: left,\n };\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;\n\n if (branch.nodeOtherConfig) {\n const endYToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + canvasConfigReadonly().DISTANCE_TO_WAIT;\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.mx} ${endYToWait}`;\n\n const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);\n const topStartLine2 = endYToWait + waitHeight;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${coord1.mx} ${topStartLine2} L ${coord1.mx} ${coord1.ly}`;\n }\n branch.nodeOtherConfig.specific_y = endYToWait;\n branch.nodeOtherConfig.specific_x = coord1.mx;\n }\n\n branch.specific_start_branch_y = top + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n branch.specific_start_branch_x = left;\n\n if (!branch.elements?.length) {\n return;\n }\n\n const heightToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên;\n\n branch.elements.forEach((elementBranch) => {\n elementBranch.specific_y = top + lineFormElementToBranching + heightToElement;\n elementBranch.specific_x = left - (elementBranch.specific_width ?? 0) / 2;\n });\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n static leftLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, element: IDiagramElement, config: IDataDiagramConfigSvg) {\n const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'left', config);\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n if (!branch.elements?.length) {\n return;\n }\n\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) {\n return;\n }\n }\n\n static rightLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, element: IDiagramElement, config: IDataDiagramConfigSvg) {\n const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'right', config);\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n const maxY = (coordQL1.y ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n\n if (!branch.elements?.length) {\n return;\n }\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) {\n return;\n }\n }\n\n static drawElementInBranchLine(branch: IDiagramElementBranch, coordQL2: ICoordinatesDiagramSvg, config: IDataDiagramConfigSvg) {\n const topElementInBranch = coordQL2.ly; // bắt đầu của 1 emelent trong nhánh sẽ là điểm cuối cùng của nhánh trỏ tới\n\n const elementFirst = branch.elements[0];\n\n elementFirst.specific_y = topElementInBranch;\n elementFirst.specific_x = (coordQL2.lx ?? 0) - (elementFirst.specific_width ?? 0) / 2;\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n static drawMissingLineFromLastElement(branch: IDiagramElementBranch, coordQ3: ICoordinatesDiagramSvg) {\n const { mx, my } = coordQ3;\n\n if (!my) {\n return;\n }\n const lastElementInBranch = branch.elements[branch.elements.length - 1];\n\n if (!lastElementInBranch.branches?.length) {\n branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${lastElementInBranch.position_end ?? 0}`;\n return;\n }\n const ly = (lastElementInBranch.position_end_branch ?? 0) - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n\n if (ly === my) {\n return;\n }\n branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${ly}`;\n }\n\n static drawAboveUnderLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, direction: 'left' | 'right', config: IDataDiagramConfigSvg) {\n const M = `M ${left} ${top}`; // đặt bút vẽ từ điểm x, y\n const Ly = top + lineFormElementToBranching - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n const L = `L ${left} ${Ly}`; // Kéo dài 1 đường thẳng tới X, Y,\n const straightLineBetweenBranch = lineBetweenBranch - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE * 2;\n\n const coordQL1: ICoordinatesDiagramSvg = {\n // điểm cong số 1 của nhánh và đường thẳng kéo trên dưới\n mx: left,\n my: Ly,\n x1: left,\n y1: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n x: this.mathOperatorsCalculation(direction, left, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n y: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n };\n\n coordQL1.ly = coordQL1.y;\n // đoạn thẳng kéo dài lineBetweenBranch phải trừ đi hai đầu cong\n coordQL1.lx = this.mathOperatorsCalculation(direction, coordQL1.x, straightLineBetweenBranch, true);\n const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;\n\n const coordQL2: ICoordinatesDiagramSvg = {\n // điểm cong số 2 của nhánh và đường thẳng đứng\n y1: coordQL1.ly,\n x1: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n y: (coordQL1.ly ?? 0) + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n x: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n };\n\n coordQL2.ly = (coordQL2.y ?? 0) + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig);\n coordQL2.lx = coordQL2.x;\n\n if (!branch.elements?.length) {\n coordQL2.ly = maxHeightBranch + (coordQL2.ly ?? 0); // tổng chiều cao của nhánh + điểm xuất phát\n }\n let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n\n if (branch.nodeOtherConfig) {\n const endYToWait = (coordQL2.y ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT; // xử lý các line vào first element\n const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);\n const topStartLine2 = endYToWait + waitHeight;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${coordQL2.x},${endYToWait}`;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${coordQL2.x} ${topStartLine2} L ${coordQL2.x} ${coordQL2.ly}`;\n }\n branch.nodeOtherConfig.specific_y = endYToWait;\n branch.nodeOtherConfig.specific_x = coordQL2.x;\n }\n\n branch.positionMaxLeft = coordQL2.lx;\n branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;\n const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);\n checkMaxLeft(config, branch.nodeOtherConfig?.specific_x, branch.positionMaxLeft);\n\n return { coordQL1, coordQL2, isCheckAllElementConnectToExit };\n }\n\n static checkChildrenConnectToExit(elements: IDiagramElement[]) {\n let toExit = false;\n\n if (elements.length && (elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n toExit = true;\n\n return toExit;\n }\n elements.forEach((element) => {\n if (!element.branches?.length) {\n return;\n }\n let branchConnectToExit = 0;\n\n element.branches.forEach((branch) => {\n if (this.checkChildrenConnectToExit(branch.elements)) {\n branchConnectToExit++;\n }\n });\n if (branchConnectToExit === element.branches.length) {\n toExit = true;\n }\n });\n\n return toExit;\n }\n\n /* above, left a + b; opposite = true a - b; \n under, right a - b; opposite = true a + b\n */\n static mathOperatorsCalculation(direction: 'left' | 'right' | 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean) {\n switch (direction) {\n case 'left':\n case 'above':\n if (opposite) {\n return (a ?? 0) - (b ?? 0);\n }\n\n return (a ?? 0) + (b ?? 0);\n\n case 'right':\n case 'under':\n if (opposite) {\n return (a ?? 0) + (b ?? 0);\n }\n\n return (a ?? 0) - (b ?? 0);\n default:\n return (a ?? 0) - (b ?? 0);\n }\n }\n}\n","import { ElementRef } from '@angular/core';\nimport { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDiagramElement } from '../interfaces/diagram.interface';\n\nexport const buildFlatElement = (elements: Array<IDiagramElement>, flatElementsContainer: Array<IDiagramElement>) => {\n elements.forEach((element) => {\n flatElementsContainer.push(element);\n if (!element.branches?.length) {\n return;\n }\n flatElementHasBranch(element, flatElementsContainer);\n });\n};\n\nconst flatElementHasBranch = (element: IDiagramElement, flatElementsContainer: Array<IDiagramElement>) => {\n if (!element.branches?.length) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n return;\n }\n buildFlatElement(branch.elements, flatElementsContainer);\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const setAttributeSvgAndAppend = (svgElement: ElementRef<any> | undefined, elementSvg: SVGPathElement | undefined, svgAttributePathD: string, color?: string) => {\n elementSvg?.setAttribute('d', svgAttributePathD);\n elementSvg?.setAttribute('stroke', `#${color ?? canvasConfigReadonly().ELEMENT_SVG_STROKE_COLOR}`);\n elementSvg?.setAttribute('fill', 'none');\n elementSvg?.setAttribute('stroke-width', canvasConfigReadonly().ELEMENT_SVG_STROKE_WIDTH);\n svgElement?.nativeElement.appendChild(elementSvg);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const canvasRemoveChildInSvg = (svgElement: ElementRef<any> | undefined) => {\n if (!svgElement) {\n return;\n }\n const children = Array.from(svgElement?.nativeElement.children);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children.forEach((child: any) => {\n if (child.tagName !== 'path') {\n return;\n }\n child.remove();\n });\n};\n\nexport const applyElementStyle = (el: HTMLElement, element: IDiagramElement) => {\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.left = '0';\n el.style.transform = `translate(${element.translateX}px, ${element.translateY}px)`;\n el.style.width = `${element.specific_width}px`;\n el.style.height = `${element.specific_height}px`;\n el.style.zIndex = '1';\n el.style.willChange = 'transform';\n};\n","import { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDataDiagramConfigSvg } from '../interfaces/coordinates.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { MoLibDiagramCalculatorBranchUtil } from './calculator-branch.util';\nimport { buildFlatElement } from './diagram.util';\n\nexport class MoLibDiagramCalculatorCoordinatesUtil {\n static setXYElements(elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg, positionX?: number) {\n if (!elements?.length) {\n return;\n }\n elements.forEach((currentElement, index) => {\n currentElement.specific_x = (currentElement.specific_x ?? 0) + (positionX ?? 0);\n const preElement = elements[index - 1];\n\n if (preElement) {\n currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) / 2 - (currentElement.specific_width ?? 0) / 2;\n currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) + checkElementGetHeight(preElement.nodeOtherConfig);\n if (preElement.position_end_branch) {\n currentElement.specific_y = preElement.position_end_branch;\n }\n }\n\n const top = currentElement.specific_y ?? 0;\n const left = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) / 2;\n let lineBetweenElements = (currentElement.specific_height ?? 0) + checkElementGetHeight(currentElement.nodeOtherConfig);\n\n if (currentElement.branches?.length) {\n lineBetweenElements = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n }\n\n const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;\n const maxXLeft = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 100;\n\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n configSvg.widthSvg = maxXLeft > configSvg.widthSvg ? maxXLeft : configSvg.widthSvg;\n\n checkMaxLeft(config, currentElement.specific_x, currentElement.branches?.[0].positionMaxLeft);\n if (!currentElement.branches?.length) {\n // các element không có nhánh mới vẽ đường thẳng\n const drawFormToHeightExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_height ?? 0) / 2 : lineBetweenElements;\n\n currentElement.attributeSvgD = `M ${left} ${top} l 0 ${drawFormToHeightExit}`;\n currentElement.position_end = top + lineBetweenElements;\n\n if (currentElement.nodeOtherConfig) {\n const waitHeight = getHeightWaitConfig(currentElement.nodeOtherConfig);\n const distanceElementToWait = (currentElement.specific_height ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;\n const topStartLine2 = top + distanceElementToWait + waitHeight;\n\n currentElement.attributeSvgD = `M ${left} ${top} l 0 ${distanceElementToWait}`;\n currentElement.position_end = topStartLine2 + lineBetweenElements;\n\n currentElement.nodeOtherConfig.specific_y = top + distanceElementToWait;\n currentElement.nodeOtherConfig.specific_x = left;\n delete currentElement.nodeOtherConfig.attributeSvgD;\n if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n currentElement.nodeOtherConfig.attributeSvgD = `M ${left} ${topStartLine2} l 0 ${canvasConfigReadonly().WAIT_TO_ELEMENT}`;\n }\n }\n\n return;\n }\n\n // start các element có nhánh\n const half = Math.ceil(currentElement.branches.length / 2);\n const aboveHalf = currentElement.branches.slice(0, half);\n const underHalf = currentElement.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n\n // TÍNH CHIỀU Cao TỐI ĐA CỦA NHÁNH\n const maxHeightBranch = {\n height: 0,\n };\n\n MoLibDiagramCalculatorCoordinatesUtil.calculatorMaxBranchHeight(currentElement, maxHeightBranch);\n currentElement.maxHeightBranch = maxHeightBranch.height;\n const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };\n const lineFormElementToBranching = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n if (brachMiddle) {\n this.calculatorWidthBranch(brachMiddle.elements, maxWidthBrachMiddle);\n brachMiddle.widthBranch = {\n width: maxWidthBrachMiddle.width,\n above: maxWidthBrachMiddle.aboveWidth,\n under: maxWidthBrachMiddle.underWidth,\n };\n MoLibDiagramCalculatorBranchUtil.drawStraightLine(left, lineFormElementToBranching, top, brachMiddle, maxHeightBranch.height, config);\n }\n\n let hasNextSameParentElementNext = false;\n const aboveHalfReverse = aboveHalf.slice().reverse();\n\n aboveHalfReverse.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n\n hasNextSameParentElementNext = !flatElementOnBranch?.length || !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n\n branch.onTheSide = 'above';\n const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều ngang để cách nhánh trên or dưới\n\n this.calculatorWidthBranch(branch.elements, maxWidthBranch);\n branch.widthBranch = {\n width: maxWidthBranch.width,\n above: maxWidthBranch.aboveWidth,\n under: maxWidthBranch.underWidth,\n };\n const branchPre = aboveHalfReverse[indexBranch - 1];\n\n let lineBetweenBranch = maxWidthBranch.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n // nhánh trái\n\n MoLibDiagramCalculatorBranchUtil.leftLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);\n });\n\n underHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n\n hasNextSameParentElementNext = !flatElementOnBranch?.length || !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n branch.onTheSide = 'under';\n const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao để cách nhánh trên or dưới\n\n this.calculatorWidthBranch(branch.elements, maxWidthBranch);\n branch.widthBranch = {\n width: maxWidthBranch.width,\n above: maxWidthBranch.aboveWidth,\n under: maxWidthBranch.underWidth,\n };\n const branchPre = underHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthBranch.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n // nhánh phải\n MoLibDiagramCalculatorBranchUtil.rightLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);\n });\n });\n\n // Set translateX và translateY để có thể render nodes\n this.setTranslatePositions(elements);\n }\n\n /**\n * Set translateX và translateY từ specific_x và specific_y cho tất cả elements (bao gồm branches)\n */\n private static setTranslatePositions(elements: Array<IDiagramElement>) {\n elements.forEach((element) => {\n // Set position cho element chính\n element.translateX = element.specific_x;\n element.translateY = element.specific_y;\n\n // Set position cho nodeOtherConfig nếu có\n if (element.nodeOtherConfig) {\n const offsetX = (element.nodeOtherConfig.specific_width ?? 0) / 2;\n\n element.nodeOtherConfig.translateX = (element.nodeOtherConfig.specific_x ?? 0) - offsetX;\n element.nodeOtherConfig.translateY = element.nodeOtherConfig.specific_y;\n }\n\n // Recursively set positions cho elements trong branches\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n // Set position cho branch nodeOtherConfig nếu có\n if (branch.nodeOtherConfig) {\n const offsetX = (branch.nodeOtherConfig.specific_width ?? 0) / 2;\n branch.nodeOtherConfig.translateX = (branch.nodeOtherConfig.specific_x ?? 0) - offsetX;\n branch.nodeOtherConfig.translateY = branch.nodeOtherConfig.specific_y;\n }\n\n // Recursively set positions cho elements trong branch\n if (branch.elements?.length > 0) {\n this.setTranslatePositions(branch.elements);\n }\n });\n }\n });\n }\n\n static calculatorMaxBranchHeight(element: IDiagramElement, maxHeightBranch: { height: number }) {\n if (!element.branches?.length) {\n return;\n }\n\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n maxHeightBranch.height = lineBranchNoHasElement > maxHeightBranch.height ? lineBranchNoHasElement : maxHeightBranch.height;\n\n return;\n }\n\n const total = {\n height: 0,\n };\n\n this.plusHeightElementInBranch(branch.elements, total);\n maxHeightBranch.height = total.height > maxHeightBranch.height ? total.height : maxHeightBranch.height;\n });\n }\n\n static plusHeightElementInBranch(elements: IDiagramElement[], total: { height: number }) {\n elements.forEach((element) => {\n const margin = !element.branches?.length ? checkElementGetHeight(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n total.height += (element.specific_height ?? 0) + margin;\n if (!element.branches?.length) {\n return;\n }\n total.height += 64; // từ chiều đường thẳng ngang xuống đến nhánh đầu tiên\n const theMostElementsInBranch = {\n height: 0,\n };\n\n element.branches.forEach((branch) => {\n const heightInBranch = { height: 0 };\n\n heightInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20; // đường cong kết thúc nhánh + 10px đường cong\n if (!branch.elements?.length) {\n heightInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n if (theMostElementsInBranch.height < heightInBranch.height) {\n theMostElementsInBranch.height = heightInBranch.height;\n }\n\n return;\n }\n this.plusHeightElementInBranch(branch.elements, heightInBranch);\n if (theMostElementsInBranch.height < heightInBranch.height) {\n theMostElementsInBranch.height = heightInBranch.height;\n }\n });\n\n total.height += theMostElementsInBranch.height;\n });\n }\n\n static calculatorWidthBranch(elements: IDiagramElement[] | undefined, maxWidth: { width: number; aboveWidth: number; underWidth: number }, log?: boolean) {\n if (!elements?.length) {\n const width = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;\n\n maxWidth.width = width;\n maxWidth.aboveWidth = width / 2;\n maxWidth.underWidth = width / 2;\n\n return;\n }\n\n const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n elements.forEach((element) => {\n if (!element.branches?.length) {\n // tính chiều cao của từng element 1, vì chiều cao của từng thằng có thể khác nhau\n if ((element.specific_width ?? 0) < maxWidthInElements.width) {\n return;\n }\n const width = element.specific_width ?? 0;\n\n maxWidthInElements.width = width;\n maxWidthInElements.aboveWidth = width / 2;\n maxWidthInElements.underWidth = width / 2;\n\n return;\n }\n const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n const width = element.specific_width ?? 0;\n\n if (width > widthElementIncludeBranch.width) {\n widthElementIncludeBranch.width = width;\n widthElementIncludeBranch.aboveWidth = width / 2;\n widthElementIncludeBranch.underWidth = width / 2;\n }\n\n const half = Math.ceil(element.branches.length / 2);\n const aboveHalf = element.branches.slice(0, half);\n const underHalf = element.branches.slice(half);\n let brachMiddle;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n if (brachMiddle) {\n brachMiddle.onTheSide = 'center';\n }\n aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));\n underHalf.forEach((branch) => (branch.onTheSide = 'under'));\n\n // tính chiều cao của từng nhánh 1, rồi tính tổng => so sánh với chiều cao xem element có nhánh nào cao nhất thì lấy\n const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n element.branches.forEach((branch) => {\n const width = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao của từng nhánh 1\n\n this.calculatorWidthBranch(branch.elements, width, log);\n switch (branch.onTheSide) {\n case 'above':\n widthBranch.aboveWidth += width.width;\n break;\n\n case 'under':\n widthBranch.underWidth += width.width;\n break;\n\n case 'center':\n widthBranch.aboveWidth += width.aboveWidth;\n widthBranch.underWidth += width.underWidth;\n break;\n }\n });\n\n const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n\n widthBranch.aboveWidth += marginBetweenBranch / 2;\n widthBranch.underWidth += marginBetweenBranch / 2;\n const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);\n const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);\n\n if (maxWidthInElements.aboveWidth < maxAboveWidth) {\n maxWidthInElements.aboveWidth = maxAboveWidth;\n }\n if (maxWidthInElements.underWidth < maxUnderWidth) {\n maxWidthInElements.underWidth = maxUnderWidth;\n }\n\n maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n });\n\n maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n maxWidth.aboveWidth += maxWidthInElements.aboveWidth;\n maxWidth.underWidth += maxWidthInElements.underWidth;\n }\n}\n\nconst checkElementGetHeight = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n};\n\nexport const getDistanceFromBranchToFirstBlock = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;\n};\n\nexport const getHeightWaitConfig = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return (hasWaitConfig.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n\n return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n};\n\nexport const checkMaxLeft = (config: IDataDiagramConfigSvg, specific_x: number | undefined, positionMaxLeft: number | undefined) => {\n let numberTranslatePosition = config.positionMaxLeft;\n\n if (numberTranslatePosition === 0 && specific_x && specific_x > 0 && specific_x < 50) {\n numberTranslatePosition = -50;\n }\n\n if (specific_x && specific_x < numberTranslatePosition) {\n numberTranslatePosition = specific_x;\n }\n\n if (positionMaxLeft && positionMaxLeft < numberTranslatePosition) {\n numberTranslatePosition = positionMaxLeft;\n }\n if (numberTranslatePosition === config.positionMaxLeft) {\n return;\n }\n config.positionMaxLeft = numberTranslatePosition;\n};\n\nexport const checkMaxTop = (config: IDataDiagramConfigSvg, specific_y: number | undefined, positionMaxTop: number | undefined) => {\n let numberTranslatePosition = config.positionMaxTop;\n\n if (numberTranslatePosition === 0 && specific_y && specific_y > 0 && specific_y < 100) {\n numberTranslatePosition = specific_y - 120;\n }\n\n if (specific_y && specific_y < numberTranslatePosition) {\n numberTranslatePosition = specific_y;\n }\n\n if (positionMaxTop && positionMaxTop < numberTranslatePosition) {\n numberTranslatePosition = positionMaxTop;\n }\n if (numberTranslatePosition === config.positionMaxTop) {\n return;\n }\n config.positionMaxTop = numberTranslatePosition;\n};\n","import { canvasConfigReadonly } from '../../diagram-draw.service';\nimport { ICoordinatesDiagramSvg, IDataDiagramConfigSvg } from '../../interfaces/coordinates.interface';\nimport { checkMaxTop, getHeightWaitConfig } from '../calculator-element.util';\nimport { IDiagramElement, IDiagramElementBranch } from '../../interfaces/diagram.interface';\nimport { MoLibDiagramHorizontalCalculatorCoordinatesUtil } from './calculator-coordinates.util';\n\n/**\n * Horizontal branch calculator.\n * Flow direction: LEFT → RIGHT (trái sang phải).\n * Branches spread: above = UP (y giảm), under = DOWN (y tăng).\n *\n * Mapping từ trục dọc sang ngang:\n * vertical \"left\" branch (x giảm) ↔ horizontal \"above\" branch (y giảm)\n * vertical \"right\" branch (x tăng) ↔ horizontal \"under\" branch (y tăng)\n *\n * Ký hiệu trong ICoordinatesDiagramSvg:\n * (mx,my) = điểm bắt đầu Q curve\n * (x1,y1) = control point\n * (x,y) = end point của Q curve\n * (lx,ly) = điểm cuối của L sau Q\n */\nexport class MoLibDiagramHorizontalCalculatorBranchUtil {\n private static getHorizontalDistanceToFirstBlock(branch: IDiagramElementBranch) {\n if (branch.nodeOtherConfig) {\n const distToWait = 110; // increase statically since branch label is always assigned later\n return distToWait + getHeightWaitConfig(branch.nodeOtherConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;\n }\n\n // ─────────────────────────────────────────────────────────────────── public ──\n\n /** Nhánh giữa (center): kéo thẳng sang phải */\n static drawStraightLine(\n top: number, // Y tâm của element cha\n lineFormElementToBranching: number, // width element + margin đến điểm rẽ\n left: number, // X trái của element cha\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'center';\n const startDraw = left + lineFormElementToBranching;\n let Lx = startDraw;\n\n Lx += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n Lx += this.getHorizontalDistanceToFirstBlock(branch);\n if (!branch.elements?.length) {\n Lx += maxWidthBranch + 20;\n }\n\n const coord1 = { mx: left, my: top, lx: Lx, ly: top };\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;\n\n if (branch.nodeOtherConfig) {\n const distToWait = 110;\n const endXToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + distToWait;\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${endXToWait} ${coord1.my}`;\n const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);\n const leftLine2 = endXToWait + waitWidth;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coord1.my} L ${coord1.lx} ${coord1.my}`;\n }\n branch.nodeOtherConfig.specific_x = endXToWait;\n branch.nodeOtherConfig.specific_y = coord1.my;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!branch.nodeOtherConfig.specific_height) {\n branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!branch.nodeOtherConfig.specific_width) {\n branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n }\n\n branch.specific_start_branch_x = left + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n branch.specific_start_branch_y = top;\n\n if (!branch.elements?.length) return;\n\n const widthToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + this.getHorizontalDistanceToFirstBlock(branch);\n\n branch.elements.forEach((el) => {\n el.specific_x = left + lineFormElementToBranching + widthToElement;\n el.specific_y = top - (el.specific_height ?? 0) / 2;\n });\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n /** Nhánh phía trên (above): rẽ lên, rồi bẻ phải đến element */\n static aboveLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n element: IDiagramElement,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'above';\n const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(\n top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'above', config\n );\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n\n if (!branch.elements?.length) return;\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) return;\n }\n\n /** Nhánh phía dưới (under): rẽ xuống, rồi bẻ phải đến element */\n static underLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n element: IDiagramElement,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'under';\n const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(\n top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'under', config\n );\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n\n // Mở rộng widthSvg nếu nhánh xuống vượt\n const maxY = (coordQL1.y ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n\n if (!branch.elements?.length) return;\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) return;\n }\n\n // ────────────────────────────────────────────────────────────────── private ──\n\n /** Đặt element đầu tiên trong nhánh dựa theo tọa độ cuối của QL2 */\n static drawElementInBranchLine(branch: IDiagramElementBranch, coordQL2: ICoordinatesDiagramSvg, config: IDataDiagramConfigSvg) {\n const elementFirst = branch.elements[0];\n\n // lx = X bắt đầu của element; ly = Y tâm nhánh → specific_y = tâm - half height\n elementFirst.specific_x = coordQL2.lx;\n elementFirst.specific_y = (coordQL2.ly ?? 0) - (elementFirst.specific_height ?? 0) / 2;\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n /**\n * Vẽ đường rẽ nhánh kiểu horizontal:\n *\n * M left top → bắt đầu tại tâm Y của element cha\n * L Lx top → kéo NGANG sang phải đến điểm rẽ (Lx = left + lineFormElementToBranching - CURVE)\n *\n * QL1: bẻ từ hướng → sang hướng ↑ (above) hoặc ↓ (under)\n * M (Lx, top)\n * Q (Lx+C, top) → (Lx+C, top±C) control đi thẳng phải, điểm kết bắt đầu đi dọc\n * L Lx+C, top±C±straight kéo thẳng dọc (lên/xuống)\n *\n * QL2: bẻ ngược lại → hướng ngang để tới element\n * Q (Lx+C, top±C±straight±C) → (Lx+2C, top±C±straight±C)\n * control đi tiếp dọc, điểm kết đi ngang (phải)\n * L Lx+2C+distToFirst, same_Y kéo ngang đến vị trí element đầu tiên\n *\n * Sau QL2:\n * coordQL2.lx = X bắt đầu của element đầu tiên\n * coordQL2.ly = Y tâm của nhánh\n */\n static drawAboveUnderLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n direction: 'above' | 'under',\n config: IDataDiagramConfigSvg\n ) {\n const CURVE = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n const M = `M ${left} ${top}`;\n const Lx = left + lineFormElementToBranching - CURVE;\n const L = `L ${Lx} ${top}`;\n const straight = lineBetweenBranch - CURVE * 2; // đoạn thẳng dọc (bỏ 2 cong đầu-cuối)\n\n // ── QL1: curve từ hướng ngang → hướng dọc (lên/xuống), rồi thẳng dọc ────\n const coordQL1: ICoordinatesDiagramSvg = {\n mx: Lx,\n my: top,\n x1: Lx + CURVE, // control: đi thẳng phải thêm CURVE\n y1: top, // control: cùng Y\n x: Lx + CURVE, // end X: giữ nguyên (= Lx+CURVE)\n y: this.mathOp(direction, top, CURVE, true),\n // 'above': top - CURVE (bắt đầu đi lên)\n // 'under': top + CURVE (bắt đầu đi xuống)\n };\n // Đoạn L sau QL1: giữ nguyên X, tiếp tục đi dọc\n coordQL1.lx = coordQL1.x; // X không đổi\n coordQL1.ly = this.mathOp(direction, coordQL1.y, straight, true); // tiếp tục lên/xuống\n\n const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;\n\n // ── QL2: curve từ hướng dọc → hướng ngang (phải), rồi thẳng ngang đến element ──\n const coordQL2: ICoordinatesDiagramSvg = {\n // control: tiếp tục đi dọc thêm CURVE từ điểm cuối QL1\n x1: coordQL1.lx,\n y1: this.mathOp(direction, coordQL1.ly, CURVE, true),\n // end: rẽ ngang sang phải thêm CURVE, giữ nguyên Y tại y1\n y: this.mathOp(direction, coordQL1.ly, CURVE, true),\n x: (coordQL1.lx ?? 0) + CURVE,\n };\n\n // Đoạn L sau QL2: đi ngang (phải) đến vị trí element đầu tiên trong nhánh\n const distToFirst = this.getHorizontalDistanceToFirstBlock(branch);\n\n if (!branch.elements?.length) {\n coordQL2.lx = (coordQL2.x ?? 0) + distToFirst + maxWidthBranch;\n } else {\n coordQL2.lx = (coordQL2.x ?? 0) + distToFirst;\n }\n coordQL2.ly = coordQL2.y; // Y không đổi → tâm Y của nhánh\n\n // Xử lý nodeOtherConfig (wait block) trên nhánh\n let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n\n if (branch.nodeOtherConfig) {\n const distToWait = 110;\n const endXToWait = (coordQL2.x ?? 0) + distToWait;\n const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);\n const leftLine2 = endXToWait + waitWidth;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${endXToWait},${coordQL2.y}`;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n }\n branch.nodeOtherConfig.specific_x = endXToWait;\n // specific_y = tâm Y của nhánh — setTranslatePositions sẽ trừ height/2 khi set translateY\n branch.nodeOtherConfig.specific_y = coordQL2.y ?? 0;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!branch.nodeOtherConfig.specific_height) {\n branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!branch.nodeOtherConfig.specific_width) {\n branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n }\n\n branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;\n const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);\n\n branch.positionMaxTop = coordQL2.y;\n checkMaxTop(config, branch.nodeOtherConfig?.specific_y, branch.positionMaxTop);\n\n return { coordQL1, coordQL2, isCheckAllElementConnectToExit };\n }\n\n static checkChildrenConnectToExit(elements: IDiagramElement[]): boolean {\n let toExit = false;\n\n if (\n elements.length &&\n (elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT\n ) {\n return true;\n }\n elements.forEach((element) => {\n if (!element.branches?.length) return;\n let branchConnectToExit = 0;\n\n element.branches.forEach((branch) => {\n if (this.checkChildrenConnectToExit(branch.elements)) branchConnectToExit++;\n });\n if (branchConnectToExit === element.branches.length) toExit = true;\n });\n\n return toExit;\n }\n\n /**\n * Quy ước:\n * above + opposite=true → a - b (đi lên, y giảm)\n * above + opposite=false → a + b\n * under + opposite=true → a + b (đi xuống, y tăng)\n * under + opposite=false → a - b\n */\n static mathOp(direction: 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean): number {\n const av = a ?? 0;\n const bv = b ?? 0;\n\n switch (direction) {\n case 'above':\n return opposite ? av - bv : av + bv;\n case 'under':\n return opposite ? av + bv : av - bv;\n default:\n return av - bv;\n }\n }\n\n /** Alias để tương thích với code cũ gọi mathOperatorsCalculation */\n static mathOperatorsCalculation(direction: 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean): number {\n return this.mathOp(direction, a, b, opposite);\n }\n}\n","import { canvasConfigReadonly } from '../../diagram-draw.service';\nimport { IDataDiagramConfigSvg } from '../../interfaces/coordinates.interface';\nimport { checkMaxTop } from '../calculator-element.util';\nimport { IDiagramElement, IDiagramElementBranch } from '../../interfaces/diagram.interface';\nimport { buildFlatElement } from '../diagram.util';\nimport { MoLibDiagramHorizontalCalculatorBranchUtil } from './calculator-branch.util';\n\n/**\n * Horizontal layout calculator.\n * Mirrors MoLibDiagramCalculatorCoordinatesUtil (vertical) but rotated 90°:\n * - Elements grow LEFT → RIGHT (specific_x advances along main axis)\n * - Branches split UP / DOWN (specific_y for branch offset)\n * - \"above\" branch = upper side (y decreases)\n * - \"under\" branch = lower side (y increases)\n *\n * Key axis mapping vs. vertical:\n * vertical: specific_y ↕ specific_x centered\n * horizontal: specific_x → specific_y centered\n */\nexport class MoLibDiagramHorizontalCalculatorCoordinatesUtil {\n static setXYElements(elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg, positionY?: number) {\n if (!elements?.length) {\n return;\n }\n\n elements.forEach((currentElement, index) => {\n currentElement.specific_y = (currentElement.specific_y ?? 0) + (positionY ?? 0);\n const preElement = elements[index - 1];\n\n if (preElement) {\n // Trong horizontal: y (chiều cao) căn giữa theo preElement, x tiến sang phải\n currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) / 2 - (currentElement.specific_height ?? 0) / 2;\n currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) + this.checkElementGetMargin(preElement.nodeOtherConfig);\n\n if (preElement.position_end_branch) {\n currentElement.specific_x = preElement.position_end_branch;\n }\n }\n\n checkMaxTop(config, currentElement.specific_y, currentElement.branches?.[0]?.positionMaxTop);\n\n const top = currentElement.specific_y ?? 0;\n let lineBetweenElements = (currentElement.specific_width ?? 0) + this.checkElementGetMargin(currentElement.nodeOtherConfig);\n\n if (currentElement.branches?.length) {\n lineBetweenElements = (currentElement.specific_width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n }\n\n const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;\n const maxXRight = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n configSvg.widthSvg = maxXRight > configSvg.widthSvg ? maxXRight : configSvg.widthSvg;\n\n if (!currentElement.branches?.length) {\n // Element không có nhánh: vẽ đường thẳng ngang\n const drawFormToWidthExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_width ?? 0) / 2 : lineBetweenElements;\n\n currentElement.attributeSvgD = `M ${currentElement.specific_x ?? 0} ${top + (currentElement.specific_height ?? 0) / 2} l ${drawFormToWidthExit} 0`;\n currentElement.position_end = (currentElement.specific_x ?? 0) + lineBetweenElements;\n\n if (currentElement.nodeOtherConfig) {\n const waitWidth = this.getWidthWaitConfig(currentElement.nodeOtherConfig);\n const distanceElementToWait = (currentElement.specific_width ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;\n const leftStartLine2 = (currentElement.specific_x ?? 0) + distanceElementToWait + waitWidth;\n\n currentElement.attributeSvgD = `M ${currentElement.specific_x ?? 0} ${top + (currentElement.specific_height ?? 0) / 2} l ${distanceElementToWait} 0`;\n currentElement.position_end = leftStartLine2 + lineBetweenElements;\n\n currentElement.nodeOtherConfig.specific_x = (currentElement.specific_x ?? 0) + distanceElementToWait;\n // specific_y = tâm Y của đường line — setTranslatePositions sẽ trừ height/2 để căn giữa dọc\n currentElement.nodeOtherConfig.specific_y = top + (currentElement.specific_height ?? 0) / 2;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!currentElement.nodeOtherConfig.specific_height) {\n currentElement.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!currentElement.nodeOtherConfig.specific_width) {\n currentElement.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n delete currentElement.nodeOtherConfig.attributeSvgD;\n\n if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n currentElement.nodeOtherConfig.attributeSvgD = `M ${leftStartLine2} ${top + (currentElement.specific_height ?? 0) / 2} l ${canvasConfigReadonly().WAIT_TO_ELEMENT} 0`;\n }\n }\n\n return;\n }\n\n // Elements có nhánh\n const half = Math.ceil(currentElement.branches.length / 2);\n const aboveHalf = currentElement.branches.slice(0, half);\n const underHalf = currentElement.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n\n // TÍNH CHIỀU CAO TỐI ĐA CỦA NHÁNH (đây là chiều rộng trong horizontal context nhưng\n // dùng chung maxHeightBranch để đơn giản, ý nghĩa là \"khoảng trống tối thiểu dành cho nhánh không có element\")\n const maxWidthBranch = { width: 0 };\n\n this.calculatorMaxBranchWidth(currentElement, maxWidthBranch);\n currentElement.maxHeightBranch = maxWidthBranch.width;\n\n const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };\n const lineFormElementToBranching = (currentElement.specific_width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n // top = y + height/2: điểm giữa theo chiều Y → dùng làm tọa độ Y của đường ngang chính\n const topMid = top + (currentElement.specific_height ?? 0) / 2;\n\n if (brachMiddle) {\n brachMiddle.onTheSide = 'center';\n this.calculatorHeightBranch(brachMiddle.elements, maxWidthBrachMiddle);\n brachMiddle.widthBranch = {\n width: maxWidthBrachMiddle.width,\n above: maxWidthBrachMiddle.aboveWidth,\n under: maxWidthBrachMiddle.underWidth,\n };\n MoLibDiagramHorizontalCalculatorBranchUtil.drawStraightLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, brachMiddle, maxWidthBranch.width, config);\n }\n\n let hasNextSameParentElementNext = false;\n aboveHalf.reverse();\n\n aboveHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n\n branch.onTheSide = 'above';\n const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, maxWidthB);\n branch.widthBranch = {\n width: maxWidthB.width,\n above: maxWidthB.aboveWidth,\n under: maxWidthB.underWidth,\n };\n\n const branchPre = aboveHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthB.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n MoLibDiagramHorizontalCalculatorBranchUtil.aboveLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, lineBetweenBranch, branch, maxWidthBranch.width, currentElement, config);\n });\n\n underHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n branch.onTheSide = 'under';\n const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, maxWidthB);\n branch.widthBranch = {\n width: maxWidthB.width,\n above: maxWidthB.aboveWidth,\n under: maxWidthB.underWidth,\n };\n\n const branchPre = underHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthB.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n MoLibDiagramHorizontalCalculatorBranchUtil.underLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, lineBetweenBranch, branch, maxWidthBranch.width, currentElement, config);\n });\n });\n\n this.setTranslatePositions(elements);\n }\n\n /**\n * Set translateX/Y cho tất cả elements (bao gồm branches và nodeOtherConfig)\n */\n private static setTranslatePositions(elements: Array<IDiagramElement>) {\n elements.forEach((element) => {\n element.translateX = element.specific_x;\n element.translateY = element.specific_y;\n\n if (element.nodeOtherConfig) {\n const offsetY = (element.nodeOtherConfig.specific_height ?? 0) / 2;\n\n element.nodeOtherConfig.translateX = element.nodeOtherConfig.specific_x;\n element.nodeOtherConfig.translateY = (element.nodeOtherConfig.specific_y ?? 0) - offsetY;\n }\n\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n if (branch.nodeOtherConfig) {\n const offsetY = (branch.nodeOtherConfig.specific_height ?? 0) / 2;\n\n branch.nodeOtherConfig.translateX = branch.nodeOtherConfig.specific_x;\n branch.nodeOtherConfig.translateY = (branch.nodeOtherConfig.specific_y ?? 0) - offsetY;\n }\n\n if (branch.elements && branch.elements.length > 0) {\n this.setTranslatePositions(branch.elements);\n }\n });\n }\n });\n }\n\n /** Tính chiều rộng tối đa của nhánh (trong horizontal = chiều cao thực của nhánh không có element) */\n static calculatorMaxBranchWidth(element: IDiagramElement, maxWidthBranch: { width: number }) {\n if (!element.branches?.length) {\n return;\n }\n\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n maxWidthBranch.width = lineBranchNoHasElement > maxWidthBranch.width ? lineBranchNoHasElement : maxWidthBranch.width;\n\n return;\n }\n\n const total = { height: 0 };\n\n this.plusWidthElementInBranch(branch.elements, total);\n maxWidthBranch.width = total.height > maxWidthBranch.width ? total.height : maxWidthBranch.width;\n });\n }\n\n /** Tính tổng chiều rộng các elements trong nhánh (dọc theo trục X) */\n static plusWidthElementInBranch(elements: IDiagramElement[], total: { height: number }) {\n elements.forEach((element) => {\n const margin = !element.branches?.length ? this.checkElementGetMargin(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n total.height += (element.specific_width ?? 0) + margin;\n if (!element.branches?.length) {\n return;\n }\n total.height += 64;\n const theMostElementsInBranch = { height: 0 };\n\n element.branches.forEach((branch) => {\n const widthInBranch = { height: 0 };\n\n widthInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20;\n if (!branch.elements?.length) {\n widthInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n if (theMostElementsInBranch.height < widthInBranch.height) {\n theMostElementsInBranch.height = widthInBranch.height;\n }\n return;\n }\n this.plusWidthElementInBranch(branch.elements, widthInBranch);\n if (theMostElementsInBranch.height < widthInBranch.height) {\n theMostElementsInBranch.height = widthInBranch.height;\n }\n });\n\n total.height += theMostElementsInBranch.height;\n });\n }\n\n /**\n * Tính chiều cao (Y span) của một nhánh — dùng để offset các nhánh trên/dưới.\n * Trong horizontal context: mỗi nhánh trải dài theo Y (lên/xuống).\n */\n static calculatorHeightBranch(elements: IDiagramElement[] | undefined, maxWidth: { width: number; aboveWidth: number; underWidth: number }) {\n if (!elements?.length) {\n const w = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;\n\n maxWidth.width = w;\n maxWidth.aboveWidth = w / 2;\n maxWidth.underWidth = w / 2;\n\n return;\n }\n\n const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n elements.forEach((element) => {\n if (!element.branches?.length) {\n // element không nhánh: dùng specific_height làm Y span\n if ((element.specific_height ?? 0) < maxWidthInElements.width) {\n return;\n }\n const h = element.specific_height ?? 0;\n\n maxWidthInElements.width = h;\n maxWidthInElements.aboveWidth = h / 2;\n maxWidthInElements.underWidth = h / 2;\n\n return;\n }\n\n const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n const h = element.specific_height ?? 0;\n\n if (h > widthElementIncludeBranch.width) {\n widthElementIncludeBranch.width = h;\n widthElementIncludeBranch.aboveWidth = h / 2;\n widthElementIncludeBranch.underWidth = h / 2;\n }\n\n const half = Math.ceil(element.branches.length / 2);\n const aboveHalf = element.branches.slice(0, half);\n const underHalf = element.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n if (brachMiddle) brachMiddle.onTheSide = 'center';\n aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));\n underHalf.forEach((branch) => (branch.onTheSide = 'under'));\n\n const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n element.branches.forEach((branch) => {\n const w = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, w);\n switch (branch.onTheSide) {\n case 'above':\n widthBranch.aboveWidth += w.width;\n break;\n case 'under':\n widthBranch.underWidth += w.width;\n break;\n case 'center':\n widthBranch.aboveWidth += w.aboveWidth;\n widthBranch.underWidth += w.underWidth;\n break;\n }\n });\n\n const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n\n widthBranch.aboveWidth += marginBetweenBranch / 2;\n widthBranch.underWidth += marginBetweenBranch / 2;\n const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);\n const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);\n\n if (maxWidthInElements.aboveWidth < maxAboveWidth) {\n maxWidthInElements.aboveWidth = maxAboveWidth;\n }\n if (maxWidthInElements.underWidth < maxUnderWidth) {\n maxWidthInElements.underWidth = maxUnderWidth;\n }\n\n maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n });\n\n maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n maxWidth.aboveWidth += maxWidthInElements.aboveWidth;\n maxWidth.underWidth += maxWidthInElements.underWidth;\n }\n\n /** Tính khoảng cách thêm vào sau element (bao gồm wait config nếu có) */\n private static checkElementGetMargin(hasWaitConfig?: IDiagramElement): number {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + this.getWidthWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n }\n\n /** Tính chiều rộng của wait config node */\n private static getWidthWaitConfig(hasWaitConfig?: IDiagramElement): number {\n if (hasWaitConfig) {\n return (hasWaitConfig.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n}\n","import { IArrowStyle, ILineStyle } from '@libs-ui/components-draw-line';\n\nexport const DEFAULT_NAVIGATION_LINE_STYLE: ILineStyle = {\n curve: 10,\n distancePoint: 20,\n stroke: 'var(--libs-ui-color-light-1, #4e8cf7)',\n strokeDasharray: '5',\n strokeWidth: '1',\n};\n\nexport const DEFAULT_NAVIGATION_ARROW_STYLE: IArrowStyle = {\n width: 4,\n height: 8,\n fill: 'var(--libs-ui-color-light-1, #4e8cf7)',\n};\n\nexport const DEFAULT_NAVIGATION_ENDPOINT_GAP = 8;\n","import { IDrawLineDataInput, IPoints, TYPE_MODE } from '@libs-ui/components-draw-line';\nimport { IDiagramElement } from '../../interfaces/diagram.interface';\nimport { INavigationLineStyleConfig } from '../../interfaces/navigation.interface';\nimport { DEFAULT_NAVIGATION_ARROW_STYLE, DEFAULT_NAVIGATION_ENDPOINT_GAP, DEFAULT_NAVIGATION_LINE_STYLE } from './navigation-style.define';\n\nexport class LibsUiDiagramDrawNavigationUtil {\n /** Rule chọn mode mặc định (copy từ workflows/canvas.component.ts:471). */\n static defaultModeResolver(start: { x: number; y: number }, end: { x: number; y: number }): TYPE_MODE {\n return start.x < end.x && start.y > end.y ? 'quart-in' : 's-line';\n }\n\n /**\n * Build dữ liệu navigation line (next_other_id) từ flat elements để render qua draw-line directive.\n * @param flatElements Danh sách phẳng tất cả elements (sau khi configXYElements đã chạy).\n * @param orientation Chiều layout của diagram.\n * @param styleConfig Tuỳ chỉnh style line/arrow + override resolver mode/gap.\n */\n static buildNavigationData(flatElements: IDiagramElement[], orientation: 'vertical' | 'horizontal', styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput[] {\n const result: IDrawLineDataInput[] = [];\n\n flatElements.forEach((item) => {\n if (item.branches?.length) {\n item.branches.forEach((branch, index) => {\n if (!branch.next_other_id?.length || !branch.nodeOtherConfig) {\n return;\n }\n const nodeOtherConfig = branch.nodeOtherConfig;\n const nextIds = branch.next_other_id;\n\n nextIds.forEach((nextId, idx) => {\n const target = flatElements.find((el) => el.id === nextId);\n\n if (!target) {\n return;\n }\n const lineId = nextIds.length > 1 ? `${item.id}_branch_${index}_${idx}` : `${item.id}_branch_${index}`;\n const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);\n\n if (lineData) {\n result.push(lineData);\n }\n });\n });\n return;\n }\n\n if (!item.next_other_id?.length || !item.nodeOtherConfig) {\n return;\n }\n const nodeOtherConfig = item.nodeOtherConfig;\n const nextIds = item.next_other_id;\n\n nextIds.forEach((nextId, idx) => {\n const target = flatElements.find((el) => el.id === nextId);\n\n if (!target) {\n return;\n }\n const lineId = nextIds.length > 1 ? `${item.id ?? ''}_${idx}` : (item.id ?? '');\n const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);\n\n if (lineData) {\n result.push(lineData);\n }\n });\n });\n\n return result;\n }\n\n private static buildOneLine(id: string, source: IDiagramElement, target: IDiagramElement, orientation: 'vertical' | 'horizontal', styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput | undefined {\n const gap = styleConfig?.endpointGap ?? DEFAULT_NAVIGATION_ENDPOINT_GAP;\n const points = orientation === 'horizontal' ? this.calcPointsHorizontal(source, target, gap) : this.calcPointsVertical(source, target, gap);\n\n if (!points) {\n return undefined;\n }\n const resolver = styleConfig?.modeResolver ?? this.defaultModeResolver;\n const mode = resolver(points.start, points.end);\n\n return {\n id,\n points,\n mode,\n lineStyle: { ...DEFAULT_NAVIGATION_LINE_STYLE, ...styleConfig?.lineStyle },\n arrowStyle: { ...DEFAULT_NAVIGATION_ARROW_STYLE, ...styleConfig?.arrowStyle },\n };\n }\n\n /** VERTICAL: line navigation đi NGANG — kẹp cạnh phải/trái source → cạnh trái/phải target. */\n private static calcPointsVertical(source: IDiagramElement, target: IDiagramElement, gap: number): IPoints {\n const sx = source.specific_x ?? 0;\n const sy = source.specific_y ?? 0;\n const sw = source.specific_width ?? 0;\n const sh = source.specific_height ?? 0;\n const tx = target.specific_x ?? 0;\n const ty = target.specific_y ?? 0;\n const tw = target.specific_width ?? 0;\n const th = target.specific_height ?? 0;\n\n const sMidY = sy + sh / 2;\n const tMidY = ty + th / 2;\n\n // Default: line đi sang PHẢI từ source → cạnh TRÁI target\n let start = { x: sx + sw, y: sMidY };\n let end = { x: tx - gap, y: tMidY };\n\n // Source nằm BÊN PHẢI target → line đi sang TRÁI: cạnh TRÁI source → cạnh PHẢI target\n if (sx > tx + tw) {\n start = { x: sx, y: sMidY };\n end = { x: tx + tw + gap, y: tMidY };\n return { start, end };\n }\n\n // Source nằm PHÍA TRÊN target (cùng cột hoặc gần) → đi XUỐNG vào cạnh TRÊN target\n if (sy < ty && Math.abs(sx + sw / 2 - (tx + tw / 2)) < Math.max(sw, tw)) {\n start = { x: sx + sw / 2, y: sy + sh };\n end = { x: tx + tw / 2, y: ty - gap };\n }\n return { start, end };\n }\n\n /** HORIZONTAL: line navigation đi DỌC — kẹp cạnh dưới/trên source → cạnh trên/dưới target. */\n private static calcPointsHorizontal(source: IDiagramElement, target: IDiagramElement, gap: number): IPoints {\n const sx = source.specific_x ?? 0;\n const sy = source.specific_y ?? 0;\n const sw = source.specific_width ?? 0;\n const tx = target.specific_x ?? 0;\n const ty = target.specific_y ?? 0;\n const tw = target.specific_width ?? 0;\n const th = target.specific_height ?? 0;\n\n // Default: line đi XUỐNG từ source → cạnh TRÊN target\n const start = { x: sx + sw, y: sy };\n const end = { x: tx - gap, y: ty + th / 2 };\n\n if (sy < ty) {\n end.x = tx + tw / 2;\n end.y = ty - gap;\n }\n return { start, end };\n }\n}\n","import { ComponentRef, Injectable, signal } from '@angular/core';\nimport { IDrawLineDataInput } from '@libs-ui/components-draw-line';\nimport { setStylesElement } from '@libs-ui/utils';\nimport { IRuleConnectable, TDropZoneCanDropFn } from './interfaces/canvas.interface';\nimport { IDataDiagramConfigSvg } from './interfaces/coordinates.interface';\nimport { ICanvasConfig, ICustomCanvasConfig, IDiagramElement, IDiagramElementBranch, IDropZoneIndicatorStyle } from './interfaces/diagram.interface';\nimport { INavigationLineStyleConfig } from './interfaces/navigation.interface';\nimport { MoLibDiagramCalculatorCoordinatesUtil } from './utils/calculator-element.util';\nimport { applyElementStyle, setAttributeSvgAndAppend } from './utils/diagram.util';\nimport { MoLibDiagramHorizontalCalculatorCoordinatesUtil } from './utils/horizontal/calculator-coordinates.util';\nimport { LibsUiDiagramDrawNavigationUtil } from './utils/navigation/build-navigation-data.util';\n\nconst canvasConfig = signal<ICanvasConfig>({\n ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT: 60,\n ELEMENT_MARGIN_DEFAULT: 60,\n ELEMENT_MARGIN_DEFAULT_BRANCH: 16,\n ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT: 60,\n DEFAULT_BRANCH_WHEN_NO_ELEMENT: 100,\n ELEMENT_HEIGHT_CURVE: 10,\n ELEMENT_SVG_STROKE_COLOR: '9ca2ad',\n ELEMENT_SVG_STROKE_WIDTH: '1',\n ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST: 78,\n\n DISTANCE_TO_WAIT: 30,\n WAIT_TO_ELEMENT: 50,\n ELEMENT_WAIT_DEFAULT: 28,\n DISTANCE_WAIT_TO_NEXT_LINE: 4,\n\n TYPE_ELEMENT_EXIT: 'EXIT',\n TYPE_ELEMENT_WORKFLOW: 'WORKFLOW',\n WIDTH_ELEMENT_DEFAULT: 165,\n HEIGHT_ELEMENT_DEFAULT: 48,\n\n ADD_ICON_DIAMETER: 24,\n});\n\nexport const canvasConfigReadonly = canvasConfig.asReadonly();\nexport const storeDataDefault = {\n positionMaxLeft: 0,\n positionMaxTop: 0,\n widthHeightSvgCanvas: { heightSvg: window.innerHeight, widthSvg: window.innerWidth },\n};\n@Injectable({\n providedIn: 'root',\n})\nexport class LibsUiDiagramDrawService {\n private readonly configCanvas = signal<ICustomCanvasConfig | undefined>(undefined);\n readonly orientation = signal<'vertical' | 'horizontal'>('vertical');\n private readonly elementSvg = signal<SVGPathElement | undefined>(undefined);\n private readonly attributeSvgD = signal<string>('');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly componentRefs = signal<ComponentRef<any>[]>([]);\n\n // Virtualization Tracking\n private virtualViewport?: { x: number; y: number; width: number; height: number };\n private virtualFlatElements: { element: IDiagramElement; branch?: IDiagramElementBranch; shouldShowArrow: boolean; isOtherConfig: boolean; parentId?: string | number }[] = [];\n private virtualFlatBranches: IDiagramElementBranch[] = [];\n private readonly virtualNodesMap = new Map<string, { component?: ComponentRef<any>; arrow?: HTMLElement; label?: HTMLElement }>();\n\n public updateViewport(vp: { x: number; y: number; width: number; height: number }) {\n this.virtualViewport = vp;\n if (this.configCanvas()?.useVirtualizationTemplate) {\n this.applyVirtualizationDiff();\n }\n }\n\n set setConfig(config: ICustomCanvasConfig) {\n this.configCanvas.set(config);\n }\n\n set setConfigCanvas(config: Partial<ICanvasConfig>) {\n if (!config) {\n return;\n }\n\n canvasConfig.update((current) => ({ ...current, ...config }));\n }\n\n configXYElements(elements: Array<IDiagramElement>, updateSVG?: boolean, positionX?: number) {\n const storeData = this.configCanvas()?.storeDataDefine ?? storeDataDefault;\n const maxLeftOrigin = storeData.positionMaxLeft;\n const maxTopOrigin = storeData.positionMaxTop ?? 0;\n\n if (this.orientation() === 'horizontal') {\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(elements, storeData, positionX);\n } else {\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(elements, storeData, positionX);\n }\n\n const maxLeftNew = storeData.positionMaxLeft;\n const maxTopNew = storeData.positionMaxTop ?? 0;\n\n if (!this.elementSvg()) {\n this.elementSvg.set(document.createElementNS('http://www.w3.org/2000/svg', 'path'));\n }\n\n if (!updateSVG && this.configCanvas()?.svgContainer && this.elementSvg()) {\n setAttributeSvgAndAppend(this.configCanvas()?.svgContainer, this.elementSvg(), '');\n }\n\n if (this.orientation() === 'horizontal' && maxTopOrigin !== maxTopNew) {\n this.updatePositionElements(maxTopNew, elements, storeData);\n return;\n }\n if (this.orientation() === 'vertical' && maxLeftOrigin !== maxLeftNew) {\n this.updatePositionElements(maxLeftNew, elements, storeData);\n return;\n }\n\n if (this.elementSvg()) {\n this.attributeSvgD.set('');\n this.buildSvgElement(elements);\n this.elementSvg()?.setAttribute('d', this.attributeSvgD());\n }\n }\n\n private updatePositionElements(positionOffset: number, elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg) {\n if (positionOffset && positionOffset < 0) {\n positionOffset = positionOffset * -1 + 200; // 100 là khoảng cách cách biên\n }\n if (this.orientation() === 'horizontal') {\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(elements, { ...config, updateSVG: true }, positionOffset);\n } else {\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(elements, { ...config, updateSVG: true }, positionOffset);\n }\n if (!this.elementSvg()) {\n this.elementSvg.set(document.createElementNS('http://www.w3.org/2000/svg', 'path'));\n }\n if (this.elementSvg()) {\n this.attributeSvgD.set('');\n this.buildSvgElement(elements);\n this.elementSvg()?.setAttribute('d', this.attributeSvgD());\n }\n }\n\n private buildSvgElement(elements: Array<IDiagramElement>) {\n elements.forEach((currentElement) => {\n if (currentElement.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${currentElement.attributeSvgD}`);\n }\n if (currentElement.nodeOtherConfig?.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${currentElement.nodeOtherConfig?.attributeSvgD}`);\n }\n if (!currentElement.branches?.length) {\n return;\n }\n\n currentElement.branches.forEach((branch) => {\n if (branch.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${branch.attributeSvgD}`);\n }\n if (branch.nodeOtherConfig?.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${branch.nodeOtherConfig?.attributeSvgD}`);\n }\n\n if (!branch.elements.length) {\n return;\n }\n\n this.buildSvgElement(branch.elements);\n });\n });\n }\n\n /**\n * Render tất cả nodes từ elements array\n */\n renderNodes(elements: Array<IDiagramElement>) {\n if (this.configCanvas()?.useVirtualizationTemplate) {\n this.extractVirtualElements(elements);\n this.applyVirtualizationDiff();\n return;\n }\n\n this.clearNodes();\n this.renderElementsRecursively(elements, true);\n this.renderBranchLabels(elements);\n }\n\n private extractVirtualElements(elements: IDiagramElement[]) {\n this.virtualFlatElements = [];\n this.virtualFlatBranches = [];\n const scan = (list: IDiagramElement[], branch?: IDiagramElementBranch, isFirstLevel = true) => {\n list.forEach((el, index) => {\n const shouldShowArrow = !(isFirstLevel && index === 0);\n this.virtualFlatElements.push({ element: el, branch, isOtherConfig: false, shouldShowArrow, parentId: el.id });\n if (el.nodeOtherConfig) this.virtualFlatElements.push({ element: el.nodeOtherConfig, branch, isOtherConfig: true, shouldShowArrow: false, parentId: el.id });\n if (el.branches) {\n el.branches.forEach((b, bIndex) => {\n if (!b.label) b.label = `Nhánh ${bIndex + 1}`;\n this.virtualFlatBranches.push(b);\n if (b.elements) scan(b.elements, b, false);\n if (b.nodeOtherConfig) this.virtualFlatElements.push({ element: b.nodeOtherConfig, branch: b, isOtherConfig: true, shouldShowArrow: false, parentId: 'branch_' + bIndex + '_' + el.id });\n });\n }\n });\n };\n scan(elements, undefined, true);\n }\n\n private applyVirtualizationDiff() {\n const vp = this.virtualViewport;\n if (!vp) return;\n const config = this.configCanvas();\n const container = config?.nodesContainer?.nativeElement;\n if (!container || !config) return;\n\n const buffer = 300;\n const visibleIds = new Set<string>();\n\n this.virtualFlatElements.forEach((item) => {\n const el = item.element;\n if (el.translateX === undefined || el.translateY === undefined) return;\n if (el.translateX + (el.specific_width || 165) < vp.x - buffer || el.translateX > vp.x + vp.width + buffer || el.translateY + (el.specific_height || 48) < vp.y - buffer || el.translateY > vp.y + vp.height + buffer) return;\n\n const id = String(item.parentId) + (item.isOtherConfig ? '_other' : '');\n visibleIds.add(id);\n\n if (!this.virtualNodesMap.has(id)) {\n const componentType = item.isOtherConfig ? config.nodeOtherConfigComponentType : config.nodeComponentType;\n if (componentType && config.viewContainerRef) {\n const ref = config.viewContainerRef.createComponent(componentType);\n ref.setInput('element', el);\n if (item.branch) ref.setInput('branch', item.branch);\n ref.setInput('orientation', this.orientation());\n\n const domEl = ref.location.nativeElement as HTMLElement;\n domEl.classList.add('diagram-node-dynamic');\n applyElementStyle(domEl, el);\n container.appendChild(domEl);\n\n let arrow: HTMLElement | undefined;\n if (item.shouldShowArrow && !item.isOtherConfig) {\n arrow = this.createArrowIndicator(el, container);\n }\n this.virtualNodesMap.set(id, { component: ref, arrow });\n }\n } else {\n const cache = this.virtualNodesMap.get(id);\n if (cache) {\n if (cache.component) applyElementStyle(cache.component.location.nativeElement, el);\n if (cache.arrow) {\n const arrowSize = 16;\n const nodeWidth = el.specific_width ?? 165;\n const nodeHeight = el.specific_height ?? 48;\n if (this.orientation() === 'horizontal') {\n cache.arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 4L16 8L8 12Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n cache.arrow.style.left = `${el.translateX - arrowSize}px`;\n cache.arrow.style.top = `${el.translateY + nodeHeight / 2 - arrowSize / 2}px`;\n } else {\n cache.arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 16L4 12H12L8 16Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n cache.arrow.style.left = `${el.translateX + nodeWidth / 2 - arrowSize / 2}px`;\n cache.arrow.style.top = `${el.translateY - arrowSize}px`;\n }\n }\n }\n }\n });\n\n this.virtualFlatBranches.forEach((branch, index) => {\n const x = branch.specific_start_branch_x;\n const y = branch.specific_start_branch_y;\n if (x === undefined || y === undefined) return;\n if (x < vp.x - buffer || x > vp.x + vp.width + buffer || y < vp.y - buffer || y > vp.y + vp.height + buffer) return;\n\n const id = 'branch_' + index + '_' + Math.round(x) + '_' + Math.round(y);\n visibleIds.add(id);\n\n if (!this.virtualNodesMap.has(id)) {\n const labelDiv = this.createBranchLabel(branch);\n if (labelDiv) this.virtualNodesMap.set(id, { label: labelDiv });\n } else {\n const cache = this.virtualNodesMap.get(id);\n if (cache?.label) {\n const labelDiv = cache.label;\n const labelRect = labelDiv.getBoundingClientRect();\n const labelW = labelRect.width || labelDiv.offsetWidth;\n const labelH = labelRect.height || labelDiv.offsetHeight;\n if (this.orientation() === 'vertical') {\n labelDiv.style.left = `${x - labelW / 2 - 4}px`;\n labelDiv.style.top = `${y - labelH / 2 + 4}px`;\n } else {\n labelDiv.style.left = `${x + 4}px`;\n labelDiv.style.top = `${y - labelH / 2}px`; // center over wire\n }\n }\n }\n });\n\n Array.from(this.virtualNodesMap.entries()).forEach(([id, cache]) => {\n if (!visibleIds.has(id)) {\n cache.component?.destroy();\n cache.arrow?.remove();\n cache.label?.remove();\n this.virtualNodesMap.delete(id);\n }\n });\n }\n\n /**\n * Render elements và branches một cách đệ quy\n */\n private renderElementsRecursively(elements: Array<IDiagramElement>, isFirstLevel = true, branch?: IDiagramElementBranch) {\n elements.forEach((element, index) => {\n if (element.translateX !== undefined && element.translateY !== undefined) {\n // Main node: có arrow nếu không phải element đầu tiên của level đầu\n const shouldShowArrow = !(isFirstLevel && index === 0);\n this.createNode(element, branch, shouldShowArrow, false);\n }\n\n // Render nodeOtherConfig nếu có (nodes phụ) - KHÔNG có arrow\n if (element.nodeOtherConfig?.translateX !== undefined && element.nodeOtherConfig.translateY !== undefined) {\n this.createNode(element.nodeOtherConfig, branch, false, true);\n }\n\n // Render branches nếu có\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n if (branch.elements && branch.elements.length > 0) {\n this.renderElementsRecursively(branch.elements, false, branch);\n }\n if (branch.nodeOtherConfig?.translateX !== undefined && branch.nodeOtherConfig.translateY !== undefined) {\n this.createNode(branch.nodeOtherConfig, branch, false, true);\n }\n });\n }\n });\n }\n\n /**\n * Tạo một node component động\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private createNode(element: IDiagramElement, branch: IDiagramElementBranch | undefined, shouldShowArrow: boolean, isNodeOtherConfig: boolean): ComponentRef<any> | undefined {\n const config = this.configCanvas();\n if (!config?.viewContainerRef) {\n return;\n }\n\n if (config.useVirtualizationTemplate) {\n if (config.nodesContainer?.nativeElement) {\n if (shouldShowArrow && !isNodeOtherConfig) {\n this.createArrowIndicator(element, config.nodesContainer.nativeElement);\n }\n }\n return;\n }\n\n const componentType = isNodeOtherConfig ? config.nodeOtherConfigComponentType : config.nodeComponentType;\n\n if (!componentType) {\n return;\n }\n\n const componentRef = config.viewContainerRef.createComponent(componentType);\n const el = componentRef.location.nativeElement as HTMLElement;\n\n componentRef.setInput('element', element);\n if (branch) {\n componentRef.setInput('branch', branch);\n }\n componentRef.setInput('orientation', this.orientation());\n el.classList.add('diagram-node-dynamic');\n\n applyElementStyle(el, element);\n\n if (config.nodesContainer?.nativeElement) {\n config.nodesContainer.nativeElement.appendChild(el);\n\n if (shouldShowArrow && !isNodeOtherConfig) {\n this.createArrowIndicator(element, config.nodesContainer.nativeElement);\n }\n }\n\n this.componentRefs.update((refs) => [...refs, componentRef]); // Lưu reference để cleanup sau\n\n return componentRef;\n }\n\n /**\n * Clear tất cả nodes đã tạo\n */\n clearNodes() {\n this.componentRefs().forEach((ref) => {\n ref.destroy();\n });\n this.componentRefs.set([]);\n\n Array.from(this.virtualNodesMap.values()).forEach((cache) => {\n cache.component?.destroy();\n cache.arrow?.remove();\n cache.label?.remove();\n });\n this.virtualNodesMap.clear();\n\n const config = this.configCanvas();\n const nodesContainer = config?.nodesContainer?.nativeElement;\n if (nodesContainer) {\n if (!config?.useVirtualizationTemplate) {\n const dynamicNodes = nodesContainer.querySelectorAll('.diagram-node-dynamic');\n dynamicNodes.forEach((node: Element) => node.remove());\n }\n const labels = nodesContainer.querySelectorAll('.branch-label');\n labels.forEach((label: Element) => label.remove());\n const arrows = nodesContainer.querySelectorAll('.node-arrow-indicator');\n arrows.forEach((arrow: Element) => arrow.remove());\n }\n }\n\n /**\n * Tạo mũi tên indicator chỉ hướng vào node.\n * - vertical: mũi tên ▼ phía TRÊN node (luồng trên → xuống)\n * - horizontal: mũi tên ► phía TRÁI node (luồng trái → phải)\n */\n private createArrowIndicator(element: IDiagramElement, container: HTMLElement): HTMLElement | undefined {\n if (element.translateX === undefined || element.translateY === undefined) {\n return undefined;\n }\n\n const arrow = document.createElement('div');\n arrow.className = 'node-arrow-indicator';\n arrow.style.position = 'absolute';\n arrow.style.zIndex = '1';\n arrow.style.pointerEvents = 'none';\n\n const arrowSize = 16;\n const nodeWidth = element.specific_width ?? 0;\n const nodeHeight = element.specific_height ?? 0;\n\n if (this.orientation() === 'horizontal') {\n // Mũi tên ► ở bên TRÁI node, căn giữa theo chiều cao\n arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 4L16 8L8 12Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n arrow.style.left = `${element.translateX - arrowSize}px`;\n arrow.style.top = `${element.translateY + nodeHeight / 2 - arrowSize / 2}px`;\n } else {\n // Mũi tên ▼ ở phía TRÊN node, căn giữa theo chiều rộng\n arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 16L4 12H12L8 16Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n arrow.style.left = `${element.translateX + nodeWidth / 2 - arrowSize / 2}px`;\n arrow.style.top = `${element.translateY - arrowSize}px`;\n }\n\n container.appendChild(arrow);\n return arrow;\n }\n\n /**\n * Render branch labels (text annotations on branches)\n */\n private renderBranchLabels(elements: Array<IDiagramElement>) {\n const svgContainer = this.configCanvas()?.svgContainer?.nativeElement;\n if (!svgContainer) {\n return;\n }\n\n elements.forEach((element) => {\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch, index) => {\n if (branch.specific_start_branch_x !== undefined && branch.specific_start_branch_y !== undefined) {\n if (!branch.label) {\n branch.label = `Nhánh ${index + 1}`;\n }\n this.createBranchLabel(branch);\n }\n\n if (branch.elements && branch.elements.length > 0) {\n this.renderBranchLabels(branch.elements);\n }\n });\n }\n });\n }\n\n private createBranchLabel(branch: IDiagramElementBranch): HTMLElement | undefined {\n const config = this.configCanvas();\n const container = config?.nodesContainer?.nativeElement;\n if (!container) {\n return undefined;\n }\n\n const labelDiv = document.createElement('div');\n labelDiv.className = `branch-label ${branch.labelClassName || 'libs-ui-font-h7r'}`;\n labelDiv.textContent = branch.label || '';\n\n labelDiv.style.position = 'absolute';\n labelDiv.style.padding = '2px 7px';\n labelDiv.style.borderRadius = '10px';\n labelDiv.style.backgroundColor = branch.labelBgColor || '#f3f4f6';\n labelDiv.style.color = branch.labelColor || '#374151';\n labelDiv.style.whiteSpace = 'nowrap';\n labelDiv.style.zIndex = '2';\n labelDiv.style.pointerEvents = 'none';\n\n container.appendChild(labelDiv);\n\n const startX = branch.specific_start_branch_x ?? 0;\n const startY = branch.specific_start_branch_y ?? 0;\n const labelW = labelDiv.offsetWidth;\n const labelH = labelDiv.offsetHeight || 18;\n\n if (this.orientation() === 'horizontal') {\n /**\n * Horizontal: label nằm TRÊN đường line nằm ngang.\n * specific_start_branch = điểm bắt đầu đoạn thẳng ngang đến element.\n * Đặt label tịnh tiến sang phải 8px từ ngoặt nhánh, và căn giữa dây.\n */\n labelDiv.style.left = `${startX + 4}px`;\n labelDiv.style.top = `${startY - labelH / 2}px`;\n } else {\n /**\n * Vertical: label nằm BÊN TRÁI đường ngang, căn giữa theo Y.\n * specific_start_branch = điểm đầu đoạn thẳng đến element (sau curve).\n */\n labelDiv.style.left = `${startX - labelW / 2 - 4}px`;\n labelDiv.style.top = `${startY - labelH / 2 + 4}px`;\n }\n return labelDiv;\n }\n\n /**\n * Render dấu \"+\" tại mỗi vị trí có thể thả element từ sidebar.\n * Service tự tạo DOM elements và inject vào nodesContainer.\n * @param flatElements Danh sách flat elements đã tính toán vị trí\n * @param onDrop Callback khi người dùng thả element vào một \"+\"\n * @param canDropFn (tùy chọn) Function kiểm tra điều kiện hiển thị drop zone.\n * ```\n */\n renderDropZones(flatElements: IDiagramElement[], onDrop: (element: IDiagramElement, branch: IDiagramElementBranch | undefined, dragData: string) => void, canDropFn: TDropZoneCanDropFn, ruleConnectableElements: Array<IRuleConnectable>): void {\n this.clearDropZones();\n const container = this.configCanvas()?.nodesContainer?.nativeElement as HTMLElement | undefined;\n if (!container) return;\n\n flatElements.forEach((el) => {\n if (el.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) return;\n\n if (el.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n el.branches?.forEach((branch) => {\n if (canDropFn(undefined, el, branch, ruleConnectableElements)) return;\n\n const top = this.orientation() === 'horizontal' ? this.calcDropZoneTopBranchH(el, branch) : this.calcDropZoneTopBranch(el, branch);\n const left = this.orientation() === 'horizontal' ? this.calcDropZoneLeftBranchH(el, branch) : this.calcDropZoneLeftBranch(el, branch);\n this.createDropZoneEl(container, top, left, el, branch, onDrop);\n });\n } else {\n if (!canDropFn(undefined, el, undefined, ruleConnectableElements)) return;\n\n const top = this.orientation() === 'horizontal' ? this.calcDropZoneTopNodeH(el) : this.calcDropZoneTopNode(el);\n const left = this.orientation() === 'horizontal' ? this.calcDropZoneLeftNodeH(el) : this.calcDropZoneLeftNode(el);\n this.createDropZoneEl(container, top, left, el, undefined, onDrop);\n }\n });\n }\n\n /**\n * Build dữ liệu navigation line (next_other_id) từ flat elements để render qua draw-line directive.\n * Service tự đọc `orientation()` để chọn pattern endpoint phù hợp.\n * Caller chỉ cần truyền vào `drawLineFunctionControl.setData(...)`.\n */\n buildNavigationData(flatElements: IDiagramElement[], styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput[] {\n return LibsUiDiagramDrawNavigationUtil.buildNavigationData(flatElements, this.orientation(), styleConfig);\n }\n\n /** Xóa tất cả drop zone \"+\" khỏi DOM */\n clearDropZones(): void {\n const container = this.configCanvas()?.nodesContainer?.nativeElement as HTMLElement | undefined;\n if (!container) return;\n container.querySelectorAll('.diagram-drop-zone').forEach((el) => el.remove());\n }\n\n private createDropZoneEl(\n container: HTMLElement,\n top: number,\n left: number,\n element: IDiagramElement,\n branch: IDiagramElementBranch | undefined,\n onDrop: (element: IDiagramElement, branch: IDiagramElementBranch | undefined, dragData: string) => void\n ): void {\n const indicatorStyle: IDropZoneIndicatorStyle | undefined = this.configCanvas()?.dropZoneStyle;\n const RECT_W = element.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT;\n const RECT_H = element.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT;\n\n // Tâm của nút tròn\n const centerX = left + canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n const centerY = top + canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n\n // Hit zone vô hình: rộng hơn rectangle một khoản padding để bắt drag sớm hơn\n const HIT_PAD = 20;\n const HIT_W = RECT_W + HIT_PAD * 2;\n const HIT_H = RECT_H + HIT_PAD * 2;\n const hitLeft = centerX - HIT_W / 2;\n const hitTop = centerY - HIT_H / 2;\n\n // ── Hit zone (wrapper vô hình, vùng nhận drag rộng) ─────────────────\n const hitZone = document.createElement('div');\n hitZone.className = 'diagram-drop-zone';\n hitZone.style.cssText = `\n position: absolute;\n top: ${hitTop}px;\n left: ${hitLeft}px;\n z-index: 9;\n width: ${HIT_W}px;\n height: ${HIT_H}px;\n cursor: pointer;\n `;\n\n // ── Indicator (con bên trong, phần hiển thị) ─────────────────────────\n const indicator = document.createElement('div');\n indicator.style.pointerEvents = 'none'; // tránh tranh chấp event với hitZone\n\n // Vị trí dot trong hitZone (căn giữa hitZone)\n const dotOffsetLeft = HIT_W / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n const dotOffsetTop = HIT_H / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n\n // Vị trí rectangle trong hitZone (căn giữa hitZone)\n const rectOffsetLeft = HIT_PAD;\n const rectOffsetTop = HIT_H / 2 - RECT_H / 2;\n\n const applyDotStyle = () => {\n const s = indicatorStyle;\n const size = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const bg = s?.backgroundColor ?? '#3b82f6';\n const iconColor = s?.iconColor ?? '#ffffff';\n const opacity = s?.opacity ?? 0.95;\n const borderRadius = s?.borderRadius ?? '50%';\n\n setStylesElement(indicator, {\n position: 'absolute',\n top: `${dotOffsetTop}px`,\n left: `${dotOffsetLeft}px`,\n width: `${size}px`,\n height: `${size}px`,\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 0.15s ease',\n border: 'none',\n });\n\n if (s?.renderIndicator) {\n indicator.innerHTML = s.renderIndicator(size);\n } else {\n indicator.innerHTML = `\n <div style=\"\n width: ${size}px;\n height: ${size}px;\n background-color: ${bg};\n border-radius: ${borderRadius};\n opacity: ${opacity};\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n \"><i class=\"libs-ui-icon-add before:text-[${iconColor}]\"></i></div>\n `;\n }\n };\n\n const applyRectStyle = () => {\n const s = indicatorStyle;\n const hoverBg = s?.hoverBackgroundColor ?? '#eef4ff';\n const hoverBorder = s?.hoverBorderColor ?? 'rgba(59, 130, 246, 0.7)';\n const hoverBorderStyle = s?.hoverBorderStyle ?? 'dashed';\n const hoverRadius = s?.hoverBorderRadius ?? 10;\n\n setStylesElement(indicator, {\n top: `${rectOffsetTop}px`,\n left: `${rectOffsetLeft}px`,\n width: `${RECT_W}px`,\n height: `${RECT_H}px`,\n borderRadius: `${hoverRadius}px`,\n backgroundColor: hoverBg,\n border: `2px ${hoverBorderStyle} ${hoverBorder}`,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n });\n\n // Nếu có hàm render động cho trạng thái hover — gọi nó\n indicator.innerHTML = s?.renderHoverIndicator ? s.renderHoverIndicator() : '';\n };\n\n applyDotStyle();\n hitZone.appendChild(indicator);\n\n hitZone.addEventListener('dragenter', (e: DragEvent) => {\n e.preventDefault();\n applyRectStyle();\n });\n\n hitZone.addEventListener('dragover', (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n });\n\n hitZone.addEventListener('dragleave', (e: DragEvent) => {\n if (!hitZone.contains(e.relatedTarget as Node)) {\n applyDotStyle();\n }\n });\n\n hitZone.addEventListener('drop', (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const raw = e.dataTransfer?.getData('application/json') ?? '';\n onDrop(element, branch, raw);\n });\n\n container.appendChild(hitZone);\n }\n\n // ── Vertical drop zone helpers (existing) ───────────────────────────────────\n private calcDropZoneTopBranch(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const oc = branch.nodeOtherConfig;\n if (oc) return (oc.specific_y ?? 0) + (oc.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + 10;\n return (branch.specific_start_branch_y ?? 0) + 30;\n }\n\n private calcDropZoneLeftBranch(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const firstEl = branch.elements?.[0];\n if (firstEl?.translateX !== undefined) return firstEl.translateX + (firstEl.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n return (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n }\n\n private calcDropZoneTopNode(el: IDiagramElement): number {\n const oc = el.nodeOtherConfig;\n if (oc) return (oc.specific_y ?? 0) + (oc.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + 10;\n return (el.translateY ?? 0) + (el.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT) + 10;\n }\n\n private calcDropZoneLeftNode(el: IDiagramElement): number {\n return (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n }\n\n // ── Horizontal drop zone helpers ─────────────────────────────────────────────\n /**\n * Horizontal node: \"+\" nằm giữa đường line nối 2 node — căn giữa Y của element.\n */\n private calcDropZoneTopNodeH(el: IDiagramElement): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const centerY = (el.translateY ?? 0) + (el.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT) / 2;\n return centerY - D / 2;\n }\n\n private calcDropZoneLeftNodeH(el: IDiagramElement): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const M = canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n const oc = el.nodeOtherConfig;\n\n if (oc) {\n const right = (oc.specific_x ?? 0) + (oc.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT);\n return right + M / 2 - D / 2;\n }\n\n const right = (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT);\n // Midpoint của khoảng trống giữa node và node tiếp theo (gap = ELEMENT_MARGIN_DEFAULT)\n return right + M / 2 - D / 2;\n }\n\n /**\n * Horizontal branch: \"+\" nằm căn giữa Y của branch line, sau phần tử cuối trong nhánh.\n */\n private calcDropZoneTopBranchH(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n // specific_start_branch_y = tâm Y của đường nhánh\n const centerY = branch.specific_start_branch_y ?? 0;\n return centerY - D / 2;\n }\n\n private calcDropZoneLeftBranchH(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const M = canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n\n // Sau nodeOtherConfig của nhánh (cổ nhánh)\n const oc = branch.nodeOtherConfig;\n if (oc?.specific_x !== undefined) {\n return (oc.specific_x ?? 0) + (oc.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + M / 2 - D / 2;\n }\n // Nếu nhánh không có nodeOtherConfig: đặt sau điểm rẽ nhánh\n return (branch.specific_start_branch_x ?? 0) + M / 2 - D / 2;\n }\n}\n","import { IBranchEndCount } from '../interfaces/canvas.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\n\nexport class LibsUiDiagramDrawCanvasUtil {\n static buildFlatElement(elements: Array<IDiagramElement>, flatElementsContainer: Array<IDiagramElement>) {\n elements.forEach((element) => {\n flatElementsContainer.push(element);\n if (!element.branches?.length) {\n return;\n }\n LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(element, flatElementsContainer);\n });\n }\n\n static flatElementHasBranch(element: IDiagramElement, flatElementsContainer: Array<IDiagramElement>) {\n if (!element.branches?.length) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n return;\n }\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(branch.elements, flatElementsContainer);\n });\n }\n\n static getDefaultStorageBranchEndCount(): IBranchEndCount {\n return { branchContainer: undefined, count: 0, branchEmpty: 0 };\n }\n\n /**\n * data: sử dụng reference Object type nên count sẽ đệ quy cho đến node cuối cùng\n * data.branchContainer: branch cuối cùng của element không next đến idElement\n * data.count: số lượng branch có next_id đến idElement\n */\n static getBranchContainerAndCountElementHasNextIdToElement(element: IDiagramElement, idElement: string | undefined, data: IBranchEndCount, flowFlatElements: Array<IDiagramElement>) {\n if (!element?.branches) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n data.count++;\n data.branchContainer = branch;\n data.branchEmpty++;\n\n return;\n }\n const lastElement = branch.elements[branch.elements.length - 1];\n\n if (!lastElement.next_id) {\n return;\n }\n if (lastElement.branches?.length) {\n const dataOfLastElement = this.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(lastElement, idElement, dataOfLastElement, flowFlatElements);\n if (!dataOfLastElement.count) {\n lastElement.next_id = '';\n\n return;\n }\n data.count++;\n data.branchContainer = branch;\n if (dataOfLastElement.count === 1) {\n data.branchContainer = dataOfLastElement.branchContainer;\n\n return;\n }\n\n return;\n }\n const nextOfLastElement = flowFlatElements.find((el) => el.id === lastElement.next_id);\n\n if (nextOfLastElement && nextOfLastElement.id !== idElement) {\n return;\n }\n data.count++;\n data.branchContainer = branch;\n });\n }\n\n static getElementHasCurrentBranchOrCurrentElement(currentBranch?: IDiagramElementBranch, currentElement?: IDiagramElement, flatElements?: Array<IDiagramElement>): { currentBranch?: IDiagramElementBranch; element?: IDiagramElement } {\n const data: { currentBranch?: IDiagramElementBranch; element?: IDiagramElement } = {\n currentBranch: undefined,\n element: undefined,\n };\n\n if (!flatElements?.length || (!currentBranch && !currentElement)) {\n return data;\n }\n\n if (!currentElement) {\n data.currentBranch = currentBranch;\n data.element = flatElements.find((el) => !!el.branches?.find((branch) => branch === currentBranch));\n\n return data;\n }\n const elementsHasBranches = flatElements.filter((item) => item.branches?.length);\n\n if (!elementsHasBranches) {\n return data;\n }\n for (const element of elementsHasBranches) {\n const branches = element.branches;\n\n if (!branches) {\n return data;\n }\n for (const branch of branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (branch.elements.find((item) => item.id === currentElement.id)) {\n data.currentBranch = branch;\n data.element = element;\n\n return data;\n }\n }\n }\n\n return data;\n }\n\n static findAndDeleteElementFromContainer(containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public static getBranchOfElement(elementId: string, flatElements: Array<IDiagramElement>, elementTypeWorkflow: string) {\n const flatElementHasBranch = flatElements.filter((item) => item.element_type === elementTypeWorkflow);\n\n if (!flatElementHasBranch) {\n return;\n }\n\n for (const item of flatElementHasBranch) {\n if (!item.branches?.length) {\n continue;\n }\n for (const branch of item.branches) {\n const index = branch.elements.findIndex((el) => el.id === elementId);\n\n if (index === -1) {\n continue;\n }\n\n return branch;\n }\n }\n\n return;\n }\n}\n\nexport const getDefaultConfigConstituentBranches = (code: string, dataDefault: IDiagramElement) => {\n dataDefault.branches = [\n {\n elements: [],\n },\n {\n elements: [],\n },\n ];\n\n return dataDefault;\n};\n\nexport const findAndDeleteElementFromContainer = (containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean => {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { cloneDeep, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { canvasConfigReadonly } from './diagram-draw.service';\nimport { IBranchEndCount, IHandlerFunction, IRuleConnectable } from './interfaces/canvas.interface';\nimport { IDiagramElement, IDiagramElementBranch } from './interfaces/diagram.interface';\nimport { getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';\n\n@Injectable({ providedIn: 'root' })\nexport class LibsUiDiagramDrawCanvasService {\n private elements!: Array<IDiagramElement>;\n private flatElements!: Array<IDiagramElement>;\n private handlerFunction!: IHandlerFunction;\n private elementRuleConnectable: Array<IRuleConnectable> = [];\n\n private readonly translateService = inject(TranslateService);\n\n public set HandlerFunction(handlerFunction: IHandlerFunction) {\n this.handlerFunction = handlerFunction;\n }\n\n public get HandlerFunction() {\n return this.handlerFunction;\n }\n\n public loadElements(elements: Array<IDiagramElement>, positionFirstNode: { x: number; y: number }, ruleConnectableElements: Array<IRuleConnectable>) {\n if (!elements || !elements.length) {\n return;\n }\n\n this.flatElements = [];\n const firstElement = elements[0];\n firstElement.specific_x = positionFirstNode.x;\n firstElement.specific_y = positionFirstNode.y;\n this.Elements = elements;\n this.RuleConnectableElements = ruleConnectableElements;\n }\n\n public set Elements(elements) {\n this.elements = elements;\n }\n\n public get Elements() {\n return this.elements;\n }\n\n set RuleConnectableElements(elements: Array<IRuleConnectable>) {\n this.elementRuleConnectable = elements;\n }\n\n public get RuleConnectableElements() {\n return this.elementRuleConnectable;\n }\n\n public checkRuleDragDrop(beforeElementDrag: IDiagramElement | undefined, currentElementDrag: IDiagramElement | undefined, afterElementDrag: IDiagramElement | undefined, ruleConnectableElements: Array<IRuleConnectable>): boolean {\n const ruleItemDrag = ruleConnectableElements.find((item) => item.elementCode === currentElementDrag?.code);\n const ruleAfterItemDrag = ruleConnectableElements.find((item) => afterElementDrag && item.elementCode === afterElementDrag.code);\n\n if (\n !!(ruleItemDrag && ruleItemDrag.elementCodeConnectableBefore.find((code) => code === beforeElementDrag?.code)) &&\n (!ruleAfterItemDrag || !!(ruleAfterItemDrag && ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === currentElementDrag?.code)))\n ) {\n return true;\n }\n\n return false;\n }\n\n public get FlatElements() {\n this.flatElements = [];\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(this.Elements as Array<IDiagramElement>, this.flatElements);\n\n return this.flatElements;\n }\n\n public checkExistNameElement(name: string, flatElements: Array<IDiagramElement>) {\n if (!name || !name.trim()) {\n return false;\n }\n\n return flatElements?.find((element) => element.name && element.name.trim() && element.name.trim().toLocaleLowerCase() === name.trim().toLocaleLowerCase()) ? true : false;\n }\n\n public addElement(itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch | undefined, dataDrop: IDiagramElement, branchChoice?: number) {\n if (!itemDrop || !dataDrop) {\n return;\n }\n const elementsFlat = this.FlatElements;\n if (dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n let counter = 0;\n const elementsOfCodeDataDrop = this.FlatElements?.filter((element) => element.code === dataDrop.code);\n\n if (elementsOfCodeDataDrop && elementsOfCodeDataDrop.length) {\n counter = elementsOfCodeDataDrop.reduce((preEl: IDiagramElement, currentEl: IDiagramElement) => (Number(currentEl.specific_counter_current_code) > Number(preEl.specific_counter_current_code) ? currentEl : preEl), elementsOfCodeDataDrop[0])\n .specific_counter_current_code as number;\n }\n counter++;\n let name = `${dataDrop.name} ${counter}`;\n\n while (this.checkExistNameElement(name as string, elementsFlat)) {\n counter++;\n name = `${dataDrop.name} ${counter}`;\n }\n dataDrop.name = name;\n dataDrop.specific_counter_current_code = counter;\n }\n if (branchDrop) {\n return this.addElementToBranch(itemDrop, branchDrop, cloneDeep(dataDrop), branchChoice);\n }\n const elements = this.Elements;\n const nextCurrentItemDrop: IDiagramElement = elements?.find((item) => item.id === itemDrop.next_id) as IDiagramElement;\n\n if (!nextCurrentItemDrop && dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n return;\n }\n const indexItemDrop = elements?.findIndex((item) => item.id === itemDrop.id);\n const newElement = { ...cloneDeep(dataDrop), pre_id: itemDrop.id, next_id: dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT ? nextCurrentItemDrop.id : '' };\n\n if (!dataDrop.id) {\n newElement.id = `${uuid()}`;\n }\n\n itemDrop.next_id = newElement.id;\n\n if (nextCurrentItemDrop) {\n nextCurrentItemDrop.pre_id = newElement.id;\n }\n elements?.splice((indexItemDrop as number) + 1, 0, newElement);\n const flatElements = this.FlatElements;\n const afterElement = flatElements?.find((el) => el.pre_id === newElement.id);\n\n if (!afterElement) {\n return;\n }\n const beforeElement = flatElements?.filter((el) => el.id !== newElement.id && el.next_id === afterElement.id);\n\n beforeElement?.forEach((element) => {\n element.next_id = newElement.id;\n });\n if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n this.addElementExitWorkFlow(newElement, branchChoice);\n }\n\n private addElementToBranch(itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch, dataDrop: IDiagramElement, numberBranch?: number) {\n const elements = branchDrop.elements;\n let nextCurrentItemDrop = undefined;\n let indexItemDrop = -1;\n\n if (elements && elements.length) {\n indexItemDrop = elements.findIndex((item) => item.id === itemDrop.id);\n nextCurrentItemDrop = elements.find((item) => item.id === itemDrop.next_id) as IDiagramElement;\n if (!nextCurrentItemDrop && indexItemDrop === -1) {\n nextCurrentItemDrop = elements[indexItemDrop + 1];\n }\n }\n let nextId = (nextCurrentItemDrop && nextCurrentItemDrop.id) || itemDrop.next_id;\n\n if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n nextId = '';\n }\n const newElement: IDiagramElement = { ...dataDrop, pre_id: itemDrop.id, next_id: nextId };\n\n if (!dataDrop.id) {\n newElement.id = `${uuid()}`;\n }\n\n if (!itemDrop.branches || !itemDrop.branches.find((branch) => branch === branchDrop)) {\n itemDrop.next_id = newElement.id;\n }\n\n if (nextCurrentItemDrop) {\n nextCurrentItemDrop.pre_id = newElement.id;\n }\n elements?.splice(indexItemDrop + 1, 0, newElement as IDiagramElement);\n if (itemDrop && itemDrop.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n this.updateNextIdOfChildElementInElementWorkflow(itemDrop, this.FlatElements?.find((item) => item.id === itemDrop.next_id) as IDiagramElement);\n }\n if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.checkEndMoveElementWhenDropElementCodeExit(branchDrop);\n }\n\n if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n this.addElementExitWorkFlow(newElement, numberBranch);\n }\n\n private updateNextIdOfChildElementInElementWorkflow(elementWorkflow: IDiagramElement, nextElement: IDiagramElement) {\n if (!elementWorkflow || elementWorkflow.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !nextElement) {\n return;\n }\n const flatElement: Array<IDiagramElement> = [];\n\n LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(nextElement, flatElement);\n elementWorkflow.branches?.forEach((branch) => {\n if (!branch.elements || !branch.elements.length) {\n return;\n }\n const elements = branch.elements as IDiagramElement[];\n\n elements.forEach((element, index) => {\n if (index !== elements.length - 1) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.next_id) {\n return this.updateNextIdOfChildElementInElementWorkflow(element, elements[index + 1]);\n }\n\n return;\n }\n if (element.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || element.id === nextElement.id) {\n return;\n }\n if (element.pre_id === nextElement.id || flatElement.find((item) => item.id === element.id)) {\n // trường hợp gọi đệ quy NextElement là khối trước hoặc cha của các element hiện tại\n return;\n }\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (element.next_id) {\n element.next_id = nextElement.id;\n }\n return this.updateNextIdOfChildElementInElementWorkflow(element, nextElement);\n }\n if (elementWorkflow.next_id !== nextElement.id) {\n return;\n }\n element.next_id = nextElement.id;\n });\n });\n }\n\n private checkEndMoveElementWhenDropElementCodeExit(currentBranch: IDiagramElementBranch) {\n const flatElements = this.FlatElements;\n const elementHasCurrentBranch = flatElements?.find((el) => el.branches && !!el.branches.find((branch) => branch === currentBranch));\n\n if (!elementHasCurrentBranch) {\n return;\n }\n const nextElement: IDiagramElement = flatElements?.find((el) => el.id === elementHasCurrentBranch.next_id) as IDiagramElement;\n\n if (!nextElement) {\n return;\n }\n const dataElementHasCurrentBranch = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasCurrentBranch, nextElement.id as string, dataElementHasCurrentBranch, this.FlatElements as IDiagramElement[]);\n if (!dataElementHasCurrentBranch.branchEmpty && dataElementHasCurrentBranch.count === 0) {\n elementHasCurrentBranch.next_id = '';\n }\n const elementNextToId = flatElements?.find((el) => el.next_id === nextElement.id); // Khối cha\n\n if (!elementNextToId || elementNextToId.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !elementNextToId.next_id) {\n return;\n }\n let dataFistElement = dataElementHasCurrentBranch;\n\n if (elementHasCurrentBranch.id !== elementNextToId.id) {\n dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id as string, dataFistElement, this.FlatElements as IDiagramElement[]);\n }\n if (dataFistElement.count > 1 || !dataFistElement.branchContainer) {\n return;\n }\n const branchAddItem = dataFistElement.branchContainer;\n\n if (elementHasCurrentBranch.id === elementNextToId.id) {\n if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.moveElementsToBranch(nextElement, branchAddItem);\n const { element } = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementHasCurrentBranch, this.FlatElements);\n const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n const elementCount = element && element.next_id ? element : elementHasCurrentBranch;\n // Fixbug: 15771\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementCount, elementCount.next_id as string, data, this.FlatElements as IDiagramElement[]);\n if (!data.count) {\n return (elementCount.next_id = '');\n }\n\n return;\n }\n elementHasCurrentBranch.next_id = '';\n const elementHasBranchesNotResetId = this.deleteElement(nextElement);\n\n if (!elementHasBranchesNotResetId.length) {\n return this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);\n }\n const { data, element } = elementHasBranchesNotResetId[0];\n const infoOfElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, this.FlatElements);\n const parentOfElement = infoOfElement.element;\n let dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement as IDiagramElement, parentOfElement?.next_id as string, dataOfElementInfo, this.FlatElements as IDiagramElement[]);\n if (elementHasBranchesNotResetId.length === 1) {\n if (data.count > 1) {\n return this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);\n }\n if (dataFistElement.branchContainer !== data.branchContainer && dataFistElement.count === 1) {\n this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);\n dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement as IDiagramElement, parentOfElement?.next_id as string, dataOfElementInfo, this.FlatElements as IDiagramElement[]);\n }\n if (dataOfElementInfo.count > 1) {\n return;\n }\n // Fixbug: 15518\n if (data.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(element, data.branchContainer, nextElement);\n }\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(\n parentOfElement as IDiagramElement,\n parentOfElement?.next_id as string,\n LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(),\n this.FlatElements as IDiagramElement[]\n );\n\n return;\n }\n this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);\n const flatElement = this.FlatElements;\n\n elementHasBranchesNotResetId.forEach((item) => {\n const { element } = item;\n\n if (element.next_id && flatElement?.find((item) => item.id === element.next_id)) {\n return;\n }\n const infoFromElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, flatElement);\n\n if (infoFromElement.element) {\n element.next_id = infoFromElement.element.next_id;\n this.updateNextIdOfChildElementInElementWorkflow(element, flatElements?.find((item) => item.id === element.next_id) as IDiagramElement); // FixBug: 15729\n }\n });\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(\n parentOfElement as IDiagramElement,\n parentOfElement?.next_id as string,\n LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(),\n flatElement as IDiagramElement[]\n );\n\n return;\n }\n if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.moveElementsToBranch(nextElement, branchAddItem);\n // kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó\n const dataOfElementNextToId = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, elementNextToId.next_id, dataOfElementNextToId, this.FlatElements as IDiagramElement[]);\n if (!dataOfElementNextToId.count) {\n elementNextToId.next_id = '';\n }\n\n return;\n }\n elementNextToId.next_id = '';\n elementHasCurrentBranch.next_id = '';\n const elementHasBranchesNotResetId = this.deleteElement(nextElement);\n\n if (dataElementHasCurrentBranch.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, dataElementHasCurrentBranch.branchContainer, nextElement);\n }\n if (branchAddItem && branchAddItem !== dataElementHasCurrentBranch.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(elementNextToId, branchAddItem, nextElement); // dòng này sẽ khởi tạo lại next_id của khối cha\n }\n\n if (!elementHasBranchesNotResetId.length) {\n return;\n }\n // kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó\n dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id as string, dataFistElement, this.FlatElements as IDiagramElement[]);\n if (!dataFistElement.count) {\n // nếu khối cha kiểm tra khối cha chứa các element có branch có count = 0 thì reset next_id = ''\n elementNextToId.next_id = '';\n }\n const newId = elementHasBranchesNotResetId[0].element.next_id;\n\n elementHasBranchesNotResetId.forEach((item) => (item.element.next_id = newId));\n }\n\n private moveElementsToBranch(elementStart: IDiagramElement, branchContainer: IDiagramElementBranch) {\n if (!elementStart || elementStart.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || !branchContainer || !branchContainer.elements) {\n return;\n }\n const result = this.findContainerHasElementStart(elementStart, this.Elements as IDiagramElement[]);\n\n if (!result) {\n return;\n }\n const { container, index } = result;\n const elementsHasMove: Array<IDiagramElement> = container.slice(Number(index));\n const elementsOfBranchContainer = branchContainer.elements;\n const lastElementOfBranchContainer = elementsOfBranchContainer[elementsOfBranchContainer.length - 1];\n\n elementsHasMove.forEach((element) => this.deleteElement(element, true));\n if (lastElementOfBranchContainer && lastElementOfBranchContainer.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n lastElementOfBranchContainer.next_id = elementStart.id;\n elementStart.pre_id = lastElementOfBranchContainer.id;\n }\n\n const lastElementMove = elementsHasMove[elementsHasMove.length - 1];\n let nextElement = elementStart;\n\n if (lastElementMove && lastElementMove.next_id) {\n nextElement = this.FlatElements?.find((item) => item.id === lastElementMove.next_id) as IDiagramElement;\n }\n\n const preElementStart: IDiagramElement = container[Number(index) - 1];\n\n branchContainer.elements.push(...elementsHasMove);\n if (!preElementStart || preElementStart.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n if (nextElement) {\n this.updateNextIdOfChildElementInElementWorkflow(preElementStart, nextElement);\n }\n }\n\n private findContainerHasElementStart(elementStart: IDiagramElement, containerCapacity: Array<IDiagramElement>): { elementStart: IDiagramElement; index: string; container: Array<IDiagramElement> } | undefined {\n if (!containerCapacity || !containerCapacity.length || !elementStart) {\n return undefined;\n }\n for (const index in containerCapacity) {\n const element = containerCapacity[index];\n\n if (element.id === elementStart.id) {\n return {\n elementStart: elementStart,\n index: index,\n container: containerCapacity,\n };\n }\n if (!element.branches || !element.branches.length) {\n continue;\n }\n const branches = element.branches;\n\n for (const branch of branches) {\n const result = this.findContainerHasElementStart(elementStart, branch.elements as IDiagramElement[]);\n\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n private deleteElement(elementDelete: IDiagramElement, ignoreUpdatePreId?: boolean): Array<{ element: IDiagramElement; data: IBranchEndCount }> {\n if (!elementDelete || !elementDelete.id) {\n return [];\n }\n const elementHasBranchesNotResetId = new Array<{ element: IDiagramElement; data: IBranchEndCount }>();\n const flatElements = this.FlatElements;\n const elementsHasNextIdToElementDelete = flatElements?.filter((el) => el.next_id === elementDelete.id);\n const elementHasPreIdToElementDelete = flatElements?.find((el) => el.pre_id === elementDelete.id && el.id === elementDelete.next_id);\n\n if (!ignoreUpdatePreId && elementHasPreIdToElementDelete) {\n elementHasPreIdToElementDelete.pre_id = elementDelete.pre_id;\n }\n elementsHasNextIdToElementDelete?.forEach((elementHasNextIdToElementDelete) => {\n if (elementHasPreIdToElementDelete) {\n elementHasNextIdToElementDelete.next_id = elementHasPreIdToElementDelete.id;\n\n return;\n }\n if (elementDelete.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n if (!elementHasPreIdToElementDelete && elementDelete.next_id) {\n // Fixbug: 15623\n elementHasNextIdToElementDelete.next_id = elementDelete.next_id;\n }\n\n return;\n }\n if (elementHasNextIdToElementDelete.branches && elementHasNextIdToElementDelete.branches.length) {\n const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasNextIdToElementDelete, elementDelete.id as string, data, this.FlatElements as Array<IDiagramElement>);\n if (!data.count) {\n elementHasNextIdToElementDelete.next_id = '';\n\n return;\n }\n elementHasBranchesNotResetId.push({ element: elementHasNextIdToElementDelete, data });\n\n return;\n }\n elementHasNextIdToElementDelete.next_id = elementDelete.next_id;\n });\n LibsUiDiagramDrawCanvasUtil.findAndDeleteElementFromContainer(this.Elements as Array<IDiagramElement>, elementDelete);\n\n return elementHasBranchesNotResetId;\n }\n\n private cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch: IDiagramElement, branch: IDiagramElementBranch | undefined, dataDrop: IDiagramElement) {\n if (!dataDrop || !elementHasCurrentBranch || !branch) {\n return;\n }\n\n let elementDrop: IDiagramElement = elementHasCurrentBranch;\n\n if (branch.elements && branch.elements.length) {\n elementDrop = branch.elements[branch.elements.length - 1];\n }\n\n return this.addElementToBranch(elementDrop, branch, cloneDeep(dataDrop));\n }\n\n private addElementExitWorkFlow(newElement: IDiagramElement, numberBranch?: number) {\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant('i18n_end_journey_new'),\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n if (newElement.branches && newElement.branches.length) {\n newElement.branches.forEach((item, index) => {\n if (index === numberBranch) {\n return;\n }\n if (!newElement.branches) {\n return;\n }\n this.addElement(newElement, item, exit);\n });\n }\n }\n\n public addElementExitWhenDeleteDirectionLine(element: IDiagramElement, branch: IDiagramElementBranch | undefined) {\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant('i18n_end_journey_new'),\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n delete element.nodeOtherConfig;\n this.addElement(element, branch, exit);\n }\n\n /**\n * Khi một element bị xoá, hàm này sẽ tự động thêm exit cho tất cả các element phía trước đang trỏ tới element đó.\n */\n public addElementExitForAllElementPreviousWhenElementDelete(elementsDelete: IDiagramElement[]) {\n const flatElement = this.FlatElements;\n const flatElementsInElementDelete: IDiagramElement[] = [];\n\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(elementsDelete, flatElementsInElementDelete);\n\n flatElementsInElementDelete.forEach((elementDel) => {\n if (elementDel.pre_other_id && elementDel.pre_other_id.length) {\n elementDel.pre_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (element?.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.branches?.length) {\n element.branches.forEach((branch) => {\n if (!branch.next_other_id || !branch.next_other_id.length) {\n return;\n }\n const indexEl = branch.next_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n branch.next_other_id.splice(indexEl, 1);\n }\n if (!branch.next_other_id.length) {\n this.addElementExitWhenDeleteDirectionLine(element, branch);\n element.subCodeOfElement = undefined;\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n branch.nodeOtherConfig = undefined;\n }\n });\n\n return;\n }\n\n if (!element || !element.next_other_id) {\n return;\n }\n\n const indexEl = element.next_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.next_other_id.splice(indexEl, 1);\n }\n\n if (!element.next_other_id.length) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n const getConfigDefaultBranches = this.handlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;\n getConfigDefaultBranches(element.code ?? '', element);\n }\n const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(element.id ?? '', this.FlatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);\n\n this.addElementExitWhenDeleteDirectionLine(element, branch);\n element.subCodeOfElement = undefined;\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n }\n });\n\n return;\n }\n\n if (elementDel.next_other_id && elementDel.next_other_id.length) {\n elementDel.next_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (!element || !element.pre_other_id) {\n return;\n }\n\n const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.pre_other_id.splice(indexEl, 1);\n }\n });\n }\n\n if (elementDel.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementDel.branches?.length) {\n elementDel.branches.forEach((branch) => {\n if (!branch.next_other_id || !branch.next_other_id.length) {\n return;\n }\n\n branch.next_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (!element || !element.pre_other_id) {\n return;\n }\n\n const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.pre_other_id.splice(indexEl, 1);\n }\n });\n });\n }\n });\n }\n\n public async removeOrChangeElement(elementRemove: IDiagramElement, elementChange: IDiagramElement | undefined, branchChoose?: number) {\n if (!elementRemove || elementRemove.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n return;\n }\n const flatElements = this.FlatElements;\n const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);\n const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);\n\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant('i18n_out_journey'),\n id: `${uuid()}`,\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n const elementNextBeforeDelete = flatElements?.find((el) => el.pre_id === elementRemove.id && el.id === elementRemove.next_id);\n\n if (elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {\n infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;\n }\n if (preElement && preElement.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n preElement.nodeOtherConfig = undefined;\n }\n }\n\n if (preElement && !elementNextBeforeDelete) {\n preElement.nodeOtherConfig = undefined;\n if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {\n infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;\n }\n }\n\n this.deleteElement(elementRemove);\n\n // xóa thẳng\n if (!elementChange) {\n if (!elementNextBeforeDelete) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n }\n\n return;\n }\n\n // thay đơn == đơn, thay đơn = nhánh\n if (elementRemove.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (!elementRemove.next_id && elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n // 48229\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n }\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n if (elementChange.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.deleteElement(elementNextBeforeDelete);\n }\n\n return;\n }\n\n // thay nhánh = đơn\n if (elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n\n return;\n }\n\n // thay nhánh = nhánh\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n this.deleteElement(exit);\n }\n\n public async deleteChangeElementAndInsertBranchKeep(elementRemove: IDiagramElement, elementChange: IDiagramElement | undefined, branchKeepElement: IDiagramElementBranch | undefined, branchChoice?: number | undefined) {\n const flatElements = this.FlatElements;\n const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);\n const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);\n\n this.addBranchKeepToFlow(branchKeepElement, preElement as IDiagramElement, infoOfElementRemove.currentBranch);\n this.deleteElement(elementRemove);\n if (elementChange) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoice);\n }\n }\n\n private addBranchKeepToFlow(branchKeepElement: IDiagramElementBranch | undefined, itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch | undefined) {\n if (!branchKeepElement) {\n return;\n }\n const elements = branchKeepElement.elements;\n const nextCurrentItemDrop = elements[0];\n\n if (nextCurrentItemDrop) {\n if (itemDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n itemDrop.next_id = nextCurrentItemDrop && nextCurrentItemDrop.id;\n }\n nextCurrentItemDrop.pre_id = itemDrop.id;\n }\n if (branchDrop) {\n branchDrop.elements.push(...elements);\n\n return;\n }\n this.Elements.push(...elements);\n }\n}\n","import { cloneDeep } from '@libs-ui/utils';\nimport { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { buildFlatElement } from './diagram.util';\n\nexport const buildElementDirectionTo = (element: IDiagramElement, flatElements: IDiagramElement[], checkRule: (element: IDiagramElement, item: IDiagramElement) => boolean, branch?: IDiagramElementBranch) => {\n let elementsFlat: IDiagramElement[] = cloneDeep(flatElements) ?? [];\n\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (!branch) {\n return undefined;\n }\n\n getAllItemPreOfElement(element, elementsFlat);\n getAllItemNextOfBranch(branch, elementsFlat);\n elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);\n if (element.pre_other_id?.length) {\n elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));\n }\n elementsFlat = elementsFlat.filter((item) => {\n return checkRule(element, item);\n });\n\n return elementsFlat;\n }\n\n getAllItemPreOfElement(element, elementsFlat);\n getAllItemNextOfElement(element, elementsFlat);\n elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);\n\n if (element.pre_other_id?.length) {\n elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));\n }\n\n elementsFlat = elementsFlat.filter((item) => {\n return checkRule(element, item);\n });\n\n return elementsFlat;\n};\n\nexport const getAllItemPreOfElement = (element: IDiagramElement, flatElements: IDiagramElement[]) => {\n const pre_id = [];\n\n if (element.pre_id) {\n pre_id.push(element.pre_id);\n }\n if (element.pre_other_id) {\n pre_id.push(...element.pre_other_id);\n }\n if (!pre_id.length) {\n return;\n }\n pre_id.forEach((preId) => {\n const elementPre = flatElements.find((item) => item.id === preId);\n\n if (!elementPre) {\n return;\n }\n const itemIndex = flatElements.findIndex((item) => item.id === preId);\n\n flatElements.splice(itemIndex, 1);\n getAllItemPreOfElement(elementPre, flatElements);\n });\n};\n\nexport const getAllItemNextOfElement = (element: IDiagramElement, flatElements: IDiagramElement[]) => {\n if (!element.next_id) {\n if (!element.branches?.length) {\n return;\n }\n\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement([element], flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemIndex = flatElements.findIndex((item) => item.id === el.id);\n\n if (itemIndex === -1) {\n return;\n }\n\n flatElements.splice(itemIndex, 1);\n });\n\n return;\n }\n const elementNextIndex = flatElements.findIndex((item) => item.id === element.next_id);\n\n if (elementNextIndex === -1) {\n return;\n }\n const nextElement = flatElements[elementNextIndex];\n\n flatElements.splice(elementNextIndex, 1);\n getAllItemNextOfElement(nextElement, flatElements);\n};\n\nexport const getAllItemNextOfBranch = (branch: IDiagramElementBranch, flatElements: IDiagramElement[]) => {\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemIndex = flatElements.findIndex((item) => item.id === el.id);\n\n if (itemIndex === -1) {\n return;\n }\n\n flatElements.splice(itemIndex, 1);\n });\n};\n\nexport const collectNextChainElements = (element: IDiagramElement, flatContainerElement: IDiagramElement[], listElementDelete: IDiagramElement[]) => {\n const elementNext = flatContainerElement.find((item) => item.id === element.next_id);\n\n if (!elementNext) {\n return;\n }\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement([elementNext], flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemInNext = flatContainerElement.find((item) => item.id === el.id);\n\n if (itemInNext) {\n listElementDelete.push(itemInNext);\n }\n });\n collectNextChainElements(elementNext, flatContainerElement, listElementDelete);\n};\n","import { inject, Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { LibsUiDiagramDrawCanvasService } from './canvas.service';\nimport { canvasConfigReadonly } from './diagram-draw.service';\nimport { IDiagramElement, IDiagramElementBranch } from './interfaces/diagram.interface';\nimport { findAndDeleteElementFromContainer, getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';\nimport { buildFlatElement } from './utils/diagram.util';\nimport { buildElementDirectionTo, collectNextChainElements } from './utils/direction.util';\n\n@Injectable({ providedIn: 'root' })\nexport class LibsUiDiagramDrawDirectionService {\n private elementDirection: IDiagramElement | undefined;\n private branchDirection: { branch: IDiagramElementBranch; index: number } | undefined;\n private elementViewDirectionId: string | undefined;\n private readonly onViewDirection: Subject<{ id: string }> = new Subject();\n\n private readonly canvasService = inject(LibsUiDiagramDrawCanvasService);\n\n public set ElementDirection(element: IDiagramElement | undefined) {\n this.elementDirection = element;\n }\n\n public get ElementDirection() {\n return this.elementDirection;\n }\n\n public set BranchDirection(branch: { branch: IDiagramElementBranch; index: number } | undefined) {\n this.branchDirection = branch;\n }\n\n public get BranchDirection() {\n return this.branchDirection;\n }\n\n public set ElementViewDirectionId(id: string | undefined) {\n this.elementViewDirectionId = id;\n }\n\n public get ElementViewDirectionId() {\n return this.elementViewDirectionId;\n }\n\n public get OnViewDirection() {\n return this.onViewDirection;\n }\n\n private checkRuleDirectionToElement(element: IDiagramElement | undefined, elementConnectTo: IDiagramElement | undefined) {\n const ruleAfterItemDrag = this.canvasService.RuleConnectableElements.find((item) => elementConnectTo && item.elementCode === elementConnectTo.code);\n\n if (!ruleAfterItemDrag) {\n return true;\n }\n\n if (ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === element?.code)) {\n return true;\n }\n\n return false;\n }\n\n buildElementConnectTo(element: IDiagramElement, flatElements: IDiagramElement[], branch?: IDiagramElementBranch, checkRule?: (element: IDiagramElement | undefined, elementConnectTo: IDiagramElement | undefined) => boolean) {\n const checkRuleDirectionToElement = checkRule ?? this.checkRuleDirectionToElement.bind(this);\n return buildElementDirectionTo(element, flatElements, checkRuleDirectionToElement, branch);\n }\n\n /**Xóa các element nằm phía sau khi nhánh được điều hướng */\n public deleteElementsBehindBranchConnectTo(branch: IDiagramElementBranch) {\n const flatElements = this.canvasService.FlatElements ?? [];\n const flatElementInElementCurrent: IDiagramElement[] = [];\n const listElementDelete: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementInElementCurrent);\n listElementDelete.push(...flatElementInElementCurrent);\n\n this.deleteLineConnectFromElement(listElementDelete, flatElements);\n listElementDelete.forEach((elementDelete) => {\n findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);\n });\n }\n\n /**xóa line đến và xóa line đi ở toàn bộ các khối và nhánh bị xóa */\n private deleteLineConnectFromElement(elements: IDiagramElement[], flatElements: IDiagramElement[]) {\n elements.forEach((item) => {\n if (item.branches?.length) {\n item.branches.forEach((branch) => {\n if (branch.next_other_id?.length) {\n this.deletePreOtherId(item.id ?? '', branch.next_other_id, flatElements);\n }\n });\n }\n if (item.next_other_id?.length) {\n this.deletePreOtherId(item.id ?? '', item.next_other_id, flatElements);\n }\n if (item.pre_other_id?.length) {\n // nhánh chỉ lưu id next đi thôi chứ không lưu được pre => chỉ cần xóa pre trong khối.\n this.deleteNextOtherId(item.id ?? '', item.pre_other_id, flatElements);\n }\n });\n }\n\n /** Xóa pre_other_id từ khác khối mà khối bị xóa nối đến BlockDelete => Other*/\n private deletePreOtherId(itemId: string, nextOtherId: Array<string>, flatElements: IDiagramElement[]) {\n nextOtherId.forEach((nextToId) => {\n const nextElement = flatElements.find((item) => item.id === nextToId);\n\n if (!nextElement?.pre_other_id?.length) {\n return;\n }\n const indexIdPre = nextElement.pre_other_id.findIndex((id) => id === itemId);\n\n if (indexIdPre !== -1) {\n nextElement.pre_other_id.splice(indexIdPre, 1);\n }\n });\n }\n\n /** Xóa next_other_id từ khác khối nối đến khối bị xóa Other => BlockDelete và kiểm tra + thêm khối thoát cho những khối nối tới BlockDelete*/\n private deleteNextOtherId(itemId: string, preOtherId: Array<string>, flatElements: IDiagramElement[]) {\n preOtherId.forEach((nextToId) => {\n const preElement = flatElements.find((item) => item.id === nextToId);\n\n if (!preElement) {\n return;\n }\n\n if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n preElement.branches?.forEach((branch) => {\n if (!branch.next_other_id?.length) {\n return;\n }\n const indexIdNextInBranch = branch.next_other_id.findIndex((id) => id === itemId);\n\n if (indexIdNextInBranch !== -1) {\n branch.next_other_id.splice(indexIdNextInBranch, 1);\n }\n\n if (!branch.next_other_id?.length) {\n branch.nodeOtherConfig = undefined;\n this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);\n }\n });\n\n return;\n }\n\n if (!preElement.next_other_id?.length) {\n return;\n }\n const indexIdNext = preElement.next_other_id.findIndex((id) => id === itemId);\n\n if (indexIdNext !== -1) {\n preElement.next_other_id.splice(indexIdNext, 1);\n }\n\n if (!preElement.next_other_id?.length) {\n // thêm khối thoát vì không còn khối nào connect tới nó\n if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n const getConfigDefaultBranches = this.canvasService.HandlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;\n getConfigDefaultBranches(preElement.code ?? '', preElement);\n }\n const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(preElement.id ?? '', flatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);\n\n this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);\n preElement.subCodeOfElement = undefined;\n preElement.attributeSvgD = undefined;\n preElement.position_end = undefined;\n }\n });\n }\n\n public addBranchDirection(targetId: string, element: IDiagramElement, branch: IDiagramElementBranch, flatElements: IDiagramElement[]) {\n if (!branch.next_other_id) {\n branch.next_other_id = [];\n }\n branch.next_other_id.push(targetId);\n\n const elementTo = flatElements.find((item) => item.id === targetId);\n\n if (elementTo) {\n if (!elementTo.pre_other_id) {\n elementTo.pre_other_id = [];\n }\n elementTo.pre_other_id.push(element.id ?? '');\n }\n }\n\n public addElementDirection(targetId: string, element: IDiagramElement, flatElements: IDiagramElement[]) {\n if (!element.next_other_id) {\n element.next_other_id = [];\n }\n element.next_other_id.push(targetId);\n\n const elementTo = flatElements.find((item) => item.id === targetId);\n\n if (elementTo) {\n if (!elementTo.pre_other_id) {\n elementTo.pre_other_id = [];\n }\n elementTo.pre_other_id.push(element.id ?? '');\n }\n }\n\n public deleteElementsBehindElementConnectTo(element: IDiagramElement, flatElements: IDiagramElement[]) {\n const listElementDelete: IDiagramElement[] = [];\n let flatElementInElementCurrent: IDiagramElement[] = [];\n\n if (element.branches?.length) {\n buildFlatElement([element], flatElementInElementCurrent);\n flatElementInElementCurrent = flatElementInElementCurrent.filter((item) => item.id !== element.id);\n }\n delete element.branches;\n listElementDelete.push(...flatElementInElementCurrent);\n collectNextChainElements(element, flatElements, listElementDelete);\n this.deleteLineConnectFromElement(listElementDelete, flatElements);\n listElementDelete.forEach((elementDelete) => {\n this.findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);\n });\n }\n\n private findAndDeleteElementFromContainer(containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public editDirection(flatElements: IDiagramElement[], targetId: string, element: IDiagramElement, branch?: IDiagramElementBranch) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && branch) {\n this.editDirectionWithBranch(flatElements, branch, targetId, element);\n\n return;\n }\n\n const idOldNextTo = element.next_other_id?.[0];\n const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);\n\n // xóa line cũ\n if (elementOldTo?.pre_other_id) {\n const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);\n\n if (itemIndex !== -1) {\n elementOldTo.pre_other_id?.splice(itemIndex, 1);\n }\n }\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n\n // update line mới\n const elementNewTo = flatElements?.find((item) => item.id === targetId);\n\n if (elementNewTo) {\n if (!elementNewTo.pre_other_id) {\n elementNewTo.pre_other_id = [];\n }\n elementNewTo.pre_other_id.push(element.id ?? '');\n }\n element.next_other_id = [];\n element.next_other_id.push(targetId);\n }\n\n private editDirectionWithBranch(flatElements: IDiagramElement[], branch: IDiagramElementBranch, targetId: string, element: IDiagramElement) {\n const idOldNextTo = branch.next_other_id?.[0];\n const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);\n\n // xóa line cũ\n if (elementOldTo?.pre_other_id) {\n const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);\n\n if (itemIndex !== -1) {\n elementOldTo.pre_other_id?.splice(itemIndex, 1);\n }\n }\n\n // update line mới\n const elementNewTo = flatElements?.find((item) => item.id === targetId);\n\n if (elementNewTo) {\n if (!elementNewTo.pre_other_id) {\n elementNewTo.pre_other_id = [];\n }\n elementNewTo.pre_other_id.push(element.id ?? '');\n }\n branch.next_other_id = [];\n branch.next_other_id.push(targetId);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-services-diagram-draw.mjs","sources":["../../../../../libs-ui/services/diagram-draw/src/utils/calculator-branch.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/diagram.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/calculator-element.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/horizontal/calculator-branch.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/horizontal/calculator-coordinates.util.ts","../../../../../libs-ui/services/diagram-draw/src/utils/navigation/navigation-style.define.ts","../../../../../libs-ui/services/diagram-draw/src/utils/navigation/build-navigation-data.util.ts","../../../../../libs-ui/services/diagram-draw/src/diagram-draw.service.ts","../../../../../libs-ui/services/diagram-draw/src/utils/canvas.util.ts","../../../../../libs-ui/services/diagram-draw/src/canvas.service.ts","../../../../../libs-ui/services/diagram-draw/src/utils/direction.util.ts","../../../../../libs-ui/services/diagram-draw/src/direction.service.ts","../../../../../libs-ui/services/diagram-draw/src/libs-ui-services-diagram-draw.ts"],"sourcesContent":["import { canvasConfigReadonly } from '../diagram-draw.service';\nimport { ICoordinatesDiagramSvg, IDataDiagramConfigSvg } from '../interfaces/coordinates.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { checkMaxLeft, getDistanceFromBranchToFirstBlock, getHeightWaitConfig, MoLibDiagramCalculatorCoordinatesUtil } from './calculator-element.util';\n\nexport class MoLibDiagramCalculatorBranchUtil {\n static drawStraightLine(left: number, lineFormElementToBranching: number, top: number, branch: IDiagramElementBranch, maxHeightBranch: number, config: IDataDiagramConfigSvg) {\n const startDraw = top + lineFormElementToBranching;\n let Ly = startDraw;\n\n Ly += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE; // chiều dài đến element đầu tiên\n Ly += getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên\n if (!branch.elements?.length) {\n Ly += maxHeightBranch;\n Ly += 20; // thêm đoạn nối từ điểm kết thúc nhánh đến hết\n }\n\n const coord1 = {\n mx: left,\n my: top,\n ly: Ly,\n lx: left,\n };\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;\n\n if (branch.nodeOtherConfig) {\n const endYToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + canvasConfigReadonly().DISTANCE_TO_WAIT;\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.mx} ${endYToWait}`;\n\n const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);\n const topStartLine2 = endYToWait + waitHeight;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${coord1.mx} ${topStartLine2} L ${coord1.mx} ${coord1.ly}`;\n }\n branch.nodeOtherConfig.specific_y = endYToWait;\n branch.nodeOtherConfig.specific_x = coord1.mx;\n }\n\n branch.specific_start_branch_y = top + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n branch.specific_start_branch_x = left;\n\n if (!branch.elements?.length) {\n return;\n }\n\n const heightToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig); // chiều dài đến element đầu tiên;\n\n branch.elements.forEach((elementBranch) => {\n elementBranch.specific_y = top + lineFormElementToBranching + heightToElement;\n elementBranch.specific_x = left - (elementBranch.specific_width ?? 0) / 2;\n });\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n static leftLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, element: IDiagramElement, config: IDataDiagramConfigSvg) {\n const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'left', config);\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n if (!branch.elements?.length) {\n return;\n }\n\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) {\n return;\n }\n }\n\n static rightLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, element: IDiagramElement, config: IDataDiagramConfigSvg) {\n const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch, 'right', config);\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n const maxY = (coordQL1.y ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n\n if (!branch.elements?.length) {\n return;\n }\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) {\n return;\n }\n }\n\n static drawElementInBranchLine(branch: IDiagramElementBranch, coordQL2: ICoordinatesDiagramSvg, config: IDataDiagramConfigSvg) {\n const topElementInBranch = coordQL2.ly; // bắt đầu của 1 emelent trong nhánh sẽ là điểm cuối cùng của nhánh trỏ tới\n\n const elementFirst = branch.elements[0];\n\n elementFirst.specific_y = topElementInBranch;\n elementFirst.specific_x = (coordQL2.lx ?? 0) - (elementFirst.specific_width ?? 0) / 2;\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n static drawMissingLineFromLastElement(branch: IDiagramElementBranch, coordQ3: ICoordinatesDiagramSvg) {\n const { mx, my } = coordQ3;\n\n if (!my) {\n return;\n }\n const lastElementInBranch = branch.elements[branch.elements.length - 1];\n\n if (!lastElementInBranch.branches?.length) {\n branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${lastElementInBranch.position_end ?? 0}`;\n return;\n }\n const ly = (lastElementInBranch.position_end_branch ?? 0) - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n\n if (ly === my) {\n return;\n }\n branch.attributeSvgD = `${branch.attributeSvgD} M ${mx} ${my} L ${mx} ${ly}`;\n }\n\n static drawAboveUnderLine(left: number, lineFormElementToBranching: number, top: number, lineBetweenBranch: number, branch: IDiagramElementBranch, maxHeightBranch: number, direction: 'left' | 'right', config: IDataDiagramConfigSvg) {\n const M = `M ${left} ${top}`; // đặt bút vẽ từ điểm x, y\n const Ly = top + lineFormElementToBranching - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n const L = `L ${left} ${Ly}`; // Kéo dài 1 đường thẳng tới X, Y,\n const straightLineBetweenBranch = lineBetweenBranch - canvasConfigReadonly().ELEMENT_HEIGHT_CURVE * 2;\n\n const coordQL1: ICoordinatesDiagramSvg = {\n // điểm cong số 1 của nhánh và đường thẳng kéo trên dưới\n mx: left,\n my: Ly,\n x1: left,\n y1: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n x: this.mathOperatorsCalculation(direction, left, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n y: Ly + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n };\n\n coordQL1.ly = coordQL1.y;\n // đoạn thẳng kéo dài lineBetweenBranch phải trừ đi hai đầu cong\n coordQL1.lx = this.mathOperatorsCalculation(direction, coordQL1.x, straightLineBetweenBranch, true);\n const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;\n\n const coordQL2: ICoordinatesDiagramSvg = {\n // điểm cong số 2 của nhánh và đường thẳng đứng\n y1: coordQL1.ly,\n x1: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n y: (coordQL1.ly ?? 0) + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE,\n x: this.mathOperatorsCalculation(direction, coordQL1.lx, canvasConfigReadonly().ELEMENT_HEIGHT_CURVE, true),\n };\n\n coordQL2.ly = (coordQL2.y ?? 0) + getDistanceFromBranchToFirstBlock(branch.nodeOtherConfig);\n coordQL2.lx = coordQL2.x;\n\n if (!branch.elements?.length) {\n coordQL2.ly = maxHeightBranch + (coordQL2.ly ?? 0); // tổng chiều cao của nhánh + điểm xuất phát\n }\n let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n\n if (branch.nodeOtherConfig) {\n const endYToWait = (coordQL2.y ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT; // xử lý các line vào first element\n const waitHeight = getHeightWaitConfig(branch.nodeOtherConfig);\n const topStartLine2 = endYToWait + waitHeight;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${coordQL2.x},${endYToWait}`;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${coordQL2.x} ${topStartLine2} L ${coordQL2.x} ${coordQL2.ly}`;\n }\n branch.nodeOtherConfig.specific_y = endYToWait;\n branch.nodeOtherConfig.specific_x = coordQL2.x;\n }\n\n branch.positionMaxLeft = coordQL2.lx;\n branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;\n const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);\n checkMaxLeft(config, branch.nodeOtherConfig?.specific_x, branch.positionMaxLeft);\n\n return { coordQL1, coordQL2, isCheckAllElementConnectToExit };\n }\n\n static checkChildrenConnectToExit(elements: IDiagramElement[]) {\n let toExit = false;\n\n if (elements.length && (elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n toExit = true;\n\n return toExit;\n }\n elements.forEach((element) => {\n if (!element.branches?.length) {\n return;\n }\n let branchConnectToExit = 0;\n\n element.branches.forEach((branch) => {\n if (this.checkChildrenConnectToExit(branch.elements)) {\n branchConnectToExit++;\n }\n });\n if (branchConnectToExit === element.branches.length) {\n toExit = true;\n }\n });\n\n return toExit;\n }\n\n /* above, left a + b; opposite = true a - b; \n under, right a - b; opposite = true a + b\n */\n static mathOperatorsCalculation(direction: 'left' | 'right' | 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean) {\n switch (direction) {\n case 'left':\n case 'above':\n if (opposite) {\n return (a ?? 0) - (b ?? 0);\n }\n\n return (a ?? 0) + (b ?? 0);\n\n case 'right':\n case 'under':\n if (opposite) {\n return (a ?? 0) + (b ?? 0);\n }\n\n return (a ?? 0) - (b ?? 0);\n default:\n return (a ?? 0) - (b ?? 0);\n }\n }\n}\n","import { ElementRef } from '@angular/core';\nimport { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDiagramElement } from '../interfaces/diagram.interface';\n\nexport const buildFlatElement = (elements: Array<IDiagramElement>, flatElementsContainer: Array<IDiagramElement>) => {\n elements.forEach((element) => {\n flatElementsContainer.push(element);\n if (!element.branches?.length) {\n return;\n }\n flatElementHasBranch(element, flatElementsContainer);\n });\n};\n\nconst flatElementHasBranch = (element: IDiagramElement, flatElementsContainer: Array<IDiagramElement>) => {\n if (!element.branches?.length) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n return;\n }\n buildFlatElement(branch.elements, flatElementsContainer);\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const setAttributeSvgAndAppend = (svgElement: ElementRef<any> | undefined, elementSvg: SVGPathElement | undefined, svgAttributePathD: string, color?: string) => {\n elementSvg?.setAttribute('d', svgAttributePathD);\n elementSvg?.setAttribute('stroke', `#${color ?? canvasConfigReadonly().ELEMENT_SVG_STROKE_COLOR}`);\n elementSvg?.setAttribute('fill', 'none');\n elementSvg?.setAttribute('stroke-width', canvasConfigReadonly().ELEMENT_SVG_STROKE_WIDTH);\n svgElement?.nativeElement.appendChild(elementSvg);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const canvasRemoveChildInSvg = (svgElement: ElementRef<any> | undefined) => {\n if (!svgElement) {\n return;\n }\n const children = Array.from(svgElement?.nativeElement.children);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children.forEach((child: any) => {\n if (child.tagName !== 'path') {\n return;\n }\n child.remove();\n });\n};\n\nexport const applyElementStyle = (el: HTMLElement, element: IDiagramElement) => {\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.left = '0';\n el.style.transform = `translate(${element.translateX}px, ${element.translateY}px)`;\n el.style.width = `${element.specific_width}px`;\n el.style.height = `${element.specific_height}px`;\n el.style.zIndex = '1';\n el.style.willChange = 'transform';\n};\n","import { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDataDiagramConfigSvg } from '../interfaces/coordinates.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { MoLibDiagramCalculatorBranchUtil } from './calculator-branch.util';\nimport { buildFlatElement } from './diagram.util';\n\nexport class MoLibDiagramCalculatorCoordinatesUtil {\n static setXYElements(elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg, positionX?: number) {\n if (!elements?.length) {\n return;\n }\n elements.forEach((currentElement, index) => {\n currentElement.specific_x = (currentElement.specific_x ?? 0) + (positionX ?? 0);\n const preElement = elements[index - 1];\n\n if (preElement) {\n currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) / 2 - (currentElement.specific_width ?? 0) / 2;\n currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) + checkElementGetHeight(preElement.nodeOtherConfig);\n if (preElement.position_end_branch) {\n currentElement.specific_y = preElement.position_end_branch;\n }\n }\n\n const top = currentElement.specific_y ?? 0;\n const left = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) / 2;\n let lineBetweenElements = (currentElement.specific_height ?? 0) + checkElementGetHeight(currentElement.nodeOtherConfig);\n\n if (currentElement.branches?.length) {\n lineBetweenElements = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n }\n\n const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;\n const maxXLeft = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 100;\n\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n configSvg.widthSvg = maxXLeft > configSvg.widthSvg ? maxXLeft : configSvg.widthSvg;\n\n checkMaxLeft(config, currentElement.specific_x, currentElement.branches?.[0].positionMaxLeft);\n if (!currentElement.branches?.length) {\n // các element không có nhánh mới vẽ đường thẳng\n const drawFormToHeightExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_height ?? 0) / 2 : lineBetweenElements;\n\n currentElement.attributeSvgD = `M ${left} ${top} l 0 ${drawFormToHeightExit}`;\n currentElement.position_end = top + lineBetweenElements;\n\n if (currentElement.nodeOtherConfig) {\n const waitHeight = getHeightWaitConfig(currentElement.nodeOtherConfig);\n const distanceElementToWait = (currentElement.specific_height ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;\n const topStartLine2 = top + distanceElementToWait + waitHeight;\n\n currentElement.attributeSvgD = `M ${left} ${top} l 0 ${distanceElementToWait}`;\n currentElement.position_end = topStartLine2 + lineBetweenElements;\n\n currentElement.nodeOtherConfig.specific_y = top + distanceElementToWait;\n currentElement.nodeOtherConfig.specific_x = left;\n delete currentElement.nodeOtherConfig.attributeSvgD;\n if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n currentElement.nodeOtherConfig.attributeSvgD = `M ${left} ${topStartLine2} l 0 ${canvasConfigReadonly().WAIT_TO_ELEMENT}`;\n }\n }\n\n return;\n }\n\n // start các element có nhánh\n const half = Math.ceil(currentElement.branches.length / 2);\n const aboveHalf = currentElement.branches.slice(0, half);\n const underHalf = currentElement.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n\n // TÍNH CHIỀU Cao TỐI ĐA CỦA NHÁNH\n const maxHeightBranch = {\n height: 0,\n };\n\n MoLibDiagramCalculatorCoordinatesUtil.calculatorMaxBranchHeight(currentElement, maxHeightBranch);\n currentElement.maxHeightBranch = maxHeightBranch.height;\n const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };\n const lineFormElementToBranching = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n if (brachMiddle) {\n this.calculatorWidthBranch(brachMiddle.elements, maxWidthBrachMiddle);\n brachMiddle.widthBranch = {\n width: maxWidthBrachMiddle.width,\n above: maxWidthBrachMiddle.aboveWidth,\n under: maxWidthBrachMiddle.underWidth,\n };\n MoLibDiagramCalculatorBranchUtil.drawStraightLine(left, lineFormElementToBranching, top, brachMiddle, maxHeightBranch.height, config);\n }\n\n let hasNextSameParentElementNext = false;\n const aboveHalfReverse = aboveHalf.slice().reverse();\n\n aboveHalfReverse.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n\n hasNextSameParentElementNext = !flatElementOnBranch?.length || !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n\n branch.onTheSide = 'above';\n const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều ngang để cách nhánh trên or dưới\n\n this.calculatorWidthBranch(branch.elements, maxWidthBranch);\n branch.widthBranch = {\n width: maxWidthBranch.width,\n above: maxWidthBranch.aboveWidth,\n under: maxWidthBranch.underWidth,\n };\n const branchPre = aboveHalfReverse[indexBranch - 1];\n\n let lineBetweenBranch = maxWidthBranch.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n // nhánh trái\n\n MoLibDiagramCalculatorBranchUtil.leftLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);\n });\n\n underHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n\n hasNextSameParentElementNext = !flatElementOnBranch?.length || !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n branch.onTheSide = 'under';\n const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao để cách nhánh trên or dưới\n\n this.calculatorWidthBranch(branch.elements, maxWidthBranch);\n branch.widthBranch = {\n width: maxWidthBranch.width,\n above: maxWidthBranch.aboveWidth,\n under: maxWidthBranch.underWidth,\n };\n const branchPre = underHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthBranch.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n // nhánh phải\n MoLibDiagramCalculatorBranchUtil.rightLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);\n });\n });\n\n // Set translateX và translateY để có thể render nodes\n this.setTranslatePositions(elements);\n }\n\n /**\n * Set translateX và translateY từ specific_x và specific_y cho tất cả elements (bao gồm branches)\n */\n private static setTranslatePositions(elements: Array<IDiagramElement>) {\n elements.forEach((element) => {\n // Set position cho element chính\n element.translateX = element.specific_x;\n element.translateY = element.specific_y;\n\n // Set position cho nodeOtherConfig nếu có\n if (element.nodeOtherConfig) {\n const offsetX = (element.nodeOtherConfig.specific_width ?? 0) / 2;\n\n element.nodeOtherConfig.translateX = (element.nodeOtherConfig.specific_x ?? 0) - offsetX;\n element.nodeOtherConfig.translateY = element.nodeOtherConfig.specific_y;\n }\n\n // Recursively set positions cho elements trong branches\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n // Set position cho branch nodeOtherConfig nếu có\n if (branch.nodeOtherConfig) {\n const offsetX = (branch.nodeOtherConfig.specific_width ?? 0) / 2;\n branch.nodeOtherConfig.translateX = (branch.nodeOtherConfig.specific_x ?? 0) - offsetX;\n branch.nodeOtherConfig.translateY = branch.nodeOtherConfig.specific_y;\n }\n\n // Recursively set positions cho elements trong branch\n if (branch.elements?.length > 0) {\n this.setTranslatePositions(branch.elements);\n }\n });\n }\n });\n }\n\n static calculatorMaxBranchHeight(element: IDiagramElement, maxHeightBranch: { height: number }) {\n if (!element.branches?.length) {\n return;\n }\n\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n maxHeightBranch.height = lineBranchNoHasElement > maxHeightBranch.height ? lineBranchNoHasElement : maxHeightBranch.height;\n\n return;\n }\n\n const total = {\n height: 0,\n };\n\n this.plusHeightElementInBranch(branch.elements, total);\n maxHeightBranch.height = total.height > maxHeightBranch.height ? total.height : maxHeightBranch.height;\n });\n }\n\n static plusHeightElementInBranch(elements: IDiagramElement[], total: { height: number }) {\n elements.forEach((element) => {\n const margin = !element.branches?.length ? checkElementGetHeight(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n total.height += (element.specific_height ?? 0) + margin;\n if (!element.branches?.length) {\n return;\n }\n total.height += 64; // từ chiều đường thẳng ngang xuống đến nhánh đầu tiên\n const theMostElementsInBranch = {\n height: 0,\n };\n\n element.branches.forEach((branch) => {\n const heightInBranch = { height: 0 };\n\n heightInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20; // đường cong kết thúc nhánh + 10px đường cong\n if (!branch.elements?.length) {\n heightInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n if (theMostElementsInBranch.height < heightInBranch.height) {\n theMostElementsInBranch.height = heightInBranch.height;\n }\n\n return;\n }\n this.plusHeightElementInBranch(branch.elements, heightInBranch);\n if (theMostElementsInBranch.height < heightInBranch.height) {\n theMostElementsInBranch.height = heightInBranch.height;\n }\n });\n\n total.height += theMostElementsInBranch.height;\n });\n }\n\n static calculatorWidthBranch(elements: IDiagramElement[] | undefined, maxWidth: { width: number; aboveWidth: number; underWidth: number }, log?: boolean) {\n if (!elements?.length) {\n const width = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;\n\n maxWidth.width = width;\n maxWidth.aboveWidth = width / 2;\n maxWidth.underWidth = width / 2;\n\n return;\n }\n\n const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n elements.forEach((element) => {\n if (!element.branches?.length) {\n // tính chiều cao của từng element 1, vì chiều cao của từng thằng có thể khác nhau\n if ((element.specific_width ?? 0) < maxWidthInElements.width) {\n return;\n }\n const width = element.specific_width ?? 0;\n\n maxWidthInElements.width = width;\n maxWidthInElements.aboveWidth = width / 2;\n maxWidthInElements.underWidth = width / 2;\n\n return;\n }\n const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n const width = element.specific_width ?? 0;\n\n if (width > widthElementIncludeBranch.width) {\n widthElementIncludeBranch.width = width;\n widthElementIncludeBranch.aboveWidth = width / 2;\n widthElementIncludeBranch.underWidth = width / 2;\n }\n\n const half = Math.ceil(element.branches.length / 2);\n const aboveHalf = element.branches.slice(0, half);\n const underHalf = element.branches.slice(half);\n let brachMiddle;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n if (brachMiddle) {\n brachMiddle.onTheSide = 'center';\n }\n aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));\n underHalf.forEach((branch) => (branch.onTheSide = 'under'));\n\n // tính chiều cao của từng nhánh 1, rồi tính tổng => so sánh với chiều cao xem element có nhánh nào cao nhất thì lấy\n const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n element.branches.forEach((branch) => {\n const width = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao của từng nhánh 1\n\n this.calculatorWidthBranch(branch.elements, width, log);\n switch (branch.onTheSide) {\n case 'above':\n widthBranch.aboveWidth += width.width;\n break;\n\n case 'under':\n widthBranch.underWidth += width.width;\n break;\n\n case 'center':\n widthBranch.aboveWidth += width.aboveWidth;\n widthBranch.underWidth += width.underWidth;\n break;\n }\n });\n\n const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n\n widthBranch.aboveWidth += marginBetweenBranch / 2;\n widthBranch.underWidth += marginBetweenBranch / 2;\n const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);\n const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);\n\n if (maxWidthInElements.aboveWidth < maxAboveWidth) {\n maxWidthInElements.aboveWidth = maxAboveWidth;\n }\n if (maxWidthInElements.underWidth < maxUnderWidth) {\n maxWidthInElements.underWidth = maxUnderWidth;\n }\n\n maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n });\n\n maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n maxWidth.aboveWidth += maxWidthInElements.aboveWidth;\n maxWidth.underWidth += maxWidthInElements.underWidth;\n }\n}\n\nconst checkElementGetHeight = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n};\n\nexport const getDistanceFromBranchToFirstBlock = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;\n};\n\nexport const getHeightWaitConfig = (hasWaitConfig?: IDiagramElement) => {\n if (hasWaitConfig) {\n return (hasWaitConfig.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n\n return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n};\n\nexport const checkMaxLeft = (config: IDataDiagramConfigSvg, specific_x: number | undefined, positionMaxLeft: number | undefined) => {\n let numberTranslatePosition = config.positionMaxLeft;\n\n if (numberTranslatePosition === 0 && specific_x && specific_x > 0 && specific_x < 50) {\n numberTranslatePosition = -50;\n }\n\n if (specific_x && specific_x < numberTranslatePosition) {\n numberTranslatePosition = specific_x;\n }\n\n if (positionMaxLeft && positionMaxLeft < numberTranslatePosition) {\n numberTranslatePosition = positionMaxLeft;\n }\n if (numberTranslatePosition === config.positionMaxLeft) {\n return;\n }\n config.positionMaxLeft = numberTranslatePosition;\n};\n\nexport const checkMaxTop = (config: IDataDiagramConfigSvg, specific_y: number | undefined, positionMaxTop: number | undefined) => {\n let numberTranslatePosition = config.positionMaxTop;\n\n if (numberTranslatePosition === 0 && specific_y && specific_y > 0 && specific_y < 100) {\n numberTranslatePosition = specific_y - 120;\n }\n\n if (specific_y && specific_y < numberTranslatePosition) {\n numberTranslatePosition = specific_y;\n }\n\n if (positionMaxTop && positionMaxTop < numberTranslatePosition) {\n numberTranslatePosition = positionMaxTop;\n }\n if (numberTranslatePosition === config.positionMaxTop) {\n return;\n }\n config.positionMaxTop = numberTranslatePosition;\n};\n","import { canvasConfigReadonly } from '../../diagram-draw.service';\nimport { ICoordinatesDiagramSvg, IDataDiagramConfigSvg } from '../../interfaces/coordinates.interface';\nimport { checkMaxTop, getHeightWaitConfig } from '../calculator-element.util';\nimport { IDiagramElement, IDiagramElementBranch } from '../../interfaces/diagram.interface';\nimport { MoLibDiagramHorizontalCalculatorCoordinatesUtil } from './calculator-coordinates.util';\n\n/**\n * Horizontal branch calculator.\n * Flow direction: LEFT → RIGHT (trái sang phải).\n * Branches spread: above = UP (y giảm), under = DOWN (y tăng).\n *\n * Mapping từ trục dọc sang ngang:\n * vertical \"left\" branch (x giảm) ↔ horizontal \"above\" branch (y giảm)\n * vertical \"right\" branch (x tăng) ↔ horizontal \"under\" branch (y tăng)\n *\n * Ký hiệu trong ICoordinatesDiagramSvg:\n * (mx,my) = điểm bắt đầu Q curve\n * (x1,y1) = control point\n * (x,y) = end point của Q curve\n * (lx,ly) = điểm cuối của L sau Q\n */\nexport class MoLibDiagramHorizontalCalculatorBranchUtil {\n private static getHorizontalDistanceToFirstBlock(branch: IDiagramElementBranch) {\n if (branch.nodeOtherConfig) {\n const distToWait = 110; // increase statically since branch label is always assigned later\n return distToWait + getHeightWaitConfig(branch.nodeOtherConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;\n }\n\n // ─────────────────────────────────────────────────────────────────── public ──\n\n /** Nhánh giữa (center): kéo thẳng sang phải */\n static drawStraightLine(\n top: number, // Y tâm của element cha\n lineFormElementToBranching: number, // width element + margin đến điểm rẽ\n left: number, // X trái của element cha\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'center';\n const startDraw = left + lineFormElementToBranching;\n let Lx = startDraw;\n\n Lx += canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n Lx += this.getHorizontalDistanceToFirstBlock(branch);\n if (!branch.elements?.length) {\n Lx += maxWidthBranch + 20;\n }\n\n const coord1 = { mx: left, my: top, lx: Lx, ly: top };\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${coord1.lx} ${coord1.ly}`;\n\n if (branch.nodeOtherConfig) {\n const distToWait = 110;\n const endXToWait = startDraw + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + distToWait;\n\n branch.attributeSvgD = `M ${coord1.mx} ${coord1.my} L ${endXToWait} ${coord1.my}`;\n const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);\n const leftLine2 = endXToWait + waitWidth;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coord1.my} L ${coord1.lx} ${coord1.my}`;\n }\n branch.nodeOtherConfig.specific_x = endXToWait;\n branch.nodeOtherConfig.specific_y = coord1.my;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!branch.nodeOtherConfig.specific_height) {\n branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!branch.nodeOtherConfig.specific_width) {\n branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n }\n\n branch.specific_start_branch_x = left + lineFormElementToBranching + canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n branch.specific_start_branch_y = top;\n\n if (!branch.elements?.length) return;\n\n const widthToElement = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE + this.getHorizontalDistanceToFirstBlock(branch);\n\n branch.elements.forEach((el) => {\n el.specific_x = left + lineFormElementToBranching + widthToElement;\n el.specific_y = top - (el.specific_height ?? 0) / 2;\n });\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n /** Nhánh phía trên (above): rẽ lên, rồi bẻ phải đến element */\n static aboveLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n element: IDiagramElement,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'above';\n const { coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(\n top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'above', config\n );\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n\n if (!branch.elements?.length) return;\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) return;\n }\n\n /** Nhánh phía dưới (under): rẽ xuống, rồi bẻ phải đến element */\n static underLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n element: IDiagramElement,\n config: IDataDiagramConfigSvg\n ) {\n branch.onTheSide = 'under';\n const { coordQL1, coordQL2, isCheckAllElementConnectToExit } = this.drawAboveUnderLine(\n top, lineFormElementToBranching, left, lineBetweenBranch, branch, maxWidthBranch, 'under', config\n );\n\n branch.specific_start_branch_x = coordQL2.x;\n branch.specific_start_branch_y = coordQL2.y;\n\n // Mở rộng widthSvg nếu nhánh xuống vượt\n const maxY = (coordQL1.y ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n\n if (!branch.elements?.length) return;\n this.drawElementInBranchLine(branch, coordQL2, config);\n if (isCheckAllElementConnectToExit) return;\n }\n\n // ────────────────────────────────────────────────────────────────── private ──\n\n /** Đặt element đầu tiên trong nhánh dựa theo tọa độ cuối của QL2 */\n static drawElementInBranchLine(branch: IDiagramElementBranch, coordQL2: ICoordinatesDiagramSvg, config: IDataDiagramConfigSvg) {\n const elementFirst = branch.elements[0];\n\n // lx = X bắt đầu của element; ly = Y tâm nhánh → specific_y = tâm - half height\n elementFirst.specific_x = coordQL2.lx;\n elementFirst.specific_y = (coordQL2.ly ?? 0) - (elementFirst.specific_height ?? 0) / 2;\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(branch.elements, config);\n }\n\n /**\n * Vẽ đường rẽ nhánh kiểu horizontal:\n *\n * M left top → bắt đầu tại tâm Y của element cha\n * L Lx top → kéo NGANG sang phải đến điểm rẽ (Lx = left + lineFormElementToBranching - CURVE)\n *\n * QL1: bẻ từ hướng → sang hướng ↑ (above) hoặc ↓ (under)\n * M (Lx, top)\n * Q (Lx+C, top) → (Lx+C, top±C) control đi thẳng phải, điểm kết bắt đầu đi dọc\n * L Lx+C, top±C±straight kéo thẳng dọc (lên/xuống)\n *\n * QL2: bẻ ngược lại → hướng ngang để tới element\n * Q (Lx+C, top±C±straight±C) → (Lx+2C, top±C±straight±C)\n * control đi tiếp dọc, điểm kết đi ngang (phải)\n * L Lx+2C+distToFirst, same_Y kéo ngang đến vị trí element đầu tiên\n *\n * Sau QL2:\n * coordQL2.lx = X bắt đầu của element đầu tiên\n * coordQL2.ly = Y tâm của nhánh\n */\n static drawAboveUnderLine(\n top: number,\n lineFormElementToBranching: number,\n left: number,\n lineBetweenBranch: number,\n branch: IDiagramElementBranch,\n maxWidthBranch: number,\n direction: 'above' | 'under',\n config: IDataDiagramConfigSvg\n ) {\n const CURVE = canvasConfigReadonly().ELEMENT_HEIGHT_CURVE;\n const M = `M ${left} ${top}`;\n const Lx = left + lineFormElementToBranching - CURVE;\n const L = `L ${Lx} ${top}`;\n const straight = lineBetweenBranch - CURVE * 2; // đoạn thẳng dọc (bỏ 2 cong đầu-cuối)\n\n // ── QL1: curve từ hướng ngang → hướng dọc (lên/xuống), rồi thẳng dọc ────\n const coordQL1: ICoordinatesDiagramSvg = {\n mx: Lx,\n my: top,\n x1: Lx + CURVE, // control: đi thẳng phải thêm CURVE\n y1: top, // control: cùng Y\n x: Lx + CURVE, // end X: giữ nguyên (= Lx+CURVE)\n y: this.mathOp(direction, top, CURVE, true),\n // 'above': top - CURVE (bắt đầu đi lên)\n // 'under': top + CURVE (bắt đầu đi xuống)\n };\n // Đoạn L sau QL1: giữ nguyên X, tiếp tục đi dọc\n coordQL1.lx = coordQL1.x; // X không đổi\n coordQL1.ly = this.mathOp(direction, coordQL1.y, straight, true); // tiếp tục lên/xuống\n\n const QL1 = `M ${coordQL1.mx},${coordQL1.my} Q ${coordQL1.x1},${coordQL1.y1} ${coordQL1.x},${coordQL1.y} L ${coordQL1.lx} ${coordQL1.ly}`;\n\n // ── QL2: curve từ hướng dọc → hướng ngang (phải), rồi thẳng ngang đến element ──\n const coordQL2: ICoordinatesDiagramSvg = {\n // control: tiếp tục đi dọc thêm CURVE từ điểm cuối QL1\n x1: coordQL1.lx,\n y1: this.mathOp(direction, coordQL1.ly, CURVE, true),\n // end: rẽ ngang sang phải thêm CURVE, giữ nguyên Y tại y1\n y: this.mathOp(direction, coordQL1.ly, CURVE, true),\n x: (coordQL1.lx ?? 0) + CURVE,\n };\n\n // Đoạn L sau QL2: đi ngang (phải) đến vị trí element đầu tiên trong nhánh\n const distToFirst = this.getHorizontalDistanceToFirstBlock(branch);\n\n if (!branch.elements?.length) {\n coordQL2.lx = (coordQL2.x ?? 0) + distToFirst + maxWidthBranch;\n } else {\n coordQL2.lx = (coordQL2.x ?? 0) + distToFirst;\n }\n coordQL2.ly = coordQL2.y; // Y không đổi → tâm Y của nhánh\n\n // Xử lý nodeOtherConfig (wait block) trên nhánh\n let QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n\n if (branch.nodeOtherConfig) {\n const distToWait = 110;\n const endXToWait = (coordQL2.x ?? 0) + distToWait;\n const waitWidth = getHeightWaitConfig(branch.nodeOtherConfig);\n const leftLine2 = endXToWait + waitWidth;\n\n delete branch.nodeOtherConfig.attributeSvgD;\n QL2 = `Q ${coordQL2.x1},${coordQL2.y1} ${coordQL2.x},${coordQL2.y} M ${coordQL2.x},${coordQL2.y} L ${endXToWait},${coordQL2.y}`;\n if (branch.elements?.length) {\n branch.nodeOtherConfig.attributeSvgD = `M ${leftLine2} ${coordQL2.y} L ${coordQL2.lx} ${coordQL2.ly}`;\n }\n branch.nodeOtherConfig.specific_x = endXToWait;\n // specific_y = tâm Y của nhánh — setTranslatePositions sẽ trừ height/2 khi set translateY\n branch.nodeOtherConfig.specific_y = coordQL2.y ?? 0;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!branch.nodeOtherConfig.specific_height) {\n branch.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!branch.nodeOtherConfig.specific_width) {\n branch.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n }\n\n branch.attributeSvgD = `${M} ${L} ${QL1} ${QL2}`;\n const isCheckAllElementConnectToExit = this.checkChildrenConnectToExit(branch.elements);\n\n branch.positionMaxTop = coordQL2.y;\n checkMaxTop(config, branch.nodeOtherConfig?.specific_y, branch.positionMaxTop);\n\n return { coordQL1, coordQL2, isCheckAllElementConnectToExit };\n }\n\n static checkChildrenConnectToExit(elements: IDiagramElement[]): boolean {\n let toExit = false;\n\n if (\n elements.length &&\n (elements[elements.length - 1].subCodeOfElement || elements[elements.length - 1].code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT\n ) {\n return true;\n }\n elements.forEach((element) => {\n if (!element.branches?.length) return;\n let branchConnectToExit = 0;\n\n element.branches.forEach((branch) => {\n if (this.checkChildrenConnectToExit(branch.elements)) branchConnectToExit++;\n });\n if (branchConnectToExit === element.branches.length) toExit = true;\n });\n\n return toExit;\n }\n\n /**\n * Quy ước:\n * above + opposite=true → a - b (đi lên, y giảm)\n * above + opposite=false → a + b\n * under + opposite=true → a + b (đi xuống, y tăng)\n * under + opposite=false → a - b\n */\n static mathOp(direction: 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean): number {\n const av = a ?? 0;\n const bv = b ?? 0;\n\n switch (direction) {\n case 'above':\n return opposite ? av - bv : av + bv;\n case 'under':\n return opposite ? av + bv : av - bv;\n default:\n return av - bv;\n }\n }\n\n /** Alias để tương thích với code cũ gọi mathOperatorsCalculation */\n static mathOperatorsCalculation(direction: 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean): number {\n return this.mathOp(direction, a, b, opposite);\n }\n}\n","import { canvasConfigReadonly } from '../../diagram-draw.service';\nimport { IDataDiagramConfigSvg } from '../../interfaces/coordinates.interface';\nimport { checkMaxTop } from '../calculator-element.util';\nimport { IDiagramElement, IDiagramElementBranch } from '../../interfaces/diagram.interface';\nimport { buildFlatElement } from '../diagram.util';\nimport { MoLibDiagramHorizontalCalculatorBranchUtil } from './calculator-branch.util';\n\n/**\n * Horizontal layout calculator.\n * Mirrors MoLibDiagramCalculatorCoordinatesUtil (vertical) but rotated 90°:\n * - Elements grow LEFT → RIGHT (specific_x advances along main axis)\n * - Branches split UP / DOWN (specific_y for branch offset)\n * - \"above\" branch = upper side (y decreases)\n * - \"under\" branch = lower side (y increases)\n *\n * Key axis mapping vs. vertical:\n * vertical: specific_y ↕ specific_x centered\n * horizontal: specific_x → specific_y centered\n */\nexport class MoLibDiagramHorizontalCalculatorCoordinatesUtil {\n static setXYElements(elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg, positionY?: number) {\n if (!elements?.length) {\n return;\n }\n\n elements.forEach((currentElement, index) => {\n currentElement.specific_y = (currentElement.specific_y ?? 0) + (positionY ?? 0);\n const preElement = elements[index - 1];\n\n if (preElement) {\n // Trong horizontal: y (chiều cao) căn giữa theo preElement, x tiến sang phải\n currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) / 2 - (currentElement.specific_height ?? 0) / 2;\n currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) + this.checkElementGetMargin(preElement.nodeOtherConfig);\n\n if (preElement.position_end_branch) {\n currentElement.specific_x = preElement.position_end_branch;\n }\n }\n\n checkMaxTop(config, currentElement.specific_y, currentElement.branches?.[0]?.positionMaxTop);\n\n const top = currentElement.specific_y ?? 0;\n let lineBetweenElements = (currentElement.specific_width ?? 0) + this.checkElementGetMargin(currentElement.nodeOtherConfig);\n\n if (currentElement.branches?.length) {\n lineBetweenElements = (currentElement.specific_width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n }\n\n const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;\n const maxXRight = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 200;\n const configSvg = config.widthHeightSvgCanvas;\n\n configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;\n configSvg.widthSvg = maxXRight > configSvg.widthSvg ? maxXRight : configSvg.widthSvg;\n\n if (!currentElement.branches?.length) {\n // Element không có nhánh: vẽ đường thẳng ngang\n const drawFormToWidthExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_width ?? 0) / 2 : lineBetweenElements;\n\n currentElement.attributeSvgD = `M ${currentElement.specific_x ?? 0} ${top + (currentElement.specific_height ?? 0) / 2} l ${drawFormToWidthExit} 0`;\n currentElement.position_end = (currentElement.specific_x ?? 0) + lineBetweenElements;\n\n if (currentElement.nodeOtherConfig) {\n const waitWidth = this.getWidthWaitConfig(currentElement.nodeOtherConfig);\n const distanceElementToWait = (currentElement.specific_width ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;\n const leftStartLine2 = (currentElement.specific_x ?? 0) + distanceElementToWait + waitWidth;\n\n currentElement.attributeSvgD = `M ${currentElement.specific_x ?? 0} ${top + (currentElement.specific_height ?? 0) / 2} l ${distanceElementToWait} 0`;\n currentElement.position_end = leftStartLine2 + lineBetweenElements;\n\n currentElement.nodeOtherConfig.specific_x = (currentElement.specific_x ?? 0) + distanceElementToWait;\n // specific_y = tâm Y của đường line — setTranslatePositions sẽ trừ height/2 để căn giữa dọc\n currentElement.nodeOtherConfig.specific_y = top + (currentElement.specific_height ?? 0) / 2;\n // Đảm bảo có kích thước để setTranslatePositions tính offset đúng\n if (!currentElement.nodeOtherConfig.specific_height) {\n currentElement.nodeOtherConfig.specific_height = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n if (!currentElement.nodeOtherConfig.specific_width) {\n currentElement.nodeOtherConfig.specific_width = canvasConfigReadonly().ELEMENT_WAIT_DEFAULT;\n }\n delete currentElement.nodeOtherConfig.attributeSvgD;\n\n if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n currentElement.nodeOtherConfig.attributeSvgD = `M ${leftStartLine2} ${top + (currentElement.specific_height ?? 0) / 2} l ${canvasConfigReadonly().WAIT_TO_ELEMENT} 0`;\n }\n }\n\n return;\n }\n\n // Elements có nhánh\n const half = Math.ceil(currentElement.branches.length / 2);\n const aboveHalf = currentElement.branches.slice(0, half);\n const underHalf = currentElement.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n\n // TÍNH CHIỀU CAO TỐI ĐA CỦA NHÁNH (đây là chiều rộng trong horizontal context nhưng\n // dùng chung maxHeightBranch để đơn giản, ý nghĩa là \"khoảng trống tối thiểu dành cho nhánh không có element\")\n const maxWidthBranch = { width: 0 };\n\n this.calculatorMaxBranchWidth(currentElement, maxWidthBranch);\n currentElement.maxHeightBranch = maxWidthBranch.width;\n\n const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };\n const lineFormElementToBranching = (currentElement.specific_width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n // top = y + height/2: điểm giữa theo chiều Y → dùng làm tọa độ Y của đường ngang chính\n const topMid = top + (currentElement.specific_height ?? 0) / 2;\n\n if (brachMiddle) {\n brachMiddle.onTheSide = 'center';\n this.calculatorHeightBranch(brachMiddle.elements, maxWidthBrachMiddle);\n brachMiddle.widthBranch = {\n width: maxWidthBrachMiddle.width,\n above: maxWidthBrachMiddle.aboveWidth,\n under: maxWidthBrachMiddle.underWidth,\n };\n MoLibDiagramHorizontalCalculatorBranchUtil.drawStraightLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, brachMiddle, maxWidthBranch.width, config);\n }\n\n let hasNextSameParentElementNext = false;\n aboveHalf.reverse();\n\n aboveHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n\n branch.onTheSide = 'above';\n const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, maxWidthB);\n branch.widthBranch = {\n width: maxWidthB.width,\n above: maxWidthB.aboveWidth,\n under: maxWidthB.underWidth,\n };\n\n const branchPre = aboveHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthB.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n MoLibDiagramHorizontalCalculatorBranchUtil.aboveLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, lineBetweenBranch, branch, maxWidthBranch.width, currentElement, config);\n });\n\n underHalf.forEach((branch, indexBranch) => {\n if (!hasNextSameParentElementNext) {\n const flatElementOnBranch: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementOnBranch);\n hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);\n }\n branch.onTheSide = 'under';\n const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, maxWidthB);\n branch.widthBranch = {\n width: maxWidthB.width,\n above: maxWidthB.aboveWidth,\n under: maxWidthB.underWidth,\n };\n\n const branchPre = underHalf[indexBranch - 1];\n let lineBetweenBranch = maxWidthB.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n\n if (branchPre) {\n lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n }\n if (brachMiddle) {\n lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;\n }\n\n MoLibDiagramHorizontalCalculatorBranchUtil.underLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, lineBetweenBranch, branch, maxWidthBranch.width, currentElement, config);\n });\n });\n\n this.setTranslatePositions(elements);\n }\n\n /**\n * Set translateX/Y cho tất cả elements (bao gồm branches và nodeOtherConfig)\n */\n private static setTranslatePositions(elements: Array<IDiagramElement>) {\n elements.forEach((element) => {\n element.translateX = element.specific_x;\n element.translateY = element.specific_y;\n\n if (element.nodeOtherConfig) {\n const offsetY = (element.nodeOtherConfig.specific_height ?? 0) / 2;\n\n element.nodeOtherConfig.translateX = element.nodeOtherConfig.specific_x;\n element.nodeOtherConfig.translateY = (element.nodeOtherConfig.specific_y ?? 0) - offsetY;\n }\n\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n if (branch.nodeOtherConfig) {\n const offsetY = (branch.nodeOtherConfig.specific_height ?? 0) / 2;\n\n branch.nodeOtherConfig.translateX = branch.nodeOtherConfig.specific_x;\n branch.nodeOtherConfig.translateY = (branch.nodeOtherConfig.specific_y ?? 0) - offsetY;\n }\n\n if (branch.elements && branch.elements.length > 0) {\n this.setTranslatePositions(branch.elements);\n }\n });\n }\n });\n }\n\n /** Tính chiều rộng tối đa của nhánh (trong horizontal = chiều cao thực của nhánh không có element) */\n static calculatorMaxBranchWidth(element: IDiagramElement, maxWidthBranch: { width: number }) {\n if (!element.branches?.length) {\n return;\n }\n\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n\n maxWidthBranch.width = lineBranchNoHasElement > maxWidthBranch.width ? lineBranchNoHasElement : maxWidthBranch.width;\n\n return;\n }\n\n const total = { height: 0 };\n\n this.plusWidthElementInBranch(branch.elements, total);\n maxWidthBranch.width = total.height > maxWidthBranch.width ? total.height : maxWidthBranch.width;\n });\n }\n\n /** Tính tổng chiều rộng các elements trong nhánh (dọc theo trục X) */\n static plusWidthElementInBranch(elements: IDiagramElement[], total: { height: number }) {\n elements.forEach((element) => {\n const margin = !element.branches?.length ? this.checkElementGetMargin(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;\n\n total.height += (element.specific_width ?? 0) + margin;\n if (!element.branches?.length) {\n return;\n }\n total.height += 64;\n const theMostElementsInBranch = { height: 0 };\n\n element.branches.forEach((branch) => {\n const widthInBranch = { height: 0 };\n\n widthInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20;\n if (!branch.elements?.length) {\n widthInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;\n if (theMostElementsInBranch.height < widthInBranch.height) {\n theMostElementsInBranch.height = widthInBranch.height;\n }\n return;\n }\n this.plusWidthElementInBranch(branch.elements, widthInBranch);\n if (theMostElementsInBranch.height < widthInBranch.height) {\n theMostElementsInBranch.height = widthInBranch.height;\n }\n });\n\n total.height += theMostElementsInBranch.height;\n });\n }\n\n /**\n * Tính chiều cao (Y span) của một nhánh — dùng để offset các nhánh trên/dưới.\n * Trong horizontal context: mỗi nhánh trải dài theo Y (lên/xuống).\n */\n static calculatorHeightBranch(elements: IDiagramElement[] | undefined, maxWidth: { width: number; aboveWidth: number; underWidth: number }) {\n if (!elements?.length) {\n const w = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;\n\n maxWidth.width = w;\n maxWidth.aboveWidth = w / 2;\n maxWidth.underWidth = w / 2;\n\n return;\n }\n\n const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n elements.forEach((element) => {\n if (!element.branches?.length) {\n // element không nhánh: dùng specific_height làm Y span\n if ((element.specific_height ?? 0) < maxWidthInElements.width) {\n return;\n }\n const h = element.specific_height ?? 0;\n\n maxWidthInElements.width = h;\n maxWidthInElements.aboveWidth = h / 2;\n maxWidthInElements.underWidth = h / 2;\n\n return;\n }\n\n const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n const h = element.specific_height ?? 0;\n\n if (h > widthElementIncludeBranch.width) {\n widthElementIncludeBranch.width = h;\n widthElementIncludeBranch.aboveWidth = h / 2;\n widthElementIncludeBranch.underWidth = h / 2;\n }\n\n const half = Math.ceil(element.branches.length / 2);\n const aboveHalf = element.branches.slice(0, half);\n const underHalf = element.branches.slice(half);\n let brachMiddle: IDiagramElementBranch | undefined;\n\n if (aboveHalf.length !== underHalf.length) {\n brachMiddle = aboveHalf.pop();\n }\n if (brachMiddle) brachMiddle.onTheSide = 'center';\n aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));\n underHalf.forEach((branch) => (branch.onTheSide = 'under'));\n\n const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n element.branches.forEach((branch) => {\n const w = { width: 0, aboveWidth: 0, underWidth: 0 };\n\n this.calculatorHeightBranch(branch.elements, w);\n switch (branch.onTheSide) {\n case 'above':\n widthBranch.aboveWidth += w.width;\n break;\n case 'under':\n widthBranch.underWidth += w.width;\n break;\n case 'center':\n widthBranch.aboveWidth += w.aboveWidth;\n widthBranch.underWidth += w.underWidth;\n break;\n }\n });\n\n const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;\n\n widthBranch.aboveWidth += marginBetweenBranch / 2;\n widthBranch.underWidth += marginBetweenBranch / 2;\n const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);\n const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);\n\n if (maxWidthInElements.aboveWidth < maxAboveWidth) {\n maxWidthInElements.aboveWidth = maxAboveWidth;\n }\n if (maxWidthInElements.underWidth < maxUnderWidth) {\n maxWidthInElements.underWidth = maxUnderWidth;\n }\n\n maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n });\n\n maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;\n maxWidth.aboveWidth += maxWidthInElements.aboveWidth;\n maxWidth.underWidth += maxWidthInElements.underWidth;\n }\n\n /** Tính khoảng cách thêm vào sau element (bao gồm wait config nếu có) */\n private static checkElementGetMargin(hasWaitConfig?: IDiagramElement): number {\n if (hasWaitConfig) {\n return canvasConfigReadonly().DISTANCE_TO_WAIT + this.getWidthWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;\n }\n return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n }\n\n /** Tính chiều rộng của wait config node */\n private static getWidthWaitConfig(hasWaitConfig?: IDiagramElement): number {\n if (hasWaitConfig) {\n return (hasWaitConfig.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;\n }\n}\n","import { IArrowStyle, ILineStyle } from '@libs-ui/components-draw-line';\n\nexport const DEFAULT_NAVIGATION_LINE_STYLE: ILineStyle = {\n curve: 10,\n distancePoint: 20,\n stroke: 'var(--libs-ui-color-light-1, #4e8cf7)',\n strokeDasharray: '5',\n strokeWidth: '1',\n};\n\nexport const DEFAULT_NAVIGATION_ARROW_STYLE: IArrowStyle = {\n width: 4,\n height: 8,\n fill: 'var(--libs-ui-color-light-1, #4e8cf7)',\n};\n\nexport const DEFAULT_NAVIGATION_ENDPOINT_GAP = 8;\n","import { IDrawLineDataInput, IPoints, TYPE_MODE } from '@libs-ui/components-draw-line';\nimport { IDiagramElement } from '../../interfaces/diagram.interface';\nimport { INavigationLineStyleConfig } from '../../interfaces/navigation.interface';\nimport { DEFAULT_NAVIGATION_ARROW_STYLE, DEFAULT_NAVIGATION_ENDPOINT_GAP, DEFAULT_NAVIGATION_LINE_STYLE } from './navigation-style.define';\n\nexport class LibsUiDiagramDrawNavigationUtil {\n /** Rule chọn mode mặc định (copy từ workflows/canvas.component.ts:471). */\n static defaultModeResolver(start: { x: number; y: number }, end: { x: number; y: number }): TYPE_MODE {\n return start.x < end.x && start.y > end.y ? 'quart-in' : 's-line';\n }\n\n /**\n * Build dữ liệu navigation line (next_other_id) từ flat elements để render qua draw-line directive.\n * @param flatElements Danh sách phẳng tất cả elements (sau khi configXYElements đã chạy).\n * @param orientation Chiều layout của diagram.\n * @param styleConfig Tuỳ chỉnh style line/arrow + override resolver mode/gap.\n */\n static buildNavigationData(flatElements: IDiagramElement[], orientation: 'vertical' | 'horizontal', styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput[] {\n const result: IDrawLineDataInput[] = [];\n\n flatElements.forEach((item) => {\n if (item.branches?.length) {\n item.branches.forEach((branch, index) => {\n if (!branch.next_other_id?.length || !branch.nodeOtherConfig) {\n return;\n }\n const nodeOtherConfig = branch.nodeOtherConfig;\n const nextIds = branch.next_other_id;\n\n nextIds.forEach((nextId, idx) => {\n const target = flatElements.find((el) => el.id === nextId);\n\n if (!target) {\n return;\n }\n const lineId = nextIds.length > 1 ? `${item.id}_branch_${index}_${idx}` : `${item.id}_branch_${index}`;\n const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);\n\n if (lineData) {\n result.push(lineData);\n }\n });\n });\n return;\n }\n\n if (!item.next_other_id?.length || !item.nodeOtherConfig) {\n return;\n }\n const nodeOtherConfig = item.nodeOtherConfig;\n const nextIds = item.next_other_id;\n\n nextIds.forEach((nextId, idx) => {\n const target = flatElements.find((el) => el.id === nextId);\n\n if (!target) {\n return;\n }\n const lineId = nextIds.length > 1 ? `${item.id ?? ''}_${idx}` : (item.id ?? '');\n const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);\n\n if (lineData) {\n result.push(lineData);\n }\n });\n });\n\n return result;\n }\n\n private static buildOneLine(id: string, source: IDiagramElement, target: IDiagramElement, orientation: 'vertical' | 'horizontal', styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput | undefined {\n const gap = styleConfig?.endpointGap ?? DEFAULT_NAVIGATION_ENDPOINT_GAP;\n const points = orientation === 'horizontal' ? this.calcPointsHorizontal(source, target, gap) : this.calcPointsVertical(source, target, gap);\n\n if (!points) {\n return undefined;\n }\n const resolver = styleConfig?.modeResolver ?? this.defaultModeResolver;\n const mode = resolver(points.start, points.end);\n\n return {\n id,\n points,\n mode,\n lineStyle: { ...DEFAULT_NAVIGATION_LINE_STYLE, ...styleConfig?.lineStyle },\n arrowStyle: { ...DEFAULT_NAVIGATION_ARROW_STYLE, ...styleConfig?.arrowStyle },\n };\n }\n\n /** VERTICAL: line navigation đi NGANG — kẹp cạnh phải/trái source → cạnh trái/phải target. */\n private static calcPointsVertical(source: IDiagramElement, target: IDiagramElement, gap: number): IPoints {\n const sx = source.specific_x ?? 0;\n const sy = source.specific_y ?? 0;\n const sw = source.specific_width ?? 0;\n const sh = source.specific_height ?? 0;\n const tx = target.specific_x ?? 0;\n const ty = target.specific_y ?? 0;\n const tw = target.specific_width ?? 0;\n const th = target.specific_height ?? 0;\n\n const sMidY = sy + sh / 2;\n const tMidY = ty + th / 2;\n\n // Default: line đi sang PHẢI từ source → cạnh TRÁI target\n let start = { x: sx + sw, y: sMidY };\n let end = { x: tx - gap, y: tMidY };\n\n // Source nằm BÊN PHẢI target → line đi sang TRÁI: cạnh TRÁI source → cạnh PHẢI target\n if (sx > tx + tw) {\n start = { x: sx, y: sMidY };\n end = { x: tx + tw + gap, y: tMidY };\n return { start, end };\n }\n\n // Source nằm PHÍA TRÊN target (cùng cột hoặc gần) → đi XUỐNG vào cạnh TRÊN target\n if (sy < ty && Math.abs(sx + sw / 2 - (tx + tw / 2)) < Math.max(sw, tw)) {\n start = { x: sx + sw / 2, y: sy + sh };\n end = { x: tx + tw / 2, y: ty - gap };\n }\n return { start, end };\n }\n\n /** HORIZONTAL: line navigation đi DỌC — kẹp cạnh dưới/trên source → cạnh trên/dưới target. */\n private static calcPointsHorizontal(source: IDiagramElement, target: IDiagramElement, gap: number): IPoints {\n const sx = source.specific_x ?? 0;\n const sy = source.specific_y ?? 0;\n const sw = source.specific_width ?? 0;\n const tx = target.specific_x ?? 0;\n const ty = target.specific_y ?? 0;\n const tw = target.specific_width ?? 0;\n const th = target.specific_height ?? 0;\n\n // Default: line đi XUỐNG từ source → cạnh TRÊN target\n const start = { x: sx + sw, y: sy };\n const end = { x: tx - gap, y: ty + th / 2 };\n\n if (sy < ty) {\n end.x = tx + tw / 2;\n end.y = ty - gap;\n }\n return { start, end };\n }\n}\n","import { ComponentRef, Injectable, signal } from '@angular/core';\nimport { IDrawLineDataInput } from '@libs-ui/components-draw-line';\nimport { setStylesElement } from '@libs-ui/utils';\nimport { IRuleConnectable, TDropZoneCanDropFn } from './interfaces/canvas.interface';\nimport { IDataDiagramConfigSvg } from './interfaces/coordinates.interface';\nimport { ICanvasConfig, ICustomCanvasConfig, IDiagramElement, IDiagramElementBranch, IDropZoneIndicatorStyle } from './interfaces/diagram.interface';\nimport { INavigationLineStyleConfig } from './interfaces/navigation.interface';\nimport { MoLibDiagramCalculatorCoordinatesUtil } from './utils/calculator-element.util';\nimport { applyElementStyle, setAttributeSvgAndAppend } from './utils/diagram.util';\nimport { MoLibDiagramHorizontalCalculatorCoordinatesUtil } from './utils/horizontal/calculator-coordinates.util';\nimport { LibsUiDiagramDrawNavigationUtil } from './utils/navigation/build-navigation-data.util';\n\nconst canvasConfig = signal<ICanvasConfig>({\n ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT: 60,\n ELEMENT_MARGIN_DEFAULT: 60,\n ELEMENT_MARGIN_DEFAULT_BRANCH: 16,\n ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT: 60,\n DEFAULT_BRANCH_WHEN_NO_ELEMENT: 100,\n ELEMENT_HEIGHT_CURVE: 10,\n ELEMENT_SVG_STROKE_COLOR: '9ca2ad',\n ELEMENT_SVG_STROKE_WIDTH: '1',\n ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST: 78,\n\n DISTANCE_TO_WAIT: 30,\n WAIT_TO_ELEMENT: 50,\n ELEMENT_WAIT_DEFAULT: 28,\n DISTANCE_WAIT_TO_NEXT_LINE: 4,\n\n TYPE_ELEMENT_EXIT: 'EXIT',\n TYPE_ELEMENT_WORKFLOW: 'WORKFLOW',\n WIDTH_ELEMENT_DEFAULT: 165,\n HEIGHT_ELEMENT_DEFAULT: 48,\n\n ADD_ICON_DIAMETER: 24,\n I18N_END_NODE: 'i18n_end_journey_new',\n});\n\nexport const canvasConfigReadonly = canvasConfig.asReadonly();\nexport const storeDataDefault = {\n positionMaxLeft: 0,\n positionMaxTop: 0,\n widthHeightSvgCanvas: { heightSvg: window.innerHeight, widthSvg: window.innerWidth },\n};\n@Injectable({\n providedIn: 'root',\n})\nexport class LibsUiDiagramDrawService {\n private readonly configCanvas = signal<ICustomCanvasConfig | undefined>(undefined);\n readonly orientation = signal<'vertical' | 'horizontal'>('vertical');\n private readonly elementSvg = signal<SVGPathElement | undefined>(undefined);\n private readonly attributeSvgD = signal<string>('');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly componentRefs = signal<ComponentRef<any>[]>([]);\n\n // Virtualization Tracking\n private virtualViewport?: { x: number; y: number; width: number; height: number };\n private virtualFlatElements: { element: IDiagramElement; branch?: IDiagramElementBranch; shouldShowArrow: boolean; isOtherConfig: boolean; parentId?: string | number }[] = [];\n private virtualFlatBranches: IDiagramElementBranch[] = [];\n private readonly virtualNodesMap = new Map<string, { component?: ComponentRef<any>; arrow?: HTMLElement; label?: HTMLElement }>();\n\n public updateViewport(vp: { x: number; y: number; width: number; height: number }) {\n this.virtualViewport = vp;\n if (this.configCanvas()?.useVirtualizationTemplate) {\n this.applyVirtualizationDiff();\n }\n }\n\n set setConfig(config: ICustomCanvasConfig) {\n this.configCanvas.set(config);\n }\n\n set setConfigCanvas(config: Partial<ICanvasConfig>) {\n if (!config) {\n return;\n }\n\n canvasConfig.update((current) => ({ ...current, ...config }));\n }\n\n configXYElements(elements: Array<IDiagramElement>, updateSVG?: boolean, positionX?: number) {\n const storeData = this.configCanvas()?.storeDataDefine ?? storeDataDefault;\n const maxLeftOrigin = storeData.positionMaxLeft;\n const maxTopOrigin = storeData.positionMaxTop ?? 0;\n\n if (this.orientation() === 'horizontal') {\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(elements, storeData, positionX);\n } else {\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(elements, storeData, positionX);\n }\n\n const maxLeftNew = storeData.positionMaxLeft;\n const maxTopNew = storeData.positionMaxTop ?? 0;\n\n if (!this.elementSvg()) {\n this.elementSvg.set(document.createElementNS('http://www.w3.org/2000/svg', 'path'));\n }\n\n if (!updateSVG && this.configCanvas()?.svgContainer && this.elementSvg()) {\n setAttributeSvgAndAppend(this.configCanvas()?.svgContainer, this.elementSvg(), '');\n }\n\n if (this.orientation() === 'horizontal' && maxTopOrigin !== maxTopNew) {\n this.updatePositionElements(maxTopNew, elements, storeData);\n return;\n }\n if (this.orientation() === 'vertical' && maxLeftOrigin !== maxLeftNew) {\n this.updatePositionElements(maxLeftNew, elements, storeData);\n return;\n }\n\n if (this.elementSvg()) {\n this.attributeSvgD.set('');\n this.buildSvgElement(elements);\n this.elementSvg()?.setAttribute('d', this.attributeSvgD());\n }\n }\n\n private updatePositionElements(positionOffset: number, elements: Array<IDiagramElement>, config: IDataDiagramConfigSvg) {\n if (positionOffset && positionOffset < 0) {\n positionOffset = positionOffset * -1 + 200; // 100 là khoảng cách cách biên\n }\n if (this.orientation() === 'horizontal') {\n MoLibDiagramHorizontalCalculatorCoordinatesUtil.setXYElements(elements, { ...config, updateSVG: true }, positionOffset);\n } else {\n MoLibDiagramCalculatorCoordinatesUtil.setXYElements(elements, { ...config, updateSVG: true }, positionOffset);\n }\n if (!this.elementSvg()) {\n this.elementSvg.set(document.createElementNS('http://www.w3.org/2000/svg', 'path'));\n }\n if (this.elementSvg()) {\n this.attributeSvgD.set('');\n this.buildSvgElement(elements);\n this.elementSvg()?.setAttribute('d', this.attributeSvgD());\n }\n }\n\n private buildSvgElement(elements: Array<IDiagramElement>) {\n elements.forEach((currentElement) => {\n if (currentElement.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${currentElement.attributeSvgD}`);\n }\n if (currentElement.nodeOtherConfig?.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${currentElement.nodeOtherConfig?.attributeSvgD}`);\n }\n if (!currentElement.branches?.length) {\n return;\n }\n\n currentElement.branches.forEach((branch) => {\n if (branch.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${branch.attributeSvgD}`);\n }\n if (branch.nodeOtherConfig?.attributeSvgD) {\n this.attributeSvgD.update((prev) => `${prev ?? ''} ${branch.nodeOtherConfig?.attributeSvgD}`);\n }\n\n if (!branch.elements.length) {\n return;\n }\n\n this.buildSvgElement(branch.elements);\n });\n });\n }\n\n /**\n * Render tất cả nodes từ elements array\n */\n renderNodes(elements: Array<IDiagramElement>) {\n if (this.configCanvas()?.useVirtualizationTemplate) {\n this.extractVirtualElements(elements);\n this.applyVirtualizationDiff();\n return;\n }\n\n this.clearNodes();\n this.renderElementsRecursively(elements, true);\n this.renderBranchLabels(elements);\n }\n\n private extractVirtualElements(elements: IDiagramElement[]) {\n this.virtualFlatElements = [];\n this.virtualFlatBranches = [];\n const scan = (list: IDiagramElement[], branch?: IDiagramElementBranch, isFirstLevel = true) => {\n list.forEach((el, index) => {\n const shouldShowArrow = !(isFirstLevel && index === 0);\n this.virtualFlatElements.push({ element: el, branch, isOtherConfig: false, shouldShowArrow, parentId: el.id });\n if (el.nodeOtherConfig) this.virtualFlatElements.push({ element: el.nodeOtherConfig, branch, isOtherConfig: true, shouldShowArrow: false, parentId: el.id });\n if (el.branches) {\n el.branches.forEach((b, bIndex) => {\n if (!b.label) b.label = `Nhánh ${bIndex + 1}`;\n this.virtualFlatBranches.push(b);\n if (b.elements) scan(b.elements, b, false);\n if (b.nodeOtherConfig) this.virtualFlatElements.push({ element: b.nodeOtherConfig, branch: b, isOtherConfig: true, shouldShowArrow: false, parentId: 'branch_' + bIndex + '_' + el.id });\n });\n }\n });\n };\n scan(elements, undefined, true);\n }\n\n private applyVirtualizationDiff() {\n const vp = this.virtualViewport;\n if (!vp) return;\n const config = this.configCanvas();\n const container = config?.nodesContainer?.nativeElement;\n if (!container || !config) return;\n\n const buffer = 300;\n const visibleIds = new Set<string>();\n\n this.virtualFlatElements.forEach((item) => {\n const el = item.element;\n if (el.translateX === undefined || el.translateY === undefined) return;\n if (el.translateX + (el.specific_width || 165) < vp.x - buffer || el.translateX > vp.x + vp.width + buffer || el.translateY + (el.specific_height || 48) < vp.y - buffer || el.translateY > vp.y + vp.height + buffer) return;\n\n const id = String(item.parentId) + (item.isOtherConfig ? '_other' : '');\n visibleIds.add(id);\n\n if (!this.virtualNodesMap.has(id)) {\n const componentType = item.isOtherConfig ? config.nodeOtherConfigComponentType : config.nodeComponentType;\n if (componentType && config.viewContainerRef) {\n const ref = config.viewContainerRef.createComponent(componentType);\n ref.setInput('element', el);\n if (item.branch) ref.setInput('branch', item.branch);\n ref.setInput('orientation', this.orientation());\n\n const domEl = ref.location.nativeElement as HTMLElement;\n domEl.classList.add('diagram-node-dynamic');\n applyElementStyle(domEl, el);\n container.appendChild(domEl);\n\n let arrow: HTMLElement | undefined;\n if (item.shouldShowArrow && !item.isOtherConfig) {\n arrow = this.createArrowIndicator(el, container);\n }\n this.virtualNodesMap.set(id, { component: ref, arrow });\n }\n } else {\n const cache = this.virtualNodesMap.get(id);\n if (cache) {\n if (cache.component) applyElementStyle(cache.component.location.nativeElement, el);\n if (cache.arrow) {\n const arrowSize = 16;\n const nodeWidth = el.specific_width ?? 165;\n const nodeHeight = el.specific_height ?? 48;\n if (this.orientation() === 'horizontal') {\n cache.arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 4L16 8L8 12Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n cache.arrow.style.left = `${el.translateX - arrowSize}px`;\n cache.arrow.style.top = `${el.translateY + nodeHeight / 2 - arrowSize / 2}px`;\n } else {\n cache.arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 16L4 12H12L8 16Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n cache.arrow.style.left = `${el.translateX + nodeWidth / 2 - arrowSize / 2}px`;\n cache.arrow.style.top = `${el.translateY - arrowSize}px`;\n }\n }\n }\n }\n });\n\n this.virtualFlatBranches.forEach((branch, index) => {\n const x = branch.specific_start_branch_x;\n const y = branch.specific_start_branch_y;\n if (x === undefined || y === undefined) return;\n if (x < vp.x - buffer || x > vp.x + vp.width + buffer || y < vp.y - buffer || y > vp.y + vp.height + buffer) return;\n\n const id = 'branch_' + index + '_' + Math.round(x) + '_' + Math.round(y);\n visibleIds.add(id);\n\n if (!this.virtualNodesMap.has(id)) {\n const labelDiv = this.createBranchLabel(branch);\n if (labelDiv) this.virtualNodesMap.set(id, { label: labelDiv });\n } else {\n const cache = this.virtualNodesMap.get(id);\n if (cache?.label) {\n const labelDiv = cache.label;\n const labelRect = labelDiv.getBoundingClientRect();\n const labelW = labelRect.width || labelDiv.offsetWidth;\n const labelH = labelRect.height || labelDiv.offsetHeight;\n if (this.orientation() === 'vertical') {\n labelDiv.style.left = `${x - labelW / 2 - 4}px`;\n labelDiv.style.top = `${y - labelH / 2 + 4}px`;\n } else {\n labelDiv.style.left = `${x + 4}px`;\n labelDiv.style.top = `${y - labelH / 2}px`; // center over wire\n }\n }\n }\n });\n\n Array.from(this.virtualNodesMap.entries()).forEach(([id, cache]) => {\n if (!visibleIds.has(id)) {\n cache.component?.destroy();\n cache.arrow?.remove();\n cache.label?.remove();\n this.virtualNodesMap.delete(id);\n }\n });\n }\n\n /**\n * Render elements và branches một cách đệ quy\n */\n private renderElementsRecursively(elements: Array<IDiagramElement>, isFirstLevel = true, branch?: IDiagramElementBranch) {\n elements.forEach((element, index) => {\n if (element.translateX !== undefined && element.translateY !== undefined) {\n // Main node: có arrow nếu không phải element đầu tiên của level đầu\n const shouldShowArrow = !(isFirstLevel && index === 0);\n this.createNode(element, branch, shouldShowArrow, false);\n }\n\n // Render nodeOtherConfig nếu có (nodes phụ) - KHÔNG có arrow\n if (element.nodeOtherConfig?.translateX !== undefined && element.nodeOtherConfig.translateY !== undefined) {\n this.createNode(element.nodeOtherConfig, branch, false, true);\n }\n\n // Render branches nếu có\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch) => {\n if (branch.elements && branch.elements.length > 0) {\n this.renderElementsRecursively(branch.elements, false, branch);\n }\n if (branch.nodeOtherConfig?.translateX !== undefined && branch.nodeOtherConfig.translateY !== undefined) {\n this.createNode(branch.nodeOtherConfig, branch, false, true);\n }\n });\n }\n });\n }\n\n /**\n * Tạo một node component động\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private createNode(element: IDiagramElement, branch: IDiagramElementBranch | undefined, shouldShowArrow: boolean, isNodeOtherConfig: boolean): ComponentRef<any> | undefined {\n const config = this.configCanvas();\n if (!config?.viewContainerRef) {\n return;\n }\n\n if (config.useVirtualizationTemplate) {\n if (config.nodesContainer?.nativeElement) {\n if (shouldShowArrow && !isNodeOtherConfig) {\n this.createArrowIndicator(element, config.nodesContainer.nativeElement);\n }\n }\n return;\n }\n\n const componentType = isNodeOtherConfig ? config.nodeOtherConfigComponentType : config.nodeComponentType;\n\n if (!componentType) {\n return;\n }\n\n const componentRef = config.viewContainerRef.createComponent(componentType);\n const el = componentRef.location.nativeElement as HTMLElement;\n\n componentRef.setInput('element', element);\n if (branch) {\n componentRef.setInput('branch', branch);\n }\n componentRef.setInput('orientation', this.orientation());\n el.classList.add('diagram-node-dynamic');\n\n applyElementStyle(el, element);\n\n if (config.nodesContainer?.nativeElement) {\n config.nodesContainer.nativeElement.appendChild(el);\n\n if (shouldShowArrow && !isNodeOtherConfig) {\n this.createArrowIndicator(element, config.nodesContainer.nativeElement);\n }\n }\n\n this.componentRefs.update((refs) => [...refs, componentRef]); // Lưu reference để cleanup sau\n\n return componentRef;\n }\n\n /**\n * Clear tất cả nodes đã tạo\n */\n clearNodes() {\n this.componentRefs().forEach((ref) => {\n ref.destroy();\n });\n this.componentRefs.set([]);\n\n Array.from(this.virtualNodesMap.values()).forEach((cache) => {\n cache.component?.destroy();\n cache.arrow?.remove();\n cache.label?.remove();\n });\n this.virtualNodesMap.clear();\n\n const config = this.configCanvas();\n const nodesContainer = config?.nodesContainer?.nativeElement;\n if (nodesContainer) {\n if (!config?.useVirtualizationTemplate) {\n const dynamicNodes = nodesContainer.querySelectorAll('.diagram-node-dynamic');\n dynamicNodes.forEach((node: Element) => node.remove());\n }\n const labels = nodesContainer.querySelectorAll('.branch-label');\n labels.forEach((label: Element) => label.remove());\n const arrows = nodesContainer.querySelectorAll('.node-arrow-indicator');\n arrows.forEach((arrow: Element) => arrow.remove());\n }\n }\n\n /**\n * Tạo mũi tên indicator chỉ hướng vào node.\n * - vertical: mũi tên ▼ phía TRÊN node (luồng trên → xuống)\n * - horizontal: mũi tên ► phía TRÁI node (luồng trái → phải)\n */\n private createArrowIndicator(element: IDiagramElement, container: HTMLElement): HTMLElement | undefined {\n if (element.translateX === undefined || element.translateY === undefined) {\n return undefined;\n }\n\n const arrow = document.createElement('div');\n arrow.className = 'node-arrow-indicator';\n arrow.style.position = 'absolute';\n arrow.style.zIndex = '1';\n arrow.style.pointerEvents = 'none';\n\n const arrowSize = 16;\n const nodeWidth = element.specific_width ?? 0;\n const nodeHeight = element.specific_height ?? 0;\n\n if (this.orientation() === 'horizontal') {\n // Mũi tên ► ở bên TRÁI node, căn giữa theo chiều cao\n arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 4L16 8L8 12Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n arrow.style.left = `${element.translateX - arrowSize}px`;\n arrow.style.top = `${element.translateY + nodeHeight / 2 - arrowSize / 2}px`;\n } else {\n // Mũi tên ▼ ở phía TRÊN node, căn giữa theo chiều rộng\n arrow.innerHTML = `\n <svg width=\"${arrowSize}\" height=\"${arrowSize}\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 16L4 12H12L8 16Z\" fill=\"#9ca3af\"/>\n </svg>\n `;\n arrow.style.left = `${element.translateX + nodeWidth / 2 - arrowSize / 2}px`;\n arrow.style.top = `${element.translateY - arrowSize}px`;\n }\n\n container.appendChild(arrow);\n return arrow;\n }\n\n /**\n * Render branch labels (text annotations on branches)\n */\n private renderBranchLabels(elements: Array<IDiagramElement>) {\n const svgContainer = this.configCanvas()?.svgContainer?.nativeElement;\n if (!svgContainer) {\n return;\n }\n\n elements.forEach((element) => {\n if (element.branches && element.branches.length > 0) {\n element.branches.forEach((branch, index) => {\n if (branch.specific_start_branch_x !== undefined && branch.specific_start_branch_y !== undefined) {\n if (!branch.label) {\n branch.label = `Nhánh ${index + 1}`;\n }\n this.createBranchLabel(branch);\n }\n\n if (branch.elements && branch.elements.length > 0) {\n this.renderBranchLabels(branch.elements);\n }\n });\n }\n });\n }\n\n private createBranchLabel(branch: IDiagramElementBranch): HTMLElement | undefined {\n const config = this.configCanvas();\n const container = config?.nodesContainer?.nativeElement;\n if (!container) {\n return undefined;\n }\n\n const labelDiv = document.createElement('div');\n labelDiv.className = `branch-label ${branch.labelClassName || 'libs-ui-font-h7r'}`;\n labelDiv.textContent = branch.label || '';\n\n labelDiv.style.position = 'absolute';\n labelDiv.style.padding = '2px 7px';\n labelDiv.style.borderRadius = '10px';\n labelDiv.style.backgroundColor = branch.labelBgColor || '#f3f4f6';\n labelDiv.style.color = branch.labelColor || '#374151';\n labelDiv.style.whiteSpace = 'nowrap';\n labelDiv.style.zIndex = '2';\n labelDiv.style.pointerEvents = 'none';\n\n container.appendChild(labelDiv);\n\n const startX = branch.specific_start_branch_x ?? 0;\n const startY = branch.specific_start_branch_y ?? 0;\n const labelW = labelDiv.offsetWidth;\n const labelH = labelDiv.offsetHeight || 18;\n\n if (this.orientation() === 'horizontal') {\n /**\n * Horizontal: label nằm TRÊN đường line nằm ngang.\n * specific_start_branch = điểm bắt đầu đoạn thẳng ngang đến element.\n * Đặt label tịnh tiến sang phải 8px từ ngoặt nhánh, và căn giữa dây.\n */\n labelDiv.style.left = `${startX + 4}px`;\n labelDiv.style.top = `${startY - labelH / 2}px`;\n } else {\n /**\n * Vertical: label nằm BÊN TRÁI đường ngang, căn giữa theo Y.\n * specific_start_branch = điểm đầu đoạn thẳng đến element (sau curve).\n */\n labelDiv.style.left = `${startX - labelW / 2 - 4}px`;\n labelDiv.style.top = `${startY - labelH / 2 + 4}px`;\n }\n return labelDiv;\n }\n\n /**\n * Render dấu \"+\" tại mỗi vị trí có thể thả element từ sidebar.\n * Service tự tạo DOM elements và inject vào nodesContainer.\n * @param flatElements Danh sách flat elements đã tính toán vị trí\n * @param onDrop Callback khi người dùng thả element vào một \"+\"\n * @param canDropFn (tùy chọn) Function kiểm tra điều kiện hiển thị drop zone.\n * ```\n */\n renderDropZones(flatElements: IDiagramElement[], onDrop: (element: IDiagramElement, branch: IDiagramElementBranch | undefined, dragData: string) => void, canDropFn: TDropZoneCanDropFn, ruleConnectableElements: Array<IRuleConnectable>): void {\n this.clearDropZones();\n const container = this.configCanvas()?.nodesContainer?.nativeElement as HTMLElement | undefined;\n if (!container) return;\n\n flatElements.forEach((el) => {\n if (el.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) return;\n\n if (el.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n el.branches?.forEach((branch) => {\n if (canDropFn(undefined, el, branch, ruleConnectableElements)) return;\n\n const top = this.orientation() === 'horizontal' ? this.calcDropZoneTopBranchH(el, branch) : this.calcDropZoneTopBranch(el, branch);\n const left = this.orientation() === 'horizontal' ? this.calcDropZoneLeftBranchH(el, branch) : this.calcDropZoneLeftBranch(el, branch);\n this.createDropZoneEl(container, top, left, el, branch, onDrop);\n });\n } else {\n if (!canDropFn(undefined, el, undefined, ruleConnectableElements)) return;\n\n const top = this.orientation() === 'horizontal' ? this.calcDropZoneTopNodeH(el) : this.calcDropZoneTopNode(el);\n const left = this.orientation() === 'horizontal' ? this.calcDropZoneLeftNodeH(el) : this.calcDropZoneLeftNode(el);\n this.createDropZoneEl(container, top, left, el, undefined, onDrop);\n }\n });\n }\n\n /**\n * Build dữ liệu navigation line (next_other_id) từ flat elements để render qua draw-line directive.\n * Service tự đọc `orientation()` để chọn pattern endpoint phù hợp.\n * Caller chỉ cần truyền vào `drawLineFunctionControl.setData(...)`.\n */\n buildNavigationData(flatElements: IDiagramElement[], styleConfig?: INavigationLineStyleConfig): IDrawLineDataInput[] {\n return LibsUiDiagramDrawNavigationUtil.buildNavigationData(flatElements, this.orientation(), styleConfig);\n }\n\n /** Xóa tất cả drop zone \"+\" khỏi DOM */\n clearDropZones(): void {\n const container = this.configCanvas()?.nodesContainer?.nativeElement as HTMLElement | undefined;\n if (!container) return;\n container.querySelectorAll('.diagram-drop-zone').forEach((el) => el.remove());\n }\n\n private createDropZoneEl(\n container: HTMLElement,\n top: number,\n left: number,\n element: IDiagramElement,\n branch: IDiagramElementBranch | undefined,\n onDrop: (element: IDiagramElement, branch: IDiagramElementBranch | undefined, dragData: string) => void\n ): void {\n const indicatorStyle: IDropZoneIndicatorStyle | undefined = this.configCanvas()?.dropZoneStyle;\n const RECT_W = element.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT;\n const RECT_H = element.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT;\n\n // Tâm của nút tròn\n const centerX = left + canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n const centerY = top + canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n\n // Hit zone vô hình: rộng hơn rectangle một khoản padding để bắt drag sớm hơn\n const HIT_PAD = 20;\n const HIT_W = RECT_W + HIT_PAD * 2;\n const HIT_H = RECT_H + HIT_PAD * 2;\n const hitLeft = centerX - HIT_W / 2;\n const hitTop = centerY - HIT_H / 2;\n\n // ── Hit zone (wrapper vô hình, vùng nhận drag rộng) ─────────────────\n const hitZone = document.createElement('div');\n hitZone.className = 'diagram-drop-zone';\n hitZone.style.cssText = `\n position: absolute;\n top: ${hitTop}px;\n left: ${hitLeft}px;\n z-index: 9;\n width: ${HIT_W}px;\n height: ${HIT_H}px;\n cursor: pointer;\n `;\n\n // ── Indicator (con bên trong, phần hiển thị) ─────────────────────────\n const indicator = document.createElement('div');\n indicator.style.pointerEvents = 'none'; // tránh tranh chấp event với hitZone\n\n // Vị trí dot trong hitZone (căn giữa hitZone)\n const dotOffsetLeft = HIT_W / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n const dotOffsetTop = HIT_H / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n\n // Vị trí rectangle trong hitZone (căn giữa hitZone)\n const rectOffsetLeft = HIT_PAD;\n const rectOffsetTop = HIT_H / 2 - RECT_H / 2;\n\n const applyDotStyle = () => {\n const s = indicatorStyle;\n const size = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const bg = s?.backgroundColor ?? '#3b82f6';\n const iconColor = s?.iconColor ?? '#ffffff';\n const opacity = s?.opacity ?? 0.95;\n const borderRadius = s?.borderRadius ?? '50%';\n\n setStylesElement(indicator, {\n position: 'absolute',\n top: `${dotOffsetTop}px`,\n left: `${dotOffsetLeft}px`,\n width: `${size}px`,\n height: `${size}px`,\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 0.15s ease',\n border: 'none',\n });\n\n if (s?.renderIndicator) {\n indicator.innerHTML = s.renderIndicator(size);\n } else {\n indicator.innerHTML = `\n <div style=\"\n width: ${size}px;\n height: ${size}px;\n background-color: ${bg};\n border-radius: ${borderRadius};\n opacity: ${opacity};\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n \"><i class=\"libs-ui-icon-add before:text-[${iconColor}]\"></i></div>\n `;\n }\n };\n\n const applyRectStyle = () => {\n const s = indicatorStyle;\n const hoverBg = s?.hoverBackgroundColor ?? '#eef4ff';\n const hoverBorder = s?.hoverBorderColor ?? 'rgba(59, 130, 246, 0.7)';\n const hoverBorderStyle = s?.hoverBorderStyle ?? 'dashed';\n const hoverRadius = s?.hoverBorderRadius ?? 10;\n\n setStylesElement(indicator, {\n top: `${rectOffsetTop}px`,\n left: `${rectOffsetLeft}px`,\n width: `${RECT_W}px`,\n height: `${RECT_H}px`,\n borderRadius: `${hoverRadius}px`,\n backgroundColor: hoverBg,\n border: `2px ${hoverBorderStyle} ${hoverBorder}`,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n });\n\n // Nếu có hàm render động cho trạng thái hover — gọi nó\n indicator.innerHTML = s?.renderHoverIndicator ? s.renderHoverIndicator() : '';\n };\n\n applyDotStyle();\n hitZone.appendChild(indicator);\n\n hitZone.addEventListener('dragenter', (e: DragEvent) => {\n e.preventDefault();\n applyRectStyle();\n });\n\n hitZone.addEventListener('dragover', (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n });\n\n hitZone.addEventListener('dragleave', (e: DragEvent) => {\n if (!hitZone.contains(e.relatedTarget as Node)) {\n applyDotStyle();\n }\n });\n\n hitZone.addEventListener('drop', (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const raw = e.dataTransfer?.getData('application/json') ?? '';\n onDrop(element, branch, raw);\n });\n\n container.appendChild(hitZone);\n }\n\n // ── Vertical drop zone helpers (existing) ───────────────────────────────────\n private calcDropZoneTopBranch(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const oc = branch.nodeOtherConfig;\n if (oc) return (oc.specific_y ?? 0) + (oc.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + 10;\n return (branch.specific_start_branch_y ?? 0) + 30;\n }\n\n private calcDropZoneLeftBranch(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const firstEl = branch.elements?.[0];\n if (firstEl?.translateX !== undefined) return firstEl.translateX + (firstEl.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n return (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n }\n\n private calcDropZoneTopNode(el: IDiagramElement): number {\n const oc = el.nodeOtherConfig;\n if (oc) return (oc.specific_y ?? 0) + (oc.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + 10;\n return (el.translateY ?? 0) + (el.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT) + 10;\n }\n\n private calcDropZoneLeftNode(el: IDiagramElement): number {\n return (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT) / 2 - canvasConfigReadonly().ADD_ICON_DIAMETER / 2;\n }\n\n // ── Horizontal drop zone helpers ─────────────────────────────────────────────\n /**\n * Horizontal node: \"+\" nằm giữa đường line nối 2 node — căn giữa Y của element.\n */\n private calcDropZoneTopNodeH(el: IDiagramElement): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const centerY = (el.translateY ?? 0) + (el.specific_height ?? canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT) / 2;\n return centerY - D / 2;\n }\n\n private calcDropZoneLeftNodeH(el: IDiagramElement): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const M = canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n const oc = el.nodeOtherConfig;\n\n if (oc) {\n const right = (oc.specific_x ?? 0) + (oc.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT);\n return right + M / 2 - D / 2;\n }\n\n const right = (el.translateX ?? 0) + (el.specific_width ?? canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT);\n // Midpoint của khoảng trống giữa node và node tiếp theo (gap = ELEMENT_MARGIN_DEFAULT)\n return right + M / 2 - D / 2;\n }\n\n /**\n * Horizontal branch: \"+\" nằm căn giữa Y của branch line, sau phần tử cuối trong nhánh.\n */\n private calcDropZoneTopBranchH(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n // specific_start_branch_y = tâm Y của đường nhánh\n const centerY = branch.specific_start_branch_y ?? 0;\n return centerY - D / 2;\n }\n\n private calcDropZoneLeftBranchH(el: IDiagramElement, branch: IDiagramElementBranch): number {\n const D = canvasConfigReadonly().ADD_ICON_DIAMETER;\n const M = canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;\n\n // Sau nodeOtherConfig của nhánh (cổ nhánh)\n const oc = branch.nodeOtherConfig;\n if (oc?.specific_x !== undefined) {\n return (oc.specific_x ?? 0) + (oc.specific_width ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + M / 2 - D / 2;\n }\n // Nếu nhánh không có nodeOtherConfig: đặt sau điểm rẽ nhánh\n return (branch.specific_start_branch_x ?? 0) + M / 2 - D / 2;\n }\n}\n","import { IBranchEndCount } from '../interfaces/canvas.interface';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\n\nexport class LibsUiDiagramDrawCanvasUtil {\n static buildFlatElement(elements: Array<IDiagramElement>, flatElementsContainer: Array<IDiagramElement>) {\n elements.forEach((element) => {\n flatElementsContainer.push(element);\n if (!element.branches?.length) {\n return;\n }\n LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(element, flatElementsContainer);\n });\n }\n\n static flatElementHasBranch(element: IDiagramElement, flatElementsContainer: Array<IDiagramElement>) {\n if (!element.branches?.length) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n return;\n }\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(branch.elements, flatElementsContainer);\n });\n }\n\n static getDefaultStorageBranchEndCount(): IBranchEndCount {\n return { branchContainer: undefined, count: 0, branchEmpty: 0 };\n }\n\n /**\n * data: sử dụng reference Object type nên count sẽ đệ quy cho đến node cuối cùng\n * data.branchContainer: branch cuối cùng của element không next đến idElement\n * data.count: số lượng branch có next_id đến idElement\n */\n static getBranchContainerAndCountElementHasNextIdToElement(element: IDiagramElement, idElement: string | undefined, data: IBranchEndCount, flowFlatElements: Array<IDiagramElement>) {\n if (!element?.branches) {\n return;\n }\n element.branches.forEach((branch) => {\n if (!branch.elements?.length) {\n data.count++;\n data.branchContainer = branch;\n data.branchEmpty++;\n\n return;\n }\n const lastElement = branch.elements[branch.elements.length - 1];\n\n if (!lastElement.next_id) {\n return;\n }\n if (lastElement.branches?.length) {\n const dataOfLastElement = this.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(lastElement, idElement, dataOfLastElement, flowFlatElements);\n if (!dataOfLastElement.count) {\n lastElement.next_id = '';\n\n return;\n }\n data.count++;\n data.branchContainer = branch;\n if (dataOfLastElement.count === 1) {\n data.branchContainer = dataOfLastElement.branchContainer;\n\n return;\n }\n\n return;\n }\n const nextOfLastElement = flowFlatElements.find((el) => el.id === lastElement.next_id);\n\n if (nextOfLastElement && nextOfLastElement.id !== idElement) {\n return;\n }\n data.count++;\n data.branchContainer = branch;\n });\n }\n\n static getElementHasCurrentBranchOrCurrentElement(currentBranch?: IDiagramElementBranch, currentElement?: IDiagramElement, flatElements?: Array<IDiagramElement>): { currentBranch?: IDiagramElementBranch; element?: IDiagramElement } {\n const data: { currentBranch?: IDiagramElementBranch; element?: IDiagramElement } = {\n currentBranch: undefined,\n element: undefined,\n };\n\n if (!flatElements?.length || (!currentBranch && !currentElement)) {\n return data;\n }\n\n if (!currentElement) {\n data.currentBranch = currentBranch;\n data.element = flatElements.find((el) => !!el.branches?.find((branch) => branch === currentBranch));\n\n return data;\n }\n const elementsHasBranches = flatElements.filter((item) => item.branches?.length);\n\n if (!elementsHasBranches) {\n return data;\n }\n for (const element of elementsHasBranches) {\n const branches = element.branches;\n\n if (!branches) {\n return data;\n }\n for (const branch of branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (branch.elements.find((item) => item.id === currentElement.id)) {\n data.currentBranch = branch;\n data.element = element;\n\n return data;\n }\n }\n }\n\n return data;\n }\n\n static findAndDeleteElementFromContainer(containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public static getBranchOfElement(elementId: string, flatElements: Array<IDiagramElement>, elementTypeWorkflow: string) {\n const flatElementHasBranch = flatElements.filter((item) => item.element_type === elementTypeWorkflow);\n\n if (!flatElementHasBranch) {\n return;\n }\n\n for (const item of flatElementHasBranch) {\n if (!item.branches?.length) {\n continue;\n }\n for (const branch of item.branches) {\n const index = branch.elements.findIndex((el) => el.id === elementId);\n\n if (index === -1) {\n continue;\n }\n\n return branch;\n }\n }\n\n return;\n }\n}\n\nexport const getDefaultConfigConstituentBranches = (code: string, dataDefault: IDiagramElement) => {\n dataDefault.branches = [\n {\n elements: [],\n },\n {\n elements: [],\n },\n ];\n\n return dataDefault;\n};\n\nexport const findAndDeleteElementFromContainer = (containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean => {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { cloneDeep, uuid } from '@libs-ui/utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { canvasConfigReadonly } from './diagram-draw.service';\nimport { IBranchEndCount, IHandlerFunction, IRuleConnectable } from './interfaces/canvas.interface';\nimport { IDiagramElement, IDiagramElementBranch } from './interfaces/diagram.interface';\nimport { getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';\n\n@Injectable({ providedIn: 'root' })\nexport class LibsUiDiagramDrawCanvasService {\n private elements!: Array<IDiagramElement>;\n private flatElements!: Array<IDiagramElement>;\n private handlerFunction!: IHandlerFunction;\n private elementRuleConnectable: Array<IRuleConnectable> = [];\n\n private readonly translateService = inject(TranslateService);\n\n public set HandlerFunction(handlerFunction: IHandlerFunction) {\n this.handlerFunction = handlerFunction;\n }\n\n public get HandlerFunction() {\n return this.handlerFunction;\n }\n\n public loadElements(elements: Array<IDiagramElement>, positionFirstNode: { x: number; y: number }, ruleConnectableElements: Array<IRuleConnectable>) {\n if (!elements || !elements.length) {\n return;\n }\n\n this.flatElements = [];\n const firstElement = elements[0];\n firstElement.specific_x = positionFirstNode.x;\n firstElement.specific_y = positionFirstNode.y;\n this.Elements = elements;\n this.RuleConnectableElements = ruleConnectableElements;\n }\n\n public set Elements(elements) {\n this.elements = elements;\n }\n\n public get Elements() {\n return this.elements;\n }\n\n set RuleConnectableElements(elements: Array<IRuleConnectable>) {\n this.elementRuleConnectable = elements;\n }\n\n public get RuleConnectableElements() {\n return this.elementRuleConnectable;\n }\n\n public checkRuleDragDrop(beforeElementDrag: IDiagramElement | undefined, currentElementDrag: IDiagramElement | undefined, afterElementDrag: IDiagramElement | undefined, ruleConnectableElements: Array<IRuleConnectable>): boolean {\n const ruleItemDrag = ruleConnectableElements.find((item) => item.elementCode === currentElementDrag?.code);\n const ruleAfterItemDrag = ruleConnectableElements.find((item) => afterElementDrag && item.elementCode === afterElementDrag.code);\n\n if (\n !!(ruleItemDrag && ruleItemDrag.elementCodeConnectableBefore.find((code) => code === beforeElementDrag?.code)) &&\n (!ruleAfterItemDrag || !!(ruleAfterItemDrag && ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === currentElementDrag?.code)))\n ) {\n return true;\n }\n\n return false;\n }\n\n public get FlatElements() {\n this.flatElements = [];\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(this.Elements as Array<IDiagramElement>, this.flatElements);\n\n return this.flatElements;\n }\n\n public checkExistNameElement(name: string, flatElements: Array<IDiagramElement>) {\n if (!name || !name.trim()) {\n return false;\n }\n\n return flatElements?.find((element) => element.name && element.name.trim() && element.name.trim().toLocaleLowerCase() === name.trim().toLocaleLowerCase()) ? true : false;\n }\n\n public addElement(itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch | undefined, dataDrop: IDiagramElement, branchChoice?: number) {\n if (!itemDrop || !dataDrop) {\n return;\n }\n const elementsFlat = this.FlatElements;\n if (dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n let counter = 0;\n const elementsOfCodeDataDrop = this.FlatElements?.filter((element) => element.code === dataDrop.code);\n\n if (elementsOfCodeDataDrop && elementsOfCodeDataDrop.length) {\n counter = elementsOfCodeDataDrop.reduce((preEl: IDiagramElement, currentEl: IDiagramElement) => (Number(currentEl.specific_counter_current_code) > Number(preEl.specific_counter_current_code) ? currentEl : preEl), elementsOfCodeDataDrop[0])\n .specific_counter_current_code as number;\n }\n counter++;\n let name = `${dataDrop.name} ${counter}`;\n\n while (this.checkExistNameElement(name as string, elementsFlat)) {\n counter++;\n name = `${dataDrop.name} ${counter}`;\n }\n dataDrop.name = name;\n dataDrop.specific_counter_current_code = counter;\n }\n if (branchDrop) {\n return this.addElementToBranch(itemDrop, branchDrop, cloneDeep(dataDrop), branchChoice);\n }\n const elements = this.Elements;\n const nextCurrentItemDrop: IDiagramElement = elements?.find((item) => item.id === itemDrop.next_id) as IDiagramElement;\n\n if (!nextCurrentItemDrop && dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n return;\n }\n const indexItemDrop = elements?.findIndex((item) => item.id === itemDrop.id);\n const newElement = { ...cloneDeep(dataDrop), pre_id: itemDrop.id, next_id: dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT ? nextCurrentItemDrop.id : '' };\n\n if (!dataDrop.id) {\n newElement.id = `${uuid()}`;\n }\n\n itemDrop.next_id = newElement.id;\n\n if (nextCurrentItemDrop) {\n nextCurrentItemDrop.pre_id = newElement.id;\n }\n elements?.splice((indexItemDrop as number) + 1, 0, newElement);\n const flatElements = this.FlatElements;\n const afterElement = flatElements?.find((el) => el.pre_id === newElement.id);\n\n if (!afterElement) {\n return;\n }\n const beforeElement = flatElements?.filter((el) => el.id !== newElement.id && el.next_id === afterElement.id);\n\n beforeElement?.forEach((element) => {\n element.next_id = newElement.id;\n });\n if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n this.addElementExitWorkFlow(newElement, branchChoice);\n }\n\n private addElementToBranch(itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch, dataDrop: IDiagramElement, numberBranch?: number) {\n const elements = branchDrop.elements;\n let nextCurrentItemDrop = undefined;\n let indexItemDrop = -1;\n\n if (elements && elements.length) {\n indexItemDrop = elements.findIndex((item) => item.id === itemDrop.id);\n nextCurrentItemDrop = elements.find((item) => item.id === itemDrop.next_id) as IDiagramElement;\n if (!nextCurrentItemDrop && indexItemDrop === -1) {\n nextCurrentItemDrop = elements[indexItemDrop + 1];\n }\n }\n let nextId = (nextCurrentItemDrop && nextCurrentItemDrop.id) || itemDrop.next_id;\n\n if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n nextId = '';\n }\n const newElement: IDiagramElement = { ...dataDrop, pre_id: itemDrop.id, next_id: nextId };\n\n if (!dataDrop.id) {\n newElement.id = `${uuid()}`;\n }\n\n if (!itemDrop.branches || !itemDrop.branches.find((branch) => branch === branchDrop)) {\n itemDrop.next_id = newElement.id;\n }\n\n if (nextCurrentItemDrop) {\n nextCurrentItemDrop.pre_id = newElement.id;\n }\n elements?.splice(indexItemDrop + 1, 0, newElement as IDiagramElement);\n if (itemDrop && itemDrop.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n this.updateNextIdOfChildElementInElementWorkflow(itemDrop, this.FlatElements?.find((item) => item.id === itemDrop.next_id) as IDiagramElement);\n }\n if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.checkEndMoveElementWhenDropElementCodeExit(branchDrop);\n }\n\n if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n this.addElementExitWorkFlow(newElement, numberBranch);\n }\n\n private updateNextIdOfChildElementInElementWorkflow(elementWorkflow: IDiagramElement, nextElement: IDiagramElement) {\n if (!elementWorkflow || elementWorkflow.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !nextElement) {\n return;\n }\n const flatElement: Array<IDiagramElement> = [];\n\n LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(nextElement, flatElement);\n elementWorkflow.branches?.forEach((branch) => {\n if (!branch.elements || !branch.elements.length) {\n return;\n }\n const elements = branch.elements as IDiagramElement[];\n\n elements.forEach((element, index) => {\n if (index !== elements.length - 1) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.next_id) {\n return this.updateNextIdOfChildElementInElementWorkflow(element, elements[index + 1]);\n }\n\n return;\n }\n if (element.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || element.id === nextElement.id) {\n return;\n }\n if (element.pre_id === nextElement.id || flatElement.find((item) => item.id === element.id)) {\n // trường hợp gọi đệ quy NextElement là khối trước hoặc cha của các element hiện tại\n return;\n }\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (element.next_id) {\n element.next_id = nextElement.id;\n }\n return this.updateNextIdOfChildElementInElementWorkflow(element, nextElement);\n }\n if (elementWorkflow.next_id !== nextElement.id) {\n return;\n }\n element.next_id = nextElement.id;\n });\n });\n }\n\n private checkEndMoveElementWhenDropElementCodeExit(currentBranch: IDiagramElementBranch) {\n const flatElements = this.FlatElements;\n const elementHasCurrentBranch = flatElements?.find((el) => el.branches && !!el.branches.find((branch) => branch === currentBranch));\n\n if (!elementHasCurrentBranch) {\n return;\n }\n const nextElement: IDiagramElement = flatElements?.find((el) => el.id === elementHasCurrentBranch.next_id) as IDiagramElement;\n\n if (!nextElement) {\n return;\n }\n const dataElementHasCurrentBranch = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasCurrentBranch, nextElement.id as string, dataElementHasCurrentBranch, this.FlatElements as IDiagramElement[]);\n if (!dataElementHasCurrentBranch.branchEmpty && dataElementHasCurrentBranch.count === 0) {\n elementHasCurrentBranch.next_id = '';\n }\n const elementNextToId = flatElements?.find((el) => el.next_id === nextElement.id); // Khối cha\n\n if (!elementNextToId || elementNextToId.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !elementNextToId.next_id) {\n return;\n }\n let dataFistElement = dataElementHasCurrentBranch;\n\n if (elementHasCurrentBranch.id !== elementNextToId.id) {\n dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id as string, dataFistElement, this.FlatElements as IDiagramElement[]);\n }\n if (dataFistElement.count > 1 || !dataFistElement.branchContainer) {\n return;\n }\n const branchAddItem = dataFistElement.branchContainer;\n\n if (elementHasCurrentBranch.id === elementNextToId.id) {\n if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.moveElementsToBranch(nextElement, branchAddItem);\n const { element } = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementHasCurrentBranch, this.FlatElements);\n const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n const elementCount = element && element.next_id ? element : elementHasCurrentBranch;\n // Fixbug: 15771\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementCount, elementCount.next_id as string, data, this.FlatElements as IDiagramElement[]);\n if (!data.count) {\n return (elementCount.next_id = '');\n }\n\n return;\n }\n elementHasCurrentBranch.next_id = '';\n const elementHasBranchesNotResetId = this.deleteElement(nextElement);\n\n if (!elementHasBranchesNotResetId.length) {\n return this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);\n }\n const { data, element } = elementHasBranchesNotResetId[0];\n const infoOfElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, this.FlatElements);\n const parentOfElement = infoOfElement.element;\n let dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement as IDiagramElement, parentOfElement?.next_id as string, dataOfElementInfo, this.FlatElements as IDiagramElement[]);\n if (elementHasBranchesNotResetId.length === 1) {\n if (data.count > 1) {\n return this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);\n }\n if (dataFistElement.branchContainer !== data.branchContainer && dataFistElement.count === 1) {\n this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);\n dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement as IDiagramElement, parentOfElement?.next_id as string, dataOfElementInfo, this.FlatElements as IDiagramElement[]);\n }\n if (dataOfElementInfo.count > 1) {\n return;\n }\n // Fixbug: 15518\n if (data.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(element, data.branchContainer, nextElement);\n }\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(\n parentOfElement as IDiagramElement,\n parentOfElement?.next_id as string,\n LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(),\n this.FlatElements as IDiagramElement[]\n );\n\n return;\n }\n this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);\n const flatElement = this.FlatElements;\n\n elementHasBranchesNotResetId.forEach((item) => {\n const { element } = item;\n\n if (element.next_id && flatElement?.find((item) => item.id === element.next_id)) {\n return;\n }\n const infoFromElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, flatElement);\n\n if (infoFromElement.element) {\n element.next_id = infoFromElement.element.next_id;\n this.updateNextIdOfChildElementInElementWorkflow(element, flatElements?.find((item) => item.id === element.next_id) as IDiagramElement); // FixBug: 15729\n }\n });\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(\n parentOfElement as IDiagramElement,\n parentOfElement?.next_id as string,\n LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(),\n flatElement as IDiagramElement[]\n );\n\n return;\n }\n if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.moveElementsToBranch(nextElement, branchAddItem);\n // kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó\n const dataOfElementNextToId = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, elementNextToId.next_id, dataOfElementNextToId, this.FlatElements as IDiagramElement[]);\n if (!dataOfElementNextToId.count) {\n elementNextToId.next_id = '';\n }\n\n return;\n }\n elementNextToId.next_id = '';\n elementHasCurrentBranch.next_id = '';\n const elementHasBranchesNotResetId = this.deleteElement(nextElement);\n\n if (dataElementHasCurrentBranch.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, dataElementHasCurrentBranch.branchContainer, nextElement);\n }\n if (branchAddItem && branchAddItem !== dataElementHasCurrentBranch.branchContainer) {\n this.cloneElementAndAddElementEXitToBranch(elementNextToId, branchAddItem, nextElement); // dòng này sẽ khởi tạo lại next_id của khối cha\n }\n\n if (!elementHasBranchesNotResetId.length) {\n return;\n }\n // kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó\n dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id as string, dataFistElement, this.FlatElements as IDiagramElement[]);\n if (!dataFistElement.count) {\n // nếu khối cha kiểm tra khối cha chứa các element có branch có count = 0 thì reset next_id = ''\n elementNextToId.next_id = '';\n }\n const newId = elementHasBranchesNotResetId[0].element.next_id;\n\n elementHasBranchesNotResetId.forEach((item) => (item.element.next_id = newId));\n }\n\n private moveElementsToBranch(elementStart: IDiagramElement, branchContainer: IDiagramElementBranch) {\n if (!elementStart || elementStart.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || !branchContainer || !branchContainer.elements) {\n return;\n }\n const result = this.findContainerHasElementStart(elementStart, this.Elements as IDiagramElement[]);\n\n if (!result) {\n return;\n }\n const { container, index } = result;\n const elementsHasMove: Array<IDiagramElement> = container.slice(Number(index));\n const elementsOfBranchContainer = branchContainer.elements;\n const lastElementOfBranchContainer = elementsOfBranchContainer[elementsOfBranchContainer.length - 1];\n\n elementsHasMove.forEach((element) => this.deleteElement(element, true));\n if (lastElementOfBranchContainer && lastElementOfBranchContainer.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n lastElementOfBranchContainer.next_id = elementStart.id;\n elementStart.pre_id = lastElementOfBranchContainer.id;\n }\n\n const lastElementMove = elementsHasMove[elementsHasMove.length - 1];\n let nextElement = elementStart;\n\n if (lastElementMove && lastElementMove.next_id) {\n nextElement = this.FlatElements?.find((item) => item.id === lastElementMove.next_id) as IDiagramElement;\n }\n\n const preElementStart: IDiagramElement = container[Number(index) - 1];\n\n branchContainer.elements.push(...elementsHasMove);\n if (!preElementStart || preElementStart.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n return;\n }\n if (nextElement) {\n this.updateNextIdOfChildElementInElementWorkflow(preElementStart, nextElement);\n }\n }\n\n private findContainerHasElementStart(elementStart: IDiagramElement, containerCapacity: Array<IDiagramElement>): { elementStart: IDiagramElement; index: string; container: Array<IDiagramElement> } | undefined {\n if (!containerCapacity || !containerCapacity.length || !elementStart) {\n return undefined;\n }\n for (const index in containerCapacity) {\n const element = containerCapacity[index];\n\n if (element.id === elementStart.id) {\n return {\n elementStart: elementStart,\n index: index,\n container: containerCapacity,\n };\n }\n if (!element.branches || !element.branches.length) {\n continue;\n }\n const branches = element.branches;\n\n for (const branch of branches) {\n const result = this.findContainerHasElementStart(elementStart, branch.elements as IDiagramElement[]);\n\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n private deleteElement(elementDelete: IDiagramElement, ignoreUpdatePreId?: boolean): Array<{ element: IDiagramElement; data: IBranchEndCount }> {\n if (!elementDelete || !elementDelete.id) {\n return [];\n }\n const elementHasBranchesNotResetId = new Array<{ element: IDiagramElement; data: IBranchEndCount }>();\n const flatElements = this.FlatElements;\n const elementsHasNextIdToElementDelete = flatElements?.filter((el) => el.next_id === elementDelete.id);\n const elementHasPreIdToElementDelete = flatElements?.find((el) => el.pre_id === elementDelete.id && el.id === elementDelete.next_id);\n\n if (!ignoreUpdatePreId && elementHasPreIdToElementDelete) {\n elementHasPreIdToElementDelete.pre_id = elementDelete.pre_id;\n }\n elementsHasNextIdToElementDelete?.forEach((elementHasNextIdToElementDelete) => {\n if (elementHasPreIdToElementDelete) {\n elementHasNextIdToElementDelete.next_id = elementHasPreIdToElementDelete.id;\n\n return;\n }\n if (elementDelete.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n if (!elementHasPreIdToElementDelete && elementDelete.next_id) {\n // Fixbug: 15623\n elementHasNextIdToElementDelete.next_id = elementDelete.next_id;\n }\n\n return;\n }\n if (elementHasNextIdToElementDelete.branches && elementHasNextIdToElementDelete.branches.length) {\n const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();\n\n LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasNextIdToElementDelete, elementDelete.id as string, data, this.FlatElements as Array<IDiagramElement>);\n if (!data.count) {\n elementHasNextIdToElementDelete.next_id = '';\n\n return;\n }\n elementHasBranchesNotResetId.push({ element: elementHasNextIdToElementDelete, data });\n\n return;\n }\n elementHasNextIdToElementDelete.next_id = elementDelete.next_id;\n });\n LibsUiDiagramDrawCanvasUtil.findAndDeleteElementFromContainer(this.Elements as Array<IDiagramElement>, elementDelete);\n\n return elementHasBranchesNotResetId;\n }\n\n private cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch: IDiagramElement, branch: IDiagramElementBranch | undefined, dataDrop: IDiagramElement) {\n if (!dataDrop || !elementHasCurrentBranch || !branch) {\n return;\n }\n\n let elementDrop: IDiagramElement = elementHasCurrentBranch;\n\n if (branch.elements && branch.elements.length) {\n elementDrop = branch.elements[branch.elements.length - 1];\n }\n\n return this.addElementToBranch(elementDrop, branch, cloneDeep(dataDrop));\n }\n\n private addElementExitWorkFlow(newElement: IDiagramElement, numberBranch?: number) {\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant(canvasConfigReadonly().I18N_END_NODE),\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n if (newElement.branches && newElement.branches.length) {\n newElement.branches.forEach((item, index) => {\n if (index === numberBranch) {\n return;\n }\n if (!newElement.branches) {\n return;\n }\n this.addElement(newElement, item, exit);\n });\n }\n }\n\n public addElementExitWhenDeleteDirectionLine(element: IDiagramElement, branch: IDiagramElementBranch | undefined) {\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant(canvasConfigReadonly().I18N_END_NODE),\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n delete element.nodeOtherConfig;\n this.addElement(element, branch, exit);\n }\n\n /**\n * Khi một element bị xoá, hàm này sẽ tự động thêm exit cho tất cả các element phía trước đang trỏ tới element đó.\n */\n public addElementExitForAllElementPreviousWhenElementDelete(elementsDelete: IDiagramElement[]) {\n const flatElement = this.FlatElements;\n const flatElementsInElementDelete: IDiagramElement[] = [];\n\n LibsUiDiagramDrawCanvasUtil.buildFlatElement(elementsDelete, flatElementsInElementDelete);\n\n flatElementsInElementDelete.forEach((elementDel) => {\n if (elementDel.pre_other_id && elementDel.pre_other_id.length) {\n elementDel.pre_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (element?.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.branches?.length) {\n element.branches.forEach((branch) => {\n if (!branch.next_other_id || !branch.next_other_id.length) {\n return;\n }\n const indexEl = branch.next_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n branch.next_other_id.splice(indexEl, 1);\n }\n if (!branch.next_other_id.length) {\n this.addElementExitWhenDeleteDirectionLine(element, branch);\n element.subCodeOfElement = undefined;\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n branch.nodeOtherConfig = undefined;\n }\n });\n\n return;\n }\n\n if (!element || !element.next_other_id) {\n return;\n }\n\n const indexEl = element.next_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.next_other_id.splice(indexEl, 1);\n }\n\n if (!element.next_other_id.length) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n const getConfigDefaultBranches = this.handlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;\n getConfigDefaultBranches(element.code ?? '', element);\n }\n const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(element.id ?? '', this.FlatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);\n\n this.addElementExitWhenDeleteDirectionLine(element, branch);\n element.subCodeOfElement = undefined;\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n }\n });\n\n return;\n }\n\n if (elementDel.next_other_id && elementDel.next_other_id.length) {\n elementDel.next_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (!element || !element.pre_other_id) {\n return;\n }\n\n const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.pre_other_id.splice(indexEl, 1);\n }\n });\n }\n\n if (elementDel.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementDel.branches?.length) {\n elementDel.branches.forEach((branch) => {\n if (!branch.next_other_id || !branch.next_other_id.length) {\n return;\n }\n\n branch.next_other_id.forEach((item) => {\n const element = flatElement?.find((el) => el.id === item);\n\n if (!element || !element.pre_other_id) {\n return;\n }\n\n const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);\n\n if (indexEl !== -1) {\n element.pre_other_id.splice(indexEl, 1);\n }\n });\n });\n }\n });\n }\n\n public async removeOrChangeElement(elementRemove: IDiagramElement, elementChange: IDiagramElement | undefined, branchChoose?: number) {\n if (!elementRemove || elementRemove.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n return;\n }\n const flatElements = this.FlatElements;\n const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);\n const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);\n\n const exit = {\n element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,\n name: this.translateService.instant('i18n_out_journey'),\n id: `${uuid()}`,\n specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,\n specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,\n specific_x: 0,\n specific_y: 0,\n };\n\n const elementNextBeforeDelete = flatElements?.find((el) => el.pre_id === elementRemove.id && el.id === elementRemove.next_id);\n\n if (elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {\n infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;\n }\n if (preElement && preElement.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n preElement.nodeOtherConfig = undefined;\n }\n }\n\n if (preElement && !elementNextBeforeDelete) {\n preElement.nodeOtherConfig = undefined;\n if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {\n infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;\n }\n }\n\n this.deleteElement(elementRemove);\n\n // xóa thẳng\n if (!elementChange) {\n if (!elementNextBeforeDelete) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n }\n\n return;\n }\n\n // thay đơn == đơn, thay đơn = nhánh\n if (elementRemove.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (!elementRemove.next_id && elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n // 48229\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n }\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n if (elementChange.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {\n this.deleteElement(elementNextBeforeDelete);\n }\n\n return;\n }\n\n // thay nhánh = đơn\n if (elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n\n return;\n }\n\n // thay nhánh = nhánh\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, exit);\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoose);\n this.deleteElement(exit);\n }\n\n public async deleteChangeElementAndInsertBranchKeep(elementRemove: IDiagramElement, elementChange: IDiagramElement | undefined, branchKeepElement: IDiagramElementBranch | undefined, branchChoice?: number | undefined) {\n const flatElements = this.FlatElements;\n const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);\n const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);\n\n this.addBranchKeepToFlow(branchKeepElement, preElement as IDiagramElement, infoOfElementRemove.currentBranch);\n this.deleteElement(elementRemove);\n if (elementChange) {\n this.addElement(preElement as IDiagramElement, infoOfElementRemove.currentBranch as IDiagramElementBranch, elementChange, branchChoice);\n }\n }\n\n private addBranchKeepToFlow(branchKeepElement: IDiagramElementBranch | undefined, itemDrop: IDiagramElement, branchDrop: IDiagramElementBranch | undefined) {\n if (!branchKeepElement) {\n return;\n }\n const elements = branchKeepElement.elements;\n const nextCurrentItemDrop = elements[0];\n\n if (nextCurrentItemDrop) {\n if (itemDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n itemDrop.next_id = nextCurrentItemDrop && nextCurrentItemDrop.id;\n }\n nextCurrentItemDrop.pre_id = itemDrop.id;\n }\n if (branchDrop) {\n branchDrop.elements.push(...elements);\n\n return;\n }\n this.Elements.push(...elements);\n }\n}\n","import { cloneDeep } from '@libs-ui/utils';\nimport { canvasConfigReadonly } from '../diagram-draw.service';\nimport { IDiagramElement, IDiagramElementBranch } from '../interfaces/diagram.interface';\nimport { buildFlatElement } from './diagram.util';\n\nexport const buildElementDirectionTo = (element: IDiagramElement, flatElements: IDiagramElement[], checkRule: (element: IDiagramElement, item: IDiagramElement) => boolean, branch?: IDiagramElementBranch) => {\n let elementsFlat: IDiagramElement[] = cloneDeep(flatElements) ?? [];\n\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n if (!branch) {\n return undefined;\n }\n\n getAllItemPreOfElement(element, elementsFlat);\n getAllItemNextOfBranch(branch, elementsFlat);\n elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);\n if (element.pre_other_id?.length) {\n elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));\n }\n elementsFlat = elementsFlat.filter((item) => {\n return checkRule(element, item);\n });\n\n return elementsFlat;\n }\n\n getAllItemPreOfElement(element, elementsFlat);\n getAllItemNextOfElement(element, elementsFlat);\n elementsFlat = elementsFlat.filter((item) => item.id !== element.id && item.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT);\n\n if (element.pre_other_id?.length) {\n elementsFlat = elementsFlat.filter((item) => !element.pre_other_id?.includes(item.id ?? ''));\n }\n\n elementsFlat = elementsFlat.filter((item) => {\n return checkRule(element, item);\n });\n\n return elementsFlat;\n};\n\nexport const getAllItemPreOfElement = (element: IDiagramElement, flatElements: IDiagramElement[]) => {\n const pre_id = [];\n\n if (element.pre_id) {\n pre_id.push(element.pre_id);\n }\n if (element.pre_other_id) {\n pre_id.push(...element.pre_other_id);\n }\n if (!pre_id.length) {\n return;\n }\n pre_id.forEach((preId) => {\n const elementPre = flatElements.find((item) => item.id === preId);\n\n if (!elementPre) {\n return;\n }\n const itemIndex = flatElements.findIndex((item) => item.id === preId);\n\n flatElements.splice(itemIndex, 1);\n getAllItemPreOfElement(elementPre, flatElements);\n });\n};\n\nexport const getAllItemNextOfElement = (element: IDiagramElement, flatElements: IDiagramElement[]) => {\n if (!element.next_id) {\n if (!element.branches?.length) {\n return;\n }\n\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement([element], flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemIndex = flatElements.findIndex((item) => item.id === el.id);\n\n if (itemIndex === -1) {\n return;\n }\n\n flatElements.splice(itemIndex, 1);\n });\n\n return;\n }\n const elementNextIndex = flatElements.findIndex((item) => item.id === element.next_id);\n\n if (elementNextIndex === -1) {\n return;\n }\n const nextElement = flatElements[elementNextIndex];\n\n flatElements.splice(elementNextIndex, 1);\n getAllItemNextOfElement(nextElement, flatElements);\n};\n\nexport const getAllItemNextOfBranch = (branch: IDiagramElementBranch, flatElements: IDiagramElement[]) => {\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemIndex = flatElements.findIndex((item) => item.id === el.id);\n\n if (itemIndex === -1) {\n return;\n }\n\n flatElements.splice(itemIndex, 1);\n });\n};\n\nexport const collectNextChainElements = (element: IDiagramElement, flatContainerElement: IDiagramElement[], listElementDelete: IDiagramElement[]) => {\n const elementNext = flatContainerElement.find((item) => item.id === element.next_id);\n\n if (!elementNext) {\n return;\n }\n const flatElementInElementCurrent: IDiagramElement[] = [];\n\n buildFlatElement([elementNext], flatElementInElementCurrent);\n flatElementInElementCurrent.forEach((el) => {\n const itemInNext = flatContainerElement.find((item) => item.id === el.id);\n\n if (itemInNext) {\n listElementDelete.push(itemInNext);\n }\n });\n collectNextChainElements(elementNext, flatContainerElement, listElementDelete);\n};\n","import { inject, Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { LibsUiDiagramDrawCanvasService } from './canvas.service';\nimport { canvasConfigReadonly } from './diagram-draw.service';\nimport { IDiagramElement, IDiagramElementBranch } from './interfaces/diagram.interface';\nimport { findAndDeleteElementFromContainer, getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';\nimport { buildFlatElement } from './utils/diagram.util';\nimport { buildElementDirectionTo, collectNextChainElements } from './utils/direction.util';\n\n@Injectable({ providedIn: 'root' })\nexport class LibsUiDiagramDrawDirectionService {\n private elementDirection: IDiagramElement | undefined;\n private branchDirection: { branch: IDiagramElementBranch; index: number } | undefined;\n private elementViewDirectionId: string | undefined;\n private readonly onViewDirection: Subject<{ id: string }> = new Subject();\n\n private readonly canvasService = inject(LibsUiDiagramDrawCanvasService);\n\n public set ElementDirection(element: IDiagramElement | undefined) {\n this.elementDirection = element;\n }\n\n public get ElementDirection() {\n return this.elementDirection;\n }\n\n public set BranchDirection(branch: { branch: IDiagramElementBranch; index: number } | undefined) {\n this.branchDirection = branch;\n }\n\n public get BranchDirection() {\n return this.branchDirection;\n }\n\n public set ElementViewDirectionId(id: string | undefined) {\n this.elementViewDirectionId = id;\n }\n\n public get ElementViewDirectionId() {\n return this.elementViewDirectionId;\n }\n\n public get OnViewDirection() {\n return this.onViewDirection;\n }\n\n private checkRuleDirectionToElement(element: IDiagramElement | undefined, elementConnectTo: IDiagramElement | undefined) {\n const ruleAfterItemDrag = this.canvasService.RuleConnectableElements.find((item) => elementConnectTo && item.elementCode === elementConnectTo.code);\n\n if (!ruleAfterItemDrag) {\n return true;\n }\n\n if (ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === element?.code)) {\n return true;\n }\n\n return false;\n }\n\n buildElementConnectTo(element: IDiagramElement, flatElements: IDiagramElement[], branch?: IDiagramElementBranch, checkRule?: (element: IDiagramElement | undefined, elementConnectTo: IDiagramElement | undefined) => boolean) {\n const checkRuleDirectionToElement = checkRule ?? this.checkRuleDirectionToElement.bind(this);\n return buildElementDirectionTo(element, flatElements, checkRuleDirectionToElement, branch);\n }\n\n /**Xóa các element nằm phía sau khi nhánh được điều hướng */\n public deleteElementsBehindBranchConnectTo(branch: IDiagramElementBranch) {\n const flatElements = this.canvasService.FlatElements ?? [];\n const flatElementInElementCurrent: IDiagramElement[] = [];\n const listElementDelete: IDiagramElement[] = [];\n\n buildFlatElement(branch.elements, flatElementInElementCurrent);\n listElementDelete.push(...flatElementInElementCurrent);\n\n this.deleteLineConnectFromElement(listElementDelete, flatElements);\n listElementDelete.forEach((elementDelete) => {\n findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);\n });\n }\n\n /**xóa line đến và xóa line đi ở toàn bộ các khối và nhánh bị xóa */\n private deleteLineConnectFromElement(elements: IDiagramElement[], flatElements: IDiagramElement[]) {\n elements.forEach((item) => {\n if (item.branches?.length) {\n item.branches.forEach((branch) => {\n if (branch.next_other_id?.length) {\n this.deletePreOtherId(item.id ?? '', branch.next_other_id, flatElements);\n }\n });\n }\n if (item.next_other_id?.length) {\n this.deletePreOtherId(item.id ?? '', item.next_other_id, flatElements);\n }\n if (item.pre_other_id?.length) {\n // nhánh chỉ lưu id next đi thôi chứ không lưu được pre => chỉ cần xóa pre trong khối.\n this.deleteNextOtherId(item.id ?? '', item.pre_other_id, flatElements);\n }\n });\n }\n\n /** Xóa pre_other_id từ khác khối mà khối bị xóa nối đến BlockDelete => Other*/\n private deletePreOtherId(itemId: string, nextOtherId: Array<string>, flatElements: IDiagramElement[]) {\n nextOtherId.forEach((nextToId) => {\n const nextElement = flatElements.find((item) => item.id === nextToId);\n\n if (!nextElement?.pre_other_id?.length) {\n return;\n }\n const indexIdPre = nextElement.pre_other_id.findIndex((id) => id === itemId);\n\n if (indexIdPre !== -1) {\n nextElement.pre_other_id.splice(indexIdPre, 1);\n }\n });\n }\n\n /** Xóa next_other_id từ khác khối nối đến khối bị xóa Other => BlockDelete và kiểm tra + thêm khối thoát cho những khối nối tới BlockDelete*/\n private deleteNextOtherId(itemId: string, preOtherId: Array<string>, flatElements: IDiagramElement[]) {\n preOtherId.forEach((nextToId) => {\n const preElement = flatElements.find((item) => item.id === nextToId);\n\n if (!preElement) {\n return;\n }\n\n if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n preElement.branches?.forEach((branch) => {\n if (!branch.next_other_id?.length) {\n return;\n }\n const indexIdNextInBranch = branch.next_other_id.findIndex((id) => id === itemId);\n\n if (indexIdNextInBranch !== -1) {\n branch.next_other_id.splice(indexIdNextInBranch, 1);\n }\n\n if (!branch.next_other_id?.length) {\n branch.nodeOtherConfig = undefined;\n this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);\n }\n });\n\n return;\n }\n\n if (!preElement.next_other_id?.length) {\n return;\n }\n const indexIdNext = preElement.next_other_id.findIndex((id) => id === itemId);\n\n if (indexIdNext !== -1) {\n preElement.next_other_id.splice(indexIdNext, 1);\n }\n\n if (!preElement.next_other_id?.length) {\n // thêm khối thoát vì không còn khối nào connect tới nó\n if (preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {\n const getConfigDefaultBranches = this.canvasService.HandlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;\n getConfigDefaultBranches(preElement.code ?? '', preElement);\n }\n const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(preElement.id ?? '', flatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);\n\n this.canvasService.addElementExitWhenDeleteDirectionLine(preElement, branch);\n preElement.subCodeOfElement = undefined;\n preElement.attributeSvgD = undefined;\n preElement.position_end = undefined;\n }\n });\n }\n\n public addBranchDirection(targetId: string, element: IDiagramElement, branch: IDiagramElementBranch, flatElements: IDiagramElement[]) {\n if (!branch.next_other_id) {\n branch.next_other_id = [];\n }\n branch.next_other_id.push(targetId);\n\n const elementTo = flatElements.find((item) => item.id === targetId);\n\n if (elementTo) {\n if (!elementTo.pre_other_id) {\n elementTo.pre_other_id = [];\n }\n elementTo.pre_other_id.push(element.id ?? '');\n }\n }\n\n public addElementDirection(targetId: string, element: IDiagramElement, flatElements: IDiagramElement[]) {\n if (!element.next_other_id) {\n element.next_other_id = [];\n }\n element.next_other_id.push(targetId);\n\n const elementTo = flatElements.find((item) => item.id === targetId);\n\n if (elementTo) {\n if (!elementTo.pre_other_id) {\n elementTo.pre_other_id = [];\n }\n elementTo.pre_other_id.push(element.id ?? '');\n }\n }\n\n public deleteElementsBehindElementConnectTo(element: IDiagramElement, flatElements: IDiagramElement[]) {\n const listElementDelete: IDiagramElement[] = [];\n let flatElementInElementCurrent: IDiagramElement[] = [];\n\n if (element.branches?.length) {\n buildFlatElement([element], flatElementInElementCurrent);\n flatElementInElementCurrent = flatElementInElementCurrent.filter((item) => item.id !== element.id);\n }\n delete element.branches;\n listElementDelete.push(...flatElementInElementCurrent);\n collectNextChainElements(element, flatElements, listElementDelete);\n this.deleteLineConnectFromElement(listElementDelete, flatElements);\n listElementDelete.forEach((elementDelete) => {\n this.findAndDeleteElementFromContainer(this.canvasService.Elements, elementDelete);\n });\n }\n\n private findAndDeleteElementFromContainer(containerElement: Array<IDiagramElement>, elementDelete: IDiagramElement): boolean {\n for (const index in containerElement) {\n const elementOfIndex = containerElement[index];\n\n if (elementOfIndex.id === elementDelete.id) {\n containerElement.splice(+index, 1);\n\n return true;\n }\n if (!elementOfIndex.branches?.length) {\n continue;\n }\n\n for (const branch of elementOfIndex.branches) {\n if (!branch.elements?.length) {\n continue;\n }\n if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public editDirection(flatElements: IDiagramElement[], targetId: string, element: IDiagramElement, branch?: IDiagramElementBranch) {\n if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && branch) {\n this.editDirectionWithBranch(flatElements, branch, targetId, element);\n\n return;\n }\n\n const idOldNextTo = element.next_other_id?.[0];\n const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);\n\n // xóa line cũ\n if (elementOldTo?.pre_other_id) {\n const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);\n\n if (itemIndex !== -1) {\n elementOldTo.pre_other_id?.splice(itemIndex, 1);\n }\n }\n element.attributeSvgD = undefined;\n element.position_end = undefined;\n\n // update line mới\n const elementNewTo = flatElements?.find((item) => item.id === targetId);\n\n if (elementNewTo) {\n if (!elementNewTo.pre_other_id) {\n elementNewTo.pre_other_id = [];\n }\n elementNewTo.pre_other_id.push(element.id ?? '');\n }\n element.next_other_id = [];\n element.next_other_id.push(targetId);\n }\n\n private editDirectionWithBranch(flatElements: IDiagramElement[], branch: IDiagramElementBranch, targetId: string, element: IDiagramElement) {\n const idOldNextTo = branch.next_other_id?.[0];\n const elementOldTo = flatElements?.find((item) => item.id === idOldNextTo);\n\n // xóa line cũ\n if (elementOldTo?.pre_other_id) {\n const itemIndex = elementOldTo.pre_other_id?.findIndex((id) => id === element.id);\n\n if (itemIndex !== -1) {\n elementOldTo.pre_other_id?.splice(itemIndex, 1);\n }\n }\n\n // update line mới\n const elementNewTo = flatElements?.find((item) => item.id === targetId);\n\n if (elementNewTo) {\n if (!elementNewTo.pre_other_id) {\n elementNewTo.pre_other_id = [];\n }\n elementNewTo.pre_other_id.push(element.id ?? '');\n }\n branch.next_other_id = [];\n branch.next_other_id.push(targetId);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|