UNPKG

myprint-design

Version:

操作简单,组件丰富的一站式打印解决方案打印设计器

1 lines 87.6 kB
{"version":3,"file":"elementUtil.mjs","sources":["../../../../src/utils/elementUtil.ts"],"sourcesContent":["import {\n Container,\n ElementOption,\n elementType,\n FormatterVariable,\n MyElement,\n MyHtmlElement,\n PageUnit,\n Panel,\n Point,\n PointLabel,\n Position,\n PreviewWrapper,\n Provider,\n RuntimeElementOption,\n SvgData,\n TableCellElement,\n TableHeadProviderCellElement\n} from '@myprint/design/types/entity';\nimport { elementTypeContainerList, fontMap } from '@myprint/design/constants/common';\nimport { _defaultVal, generateUUID, mitt, parse, stringify, to } from './utils';\nimport { CSSProperties, reactive, Ref } from 'vue-demi';\nimport { formatDate } from './timeUtil';\nimport { px2unit, unit2px, unit2unit } from '@myprint/design/utils/devicePixelRatio';\nimport { arrayRemove } from '@myprint/design/utils/arrays';\nimport { useAppStoreHook as appStore } from '@myprint/design/stores/app';\nimport { updatePanel } from '@myprint/design/plugins/moveable/moveable';\nimport {\n findTableHeadDeep,\n findUpperCell,\n handleTableCellInitHeight,\n recursionHandleTableHead\n} from '@myprint/design/utils/table/dataTable';\nimport numberUtil, { _defaultNum } from '@myprint/design/utils/numberUtil';\nimport { isEmpty, isNil } from 'lodash';\n\n// export function displayModel(displayModel?: DisplayModel) {\n// if (displayModel) {\n// appStore().displayModel = displayModel;\n// }\n// return appStore().displayModel;\n// }\n\nexport function displayDesign(element: MyElement) {\n return !displayPreview(element);\n}\n\nexport function displayPreview(element: MyElement) {\n return element.runtimeOption.previewIs;\n}\n\n// export function displayModelPrint() {\n// return appStore().displayModel == 'print';\n// }\n\nexport function setCurrentPanel(panel: Panel) {\n appStore().currentPanel = panel;\n appStore().lastPageUnit = panel.pageUnit;\n}\n\nexport function getCurrentPanel(panel?: Panel): Panel {\n return panel != null ? panel : appStore().currentPanel as Panel;\n}\n\nexport function setPreviewData(previewData?: any[]) {\n appStore().previewData = previewData == null ? [] : previewData;\n}\n\nexport function getPreviewData() {\n return appStore().previewData == null ? [] : appStore().previewData;\n}\n\nexport function setProvider(provider?: Provider) {\n if (provider == null) {\n to({}, appStore().provider);\n } else {\n to(provider, appStore().provider);\n }\n}\n\nexport function getProvider() {\n return appStore().provider == null ? {} as Provider : appStore().provider;\n}\n\nexport function getRecursionParentPanel(element: MyElement): Panel {\n const panel = element.runtimeOption.parent as Panel;\n if (panel == null) {\n return null!;\n }\n if (panel.pageUnit != null) {\n return panel;\n }\n return getRecursionParentPanel(panel as any);\n}\n\nexport function getCurrentPanelUnit(panel?: Panel): PageUnit {\n return _defaultVal(getCurrentPanel(panel).pageUnit, 'px');\n}\n\nexport function setCurrentElement(element: MyElement[]) {\n appStore().currentElement = element;\n mitt.emit('changeElement');\n}\n\nexport function valueUnit(value: number | undefined, panel?: Panel) {\n return value + getCurrentPanel(panel).pageUnit;\n}\n\nexport function widthValueUnit(element: MyElement) {\n return element.runtimeOption.workEnvironment == 'DataTable' ? '100%' : (element.width + getCurrentPanel(element.runtimeOption.parent as Panel).pageUnit);\n}\n\nexport function heightValueUnit(element: MyElement) {\n return element.runtimeOption.workEnvironment == 'DataTable' ? '100%' : (element.height + getCurrentPanel().pageUnit);\n}\n\nexport function getPositionX(element: MyElement) {\n if (element.runtimeOption.parent!.x) {\n return numberUtil.sum(element.x, element.runtimeOption.parent!.x);\n }\n return element.x;\n}\n\nexport function getPositionY(element: MyElement) {\n if (element.runtimeOption.parent!.y) {\n return element.y + element.runtimeOption.parent!.y;\n }\n return element.y;\n}\n\nexport function width(element: MyElement) {\n if (['DottedVerticalLine', 'VerticalLine'].includes(element.type)) {\n return element.option.borderWidth + 0.6;\n }\n return element.width;\n}\n\nexport function height(element: MyElement) {\n if (['DottedHorizontalLine', 'HorizontalLine'].includes(element.type)) {\n return element.option.borderWidth + 2;\n }\n return element.height;\n}\n\nexport function clearPanel(panel: Panel) {\n panel.pageHeader = undefined;\n panel.pageFooter = undefined;\n panel.elementList = [];\n panel.auxiliaryLineList = [];\n}\n\nexport function initPanel(panel: Panel, provider: Ref<Provider>) {\n panel.name == null && (panel.name = '新模版');\n panel.width == null && (panel.width = _defaultNum(provider.value.width, 210));\n panel.height == null && (panel.height = _defaultNum(provider.value.height, 297));\n panel.pageSize == null && (panel.pageSize = _defaultVal(provider.value.pageSize, 'A4'));\n panel.fontSizeUnit == null && (panel.fontSizeUnit = _defaultVal(provider.value.fontSizeUnit, 'px'));\n panel.pageUnit == null && (panel.pageUnit = _defaultVal(provider.value.pageUnit, 'mm'));\n panel.dragSnapPanelIs == null && (panel.dragSnapPanelIs = provider.value.dragSnapPanelIs);\n panel.dragSnapIs == null && (panel.dragSnapIs = provider.value.dragSnapIs);\n panel.elementList == undefined && (panel.elementList = []);\n panel.groupList == null && (panel.groupList = []);\n panel.auxiliaryLineList == null && (panel.auxiliaryLineList = []);\n}\n\nexport function none(element?: MyElement) {\n if (element == null) {\n return;\n }\n element.runtimeOption.status = 'NONE';\n if (element.elementList != null) {\n for (let childrenElement of element.elementList) {\n none(childrenElement);\n }\n }\n}\n\nexport function handle(element: Container) {\n element.runtimeOption.status = 'HANDLE';\n}\n\nexport function recursionForElement(container: Panel, callback: (element: MyElement) => void) {\n recursionElement(container, callback);\n recursionElement(container.pageFooter!, callback);\n recursionElement(container.pageHeader!, callback);\n}\n\nexport function recursionElement(container: Container, callback: (element: MyElement) => void) {\n if (container?.elementList?.length! > 0) {\n // console.log(container)\n for (let elementTmp of container!.elementList!) {\n callback(elementTmp);\n recursionElement(elementTmp, callback);\n }\n }\n}\n\nexport function innerElementIs(point: Point, element: MyElement, parentElement: MyElement) {\n return (!(elementTypeContainerList.includes(element.type) /*容器目前不支持嵌套*/\n && elementTypeContainerList.includes(parentElement.type))) && point.x >= parentElement.runtimeOption.x && point.x <= parentElement.runtimeOption.x + parentElement.runtimeOption.width\n && point.y >= parentElement.runtimeOption.y && point.y <= parentElement.runtimeOption.y + parentElement.runtimeOption.height;\n}\n\nexport function parentInitElement(panel: Panel, parent: Container, element: MyElement, index: number) {\n initElement(panel, element, index);\n installParentElement(parent, element);\n if (element.elementList?.length > 0) {\n for (let i = 0; i < element.elementList.length; i++) {\n let elementTmp = element.elementList[i];\n parentInitElement(panel, element, elementTmp, i);\n }\n }\n}\n\nexport function initElement(panel: Panel, element: MyElement, index: number) {\n if (element == null) {\n return;\n }\n\n if (element.option == null) {\n element.option = {} as ElementOption;\n }\n if (element.runtimeOption == null) {\n element.runtimeOption = {} as RuntimeElementOption;\n }\n element.runtimeOption.index = index;\n element.runtimeOption.status = 'NONE';\n\n let initWidth = 0, initHeight = 0, initBorderWidth = 0;\n\n if (!element.id) {\n element.id = generateUUID();\n\n switch (element.type) {\n case 'Text':\n initWidth = 30;\n initHeight = 8;\n break;\n case 'DataTable':\n initWidth = 200;\n initHeight = 30;\n if (element.option.tableHeightType == null) {\n element.option.tableHeightType = 'AUTO';\n // element.option.tableHeightType = \"FIXED\"\n }\n\n if (element.tableBodyList == undefined) {\n let indexView = {\n type: 'Text',\n field: 'autoIncrement',\n width: unit2unit('mm', getCurrentPanelUnit(), 10),\n label: '序号',\n height: element.columnList[0].height,\n option: <ElementOption>{\n disableSort: 1,\n disableEnable: 0,\n enable: 1,\n formatter: '{{autoIncrement}}'\n }\n } as TableHeadProviderCellElement;\n\n indexView.columnBody = {\n type: 'Text',\n height: indexView.height,\n data: '1',\n option: { ...indexView.option }\n } as TableCellElement;\n\n element.columnList.unshift(indexView);\n\n const deep = findTableHeadDeep(element.columnList, 0) + 1;\n // console.log(deep);\n const tableHeadListList: TableCellElement[][] = [...Array.from({ length: deep }, (_) => [])];\n recursionHandleTableHead(tableHeadListList, element.columnList, 0);\n\n handleTableCellInitHeight(tableHeadListList);\n // console.log(tableHeadListList);\n element.tableHeadList = tableHeadListList;\n element.tableBodyList = [[]];\n\n const floorHeaderList = tableHeadListList[deep - 1];\n let maxHeadHeight = -1, maxBodyHeight = -1;\n // let tableWidth = 0;\n\n\n for (let i = 0; i < floorHeaderList.length; i++) {\n let tableHeadCellElement = floorHeaderList[i];\n if (tableHeadCellElement == null) {\n tableHeadCellElement = findUpperCell(tableHeadListList, i, deep - 1)!;\n }\n if (tableHeadCellElement == null) {\n continue;\n }\n\n if (tableHeadCellElement.columnBody == undefined) {\n tableHeadCellElement.columnBody = {\n height: numberUtil.div(tableHeadCellElement.height, tableHeadCellElement.rowspan),\n data: tableHeadCellElement.data,\n type: 'Text',\n option: tableHeadCellElement.option\n } as TableCellElement;\n }\n if (tableHeadCellElement.columnBody.type == null) {\n tableHeadCellElement.columnBody.type = 'Text';\n }\n if (tableHeadCellElement.columnBody.data == null) {\n tableHeadCellElement.columnBody.data = tableHeadCellElement.data;\n }\n if (!tableHeadCellElement.columnBody.height) {\n tableHeadCellElement.columnBody.height = numberUtil.div(tableHeadCellElement.height, tableHeadCellElement.rowspan);\n }\n // console.log(tableHeadCellElement.columnBody.width);\n tableHeadCellElement.columnBody.width = tableHeadCellElement.width;\n tableHeadCellElement.type = 'Text';\n tableHeadCellElement.data = tableHeadCellElement.label;\n tableHeadCellElement.columnBody.rowspan = 1;\n tableHeadCellElement.columnBody.colspan = 1;\n\n element.tableBodyList[0].push(tableHeadCellElement.columnBody as TableCellElement);\n\n if (maxHeadHeight < tableHeadCellElement.height) {\n maxHeadHeight = tableHeadCellElement.height;\n }\n if (maxBodyHeight < tableHeadCellElement.columnBody.height) {\n maxBodyHeight = tableHeadCellElement.columnBody.height;\n }\n\n tableHeadCellElement.columnBody = undefined!;\n }\n\n if (element.option.tableHeightType == 'AUTO') {\n element.height = maxHeadHeight + maxBodyHeight;\n }\n }\n break;\n case 'Image':\n initWidth = 30;\n initHeight = 30;\n break;\n case 'Rect':\n initWidth = 30;\n initHeight = 30;\n initBorderWidth = px2unit(1);\n break;\n case 'HorizontalLine':\n case 'DottedHorizontalLine':\n initWidth = 30;\n initBorderWidth = px2unit(1);\n initHeight = px2unit(initBorderWidth + 3);\n break;\n case 'VerticalLine':\n case 'DottedVerticalLine':\n initHeight = 30;\n initBorderWidth = px2unit(1);\n initWidth = px2unit(initBorderWidth + 3);\n break;\n case 'SvgPolygonLine':\n case 'SvgBezierCurve':\n case 'SvgBezierCurveThree':\n case 'SvgLine':\n if (element.data) {\n const data = JSON.parse(element.data) as SvgData;\n const points = data.points as Point[];\n const controlPoints = data.controlPoints as Point[];\n const dataJson = {} as SvgData;\n if (points) {\n for (let point of points) {\n point.x = unit2px(point.x, panel);\n point.y = unit2px(point.y, panel);\n }\n dataJson.points = points;\n }\n\n if (controlPoints) {\n for (let point of controlPoints) {\n point.x = unit2px(point.x, panel);\n point.y = unit2px(point.y, panel);\n }\n dataJson.controlPoints = controlPoints;\n }\n\n // console.log(tmpDataList)\n element.data = JSON.stringify(dataJson);\n }\n break;\n }\n }\n\n if (element.type == 'Text' || element.type == 'TextTime') {\n if (!element.contentType) {\n element.contentType = 'Text';\n }\n }\n\n if (element.type == 'DataTable') {\n for (let i = 0; i < element.tableHeadList.length; i++) {\n const headList = element.tableHeadList[i];\n for (let j = 0; j < headList.length; j++) {\n const column = headList[j];\n if (column) {\n parentInitElement(panel, element, column, i);\n column.runtimeOption.workEnvironment = 'DataTable';\n column.runtimeOption.cellType = 'Head';\n }\n }\n }\n\n for (let i = 0; i < element.tableBodyList.length; i++) {\n const bodyList = element.tableBodyList[i];\n for (let j = 0; j < bodyList.length; j++) {\n parentInitElement(panel, element, bodyList[j], element.tableHeadList.length);\n bodyList[j].runtimeOption.workEnvironment = 'DataTable';\n bodyList[j].runtimeOption.cellType = 'Body';\n }\n }\n\n if (!element.statisticsList) {\n element.statisticsList = [];\n }\n for (let i = 0; i < element.statisticsList.length; i++) {\n const statisticsList = element.statisticsList[i];\n for (let j = 0; j < statisticsList.length; j++) {\n parentInitElement(panel, element, statisticsList[j], element.tableHeadList.length);\n statisticsList[j].runtimeOption.workEnvironment = 'DataTable';\n statisticsList[j].runtimeOption.cellType = 'Statistics';\n }\n }\n }\n\n if (['Text', 'TextTime', 'PageNum', 'DataTable'].includes(element.type)) {\n if (!element.option.fontFamily) {\n element.option.fontFamily = 'heiti';\n }\n if (element.option.fontSize == null) {\n element.option.fontSize = 13;\n }\n }\n\n // if (elementTypeLineList.includes(element.type)) {\n // if (!element.option.lineHeight) {\n // element.option.lineHeight = 0.9;\n // }\n // if (!element.option.color) {\n // element.option.color = '#000';\n // }\n // }\n\n // if (['DottedHorizontalLine', 'DottedVerticalLine']) {\n // if (!element.option.dottedStyle) {\n // element.option.dottedStyle = 'dashed';\n // }\n // }\n\n if (element.width == null) {\n element.width = initWidth;\n }\n\n if (element.height == null) {\n element.height = initHeight;\n }\n\n if (element.option.opacity == null) {\n element.option.opacity = 1;\n }\n // 初始化旋转\n if (!element.option.rotate) {\n element.option.rotate = 0;\n }\n\n if (element.option.padding == null) {\n element.option.padding = {} as Position;\n }\n\n element.runtimeOption.init = {} as Container;\n element.runtimeOption.init.runtimeOption = {} as RuntimeElementOption;\n element.runtimeOption.width = unit2px(element.width, panel);\n element.runtimeOption.height = unit2px(element.height, panel);\n element.runtimeOption.x = unit2px(element.x, panel);\n element.runtimeOption.y = unit2px(element.y, panel);\n element.runtimeOption.rotate = element.option.rotate;\n element.runtimeOption.init.x = element.runtimeOption.x;\n element.runtimeOption.init.y = element.runtimeOption.y;\n element.runtimeOption.init.width = element.runtimeOption.width;\n element.runtimeOption.init.height = element.runtimeOption.height;\n element.runtimeOption.init.runtimeOption.rotate = element.runtimeOption.rotate;\n // element.runtimeOption.translate = { x: 0, y: 0 };\n if (element.option.margin == null) {\n element.option.margin = {} as Position;\n }\n}\n\nexport function elementGroup(htmlElementList: Array<MyHtmlElement>) {\n const panel = getCurrentPanel();\n const idList = flatIdList(htmlElementList);\n const index = findGroup(idList);\n\n for (let htmlElementListElement of htmlElementList) {\n htmlElementListElement.element.groupIs = true;\n }\n\n if (index >= 0) {\n panel.groupList[index] = idList;\n } else {\n panel.groupList.push(idList);\n }\n}\n\nexport function groupListToMap(groupList: string[][]) {\n const map = {} as Record<string, number>;\n for (let i = 0; i < groupList.length; i++) {\n for (let groupListElement of groupList[i]) {\n map[groupListElement] = i;\n }\n }\n return map;\n}\n\nexport function elementUngroup(htmlElementList: Array<MyHtmlElement>) {\n const panel = getCurrentPanel();\n const idList = flatIdList(htmlElementList);\n const index = findGroup(idList);\n\n for (let htmlElementListElement of htmlElementList) {\n htmlElementListElement.element.groupIs = false;\n }\n\n if (index >= 0) {\n panel.groupList.splice(index, 1);\n }\n}\n\nexport function elementDown(elementList: MyElement[], layer: number) {\n elementList.sort(function(a, b) {\n return a.runtimeOption.index - b.runtimeOption.index;\n });\n\n for (let myElement of elementList) {\n let newLayer = myElement.runtimeOption.index - layer;\n const parentElementList = myElement.runtimeOption.parent!.elementList!;\n if (newLayer < 0) {\n newLayer = 0;\n }\n\n const tmp = parentElementList[myElement.runtimeOption.index];\n\n for (let i = myElement.runtimeOption.index; i > newLayer; i--) {\n // console.log(i)\n parentElementList[i] = parentElementList[i - 1];\n parentElementList[i].runtimeOption.index = i;\n }\n parentElementList[newLayer] = tmp;\n tmp.runtimeOption.index = newLayer;\n }\n updatePanel(elementList);\n}\n\nexport function elementUp(elementList: MyElement[], layer: number) {\n elementList.sort(function(a, b) {\n return a.runtimeOption.index - b.runtimeOption.index;\n });\n\n for (let myElement of elementList) {\n let newLayer = myElement.runtimeOption.index + layer;\n const parentElementList = myElement.runtimeOption.parent!.elementList!;\n if (newLayer > parentElementList.length - 1) {\n newLayer = parentElementList.length - 1;\n }\n // console.log('123,', newLayer)\n\n const tmp = parentElementList[myElement.runtimeOption.index];\n\n for (let i = myElement.runtimeOption.index; i < newLayer; i++) {\n // console.log(i)\n parentElementList[i] = parentElementList[i + 1];\n parentElementList[i].runtimeOption.index = i;\n }\n parentElementList[newLayer] = tmp;\n tmp.runtimeOption.index = newLayer;\n }\n updatePanel(elementList);\n}\n\nfunction flatIdList(htmlElementList: Array<MyHtmlElement | MyHtmlElement[]>) {\n const idList: string[] = [];\n for (let htmlElementListElement of htmlElementList) {\n if (Array.isArray(htmlElementListElement)) {\n for (let htmlElementListElementElement of htmlElementListElement) {\n idList.push(htmlElementListElementElement.element.id);\n }\n } else {\n idList.push(htmlElementListElement.element.id);\n }\n }\n return idList;\n}\n\nfunction findGroup(idList: string[]) {\n const panel = getCurrentPanel();\n for (let i = 0; i < panel.groupList.length; i++) {\n const groupListKey = panel.groupList[i];\n if (groupListKey.some(item => {\n return idList.includes(item);\n })) {\n return i;\n }\n }\n return -1;\n}\n\nexport function element2PreviewWrapper(element: MyElement | PreviewWrapper): PreviewWrapper {\n const previewWrapper = parse(stringify(element, 'parent', 'target', 'elementList', 'previewWrapperList', 'nestColumnList'), reactive({}) as PreviewWrapper);\n previewWrapper.id = generateUUID();\n previewWrapper.heightIs = true;\n previewWrapper.runtimeOption.parent = element.runtimeOption.parent;\n previewWrapper.runtimeOption.previewIs = true;\n\n // const oldPreviewWrapper = element as PreviewWrapper;\n // if (oldPreviewWrapper.previewWrapperList != null) {\n // // const pList: PreviewWrapper[] = []\n // previewWrapper.previewWrapperList = [];\n // for (let myElement of oldPreviewWrapper.previewWrapperList) {\n // previewWrapper.previewWrapperList.push(element2PreviewWrapper(myElement));\n // }\n // }\n\n if (element.elementList != null) {\n // const pList: PreviewWrapper[] = []\n previewWrapper.previewWrapperList = [];\n for (let myElement of element.elementList) {\n previewWrapper.previewWrapperList.push(element2PreviewWrapper(myElement));\n }\n }\n\n if (element.tableHeadList != null && element.tableHeadList.length > 0) {\n for (let i = 0; i < element.tableHeadList.length; i++) {\n const rowList = element.tableHeadList[i];\n for (let j = 0; j < rowList.length; j++) {\n if (rowList[j] == null) {\n continue;\n }\n previewWrapper.tableHeadList[i][j].runtimeOption.parent = rowList[j].runtimeOption.parent;\n }\n }\n }\n\n if (element.tableBodyList != null) {\n // const pList: PreviewWrapper[] = []\n for (let i = 0; i < element.tableBodyList.length; i++) {\n const rowList = element.tableBodyList[i];\n for (let j = 0; j < rowList.length; j++) {\n if (rowList[j] == null) {\n continue;\n }\n previewWrapper.tableBodyList[i][j].runtimeOption.parent = rowList[j].runtimeOption.parent;\n }\n }\n }\n\n if (element.statisticsList != null) {\n // const pList: PreviewWrapper[] = []\n for (let i = 0; i < element.statisticsList.length; i++) {\n const rowList = element.statisticsList[i];\n for (let j = 0; j < rowList.length; j++) {\n if (rowList[j] == null) {\n continue;\n }\n previewWrapper.statisticsList[i][j].runtimeOption.parent = rowList[j].runtimeOption.parent;\n }\n }\n }\n return previewWrapper;\n}\n\nexport function installPanelParentElement(panel: Panel) {\n installParentElement(panel, panel.pageHeader);\n installParentElement(panel, panel.pageFooter);\n installListParentElement(panel, panel.elementList);\n}\n\nexport function installListParentElement(parent: Container, elementList?: Array<MyElement>) {\n for (let element of elementList!) {\n installParentElement(parent, element);\n if (element.type == 'DataTable') {\n for (let tableHeadListElement of element.tableHeadList) {\n for (let tableCellElement of tableHeadListElement) {\n installParentElement(element, tableCellElement);\n }\n }\n for (let tableHeadListElement of element.tableBodyList) {\n for (let tableCellElement of tableHeadListElement) {\n installParentElement(element, tableCellElement);\n }\n }\n for (let tableHeadListElement of element.statisticsList) {\n for (let tableCellElement of tableHeadListElement) {\n installParentElement(element, tableCellElement);\n }\n }\n }\n if (element.elementList != null) {\n installListParentElement(element, element.elementList);\n }\n }\n\n}\n\nexport function installParentElement(parent?: Container, element?: MyElement) {\n if (!element) {\n return;\n }\n element.runtimeOption.parent = parent;\n}\n\nexport function clearParent(element: MyElement) {\n if (element.runtimeOption == null || element.runtimeOption.parent == undefined) {\n return;\n }\n element.runtimeOption.parent = undefined;\n}\n\nexport function addElement(panel: Panel, parent: Container, element: MyElement) {\n if (parent.elementList == null) {\n parent.elementList = [];\n }\n parent.elementList.push(element);\n initElement(panel, element, parent.elementList.length - 1);\n installParentElement(parent, element);\n}\n\nexport function removeElement(element: MyElement) {\n if (element.runtimeOption.parent == null) {\n return;\n }\n if (element.runtimeOption.parent.elementList == null) {\n return;\n }\n handleElementType(element)\n .handle('PageHeader', () =>\n (element.runtimeOption.parent as Panel).pageHeader = undefined\n )\n .handle('PageFooter', () =>\n (element.runtimeOption.parent as Panel).pageFooter = undefined\n )\n // .handle('PrivateDragRectElement', () => {\n // const elementList: Array<MyElement> = [];\n //\n // for (let valueElement of getCurrentPanel().elementList!) {\n // if ('SELECT' == valueElement.runtimeOption.status) {\n // elementList.push(valueElement);\n // }\n // }\n //\n // for (let valueElement of elementList) {\n // arrayRemove(valueElement.runtimeOption.parent!.elementList, valueElement);\n // }\n // element.x = undefined!;\n // }\n // )\n .end(() => {\n arrayRemove(element.runtimeOption.parent!.elementList, element);\n });\n}\n\nexport function handleElementType(element: Container) {\n const handleList: any[] = [];\n const handlers = {\n handle(type: elementType, callback: () => void) {\n handleList.push(type);\n if (element.type === type) {\n callback();\n }\n return handlers;\n },\n pageHeader(callback: () => void) {\n handleList.push('PageHeader');\n if (isPageHeader(element)) {\n callback();\n }\n return handlers;\n },\n pageFooter(callback: () => void) {\n handleList.push('PageFooter');\n if (isPageFooter(element)) {\n callback();\n }\n return handlers;\n },\n end(callback: () => void) {\n // console.log(handleList)\n if (!handleList.includes(element.type)) {\n callback();\n }\n }\n };\n\n return handlers;\n}\n\nfunction getFontSizeUnit(panel?: Panel) {\n const currentPanel = getCurrentPanel(panel);\n return currentPanel.fontSizeUnit == null ? 'px' : currentPanel.fontSizeUnit;\n}\n\nexport function defaultPreviewData(previewData: any) {\n return previewData == null || previewData.length == 0 ? [{}] : previewData;\n}\n\nexport function elementCommonPositionStyle(element: MyElement): CSSProperties {\n const fontFamily = element.option.fontFamily || 'heiti';\n return {\n // width: element.runtimeOption.width + 'px',\n // left: element.runtimeOption.x + 'px',\n // top: element.runtimeOption.y + 'px',\n // maxWidth: widthValueUnit(element),\n // height: element.runtimeOption.height + 'px',\n // maxHeight: heightValueUnit(element),\n fontFamily: fontMap[fontFamily],\n fontSize: element.option.fontSize + getFontSizeUnit(getRecursionParentPanel(element))\n } as CSSProperties;\n}\n\nexport function elementBarCodeValueStyle(element: MyElement, cssStyle?: CSSProperties): CSSProperties {\n if (cssStyle == null) {\n cssStyle = {} as CSSProperties;\n }\n\n const option = element.option!;\n const panel = element.runtimeOption.parent as Panel;\n let textDecoration = '';\n if (option.underline) {\n textDecoration = textDecoration + 'underline ';\n }\n if (option.lineThrough) {\n textDecoration = textDecoration + 'line-through ';\n }\n\n option.opacity != null && (cssStyle.opacity = option.opacity);\n option.color && (cssStyle.color = option.color);\n option.background && (cssStyle.background = option.background);\n option.bold && (cssStyle.fontWeight = option.bold ? 'bold' : 'normal');\n textDecoration && (cssStyle.textDecoration = textDecoration);\n option.italic && (cssStyle.fontStyle = option.italic ? 'italic' : 'normal');\n if (option.textAlign) {\n cssStyle.justifyContent = option.textAlign;\n }\n\n if (option.lineBreak == 0) {\n cssStyle.whiteSpace = 'nowrap';\n }\n\n if (option.lineHeight != null) {\n cssStyle.lineHeight = valueUnit(option.lineHeight, panel);\n }\n\n if (option.verticalAlign) {\n cssStyle.alignItems = option.verticalAlign;\n }\n return cssStyle;\n}\n\nexport function elementCommonStyle(element: MyElement, cssStyle?: CSSProperties): CSSProperties {\n if (cssStyle == null) {\n cssStyle = elementCommonPositionStyle(element);\n }\n const option = element.option!;\n const panel = getRecursionParentPanel(element) as Panel;\n let textDecoration = '';\n if (option.underline) {\n textDecoration = textDecoration + 'underline ';\n }\n if (option.lineThrough) {\n textDecoration = textDecoration + 'line-through ';\n }\n\n option.opacity != null && (cssStyle.opacity = option.opacity);\n option.color && (cssStyle.color = option.color);\n option.background && (cssStyle.background = option.background);\n option.bold && (cssStyle.fontWeight = option.bold ? 'bold' : 'normal');\n textDecoration && (cssStyle.textDecoration = textDecoration);\n option.italic && (cssStyle.fontStyle = option.italic ? 'italic' : 'normal');\n if (option.textAlign) {\n cssStyle.justifyContent = option.textAlign;\n }\n\n if (option.lineBreak == 0) {\n cssStyle.whiteSpace = 'nowrap';\n }\n\n if (option.lineHeight != null) {\n cssStyle.lineHeight = valueUnit(option.lineHeight, panel);\n }\n\n if (option.verticalAlign) {\n cssStyle.alignItems = option.verticalAlign;\n }\n\n if (element.runtimeOption.workEnvironment == 'DataTable') {\n let extHeight = 0;\n const parent = (element.runtimeOption.parent as MyElement);\n // if (parent == null) {\n // console.log(element);\n // }\n if (parent != null) {\n if (parent.option.borderAll) {\n // 加上边框高度\n if ((element as TableCellElement).rowspan > 1) {\n extHeight = (element as TableCellElement).rowspan - 1;\n }\n }\n if (parent.option.tableBodyHeightType == 'FIXED') {\n cssStyle.height = (element.runtimeOption.init.height + extHeight) + 'px';\n cssStyle.maxHeight = (element.runtimeOption.init.height + extHeight) + 'px';\n cssStyle.overflow = 'hidden';\n }\n } else {\n }\n\n if (element.type == 'Text' && element.contentType == 'Barcode') {\n cssStyle.width = element.runtimeOption.width + 'px';\n cssStyle.maxWidth = element.runtimeOption.width + 'px';\n }\n // cssStyle.maxWidth = (element.runtimeOption.init.width - 1) + 'px';\n } else {\n if (option.borderAll) {\n cssStyle.border = '1px solid black';\n cssStyle.boxSizing = 'border-box';\n }\n }\n\n if (!isNil(option.borderRadius)) {\n cssStyle.borderRadius = valueUnit(option.borderRadius, panel);\n }\n\n if (!isNil(option.padding)) {\n if (option.padding.top) cssStyle.paddingTop = valueUnit(option.padding.top, panel);\n if (option.padding.bottom) cssStyle.paddingBottom = valueUnit(option.padding.bottom, panel);\n if (option.padding.left) cssStyle.paddingLeft = valueUnit(option.padding.left, panel);\n if (option.padding.right) cssStyle.paddingRight = valueUnit(option.padding.right, panel);\n }\n\n if (option.margin) {\n let subWidth = 0, subHeight = 0;\n if (option.margin.top) {\n cssStyle.marginTop = valueUnit(option.margin.top, panel);\n subHeight += unit2px(option.margin.top, panel);\n }\n if (option.margin.bottom) {\n cssStyle.marginBottom = valueUnit(option.margin.bottom, panel);\n subHeight += unit2px(option.margin.bottom, panel);\n }\n if (option.margin.left) {\n cssStyle.marginLeft = valueUnit(option.margin.left, panel);\n subWidth += unit2px(option.margin.left, panel);\n }\n if (option.margin.right) {\n cssStyle.marginRight = valueUnit(option.margin.right, panel);\n subWidth += unit2px(option.margin.right, panel);\n }\n if (subWidth > 0) {\n cssStyle.width = `calc(100% - ${subWidth}px)`;\n }\n if (subHeight > 0) {\n cssStyle.height = `calc(100% - ${subHeight}px)`;\n }\n\n }\n return cssStyle;\n}\n\nexport function isPageHeader(element: Container) {\n return element != null && element.type == 'PageHeader';\n}\n\nexport function isPageFooter(element: Container) {\n return element != null && element.type == 'PageFooter';\n}\n\nexport function formatter(element: MyElement, variable: FormatterVariable = {} as FormatterVariable): string {\n if (element.option.formatter) {\n let contentData: any;\n if (element.type == 'TextTime') {\n const variableNames = extractVariableNames(element.option.formatter);\n if (variableNames == null || variableNames.length == 0) {\n contentData = '不支持的变量';\n } else {\n try {\n variable[variableNames[0]] = formatDate(variable.nowDate ? variable.nowDate : new Date(), variableNames[0]);\n contentData = replaceVariables(element.option.formatter, variable);\n } catch (e) {\n contentData = '不支持的变量';\n }\n }\n } else {\n contentData = replaceVariables(element.option.formatter, variable);\n }\n // console.log(contentData)\n return contentData;\n }\n return element.data;\n}\n\nexport function extractVariableNames(template: string): string[] {\n const regex = /\\{\\{(.+?)}}/g;\n const matches = template.match(regex);\n if (!matches) {\n return [];\n }\n // console.log(matches)\n return matches.map(match => match.slice(2, -2));\n}\n\nfunction parseVariables(str: string): { name: string, defaultValue: string }[] {\n const regex = /\\{\\{(.*?)}}/g; // 匹配 {{ 及其内部内容 }}\n const matches = str.match(regex); // 匹配结果数组\n\n if (!matches) {\n return []; // 没有匹配到任何变量\n }\n\n // 解析变量名和默认值\n const variables: { name: string, defaultValue: string }[] = [];\n for (const match of matches) {\n const parts = match.slice(2, -2).split('::'); // 去除 {{ 和 }} 并按冒号分割\n const name = parts[0].trim(); // 变量名\n const defaultValue = parts[1] ? parts[1].trim() : ''; // 默认值(如果有的话)\n\n variables.push({ name, defaultValue });\n }\n\n return variables;\n}\n\nexport function replaceVariables(str: string, params: { [key: string]: any }): string {\n let result = str;\n const variables = parseVariables(str);\n\n for (const variable of variables) {\n const { name, defaultValue } = variable;\n const value = params[name] !== undefined ? params[name] : defaultValue;\n result = result.replace(new RegExp(isEmpty(defaultValue) ? `{{${name}}}` : `{{${name}::${defaultValue}}}`, 'g'), value);\n }\n\n return result;\n}\n\nexport function changePageSize(val?: any) {\n const panel = getCurrentPanel();\n if (val) {\n panel.width = unit2unit('mm', panel.pageUnit, val.width);\n panel.height = unit2unit('mm', panel.pageUnit, val.height);\n }\n // panel.pageSize = unit2unit('mm', panel.pageUnit, val.value\n if (panel.pageHeader != null) {\n panel.pageHeader.width = unit2unit('mm', panel.pageUnit, panel.width);\n panel.pageHeader.runtimeOption.width = unit2px(panel.width);\n }\n if (panel.pageFooter != null) {\n panel.pageFooter.width = unit2unit('mm', panel.pageUnit, panel.width);\n panel.pageFooter.y = unit2unit('mm', panel.pageUnit, panel.height - panel.pageFooter.height);\n panel.pageFooter.runtimeOption.width = unit2px(panel.width);\n }\n mitt.emit('changePageSize');\n}\n\nexport function changePageUnit() {\n const panel = getCurrentPanel();\n // console.log(lastPageUnit)\n // console.log(panel.pageUnit)\n panel.width = unit2unit(appStore().lastPageUnit, panel.pageUnit, panel.width);\n panel.height = unit2unit(appStore().lastPageUnit, panel.pageUnit, panel.height);\n const { pageHeader, pageFooter, pageUnit } = panel;\n\n for (let element of panel.elementList!) {\n computedChangePageUnit(pageUnit, element);\n }\n\n if (pageHeader) {\n computedChangePageUnit(pageUnit, pageHeader);\n }\n\n if (pageFooter) {\n computedChangePageUnit(pageUnit, pageFooter);\n }\n\n appStore().lastPageUnit = panel.pageUnit;\n}\n\nfunction computedChangePageUnit(pageUnit: PageUnit, element: MyElement) {\n element.x = unit2unit(appStore().lastPageUnit, pageUnit, element.x);\n element.y = unit2unit(appStore().lastPageUnit, pageUnit, element.y);\n element.width = unit2unit(appStore().lastPageUnit, pageUnit, element.width);\n element.height = unit2unit(appStore().lastPageUnit, pageUnit, element.height);\n if (element.option.lineHeight != null) {\n element.option.lineHeight = unit2unit(appStore().lastPageUnit, pageUnit, element.option.lineHeight);\n }\n\n if (element.elementList) {\n for (let myElement of element.elementList) {\n computedChangePageUnit(pageUnit, myElement);\n }\n }\n}\n\nexport function computedShapeBound(points: Array<PointLabel>): Container {\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n\n for (let i = 1; i < points.length; i++) {\n let point = points[i];\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n } as Container;\n}\n\nexport function setElementWidthHeightPx(width: number, height: number, element: MyElement) {\n setElementWidthPx(width, element);\n setElementHeightPx(height, element);\n}\n\nexport function setElementWidthPx(width: number, element: MyElement) {\n element.runtimeOption.width = width;\n element.runtimeOption.init.width = width;\n element.width = px2unit(width, getRecursionParentPanel(element));\n}\n\nexport function setElementHeightPx(height: number, element: MyElement) {\n element.runtimeOption.height = height;\n element.runtimeOption.init.height = height;\n element.height = px2unit(height, getRecursionParentPanel(element));\n}\n\nexport function setElementOffsetWidthPx(offsetWidth: number, element: MyElement) {\n element.runtimeOption.width = element.runtimeOption.init.width + offsetWidth;\n element.width = px2unit(element.runtimeOption.width, getRecursionParentPanel(element));\n}\n\nexport function recursionUpdateCellParentWidth(columnElement: TableCellElement, offsetX: number, panel: Panel) {\n columnElement.runtimeOption.width = columnElement.runtimeOption.init.width + offsetX;\n columnElement.width = px2unit(columnElement.runtimeOption.width, panel);\n // console.log(columnElement.runtimeOption.cellParent);\n if (columnElement.runtimeOption.cellParent != null) {\n recursionUpdateCellParentWidth(columnElement.runtimeOption.cellParent, offsetX, panel);\n }\n}\n\nexport function recursionUpdateCellParentInitWidth(columnElement: TableCellElement) {\n columnElement.runtimeOption.init.width = columnElement.runtimeOption.width;\n\n if (columnElement.runtimeOption.cellParent != null) {\n recursionUpdateCellParentInitWidth(columnElement.runtimeOption.cellParent);\n }\n}\n\nexport function multipleElementGetValueList(props: string) {\n const elementList = appStore().currentElement;\n const valueList = new Set();\n if (elementList.length == 0) {\n return [...valueList];\n }\n\n for (let currentElementElement of elementList) {\n valueList.add(getNestedPropertyValue(currentElementElement, props));\n }\n\n return [...valueList];\n}\n\nexport function multipleElementGetValue(props: string) {\n const elementList = appStore().currentElement;\n if (elementList.length == 0) {\n return undefined;\n }\n\n const firstValue = getNestedPropertyValue(elementList[0], props);\n for (let currentElementElement of elementList) {\n if (getNestedPropertyValue(currentElementElement, props) != firstValue) {\n return undefined;\n }\n }\n return firstValue;\n}\n\nfunction getNestedPropertyValue(obj: any, propertyPath: any) {\n const properties = propertyPath.split('.');\n let currentObj = obj;\n\n for (let prop of properties) {\n if (currentObj.hasOwnProperty(prop)) {\n currentObj = currentObj[prop];\n } else {\n return undefined; // 如果属性不存在,返回 undefined\n }\n }\n\n return currentObj;\n}\n\nfunction setNestedPropertyValue(obj: any, propertyPath: any, value: any) {\n const properties = propertyPath.split('.');\n // console.log(obj)\n let currentObj = obj;\n\n for (let i = 0; i < properties.length - 1; i++) {\n if (!currentObj.hasOwnProperty(properties[i])) {\n currentObj[properties[i]] = {};\n }\n currentObj = currentObj[properties[i]];\n }\n\n currentObj[properties[properties.length - 1]] = value;\n}\n\n\nexport function multipleElementSetValue(props: string, val: any) {\n // console.log(val);\n // 修改属性\n // record(<Snapshot>{\n // type: 'Element',\n // action: ActionEnum.UPDATE_STYLE,\n // elementList: appStore().currentElement\n // });\n for (let currentElementElement of appStore().currentElement as MyElement[]) {\n\n setNestedPropertyValue(currentElementElement, props, val);\n\n if (currentElementElement.type == 'DataTable') {\n for (let myElement of currentElementElement.tableHeadList) {\n for (let tableCellElement of myElement) {\n if (tableCellElement != null) {\n setNestedPropertyValue(tableCellElement, props, val);\n }\n\n }\n }\n // console.log(currentElementElement.bodyList)\n for (let bodyRowList of currentElementElement.tableBodyList) {\n for (let myElement of bodyRowList) {\n setNestedPropertyValue(myElement, props, val);\n }\n }\n for (let bodyRowList of currentElementElement.statisticsList) {\n for (let myElement of bodyRowList) {\n setNestedPropertyValue(myElement, props, val);\n }\n }\n }\n }\n}\n\nexport function autoComputedPanelHeight() {\n const panel = getCurrentPanel();\n if (panel.pageSize != 'AutoHeight') {\n return;\n }\n if (panel.elementList == null || panel.elementList.length == 0) {\n return;\n }\n let maxY = 0;\n for (let myElement of panel.elementList) {\n const tmpY = myElement.y + myElement.height;\n maxY = Math.max(tmpY, maxY);\n }\n panel.height = maxY;\n}\n\nexport function getPrintRealHeight(panel?: Panel) {\n panel = getCurrentPanel(panel);\n if (panel.pageSize == 'AutoHeight') {\n return panel.runtimeOption.printRealHeight;\n }\n return panel.height;\n\n}\n"],"names":["appStore","numberUtil","width","height"],"mappings":"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