e-virt-table 1.2.17 → 1.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +817 -795
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/Cell.d.ts +2 -1
- package/dist/lib/Cell.js +7 -0
- package/dist/lib/Cell.js.map +1 -1
- package/dist/lib/Config.d.ts +3 -1
- package/dist/lib/Config.js +7 -0
- package/dist/lib/Config.js.map +1 -1
- package/dist/lib/Context.d.ts +4 -2
- package/dist/lib/Context.js +28 -9
- package/dist/lib/Context.js.map +1 -1
- package/dist/lib/Database.d.ts +3 -2
- package/dist/lib/Database.js +45 -19
- package/dist/lib/Database.js.map +1 -1
- package/dist/lib/EVirtTable.d.ts +4 -3
- package/dist/lib/EVirtTable.js +11 -6
- package/dist/lib/EVirtTable.js.map +1 -1
- package/dist/lib/History.js +2 -2
- package/dist/lib/History.js.map +1 -1
- package/dist/lib/Selector.d.ts +2 -1
- package/dist/lib/Selector.js +2 -2
- package/dist/lib/Selector.js.map +1 -1
- package/dist/lib/types.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is pattern validation error`,\r\n });\r\n }\r\n if (rule.required && (value === undefined || value === null || value === '')) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is required`,\r\n });\r\n }\r\n }\r\n return errors;\r\n }\r\n}\r\n","import { Column, SpanParams } from './types';\r\n\r\nfunction generateShortUUID(): string {\r\n return 'xxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\nfunction throttle<T extends (...args: any) => any>(func: T, delay: number): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\nexport {\r\n debounce,\r\n throttle,\r\n generateShortUUID,\r\n toLeaf,\r\n sortFixed,\r\n calCrossSpan,\r\n getMaxRow,\r\n decodeSpreadsheetStr,\r\n encodeToSpreadsheetStr,\r\n mergeRowCell,\r\n mergeColCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n getCssVar,\r\n};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawImageX = 0;\n drawImageY = 0;\n drawImageWidth = 0;\n drawImageHeight = 0;\n drawImageName = '';\n drawImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || 'center';\n this.verticalAlign = column.verticalAlign || 'middle';\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (this.type === 'tree' && cellType === 'body') {\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n iconOffsetX = level * 8;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n iconOffsetX = level * 8;\n } else {\n iconOffsetX = level * 8;\n }\n let iconWidth = 20;\n let iconHeight = 20;\n if (icon) {\n let iconX = this.drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n this.ctx.paint.drawImage(icon, iconX, iconY, iconWidth, iconHeight);\n this.drawImageX = iconX;\n this.drawImageY = iconY;\n this.drawImageWidth = iconWidth;\n this.drawImageHeight = iconHeight;\n this.drawImageName = iconName;\n this.drawImageSource = icon;\n }\n // 更改文本距离\n this.align = 'left';\n this.drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n }\n }\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n BODY_TEXT_COLOR,\n FOOTER_TEXT_COLOR,\n FOOTER_BG_COLOR,\n HIGHLIGHT_SELECTED_ROW,\n HIGHLIGHT_SELECTED_ROW_COLOR,\n HIGHLIGHT_HOVER_ROW,\n HIGHLIGHT_HOVER_ROW_COLOR,\n STRIPE,\n STRIPE_COLOR,\n } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n // 选中框类型\n if (['index-selection', 'selection'].includes(type)) {\n const check = this.ctx.database.getRowSelection(rowKey);\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\n const _x = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n const _y = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage && type == 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n } else if (checkboxImage && 'selection' === type) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawImageName = this.hoverIconName;\n this.drawImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n let visibleWidth = this.visibleWidth;\n if (this.type === 'tree') {\n const offsetIconX = this.drawTextX - this.drawX;\n visibleWidth = this.visibleWidth - offsetIconX; // 减去树形图标的宽度\n }\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.displayText, visibleWidth, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, visibleWidth, this.visibleHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\n }\n if (this.hoverIconName) {\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawImageX - 2,\n this.drawImageY - 2,\n this.drawImageWidth + 4,\n this.drawImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n }\n this.ctx.paint.drawImage(\n this.drawImageSource,\n this.drawImageX,\n this.drawImageY,\n this.drawImageWidth,\n this.drawImageHeight,\n );\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import type CellHeader from './CellHeader';\nimport Validator, { RuleParam, ValidateResult } from './Validator';\nimport type Context from './Context';\nimport type {\n CellReadonlyMethod,\n CellRulesMethod,\n ChangeItem,\n Column,\n FilterMethod,\n Position,\n SelectableMethod,\n EVirtTableOptions,\n BeforeCellValueChangeMethod,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n} from './types';\nimport { generateShortUUID } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n });\n if (Array.isArray(item.children)) {\n if (item.children.length) {\n this.initData(item.children, level + 1, [...parentRowKeys, rowKey]);\n }\n }\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.expandMap.set(rowKey, expand);\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n this.expandMap.clear();\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\n this.expandMap.set(rowkey, expand);\n row.expand = expand;\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n getExpandRowKeys() {\n let list: string[] = [];\n this.rowKeyMap.forEach((row: any, key: string) => {\n if (row.expand) {\n list.push(key);\n }\n });\n return list;\n }\n expandAll(expand: boolean) {\n this.expandMap.clear();\n this.rowKeyMap.forEach((row: any) => {\n row.expand = expand;\n this.expandMap.set(row.key, expand);\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n expandLoading(rowKey: string, loading = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expandLoading = loading;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandChildren(rowKey: string, children: any[]) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = true;\n this.expandMap.set(rowKey, true);\n row.expandLazy = true;\n row.item.children = children;\n this.initData(row.item.children, row.level + 1);\n this.clearBufferData(); // 清除缓存数据\n }\n getIsExpandLoading(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLoading;\n }\n getIsExpandLazy(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLazy;\n }\n /**\n * 根据rowKey获取是否展开\n * @param rowKey\n * @returns\n */\n getIsExpand(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expand;\n }\n /**\n * 根据rowKey获取行数据\n * @param rowKey\n * @returns\n */\n getRowForRowKey(rowKey: string) {\n return this.rowKeyMap.get(rowKey);\n }\n getRowForRowIndex(rowIndex: number) {\n const rowKey = this.getRowKeyForRowIndex(rowIndex);\n return this.rowKeyMap.get(rowKey);\n }\n /**\n * 根据rowIndex获取rowKey\n * @param rowKey\n * @returns\n */\n getRowKeyForRowIndex(rowIndex: number) {\n return this.rowIndexRowKeyMap.get(rowIndex) || '';\n }\n getRowKeyByItem(item: any) {\n return this.itemRowKeyMap.get(item);\n }\n getRowIndexForRowKey(rowKey: string) {\n return this.rowKeyRowIndexMap.get(rowKey);\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(_list: ChangeItem[], history = false) {\n let historyList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n }\n changeList.forEach((data) => {\n const { value, rowKey, key, oldValue } = data;\n rowKeyList.add(rowKey);\n this.setItemValue(rowKey, key, value);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @returns\n */\n async setItemValue(rowKey: string, key: string, _value: any, history = false, reDraw = false, isEditor = false) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange([\n {\n rowKey,\n key,\n value,\n oldValue: item[key],\n row,\n },\n ]);\n if (values && values.length) {\n value = values[0].value;\n }\n }\n // 设置改变值\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n const changeItem: ChangeItem = {\n rowKey,\n key,\n oldValue,\n value,\n row,\n };\n // 实时校验错误\n this.getValidator(rowKey, key).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', [changeItem], [row]);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 添加历史记录\n if (history) {\n this.ctx.history.pushState({\n type: 'single',\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n changeList: [\n {\n rowKey,\n key,\n oldValue,\n newValue: value,\n },\n ],\n });\n }\n\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n } else {\n this.selectionMap.clear();\n this.rowKeyMap.forEach((row, rowKey: string) => {\n this.selectionMap.set(rowKey, {\n check: false,\n row: row.item,\n key: rowKey,\n });\n });\n }\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n // 缓存,解决性能问题\n const { buffer, ...bufferState } = this.bufferCheckState;\n if (buffer) {\n return bufferState;\n }\n const total = this.rowKeyMap.size;\n let totalChecked = 0;\n let totalSelectable = 0;\n const reserveTotal = this.selectionMap.size;\n const reserveHasChecked = Array.from(this.selectionMap.values()).some((item) => item.check);\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n if (this.selectionMap.get(rowKey)?.check) {\n totalChecked += 1;\n }\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n totalSelectable += 1;\n }\n });\n // 存在跨页时,变更半选中\n const reserveIndeterminate = reserveTotal > total && totalChecked === 0 && reserveHasChecked;\n const indeterminate =\n (totalSelectable && totalSelectable > totalChecked && totalChecked > 0) || reserveIndeterminate;\n const selectable = totalSelectable !== 0;\n const check = !!totalSelectable && totalSelectable === totalChecked;\n // 缓存\n this.bufferCheckState = {\n buffer: true,\n check,\n indeterminate,\n selectable,\n };\n\n return {\n check,\n indeterminate,\n selectable,\n };\n }\n /**\n * 更新列索引\n * @param list 表头末级列表\n */\n updateColIndexKeyMap(list: CellHeader[] = []) {\n this.colIndexKeyMap.clear();\n list.forEach((column) => {\n this.colIndexKeyMap.set(column.colIndex, column.key);\n });\n }\n getColumnByColIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.column;\n }\n }\n getColumnByKey(key: string) {\n const column = this.headerMap.get(key);\n if (column) {\n return column;\n }\n }\n getColIndexForKey(key: string) {\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.colIndex;\n }\n }\n getColHeaderByIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key);\n }\n return undefined;\n }\n /**\n * 获取以改变数据\n */\n getChangedData() {\n let list: {\n rowKey: string;\n colKey: string;\n row: any;\n originalValue: any;\n value: any;\n }[] = [];\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n const colKey = key.split('\\u200b_')[1];\n if (originalValue !== value) {\n list.push({\n rowKey,\n colKey,\n originalValue,\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\n value,\n });\n }\n });\n return list;\n }\n getChangedRows() {\n const rowKeyList: Set<string> = new Set();\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n if (originalValue !== value) {\n rowKeyList.add(rowKey);\n }\n });\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n return rows;\n }\n /**\n * 获取改变值是否已经改变\n * @param rowKey\n * @param key\n * @returns\n */\n isHasChangedData(rowKey: string, key: string) {\n const changedKey = `${rowKey}\\u200b_${key}`;\n if (!this.changedDataMap.has(changedKey)) {\n return false;\n }\n const originalValue = this.originalDataMap.get(changedKey);\n const changedValue = this.changedDataMap.get(changedKey);\n return originalValue !== changedValue;\n }\n getPositionForRowIndex(rowIndex: number): Position {\n if (rowIndex < this.positions.length) {\n return this.positions[rowIndex];\n }\n return {\n height: 0,\n top: 0,\n bottom: 0,\n };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\r\nimport {\r\n BeforeAutofillDataMethod,\r\n BeforeCellValueChangeMethod,\r\n BeforeCopyMethod,\r\n BeforePasteDataMethod,\r\n BeforeSetAutofillMethod,\r\n BeforeSetSelectorMethod,\r\n CellEditorMethod,\r\n CellHeaderStyleMethod,\r\n CellHoverIconMethod,\r\n CellReadonlyMethod,\r\n CellRenderMethod,\r\n CellRulesMethod,\r\n CellStyleMethod,\r\n CellTypeMethod,\r\n ConfigType,\r\n ExpandLazyMethod,\r\n FooterPosition,\r\n FormatterMethod,\r\n MenuItem,\r\n SelectableMethod,\r\n SpanMethod,\r\n} from './types';\r\nimport { getCssVar } from './util';\r\n\r\nexport default class Config {\r\n private _config: ConfigType = {};\r\n /** CSS 类名前缀 */\r\n CSS_PREFIX = 'e-virt-table';\r\n /** 图标集合 */\r\n ICONS: IconType[] = [];\r\n /** 行的唯一标识键 */\r\n ROW_KEY = '';\r\n /** 禁用编辑,优先等级最高 */\r\n DISABLED = false; \r\n /** 表头字体 */\r\n HEADER_FONT = '12px normal Arial';\r\n /** 单元格字体 */\r\n BODY_FONT = '12px normal Arial';\r\n /** 边框 */\r\n BORDER = true;\r\n /** 斑马纹 */\r\n STRIPE = false; \r\n /** 斑马纹颜色 */\r\n STRIPE_COLOR = '#fafafa'; \r\n /** 区域边框颜色 */\r\n BORDER_COLOR = '#e1e6eb';\r\n /** 宽度为 0 表示自适应100% */\r\n WIDTH = 0;\r\n /** 最小可调整宽度 */\r\n RESIZE_MIN_WIDTH = 40;\r\n /** 高度,为 0 表示自适应 */\r\n HEIGHT = 0;\r\n /** 占位文本颜色 */\r\n PLACEHOLDER_COLOR = '#CDD0DC';\r\n /** 空数据 body 高度 */\r\n EMPTY_BODY_HEIGHT = 120;\r\n /** 自定义空样式 */\r\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 空数据文本 */\r\n EMPTY_TEXT = '暂无数据';\r\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\r\n MAX_HEIGHT = 1000;\r\n /** 区域边框圆角 */\r\n BORDER_RADIUS = 8;\r\n ENABLE_OFFSET_HEIGHT = false;\r\n OFFSET_HEIGHT = 0;\r\n HEADER_HEIGHT = 36;\r\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\r\n ENABLE_HEADER_STICKY = false; \r\n /** 表头背景色 */\r\n HEADER_BG_COLOR = '#F8FAFF';\r\n /** body 背景色 */\r\n BODY_BG_COLOR = '#FFF';\r\n /** 表头文本颜色 */\r\n HEADER_TEXT_COLOR = '#1D2129';\r\n /** body文本颜色 */\r\n BODY_TEXT_COLOR = '#4E5969';\r\n /** footer文本颜色 */\r\n FOOTER_TEXT_COLOR = '#4E5969';\r\n /** 加载 svg 图标 */\r\n LOADING_ICON_SVG = '';\r\n /** 加载 svg 图标颜色 */\r\n LOADING_ICON_COLOR = '#4E5969';\r\n /** 树形展开svg 图标 */\r\n EXPAND_ICON_SVG = '';\r\n /** 树形收缩svg 图标 */\r\n SHRINK_ICON_SVG = '';\r\n /** 展开图标颜色 */\r\n EXPAND_ICON_COLOR = '#4E5969';\r\n SHRINK_ICON_COLOR = '#4E5969';\r\n /** 错误提示颜色 */\r\n ERROR_TIP_ICON_COLOR = 'red';\r\n /** 错误提示图标大小 */\r\n ERROR_TIP_ICON_SIZE = 6;\r\n /** 是否开启懒加载\t */\r\n EXPAND_LAZY = true;\r\n /** 默认展开全部\t */\r\n DEFAULT_EXPAND_ALL = false;\r\n /** 表格 body 部分的宽度 */\r\n CELL_WIDTH = 100;\r\n /** body 单元格默认行高 */\r\n CELL_HEIGHT = 36;\r\n /** 表格 body 部分的 padding */\r\n CELL_PADDING = 8;\r\n /** hover编辑图标大小 */\r\n CELL_HOVER_ICON_SIZE = 14;\r\n /** hover编辑图标背景色 */\r\n CELL_HOVER_ICON_BG_COLOR = '#fff';\r\n /** hover编辑图标边框颜色 */\r\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\r\n /** 滚动条轨道尺寸 */\r\n SCROLLER_TRACK_SIZE = 14;\r\n /** 滚动条滑块尺寸 */\r\n SCROLLER_SIZE = 8;\r\n /** 滚动条滑块颜色 */\r\n SCROLLER_COLOR = '#dee0e3';\r\n /** 轨道颜色 */\r\n SCROLLER_TRACK_COLOR = '#fff';\r\n /** 滚动条滑块聚焦时的颜色 */\r\n SCROLLER_FOCUS_COLOR = '#bbbec4';\r\n /** 选中区域边框颜色 */\r\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\r\n /** 选中区域背景颜色 */\r\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 当前焦点单元格所在行、列的背景色 */\r\n SELECT_ROW_COL_BG_COLOR = 'transparent';\r\n /** 填充点的边框颜色 */\r\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\r\n /** 可编辑背景色 */\r\n EDIT_BG_COLOR = '#fcf6ed';\r\n /** 选择 key,合并时用 */\r\n CHECKBOX_KEY = '';\r\n /** 选择框颜色 */\r\n CHECKBOX_COLOR = 'rgb(82,146,247)';\r\n /** 选择框大小 */\r\n CHECKBOX_SIZE = 20;\r\n /** 选择框禁用图标 */\r\n CHECKBOX_DISABLED_SVG = '';\r\n /** 选择框选中图标 */\r\n CHECKBOX_CHECK_SVG = '';\r\n /** 选择框未中图标 */\r\n CHECKBOX_UNCHECK_SVG = '';\r\n /** 选择框半选中图标 */\r\n CHECKBOX_INDETERMINATE_SVG = '';\r\n /** 单元格只读背景色 */\r\n READONLY_COLOR = '#fff';\r\n /** 单元格只读文本颜色 */\r\n READONLY_TEXT_COLOR = '#4E5969';\r\n /** 单元格错误提示文本颜色 */\r\n ERROR_TIP_COLOR = '#ED3F14';\r\n /** 合计底部背景色 */\r\n FOOTER_BG_COLOR = '#fafafa';\r\n /** 合计底部固定 */\r\n FOOTER_FIXED = true;\r\n /** 合计底部位置 */\r\n FOOTER_POSITION: FooterPosition = 'bottom';\r\n /** 单元格底部高度 */\r\n CELL_FOOTER_HEIGHT = 36;\r\n /** 启用选择器 */\r\n ENABLE_SELECTOR = true;\r\n /** 启用单点击立马编辑 */\r\n ENABLE_EDIT_SINGLE_CLICK = false; \r\n /** 启用点击选择器编辑 */\r\n ENABLE_EDIT_CLICK_SELECTOR = true; \r\n /** 选择器X最小范围 */\r\n SELECTOR_AREA_MIN_X = 0; \r\n /** 选择器X最大范围colMax - offset */\r\n SELECTOR_AREA_MAX_X_OFFSET = 0;\r\n /** 选择器X最大范围,0默认最大colMax */\r\n SELECTOR_AREA_MAX_X = 0;\r\n /** 选择器Y最小范围 */\r\n SELECTOR_AREA_MIN_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y_OFFSET = 0; \r\n /** 启用自动主题 */\r\n ENABLE_AUTO_THEME = true;\r\n /** 启用选择器-选择器单选 */\r\n ENABLE_SELECTOR_SINGLE = false;\r\n /** 启用选择器-批量跨列选择 */\r\n ENABLE_SELECTOR_SPAN_COL = true;\r\n /** 启用选择器-批量跨行选择 */\r\n ENABLE_SELECTOR_SPAN_ROW = true;\r\n /** 启用选择器-批量选中列 */\r\n ENABLE_SELECTOR_ALL_ROWS = true;\r\n /** 启用选择器-批量选中行 */\r\n ENABLE_SELECTOR_ALL_COLS = true;\r\n /** 启用合并格子数据关联 */\r\n ENABLE_MERGE_CELL_LINK = false;\r\n /** 启用填充器 */\r\n ENABLE_AUTOFILL = false;\r\n /** 启用右键菜单 */\r\n ENABLE_CONTEXT_MENU = false;\r\n /** 启用复制 */\r\n ENABLE_COPY = true;\r\n /** 启用粘贴 */\r\n ENABLE_PASTER = true;\r\n /** 启用调整行高 */\r\n ENABLE_RESIZE_ROW = true;\r\n /** 启用列宽可调整 */\r\n ENABLE_RESIZE_COLUMN = true;\r\n /** 行调整线颜色 */\r\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\r\n /** 列调整线颜色 */\r\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\r\n /** 最小调整行高 */\r\n RESIZE_ROW_MIN_HEIGHT = 36;\r\n /** 列宽最小值 */\r\n RESIZE_COLUMN_MIN_WIDTH = 40;\r\n /** 启用键盘 */\r\n ENABLE_KEYBOARD = true;\r\n /** 启用历史 */\r\n ENABLE_HISTORY = false;\r\n ENABLE_VALIDATOR_IMMEDIATE = true;\r\n /** 历史栈数量 */\r\n HISTORY_NUM = 50;\r\n /** 启用悬浮高亮 */\r\n HIGHLIGHT_HOVER_ROW = false;\r\n /** 悬浮颜色 */\r\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\r\n /** 高亮选中当前行 */\r\n HIGHLIGHT_SELECTED_ROW = false;\r\n /** 高亮当前行颜色 */\r\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 提示背景颜色 */\r\n TOOLTIP_BG_COLOR = '#303133';\r\n /** 提示文本颜色 */\r\n TOOLTIP_TEXT_COLOR = '#fff';\r\n /** 提示层级 */\r\n TOOLTIP_ZINDEX = 3000;\r\n /** 自定义提示样式 */\r\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 自定义右键菜单 */\r\n CONTEXT_MENU: MenuItem[] = [\r\n { label: '复制', value: 'copy' },\r\n { label: '剪切', value: 'cut' },\r\n { label: '粘贴', value: 'paste' },\r\n { label: '清空选中内容', value: 'clearSelected' },\r\n ];\r\n /** header 格子样式 */\r\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\r\n /** body 格子样式 */\r\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** footer 格子样式 */\r\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\r\n /** 格式化方法更改(formatter优先等级比较高) */\r\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\r\n /** 自定义校验规则 */\r\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\r\n /** 自定义编辑器类型 */\r\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\r\n /** 自定义跨列/行渲染 */\r\n SPAN_METHOD?: SpanMethod;\r\n /** 自定义选择禁用 */\r\n SELECTABLE_METHOD?: SelectableMethod;\r\n /** 自定义选择禁用 */\r\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\r\n /** 数值改变前回调 */\r\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\r\n /** 粘贴前回调 */\r\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\r\n /** 数值填充前回调 */\r\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\r\n /** 设置选择器前回调 */\r\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\r\n /** 设置填充器前回调 */\r\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\r\n /** 数据复制前回调 */\r\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\r\n constructor(config: Partial<Config>) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 初始化 */\r\n init(config: ConfigType) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 同步css 样式变量 */\r\n updateCssVar() {\r\n let obj: any = {};\r\n Object.keys(this).forEach((key) => {\r\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\r\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\r\n const val = getCssVar(cssKey);\r\n obj[key] = val;\r\n }\r\n });\r\n Object.assign(this, obj, this._config);\r\n }\r\n}\r\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color, item.isBlob).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 并行执行所有异步操作\r\n await Promise.all(promises);\r\n // 加载完成后触发绘制\r\n this.ctx.emit('draw');\r\n }\r\n private async createImageFromSVG(svgContent: string, fill?: string, isBlob = false) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n let url = '';\r\n if (isBlob) {\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n url = URL.createObjectURL(svgBlob);\r\n } else {\r\n url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n }\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport { generateShortUUID } from './util';\r\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\r\nimport BaseCell from './BaseCell';\r\nimport { Rule, Rules } from './Validator';\r\nexport default class CellHeader extends BaseCell {\r\n align: Align;\r\n verticalAlign: VerticalAlign = 'middle';\r\n fixed?: Fixed;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n widthFillDisable: boolean;\r\n type: Type | '';\r\n operation = false;\r\n editorType: string;\r\n level: number;\r\n text: string;\r\n displayText: string = '';\r\n colspan: number;\r\n rowspan: number;\r\n row: any;\r\n key: string;\r\n required = false;\r\n readonly = false;\r\n ellipsis = false;\r\n overflowTooltipShow = true;\r\n children: Column[] = [];\r\n column: Column;\r\n colIndex: number;\r\n rowKey: string;\r\n rules?: Rules | Rule;\r\n hasChildren: boolean;\r\n render: Render;\r\n style: Partial<CSSStyleDeclaration> = {};\r\n drawX = 0;\r\n drawY = 0;\r\n visibleWidth = 0;\r\n visibleHeight = 0;\r\n drawCellBgColor = '';\r\n drawTextColor = '';\r\n drawImageX = 0;\r\n drawImageY = 0;\r\n drawImageWidth = 0;\r\n drawImageHeight = 0;\r\n drawImageName = '';\r\n drawImageSource: HTMLImageElement | undefined;\r\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\r\n super(ctx, x, y, width, height, 'header', column.fixed);\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.visibleWidth = width;\r\n this.visibleHeight = height;\r\n this.colIndex = colIndex;\r\n this.key = column.key;\r\n this.minWidth = column.minWidth;\r\n this.maxWidth = column.maxWidth;\r\n this.type = column.type || '';\r\n this.editorType = column.editorType || 'text';\r\n this.align = column.align || 'center';\r\n this.verticalAlign = column.verticalAlign || 'middle';\r\n this.fixed = column.fixed;\r\n this.level = column.level || 0;\r\n this.operation = column.operation || false;\r\n this.text = column.title;\r\n this.column = column;\r\n this.colspan = column.colspan || 1;\r\n this.widthFillDisable = column.widthFillDisable || false;\r\n this.rowspan = column.rowspan || 1;\r\n this.rules = column.rules;\r\n this.readonly = column.readonly || false;\r\n this.required = column.required || false;\r\n this.rowKey = generateShortUUID();\r\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\r\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\r\n this.render = column.renderHeader;\r\n }\r\n /**\r\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\r\n * @returns\r\n */\r\n isVerticalVisible() {\r\n const { stageHeight } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\r\n }\r\n\r\n /**\r\n * 更新样式\r\n */\r\n updateStyle() {\r\n this.style = this.getOverlayerViewsStyle();\r\n }\r\n updateContainer() {\r\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\r\n let bgColor = HEADER_BG_COLOR;\r\n let textColor = HEADER_TEXT_COLOR;\r\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\r\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\r\n const { backgroundColor, color } =\r\n headerCellStyleMethod({\r\n colIndex: this.colIndex,\r\n column: this.column,\r\n }) || {};\r\n if (backgroundColor) {\r\n bgColor = backgroundColor;\r\n }\r\n // 文字颜色\r\n if (color) {\r\n textColor = color;\r\n }\r\n }\r\n this.drawCellBgColor = bgColor;\r\n this.drawTextColor = textColor;\r\n }\r\n update() {\r\n this.updateContainer();\r\n this.displayText = this.getText();\r\n this.drawX = this.getDrawX();\r\n this.drawY = this.getDrawY();\r\n this.updateStyle();\r\n }\r\n draw() {\r\n const {\r\n paint,\r\n config: { BORDER_COLOR, CELL_PADDING, HEADER_FONT, BORDER },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n // 有边框的情况下,绘制边框\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\r\n fillColor: this.drawCellBgColor,\r\n });\r\n this.ellipsis = paint.drawText(displayText, drawX, drawY, this.width, this.height, {\r\n font: HEADER_FONT,\r\n padding: CELL_PADDING,\r\n color: this.drawTextColor,\r\n align: this.align,\r\n verticalAlign: this.verticalAlign,\r\n });\r\n this.drawSelection();\r\n this.drawSelector();\r\n }\r\n private drawSelector() {\r\n // 选择区背景颜色\r\n const { ENABLE_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_SELECTOR) {\r\n return;\r\n }\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (this.colIndex >= minX && this.colIndex <= maxX) {\r\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\r\n borderColor: 'transparent',\r\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\r\n });\r\n }\r\n }\r\n private drawSelection() {\r\n const { width, height, type } = this;\r\n // 选中框类型\r\n if (['index-selection', 'selection'].includes(type)) {\r\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\r\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\r\n const _x = this.drawX + (width - CHECKBOX_SIZE) / 2;\r\n const _y = this.drawY + (height - CHECKBOX_SIZE) / 2;\r\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\r\n let checkboxName = 'checkbox-uncheck';\r\n if (indeterminate) {\r\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\r\n checkboxName = 'checkbox-indeterminate';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check');\r\n checkboxName = 'checkbox-check';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\r\n checkboxName = 'checkbox-check-disabled';\r\n } else if (!check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\r\n checkboxName = 'checkbox-uncheck';\r\n } else {\r\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\r\n checkboxName = 'checkbox-disabled';\r\n }\r\n if (checkboxImage) {\r\n this.drawImageX = _x;\r\n this.drawImageY = _y;\r\n this.drawImageWidth = CHECKBOX_SIZE;\r\n this.drawImageHeight = CHECKBOX_SIZE;\r\n this.drawImageName = checkboxName;\r\n this.drawImageSource = checkboxImage;\r\n this.ctx.paint.drawImage(\r\n this.drawImageSource,\r\n this.drawImageX,\r\n this.drawImageY,\r\n this.drawImageWidth,\r\n this.drawImageHeight,\r\n );\r\n }\r\n }\r\n }\r\n getText() {\r\n if (this.render) {\r\n return '';\r\n }\r\n return this.text;\r\n }\r\n /**\r\n * 获取样式\r\n */\r\n getOverlayerViewsStyle() {\r\n let left = '';\r\n if (this.fixed === 'left') {\r\n left = `${this.drawX}px`;\r\n } else if (this.fixed === 'right') {\r\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\r\n } else {\r\n // 中间的,需要减去左边固定列的宽度\r\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\r\n }\r\n return {\r\n position: 'absolute',\r\n overflow: 'hidden',\r\n left: left,\r\n top: `${this.drawY + 1}px`,\r\n width: `${this.width}px`,\r\n height: `${this.height - 2}px`,\r\n pointerEvents: 'initial',\r\n userSelect: 'none',\r\n };\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n // 树事件\n this.treeClick(cell);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n this.selectionEnterAndLeave(cell, e);\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.hoverCellHeader = undefined; // 清除头部hover\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection = ['selection', 'index-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (cell.drawImageName === 'checkbox-uncheck' || cell.drawImageName === 'checkbox-indeterminate') {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.type === 'tree' && this.ctx.isPointer) {\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n }\n }\n private selectionEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否可选\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history);\r\n } else {\r\n this.database.batchSetItemValue(_list, history);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const item = this.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n if (item) {\r\n cellsData.push(item.value);\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n private clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: null,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n let htmlX = 0;\n let htmlY = 0;\n if (documentElement && !isOffsetParentAnElement && !isFixed) {\n const htmlRect = documentElement.getBoundingClientRect();\n htmlY = htmlRect.top + scroll.scrollTop;\n htmlX = htmlRect.left + scroll.scrollLeft -\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect);\n }\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlX;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlY;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.floatingEl.addEventListener('mouseleave', () => {\n this.hide();\n });\n this.ctx.on('mouseout', (e) => {\n if (this.floatingEl.contains(e.relatedTarget as Node)) {\n return;\n }\n this.hide();\n });\n this.ctx.on('onScroll', () => {\n this.hide();\n });\n this.ctx.on('startEdit', () => {\n this.hide();\n });\n this.ctx.on('visibleCellHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n if (cell.ellipsis) {\n this.show(cell);\n }\n });\n }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\nexport default class Overlayer {\r\n ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n }\r\n draw() {\r\n const overlayer = this.getContainer();\r\n this.ctx.emit('overlayerChange', overlayer);\r\n }\r\n destroy() {\r\n this.ctx.emit('overlayerChange', {\r\n style: {},\r\n views: [],\r\n });\r\n }\r\n private getContainer(): OverlayerContainer {\r\n const header = this.getHeader();\r\n const body = this.getBody();\r\n const footer = this.getFooter();\r\n let views: OverlayerWrapper[] = [];\r\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\r\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\r\n if (!FOOTER_FIXED) {\r\n views = [header, body];\r\n } else {\r\n if (FOOTER_POSITION === 'top') {\r\n views = [header, footer, body];\r\n } else {\r\n views = [header, body, footer];\r\n }\r\n }\r\n return {\r\n views,\r\n };\r\n }\r\n private getHeader() {\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\r\n let centerCells: CellHeader[] = [];\r\n let leftCells: CellHeader[] = [];\r\n let rightCells: CellHeader[] = [];\r\n renderCellHeaders.forEach((cellHeader) => {\r\n if (cellHeader.render) {\r\n if (cellHeader.fixed === 'left') {\r\n leftCells.push(cellHeader);\r\n } else if (cellHeader.fixed === 'right') {\r\n rightCells.push(cellHeader);\r\n } else {\r\n centerCells.push(cellHeader);\r\n }\r\n }\r\n });\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${fixedLeftWidth}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const header: OverlayerWrapper = {\r\n type: 'header',\r\n class: `${CSS_PREFIX}-overlayer-header`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return header;\r\n }\r\n private getBody() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n let renderRows = this.ctx.body.renderRows;\r\n // 合计如果不是固定在底部,就加入到渲染行中\r\n if (!this.ctx.config.FOOTER_FIXED) {\r\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\r\n }\r\n renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer') {\r\n cell.render = cell.renderFooter;\r\n }\r\n if (cell.render) {\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.body;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const body: OverlayerWrapper = {\r\n type: 'body',\r\n class: `${CSS_PREFIX}-overlayer-body`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return body;\r\n }\r\n private getFooter() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer' && cell.renderFooter) {\r\n // 把转renderFooter成render统一出口\r\n cell.render = cell.renderFooter;\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.footer;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n right: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const footer: OverlayerWrapper = {\r\n type: 'footer',\r\n class: `${CSS_PREFIX}-overlayer-footer`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return footer;\r\n }\r\n}\r\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(ladong: boolean) {\r\n this.ctx.database.setLoading(ladong);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(rowKey: string, key: string, value: any, history = true, reDraw = true, isEditor = false) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true) {\r\n this.ctx.database.batchSetItemValue(list, history);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw);\r\n this.editor.doneEdit();\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n setCurrentRowByRowIndex(rowIndex: number) {\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCell(rowIndex, 0);\r\n this.ctx.emit('draw');\r\n }\r\n setCurrentRow(rowKey: string) {\r\n const column = this.ctx.database.getColumnByColIndex(0);\r\n if (!column) {\r\n return;\r\n }\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCellByKey(rowKey, column.key);\r\n this.ctx.emit('draw');\r\n }\r\n getCurrentRow() {\r\n const cell = this.ctx.currentCell;\r\n if (!cell) {\r\n return;\r\n }\r\n const rowData: RowParams = {\r\n row: cell.row,\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n };\r\n return rowData;\r\n }\r\n clearValidate() {\r\n this.ctx.database.clearValidate();\r\n this.ctx.emit('draw');\r\n }\r\n validateFields(ValidateFields: ValidateField[], scrollError = true) {\r\n return new Promise(async (resolve, reject) => {\r\n let errors: any[] = [];\r\n for (let i = 0; i < ValidateFields.length; i++) {\r\n const { rowKey, key } = ValidateFields[i];\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n if (scrollError) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n async validate(scrollError = true) {\r\n // 先关闭编辑\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const res = await this.getValidations();\r\n resolve(res);\r\n } catch (errors) {\r\n // 滚动到错误位置,取第一个错误\r\n if (scrollError && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n const targetRow = this.ctx.database.getRowForRowKey(rowKey);\r\n if (targetRow) {\r\n const { parentRowKeys = [] } = targetRow;\r\n if (parentRowKeys && parentRowKeys.length) {\r\n this.setExpandRowKeys(parentRowKeys, true);\r\n }\r\n }\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n reject(errors);\r\n }\r\n });\r\n }\r\n setValidations(errors: ValidateItemError[]) {\r\n errors.forEach((item) => {\r\n const { rowIndex, key, message } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","c","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","iconX","iconY","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","BODY_TEXT_COLOR","FOOTER_TEXT_COLOR","FOOTER_BG_COLOR","HIGHLIGHT_SELECTED_ROW","HIGHLIGHT_SELECTED_ROW_COLOR","HIGHLIGHT_HOVER_ROW","HIGHLIGHT_HOVER_ROW_COLOR","STRIPE","STRIPE_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawX","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","i","cellHeader","BODY_FONT","PLACEHOLDER_COLOR","offsetIconX","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","dataList","parentRowKeys","ROW_KEY","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","_a","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","historyList","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","values","changeItem","selection","draw","_selectable","ignoreReserve","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","indeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","resolve","BODY_CELL_RULES_METHOD","_rules","_errors","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","_key","hasMergeCell","j","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","displayText","EventTable","mutations","mutation","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","leafColumns","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","d","_overflowsData$filter2","currentSideAxis","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","leftScroll","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","htmlX","htmlY","htmlRect","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","items","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ladong","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is pattern validation error`,\r\n });\r\n }\r\n if (rule.required && (value === undefined || value === null || value === '')) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is required`,\r\n });\r\n }\r\n }\r\n return errors;\r\n }\r\n}\r\n","import { Column, SpanParams } from './types';\r\n\r\nfunction generateShortUUID(): string {\r\n return 'xxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\nfunction throttle<T extends (...args: any) => any>(func: T, delay: number): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\nexport {\r\n debounce,\r\n throttle,\r\n generateShortUUID,\r\n toLeaf,\r\n sortFixed,\r\n calCrossSpan,\r\n getMaxRow,\r\n decodeSpreadsheetStr,\r\n encodeToSpreadsheetStr,\r\n mergeRowCell,\r\n mergeColCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n getCssVar,\r\n};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawImageX = 0;\n drawImageY = 0;\n drawImageWidth = 0;\n drawImageHeight = 0;\n drawImageName = '';\n drawImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.selectorCellValueType = column.selectorCellValueType || this.ctx.config.SELECTOR_CELL_VALUE_TYPE || 'value';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || 'center';\n this.verticalAlign = column.verticalAlign || 'middle';\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (this.type === 'tree' && cellType === 'body') {\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n iconOffsetX = level * 8;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n iconOffsetX = level * 8;\n } else {\n iconOffsetX = level * 8;\n }\n let iconWidth = 20;\n let iconHeight = 20;\n if (icon) {\n let iconX = this.drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n this.ctx.paint.drawImage(icon, iconX, iconY, iconWidth, iconHeight);\n this.drawImageX = iconX;\n this.drawImageY = iconY;\n this.drawImageWidth = iconWidth;\n this.drawImageHeight = iconHeight;\n this.drawImageName = iconName;\n this.drawImageSource = icon;\n }\n // 更改文本距离\n this.align = 'left';\n this.drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n }\n }\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n BODY_TEXT_COLOR,\n FOOTER_TEXT_COLOR,\n FOOTER_BG_COLOR,\n HIGHLIGHT_SELECTED_ROW,\n HIGHLIGHT_SELECTED_ROW_COLOR,\n HIGHLIGHT_HOVER_ROW,\n HIGHLIGHT_HOVER_ROW_COLOR,\n STRIPE,\n STRIPE_COLOR,\n } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n // 选中框类型\n if (['index-selection', 'selection'].includes(type)) {\n const check = this.ctx.database.getRowSelection(rowKey);\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\n const _x = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n const _y = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage && type == 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n } else if (checkboxImage && 'selection' === type) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawImageName = this.hoverIconName;\n this.drawImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n let visibleWidth = this.visibleWidth;\n if (this.type === 'tree') {\n const offsetIconX = this.drawTextX - this.drawX;\n visibleWidth = this.visibleWidth - offsetIconX; // 减去树形图标的宽度\n }\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.displayText, visibleWidth, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, visibleWidth, this.visibleHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\n }\n if (this.hoverIconName) {\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawImageX - 2,\n this.drawImageY - 2,\n this.drawImageWidth + 4,\n this.drawImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n }\n this.ctx.paint.drawImage(\n this.drawImageSource,\n this.drawImageX,\n this.drawImageY,\n this.drawImageWidth,\n this.drawImageHeight,\n );\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import type CellHeader from './CellHeader';\nimport Validator, { RuleParam, ValidateResult } from './Validator';\nimport type Context from './Context';\nimport type {\n CellReadonlyMethod,\n CellRulesMethod,\n ChangeItem,\n Column,\n FilterMethod,\n Position,\n SelectableMethod,\n EVirtTableOptions,\n BeforeCellValueChangeMethod,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n} from './types';\nimport { generateShortUUID, toLeaf } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n // 判断是否有选择和树形结构\n const _columns = this.getColumns();\n const leafColumns = toLeaf(_columns);\n this.ctx.hasSelection = leafColumns.some((item) => item.type === 'selection');\n this.ctx.hasTree = leafColumns.some((item) => item.type === 'tree');\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n const { ROW_KEY } = this.ctx.config;\n // 清除选中和展开状态,如果没有ROW_KEY清除\n if (!ROW_KEY) {\n // 无行主键时直接清除所有状态\n this.selectionMap.clear();\n this.expandMap.clear();\n } else {\n // 有行主键,根据上下文条件清除部分状态\n if (!this.ctx.hasSelection) {\n this.selectionMap.clear();\n }\n if (!this.ctx.hasTree) {\n this.expandMap.clear();\n }\n }\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n });\n if (Array.isArray(item.children)) {\n if (item.children.length) {\n this.initData(item.children, level + 1, [...parentRowKeys, rowKey]);\n }\n }\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.expandMap.set(rowKey, expand);\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n this.expandMap.clear();\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\n this.expandMap.set(rowkey, expand);\n row.expand = expand;\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n getExpandRowKeys() {\n let list: string[] = [];\n this.rowKeyMap.forEach((row: any, key: string) => {\n if (row.expand) {\n list.push(key);\n }\n });\n return list;\n }\n expandAll(expand: boolean) {\n this.expandMap.clear();\n this.rowKeyMap.forEach((row: any) => {\n row.expand = expand;\n this.expandMap.set(row.key, expand);\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n expandLoading(rowKey: string, loading = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expandLoading = loading;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandChildren(rowKey: string, children: any[]) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = true;\n this.expandMap.set(rowKey, true);\n row.expandLazy = true;\n row.item.children = children;\n this.initData(row.item.children, row.level + 1);\n this.clearBufferData(); // 清除缓存数据\n }\n getIsExpandLoading(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLoading;\n }\n getIsExpandLazy(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLazy;\n }\n /**\n * 根据rowKey获取是否展开\n * @param rowKey\n * @returns\n */\n getIsExpand(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expand;\n }\n /**\n * 根据rowKey获取行数据\n * @param rowKey\n * @returns\n */\n getRowForRowKey(rowKey: string) {\n return this.rowKeyMap.get(rowKey);\n }\n getRowForRowIndex(rowIndex: number) {\n const rowKey = this.getRowKeyForRowIndex(rowIndex);\n return this.rowKeyMap.get(rowKey);\n }\n /**\n * 根据rowIndex获取rowKey\n * @param rowKey\n * @returns\n */\n getRowKeyForRowIndex(rowIndex: number) {\n return this.rowIndexRowKeyMap.get(rowIndex) || '';\n }\n getRowKeyByItem(item: any) {\n return this.itemRowKeyMap.get(item);\n }\n getRowIndexForRowKey(rowKey: string) {\n return this.rowKeyRowIndexMap.get(rowKey);\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(_list: ChangeItem[], history = false, checkReadonly = true) {\n let historyList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n }\n changeList.forEach((data) => {\n const { value, rowKey, key, oldValue } = data;\n rowKeyList.add(rowKey);\n this.setItemValue(rowKey, key, value, false, false, false, checkReadonly);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n if (checkReadonly) {\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n }\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @param checkReadonly 是否检查只读\n * @returns\n */\n async setItemValue(\n rowKey: string,\n key: string,\n _value: any,\n history = false,\n reDraw = false,\n isEditor = false,\n checkReadonly = true,\n ) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (checkReadonly && this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange([\n {\n rowKey,\n key,\n value,\n oldValue: item[key],\n row,\n },\n ]);\n if (values && values.length) {\n value = values[0].value;\n }\n }\n // 设置改变值\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n const changeItem: ChangeItem = {\n rowKey,\n key,\n oldValue,\n value,\n row,\n };\n if (checkReadonly) {\n // 实时校验错误\n this.getValidator(rowKey, key).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', [changeItem], [row]);\n }\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 添加历史记录\n if (history) {\n this.ctx.history.pushState({\n type: 'single',\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n changeList: [\n {\n rowKey,\n key,\n oldValue,\n newValue: value,\n },\n ],\n });\n }\n\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n } else {\n this.selectionMap.clear();\n this.rowKeyMap.forEach((row, rowKey: string) => {\n this.selectionMap.set(rowKey, {\n check: false,\n row: row.item,\n key: rowKey,\n });\n });\n }\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n // 缓存,解决性能问题\n const { buffer, ...bufferState } = this.bufferCheckState;\n if (buffer) {\n return bufferState;\n }\n const total = this.rowKeyMap.size;\n let totalChecked = 0;\n let totalSelectable = 0;\n const reserveTotal = this.selectionMap.size;\n const reserveHasChecked = Array.from(this.selectionMap.values()).some((item) => item.check);\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n if (this.selectionMap.get(rowKey)?.check) {\n totalChecked += 1;\n }\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n totalSelectable += 1;\n }\n });\n // 存在跨页时,变更半选中\n const reserveIndeterminate = reserveTotal > total && totalChecked === 0 && reserveHasChecked;\n const indeterminate =\n (totalSelectable && totalSelectable > totalChecked && totalChecked > 0) || reserveIndeterminate;\n const selectable = totalSelectable !== 0;\n const check = !!totalSelectable && totalSelectable === totalChecked;\n // 缓存\n this.bufferCheckState = {\n buffer: true,\n check,\n indeterminate,\n selectable,\n };\n\n return {\n check,\n indeterminate,\n selectable,\n };\n }\n /**\n * 更新列索引\n * @param list 表头末级列表\n */\n updateColIndexKeyMap(list: CellHeader[] = []) {\n this.colIndexKeyMap.clear();\n list.forEach((column) => {\n this.colIndexKeyMap.set(column.colIndex, column.key);\n });\n }\n getColumnByColIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.column;\n }\n }\n getColumnByKey(key: string) {\n const column = this.headerMap.get(key);\n if (column) {\n return column;\n }\n }\n getColIndexForKey(key: string) {\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.colIndex;\n }\n }\n getColHeaderByIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key);\n }\n return undefined;\n }\n /**\n * 获取以改变数据\n */\n getChangedData() {\n let list: {\n rowKey: string;\n colKey: string;\n row: any;\n originalValue: any;\n value: any;\n }[] = [];\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n const colKey = key.split('\\u200b_')[1];\n if (originalValue !== value) {\n list.push({\n rowKey,\n colKey,\n originalValue,\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\n value,\n });\n }\n });\n return list;\n }\n getChangedRows() {\n const rowKeyList: Set<string> = new Set();\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n if (originalValue !== value) {\n rowKeyList.add(rowKey);\n }\n });\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n return rows;\n }\n /**\n * 获取改变值是否已经改变\n * @param rowKey\n * @param key\n * @returns\n */\n isHasChangedData(rowKey: string, key: string) {\n const changedKey = `${rowKey}\\u200b_${key}`;\n if (!this.changedDataMap.has(changedKey)) {\n return false;\n }\n const originalValue = this.originalDataMap.get(changedKey);\n const changedValue = this.changedDataMap.get(changedKey);\n return originalValue !== changedValue;\n }\n getPositionForRowIndex(rowIndex: number): Position {\n if (rowIndex < this.positions.length) {\n return this.positions[rowIndex];\n }\n return {\n height: 0,\n top: 0,\n bottom: 0,\n };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false);\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false);\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\r\nimport {\r\n BeforeAutofillDataMethod,\r\n BeforeCellValueChangeMethod,\r\n BeforeCopyMethod,\r\n BeforePasteDataMethod,\r\n BeforeSetAutofillMethod,\r\n BeforeSetSelectorMethod,\r\n CellEditorMethod,\r\n CellHeaderStyleMethod,\r\n CellHoverIconMethod,\r\n CellReadonlyMethod,\r\n CellRenderMethod,\r\n CellRulesMethod,\r\n CellStyleMethod,\r\n CellTypeMethod,\r\n ConfigType,\r\n ExpandLazyMethod,\r\n FooterPosition,\r\n FormatterMethod,\r\n MenuItem,\r\n SelectableMethod,\r\n SelectorCellValueType,\r\n SpanMethod,\r\n} from './types';\r\nimport { getCssVar } from './util';\r\n\r\nexport default class Config {\r\n private _config: ConfigType = {};\r\n /** CSS 类名前缀 */\r\n CSS_PREFIX = 'e-virt-table';\r\n /** 图标集合 */\r\n ICONS: IconType[] = [];\r\n /** 行的唯一标识键 */\r\n ROW_KEY = '';\r\n /** 禁用编辑,优先等级最高 */\r\n DISABLED = false; \r\n /** 表头字体 */\r\n HEADER_FONT = '12px normal Arial';\r\n /** 单元格字体 */\r\n BODY_FONT = '12px normal Arial';\r\n /** 边框 */\r\n BORDER = true;\r\n /** 斑马纹 */\r\n STRIPE = false; \r\n /** 斑马纹颜色 */\r\n STRIPE_COLOR = '#fafafa'; \r\n /** 区域边框颜色 */\r\n BORDER_COLOR = '#e1e6eb';\r\n /** 宽度为 0 表示自适应100% */\r\n WIDTH = 0;\r\n /** 最小可调整宽度 */\r\n RESIZE_MIN_WIDTH = 40;\r\n /** 高度,为 0 表示自适应 */\r\n HEIGHT = 0;\r\n /** 占位文本颜色 */\r\n PLACEHOLDER_COLOR = '#CDD0DC';\r\n /** 空数据 body 高度 */\r\n EMPTY_BODY_HEIGHT = 120;\r\n /** 自定义空样式 */\r\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 空数据文本 */\r\n EMPTY_TEXT = '暂无数据';\r\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\r\n MAX_HEIGHT = 1000;\r\n /** 区域边框圆角 */\r\n BORDER_RADIUS = 8;\r\n ENABLE_OFFSET_HEIGHT = false;\r\n OFFSET_HEIGHT = 0;\r\n HEADER_HEIGHT = 36;\r\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\r\n ENABLE_HEADER_STICKY = false; \r\n /** 表头背景色 */\r\n HEADER_BG_COLOR = '#F8FAFF';\r\n /** body 背景色 */\r\n BODY_BG_COLOR = '#FFF';\r\n /** 表头文本颜色 */\r\n HEADER_TEXT_COLOR = '#1D2129';\r\n /** body文本颜色 */\r\n BODY_TEXT_COLOR = '#4E5969';\r\n /** footer文本颜色 */\r\n FOOTER_TEXT_COLOR = '#4E5969';\r\n /** 加载 svg 图标 */\r\n LOADING_ICON_SVG = '';\r\n /** 加载 svg 图标颜色 */\r\n LOADING_ICON_COLOR = '#4E5969';\r\n /** 树形展开svg 图标 */\r\n EXPAND_ICON_SVG = '';\r\n /** 树形收缩svg 图标 */\r\n SHRINK_ICON_SVG = '';\r\n /** 展开图标颜色 */\r\n EXPAND_ICON_COLOR = '#4E5969';\r\n SHRINK_ICON_COLOR = '#4E5969';\r\n /** 错误提示颜色 */\r\n ERROR_TIP_ICON_COLOR = 'red';\r\n /** 错误提示图标大小 */\r\n ERROR_TIP_ICON_SIZE = 6;\r\n /** 是否开启懒加载\t */\r\n EXPAND_LAZY = true;\r\n /** 默认展开全部\t */\r\n DEFAULT_EXPAND_ALL = false;\r\n /** 表格 body 部分的宽度 */\r\n CELL_WIDTH = 100;\r\n /** body 单元格默认行高 */\r\n CELL_HEIGHT = 36;\r\n /** 表格 body 部分的 padding */\r\n CELL_PADDING = 8;\r\n /** hover编辑图标大小 */\r\n CELL_HOVER_ICON_SIZE = 14;\r\n /** hover编辑图标背景色 */\r\n CELL_HOVER_ICON_BG_COLOR = '#fff';\r\n /** hover编辑图标边框颜色 */\r\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\r\n /** 滚动条轨道尺寸 */\r\n SCROLLER_TRACK_SIZE = 14;\r\n /** 滚动条滑块尺寸 */\r\n SCROLLER_SIZE = 8;\r\n /** 滚动条滑块颜色 */\r\n SCROLLER_COLOR = '#dee0e3';\r\n /** 轨道颜色 */\r\n SCROLLER_TRACK_COLOR = '#fff';\r\n /** 滚动条滑块聚焦时的颜色 */\r\n SCROLLER_FOCUS_COLOR = '#bbbec4';\r\n /** 选中区域边框颜色 */\r\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\r\n /** 选中区域背景颜色 */\r\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 当前焦点单元格所在行、列的背景色 */\r\n SELECT_ROW_COL_BG_COLOR = 'transparent';\r\n /** 填充点的边框颜色 */\r\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\r\n /** 可编辑背景色 */\r\n EDIT_BG_COLOR = '#fcf6ed';\r\n /** 选择 key,合并时用 */\r\n CHECKBOX_KEY = '';\r\n /** 选择框颜色 */\r\n CHECKBOX_COLOR = 'rgb(82,146,247)';\r\n /** 选择框大小 */\r\n CHECKBOX_SIZE = 20;\r\n /** 选择框禁用图标 */\r\n CHECKBOX_DISABLED_SVG = '';\r\n /** 选择框选中图标 */\r\n CHECKBOX_CHECK_SVG = '';\r\n /** 选择框未中图标 */\r\n CHECKBOX_UNCHECK_SVG = '';\r\n /** 选择框半选中图标 */\r\n CHECKBOX_INDETERMINATE_SVG = '';\r\n /** 单元格只读背景色 */\r\n READONLY_COLOR = '#fff';\r\n /** 单元格只读文本颜色 */\r\n READONLY_TEXT_COLOR = '#4E5969';\r\n /** 单元格错误提示文本颜色 */\r\n ERROR_TIP_COLOR = '#ED3F14';\r\n /** 合计底部背景色 */\r\n FOOTER_BG_COLOR = '#fafafa';\r\n /** 合计底部固定 */\r\n FOOTER_FIXED = true;\r\n /** 合计底部位置 */\r\n FOOTER_POSITION: FooterPosition = 'bottom';\r\n /** 单元格底部高度 */\r\n CELL_FOOTER_HEIGHT = 36;\r\n /** 启用选择器 */\r\n ENABLE_SELECTOR = true;\r\n /** 启用单点击立马编辑 */\r\n ENABLE_EDIT_SINGLE_CLICK = false; \r\n /** 启用点击选择器编辑 */\r\n ENABLE_EDIT_CLICK_SELECTOR = true; \r\n /** 选择器X最小范围 */\r\n SELECTOR_AREA_MIN_X = 0; \r\n /** 选择器X最大范围colMax - offset */\r\n SELECTOR_AREA_MAX_X_OFFSET = 0;\r\n /** 选择器X最大范围,0默认最大colMax */\r\n SELECTOR_AREA_MAX_X = 0;\r\n /** 选择器Y最小范围 */\r\n SELECTOR_AREA_MIN_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y_OFFSET = 0; \r\n /** 选择器值类型,value,displayText,区别displayText受format影响 */\r\n SELECTOR_CELL_VALUE_TYPE: SelectorCellValueType = 'value'; // displayText | value\r\n /** 启用自动主题 */\r\n ENABLE_AUTO_THEME = true;\r\n /** 启用选择器-选择器单选 */\r\n ENABLE_SELECTOR_SINGLE = false;\r\n /** 启用选择器-批量跨列选择 */\r\n ENABLE_SELECTOR_SPAN_COL = true;\r\n /** 启用选择器-批量跨行选择 */\r\n ENABLE_SELECTOR_SPAN_ROW = true;\r\n /** 启用选择器-批量选中列 */\r\n ENABLE_SELECTOR_ALL_ROWS = true;\r\n /** 启用选择器-批量选中行 */\r\n ENABLE_SELECTOR_ALL_COLS = true;\r\n /** 启用合并格子数据关联 */\r\n ENABLE_MERGE_CELL_LINK = false;\r\n /** 启用填充器 */\r\n ENABLE_AUTOFILL = false;\r\n /** 启用右键菜单 */\r\n ENABLE_CONTEXT_MENU = false;\r\n /** 启用复制 */\r\n ENABLE_COPY = true;\r\n /** 启用粘贴 */\r\n ENABLE_PASTER = true;\r\n /** 启用调整行高 */\r\n ENABLE_RESIZE_ROW = true;\r\n /** 启用列宽可调整 */\r\n ENABLE_RESIZE_COLUMN = true;\r\n /** 行调整线颜色 */\r\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\r\n /** 列调整线颜色 */\r\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\r\n /** 最小调整行高 */\r\n RESIZE_ROW_MIN_HEIGHT = 36;\r\n /** 列宽最小值 */\r\n RESIZE_COLUMN_MIN_WIDTH = 40;\r\n /** 启用键盘 */\r\n ENABLE_KEYBOARD = true;\r\n /** 启用历史 */\r\n ENABLE_HISTORY = false;\r\n ENABLE_VALIDATOR_IMMEDIATE = true;\r\n /** 历史栈数量 */\r\n HISTORY_NUM = 50;\r\n /** 启用悬浮高亮 */\r\n HIGHLIGHT_HOVER_ROW = false;\r\n /** 悬浮颜色 */\r\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\r\n /** 高亮选中当前行 */\r\n HIGHLIGHT_SELECTED_ROW = false;\r\n /** 高亮当前行颜色 */\r\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 提示背景颜色 */\r\n TOOLTIP_BG_COLOR = '#303133';\r\n /** 提示文本颜色 */\r\n TOOLTIP_TEXT_COLOR = '#fff';\r\n /** 提示层级 */\r\n TOOLTIP_ZINDEX = 3000;\r\n /** 自定义提示样式 */\r\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 自定义右键菜单 */\r\n CONTEXT_MENU: MenuItem[] = [\r\n { label: '复制', value: 'copy' },\r\n { label: '剪切', value: 'cut' },\r\n { label: '粘贴', value: 'paste' },\r\n { label: '清空选中内容', value: 'clearSelected' },\r\n ];\r\n /** header 格子样式 */\r\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\r\n /** body 格子样式 */\r\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** footer 格子样式 */\r\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\r\n /** 格式化方法更改(formatter优先等级比较高) */\r\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\r\n /** 自定义校验规则 */\r\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\r\n /** 自定义编辑器类型 */\r\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\r\n /** 自定义跨列/行渲染 */\r\n SPAN_METHOD?: SpanMethod;\r\n /** 自定义选择禁用 */\r\n SELECTABLE_METHOD?: SelectableMethod;\r\n /** 自定义选择禁用 */\r\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\r\n /** 数值改变前回调 */\r\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\r\n /** 粘贴前回调 */\r\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\r\n /** 数值填充前回调 */\r\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\r\n /** 设置选择器前回调 */\r\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\r\n /** 设置填充器前回调 */\r\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\r\n /** 数据复制前回调 */\r\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\r\n constructor(config: Partial<Config>) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 初始化 */\r\n init(config: ConfigType) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 同步css 样式变量 */\r\n updateCssVar() {\r\n let obj: any = {};\r\n Object.keys(this).forEach((key) => {\r\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\r\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\r\n const val = getCssVar(cssKey);\r\n obj[key] = val;\r\n }\r\n });\r\n Object.assign(this, obj, this._config);\r\n }\r\n}\r\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color, item.isBlob).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 并行执行所有异步操作\r\n await Promise.all(promises);\r\n // 加载完成后触发绘制\r\n this.ctx.emit('draw');\r\n }\r\n private async createImageFromSVG(svgContent: string, fill?: string, isBlob = false) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n let url = '';\r\n if (isBlob) {\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n url = URL.createObjectURL(svgBlob);\r\n } else {\r\n url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n }\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport { generateShortUUID } from './util';\r\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\r\nimport BaseCell from './BaseCell';\r\nimport { Rule, Rules } from './Validator';\r\nexport default class CellHeader extends BaseCell {\r\n align: Align;\r\n verticalAlign: VerticalAlign = 'middle';\r\n fixed?: Fixed;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n widthFillDisable: boolean;\r\n type: Type | '';\r\n operation = false;\r\n editorType: string;\r\n level: number;\r\n text: string;\r\n displayText: string = '';\r\n colspan: number;\r\n rowspan: number;\r\n row: any;\r\n key: string;\r\n required = false;\r\n readonly = false;\r\n ellipsis = false;\r\n overflowTooltipShow = true;\r\n children: Column[] = [];\r\n column: Column;\r\n colIndex: number;\r\n rowKey: string;\r\n rules?: Rules | Rule;\r\n hasChildren: boolean;\r\n render: Render;\r\n style: Partial<CSSStyleDeclaration> = {};\r\n drawX = 0;\r\n drawY = 0;\r\n visibleWidth = 0;\r\n visibleHeight = 0;\r\n drawCellBgColor = '';\r\n drawTextColor = '';\r\n drawImageX = 0;\r\n drawImageY = 0;\r\n drawImageWidth = 0;\r\n drawImageHeight = 0;\r\n drawImageName = '';\r\n drawImageSource: HTMLImageElement | undefined;\r\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\r\n super(ctx, x, y, width, height, 'header', column.fixed);\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.visibleWidth = width;\r\n this.visibleHeight = height;\r\n this.colIndex = colIndex;\r\n this.key = column.key;\r\n this.minWidth = column.minWidth;\r\n this.maxWidth = column.maxWidth;\r\n this.type = column.type || '';\r\n this.editorType = column.editorType || 'text';\r\n this.align = column.align || 'center';\r\n this.verticalAlign = column.verticalAlign || 'middle';\r\n this.fixed = column.fixed;\r\n this.level = column.level || 0;\r\n this.operation = column.operation || false;\r\n this.text = column.title;\r\n this.column = column;\r\n this.colspan = column.colspan || 1;\r\n this.widthFillDisable = column.widthFillDisable || false;\r\n this.rowspan = column.rowspan || 1;\r\n this.rules = column.rules;\r\n this.readonly = column.readonly || false;\r\n this.required = column.required || false;\r\n this.rowKey = generateShortUUID();\r\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\r\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\r\n this.render = column.renderHeader;\r\n }\r\n /**\r\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\r\n * @returns\r\n */\r\n isVerticalVisible() {\r\n const { stageHeight } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\r\n }\r\n\r\n /**\r\n * 更新样式\r\n */\r\n updateStyle() {\r\n this.style = this.getOverlayerViewsStyle();\r\n }\r\n updateContainer() {\r\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\r\n let bgColor = HEADER_BG_COLOR;\r\n let textColor = HEADER_TEXT_COLOR;\r\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\r\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\r\n const { backgroundColor, color } =\r\n headerCellStyleMethod({\r\n colIndex: this.colIndex,\r\n column: this.column,\r\n }) || {};\r\n if (backgroundColor) {\r\n bgColor = backgroundColor;\r\n }\r\n // 文字颜色\r\n if (color) {\r\n textColor = color;\r\n }\r\n }\r\n this.drawCellBgColor = bgColor;\r\n this.drawTextColor = textColor;\r\n }\r\n update() {\r\n this.updateContainer();\r\n this.displayText = this.getText();\r\n this.drawX = this.getDrawX();\r\n this.drawY = this.getDrawY();\r\n this.updateStyle();\r\n }\r\n draw() {\r\n const {\r\n paint,\r\n config: { BORDER_COLOR, CELL_PADDING, HEADER_FONT, BORDER },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n // 有边框的情况下,绘制边框\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\r\n fillColor: this.drawCellBgColor,\r\n });\r\n this.ellipsis = paint.drawText(displayText, drawX, drawY, this.width, this.height, {\r\n font: HEADER_FONT,\r\n padding: CELL_PADDING,\r\n color: this.drawTextColor,\r\n align: this.align,\r\n verticalAlign: this.verticalAlign,\r\n });\r\n this.drawSelection();\r\n this.drawSelector();\r\n }\r\n private drawSelector() {\r\n // 选择区背景颜色\r\n const { ENABLE_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_SELECTOR) {\r\n return;\r\n }\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (this.colIndex >= minX && this.colIndex <= maxX) {\r\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\r\n borderColor: 'transparent',\r\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\r\n });\r\n }\r\n }\r\n private drawSelection() {\r\n const { width, height, type } = this;\r\n // 选中框类型\r\n if (['index-selection', 'selection'].includes(type)) {\r\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\r\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\r\n const _x = this.drawX + (width - CHECKBOX_SIZE) / 2;\r\n const _y = this.drawY + (height - CHECKBOX_SIZE) / 2;\r\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\r\n let checkboxName = 'checkbox-uncheck';\r\n if (indeterminate) {\r\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\r\n checkboxName = 'checkbox-indeterminate';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check');\r\n checkboxName = 'checkbox-check';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\r\n checkboxName = 'checkbox-check-disabled';\r\n } else if (!check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\r\n checkboxName = 'checkbox-uncheck';\r\n } else {\r\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\r\n checkboxName = 'checkbox-disabled';\r\n }\r\n if (checkboxImage) {\r\n this.drawImageX = _x;\r\n this.drawImageY = _y;\r\n this.drawImageWidth = CHECKBOX_SIZE;\r\n this.drawImageHeight = CHECKBOX_SIZE;\r\n this.drawImageName = checkboxName;\r\n this.drawImageSource = checkboxImage;\r\n this.ctx.paint.drawImage(\r\n this.drawImageSource,\r\n this.drawImageX,\r\n this.drawImageY,\r\n this.drawImageWidth,\r\n this.drawImageHeight,\r\n );\r\n }\r\n }\r\n }\r\n getText() {\r\n if (this.render) {\r\n return '';\r\n }\r\n return this.text;\r\n }\r\n /**\r\n * 获取样式\r\n */\r\n getOverlayerViewsStyle() {\r\n let left = '';\r\n if (this.fixed === 'left') {\r\n left = `${this.drawX}px`;\r\n } else if (this.fixed === 'right') {\r\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\r\n } else {\r\n // 中间的,需要减去左边固定列的宽度\r\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\r\n }\r\n return {\r\n position: 'absolute',\r\n overflow: 'hidden',\r\n left: left,\r\n top: `${this.drawY + 1}px`,\r\n width: `${this.width}px`,\r\n height: `${this.height - 2}px`,\r\n pointerEvents: 'initial',\r\n userSelect: 'none',\r\n };\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n // 树事件\n this.treeClick(cell);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n this.selectionEnterAndLeave(cell, e);\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.hoverCellHeader = undefined; // 清除头部hover\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection = ['selection', 'index-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (cell.drawImageName === 'checkbox-uncheck' || cell.drawImageName === 'checkbox-indeterminate') {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.type === 'tree' && this.ctx.isPointer) {\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n }\n }\n private selectionEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否可选\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n hasSelection = false; // 是否有选中\r\n hasTree = false; // 是否有树形结构\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history, checkReadonly);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true, checkReadonly);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history, checkReadonly);\r\n } else {\r\n this.database.batchSetItemValue(_list, history, checkReadonly);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 选择器值类型\r\n if (cell.selectorCellValueType === 'displayText') {\r\n cellsData.push(cell.displayText);\r\n } else {\r\n // 默认value\r\n cellsData.push(cell.getValue());\r\n }\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n let htmlX = 0;\n let htmlY = 0;\n if (documentElement && !isOffsetParentAnElement && !isFixed) {\n const htmlRect = documentElement.getBoundingClientRect();\n htmlY = htmlRect.top + scroll.scrollTop;\n htmlX = htmlRect.left + scroll.scrollLeft -\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect);\n }\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlX;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlY;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.floatingEl.addEventListener('mouseleave', () => {\n this.hide();\n });\n this.ctx.on('mouseout', (e) => {\n if (this.floatingEl.contains(e.relatedTarget as Node)) {\n return;\n }\n this.hide();\n });\n this.ctx.on('onScroll', () => {\n this.hide();\n });\n this.ctx.on('startEdit', () => {\n this.hide();\n });\n this.ctx.on('visibleCellHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n if (cell.ellipsis) {\n this.show(cell);\n }\n });\n }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\nimport type CellHeader from './CellHeader';\nimport type Context from './Context';\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\nexport default class Overlayer {\n ctx: Context;\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n draw() {\n const overlayer = this.getContainer();\n this.ctx.emit('overlayerChange', overlayer);\n }\n destroy() {\n this.ctx.emit('overlayerChange', {\n style: {},\n views: [],\n });\n }\n private getContainer(): OverlayerContainer {\n const header = this.getHeader();\n const body = this.getBody();\n const footer = this.getFooter();\n let views: OverlayerWrapper[] = [];\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\n if (!FOOTER_FIXED) {\n views = [header, body];\n } else {\n if (FOOTER_POSITION === 'top') {\n views = [header, footer, body];\n } else {\n views = [header, body, footer];\n }\n }\n return {\n views,\n };\n }\n private getHeader() {\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\n let centerCells: CellHeader[] = [];\n let leftCells: CellHeader[] = [];\n let rightCells: CellHeader[] = [];\n renderCellHeaders.forEach((cellHeader) => {\n if (cellHeader.render) {\n if (cellHeader.fixed === 'left') {\n leftCells.push(cellHeader);\n } else if (cellHeader.fixed === 'right') {\n rightCells.push(cellHeader);\n } else {\n centerCells.push(cellHeader);\n }\n }\n });\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${0}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${fixedLeftWidth}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const header: OverlayerWrapper = {\n type: 'header',\n class: `${CSS_PREFIX}-overlayer-header`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return header;\n }\n private getBody() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n let renderRows = this.ctx.body.renderRows;\n // 合计如果不是固定在底部,就加入到渲染行中\n if (!this.ctx.config.FOOTER_FIXED) {\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\n }\n renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer') {\n cell.render = cell.renderFooter;\n }\n if (cell.render) {\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.body;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const body: OverlayerWrapper = {\n type: 'body',\n class: `${CSS_PREFIX}-overlayer-body`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return body;\n }\n private getFooter() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer' && cell.renderFooter) {\n // 把转renderFooter成render统一出口\n cell.render = cell.renderFooter;\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.footer;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n right: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const footer: OverlayerWrapper = {\n type: 'footer',\n class: `${CSS_PREFIX}-overlayer-footer`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return footer;\n }\n}\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(ladong: boolean) {\r\n this.ctx.database.setLoading(ladong);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(\r\n rowKey: string,\r\n key: string,\r\n value: any,\r\n history = true,\r\n reDraw = true,\r\n isEditor = false,\r\n checkReadonly = true,\r\n ) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor, checkReadonly);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true, checkReadonly = true) {\r\n this.ctx.database.batchSetItemValue(list, history, checkReadonly);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw, checkReadonly);\r\n this.editor.doneEdit();\r\n }\r\n\r\n clearEditableData(value = null) {\r\n const xArr = [0, this.ctx.maxColIndex];\r\n const yArr = [0, this.ctx.maxRowIndex];\r\n return this.selector.clearSelectedData(xArr, yArr, false, value);\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n setCurrentRowByRowIndex(rowIndex: number) {\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCell(rowIndex, 0);\r\n this.ctx.emit('draw');\r\n }\r\n setCurrentRow(rowKey: string) {\r\n const column = this.ctx.database.getColumnByColIndex(0);\r\n if (!column) {\r\n return;\r\n }\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCellByKey(rowKey, column.key);\r\n this.ctx.emit('draw');\r\n }\r\n getCurrentRow() {\r\n const cell = this.ctx.currentCell;\r\n if (!cell) {\r\n return;\r\n }\r\n const rowData: RowParams = {\r\n row: cell.row,\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n };\r\n return rowData;\r\n }\r\n clearValidate() {\r\n this.ctx.database.clearValidate();\r\n this.ctx.emit('draw');\r\n }\r\n validateFields(ValidateFields: ValidateField[], scrollError = true) {\r\n return new Promise(async (resolve, reject) => {\r\n let errors: any[] = [];\r\n for (let i = 0; i < ValidateFields.length; i++) {\r\n const { rowKey, key } = ValidateFields[i];\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n if (scrollError) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n async validate(scrollError = true) {\r\n // 先关闭编辑\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const res = await this.getValidations();\r\n resolve(res);\r\n } catch (errors) {\r\n // 滚动到错误位置,取第一个错误\r\n if (scrollError && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n const targetRow = this.ctx.database.getRowForRowKey(rowKey);\r\n if (targetRow) {\r\n const { parentRowKeys = [] } = targetRow;\r\n if (parentRowKeys && parentRowKeys.length) {\r\n this.setExpandRowKeys(parentRowKeys, true);\r\n }\r\n }\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n reject(errors);\r\n }\r\n });\r\n }\r\n setValidations(errors: ValidateItemError[]) {\r\n errors.forEach((item) => {\r\n const { rowIndex, key, message } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","c","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","iconX","iconY","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","BODY_TEXT_COLOR","FOOTER_TEXT_COLOR","FOOTER_BG_COLOR","HIGHLIGHT_SELECTED_ROW","HIGHLIGHT_SELECTED_ROW_COLOR","HIGHLIGHT_HOVER_ROW","HIGHLIGHT_HOVER_ROW_COLOR","STRIPE","STRIPE_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawX","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","i","cellHeader","BODY_FONT","PLACEHOLDER_COLOR","offsetIconX","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","parentRowKeys","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","_a","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","checkReadonly","historyList","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","values","changeItem","selection","draw","_selectable","ignoreReserve","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","indeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","resolve","BODY_CELL_RULES_METHOD","_rules","_errors","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","_key","hasMergeCell","j","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","displayText","EventTable","mutations","mutation","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","d","_overflowsData$filter2","currentSideAxis","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","leftScroll","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","htmlX","htmlY","htmlRect","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","items","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ladong","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}
|