e-virt-table 1.4.1 → 1.4.2
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 +14 -14
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +1003 -833
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +14 -14
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/Body.js +17 -17
- package/dist/lib/Body.js.map +1 -1
- package/dist/lib/Config.d.ts +6 -0
- package/dist/lib/Config.js +21 -0
- package/dist/lib/Config.js.map +1 -1
- package/dist/lib/Context.d.ts +11 -0
- package/dist/lib/Context.js +49 -3
- package/dist/lib/Context.js.map +1 -1
- package/dist/lib/EVirtTable.d.ts +6 -0
- package/dist/lib/EVirtTable.js +12 -2
- package/dist/lib/EVirtTable.js.map +1 -1
- package/dist/lib/Editor.js +21 -18
- package/dist/lib/Editor.js.map +1 -1
- package/dist/lib/Empty.js +1 -1
- package/dist/lib/Empty.js.map +1 -1
- package/dist/lib/EventBrowser.js +10 -2
- package/dist/lib/EventBrowser.js.map +1 -1
- package/dist/lib/Header.js +12 -10
- package/dist/lib/Header.js.map +1 -1
- package/dist/lib/Overlayer.js +4 -11
- package/dist/lib/Overlayer.js.map +1 -1
- package/dist/lib/Paint.d.ts +1 -1
- package/dist/lib/Paint.js +3 -2
- package/dist/lib/Paint.js.map +1 -1
- package/dist/lib/Scroller.js +12 -4
- package/dist/lib/Scroller.js.map +1 -1
- package/dist/lib/TextSelector.d.ts +13 -16
- package/dist/lib/TextSelector.js +150 -119
- package/dist/lib/TextSelector.js.map +1 -1
- package/dist/lib/Tooltip.js +7 -13
- package/dist/lib/Tooltip.js.map +1 -1
- package/dist/lib/ZoomScale.d.ts +55 -0
- package/dist/lib/ZoomScale.js +137 -0
- package/dist/lib/ZoomScale.js.map +1 -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/CellImage.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/svg/expand.svg?raw","../src/svg/checkbox-check.svg?raw","../src/svg/select.svg?raw","../src/svg/sortable.svg?raw","../src/svg/loading.svg?raw","../src/svg/drag.svg?raw","../src/svg/checkbox-uncheck.svg?raw","../src/svg/checkbox-indeterminate.svg?raw","../src/svg/checkbox-disabled.svg?raw","../src/svg/icon-edit.svg?raw","../src/Icons.ts","../src/EventTable.ts","../src/lang/zh-CN.ts","../src/Locale.ts","../src/Context.ts","../src/Scroller.ts","../src/CellHeader.ts","../src/TreeUtil.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/DOMTreeMenu.ts","../src/ContextMenu.ts","../src/Loading.ts","../src/FinderBar.ts","../src/TextSelector.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.required && (value === undefined || value === null || value === '')) {\r\n return errors;\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 | (() => 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 const wait = typeof delay === 'function' ? delay() : delay;\r\n if (!lastCalledTime || elapsedTime >= wait) {\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 }, wait - 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, parentKey = ''): Column[] {\r\n return arr\r\n .sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0))\r\n .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, config.key);\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 parentKey,\r\n children: children.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n parentKey,\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\nfunction filterHiddenColumns(columns: Column[]): Column[] {\r\n return columns\r\n .filter((col) => !col.hide) // 先过滤掉自己 hide 的列\r\n .map((col: Column) => {\r\n // 如果有子列\r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n return {\r\n ...col,\r\n children: filterHiddenColumns(col.children), // 递归处理\r\n };\r\n }\r\n return { ...col };\r\n });\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\n\r\n/**\r\n * 解析日期字符串,支持多种常见格式\r\n * @param dateStr 日期字符串\r\n * @returns Date 对象\r\n */\r\nfunction parseDate(dateStr: any): Date {\r\n if (!dateStr) return new Date(0);\r\n\r\n // 如果是数字(时间戳),直接创建Date对象\r\n if (typeof dateStr === 'number') {\r\n return new Date(dateStr);\r\n }\r\n\r\n const str = String(dateStr).trim();\r\n\r\n // 尝试直接解析\r\n const directDate = new Date(str);\r\n if (!isNaN(directDate.getTime())) {\r\n return directDate;\r\n }\r\n\r\n // 支持多种常见格式\r\n const patterns = [\r\n // YYYY-MM-DD\r\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/,\r\n // YYYY/MM/DD\r\n /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})$/,\r\n // YYYY.MM.DD\r\n /^(\\d{4})\\.(\\d{1,2})\\.(\\d{1,2})$/,\r\n // DD-MM-YYYY\r\n /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/,\r\n // DD/MM/YYYY\r\n /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/,\r\n // DD.MM.YYYY\r\n /^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/,\r\n // MM-DD-YYYY\r\n /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/,\r\n // MM/DD/YYYY\r\n /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/,\r\n // MM.DD.YYYY\r\n /^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/,\r\n // YYYYMMDD\r\n /^(\\d{4})(\\d{2})(\\d{2})$/,\r\n // 带时间的格式 YYYY-MM-DD HH:mm:ss\r\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/,\r\n // 带时间的格式 YYYY/MM/DD HH:mm:ss\r\n /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = str.match(pattern);\r\n if (match) {\r\n const groups = match.slice(1).map(Number);\r\n\r\n if (\r\n pattern.source.includes('YYYY-MM-DD') ||\r\n pattern.source.includes('YYYY/MM/DD') ||\r\n pattern.source.includes('YYYY.MM.DD')\r\n ) {\r\n // YYYY-MM-DD 格式\r\n const [year, month, day, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (\r\n pattern.source.includes('DD-MM-YYYY') ||\r\n pattern.source.includes('DD/MM/YYYY') ||\r\n pattern.source.includes('DD.MM.YYYY')\r\n ) {\r\n // DD-MM-YYYY 格式\r\n const [day, month, year, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (\r\n pattern.source.includes('MM-DD-YYYY') ||\r\n pattern.source.includes('MM/DD/YYYY') ||\r\n pattern.source.includes('MM.DD.YYYY')\r\n ) {\r\n // MM-DD-YYYY 格式\r\n const [month, day, year, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (pattern.source.includes('YYYYMMDD')) {\r\n // YYYYMMDD 格式\r\n const [year, month, day] = groups;\r\n return new Date(year, month - 1, day);\r\n }\r\n }\r\n }\r\n\r\n // 如果都不匹配,返回无效日期\r\n return new Date(NaN);\r\n}\r\n\r\n/**\r\n * 比较两个日期值,支持多种常见格式\r\n * @param a 第一个日期值\r\n * @param b 第二个日期值\r\n * @returns 比较结果:-1 表示 a < b,0 表示 a = b,1 表示 a > b\r\n */\r\nfunction compareDates(a: any, b: any): number {\r\n const aDate = parseDate(a);\r\n const bDate = parseDate(b);\r\n\r\n if (isNaN(aDate.getTime()) && isNaN(bDate.getTime())) {\r\n return 0; // 都是无效日期\r\n }\r\n if (isNaN(aDate.getTime())) {\r\n return -1; // a 是无效日期,排在前面\r\n }\r\n if (isNaN(bDate.getTime())) {\r\n return 1; // b 是无效日期,排在前面\r\n }\r\n\r\n return aDate.getTime() - bDate.getTime();\r\n}\r\nfunction getNumberPrecision(value: unknown): number {\r\n const match = String(value).match(/\\.(\\d+)/);\r\n return match?.[1].length ?? 0;\r\n}\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 parseDate,\r\n compareDates,\r\n filterHiddenColumns,\r\n getNumberPrecision,\r\n};\r\n","import CellImage from './CellImage';\r\nimport 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 visibleWidth = 0;\r\n visibleHeight = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n drawX = 0;\r\n drawY = 0;\r\n cellImages: Map<string, CellImage> = new Map();\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 isInside(x: number, y: number) {\r\n return x >= this.drawX && x <= this.drawX + this.width && y >= this.drawY && y <= this.drawY + this.height;\r\n }\r\n /**\r\n * 判断是否在可见区域,合并单元格用\r\n * @param x \r\n * @param y \r\n * @returns \r\n */\r\n isInsideVisible(x: number, y: number) {\r\n return x >= this.drawX && x <= this.drawX + this.visibleWidth && y >= this.drawY && y <= this.drawY + this.visibleHeight && this.isInside(x, y);\r\n }\r\n setImage(key: string, image: CellImage) {\r\n this.cellImages.set(key, image);\r\n }\r\n getImages() {\r\n return this.cellImages;\r\n }\r\n getImage(key: string) {\r\n return this.cellImages.get(key);\r\n }\r\n isImageInside(key: string, e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const image = this.getImage(key);\r\n if (image) {\r\n return image.isInside(offsetX, offsetY);\r\n }\r\n return false;\r\n }\r\n}\r\n","import Context from \"./Context\";\r\nimport { RectOptions } from \"./Paint\";\r\n\r\nexport default class CellImage {\r\n source?: HTMLImageElement;\r\n name: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visible = true;\r\n constructor(name: string, x: number, y: number, width: number, height: number, source?: HTMLImageElement) {\r\n this.source = source;\r\n this.name = name;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n drawWrapper(ctx: Context, options: RectOptions) {\r\n ctx.paint.drawRect(this.x - 2, this.y - 2, this.width + 4, this.height + 4, {\r\n radius: 4,\r\n borderWidth: 1,\r\n ...options,\r\n });\r\n }\r\n setVisible(visible: boolean) {\r\n this.visible = visible;\r\n }\r\n isInside(\r\n mouseX: number,\r\n mouseY: number\r\n ) {\r\n if (!this.visible) {\r\n return false;\r\n }\r\n if (this.source && mouseX > this.x && mouseX < this.x + this.width && mouseY > this.y && mouseY < this.y + this.height) {\r\n return true;\r\n }\r\n return false;\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 LineClampType,\n RenderType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nimport CellImage from './CellImage';\nexport default class Cell extends BaseCell {\n parentRowKey: string = '';\n parentRowKeys: string[] = [];\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 domDataset: 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 drawTextFont = '';\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n autoRowHeight = false; // 是否启用行高自适应\n calculatedHeight = 0; // 计算出的自适应高度\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n maxLineClamp: LineClampType = 'auto';\n precision?: number = undefined;\n min?: number = undefined;\n max?: number = undefined;\n maxlength?: number = undefined;\n mixedRender?: boolean = false;\n renderType: RenderType = 'default';\n renderFooterType: RenderType = 'default';\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 isUpdate = true, // 是否更新,虚拟的时候可能不需要更新,解决性能问题\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 =\n column.selectorCellValueType || this.ctx.config.SELECTOR_CELL_VALUE_TYPE || 'value';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign = column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\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.autoRowHeight =\n column.autoRowHeight !== undefined ? column.autoRowHeight : this.ctx.config.AUTO_ROW_HEIGHT;\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.maxLineClamp = column.maxLineClamp || 'auto';\n this.precision = column.precision;\n this.min = column.min;\n this.max = column.max;\n this.maxlength = column.maxlength;\n this.mixedRender = column.mixedRender || false;\n this.renderType = column.renderType || 'default';\n this.renderFooterType = column.renderFooterType || 'default';\n const rowItem = this.ctx.database.getRowForRowKey(this.rowKey);\n if (this.cellType === 'body' && rowItem) {\n this.parentRowKey = rowItem.parentRowKey;\n this.parentRowKeys = rowItem.parentRowKeys;\n }\n if (isUpdate) {\n this.update();\n }\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.updateSpan();\n this.updateDragImage();\n const dragImage = this.getImage('drag');\n const drawDragImageWidth = dragImage ? dragImage.width : 0;\n this.drawTextX = this.drawX + drawDragImageWidth;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.drawTextWidth = this.visibleWidth - drawDragImageWidth;\n this.drawTextHeight = this.visibleHeight;\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\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 if (this.autoRowHeight) {\n // 自适应行高\n this.domDataset = {\n 'data-auto-height': true,\n 'data-row-index': this.rowIndex,\n 'data-col-index': this.colIndex,\n };\n }\n this.style = this.getOverlayerViewsStyle();\n }\n isInsideVisible(x: number, y: number) {\n return x >= this.drawX && x <= this.drawX + this.visibleWidth && y >= this.drawY && y <= this.drawY + this.visibleHeight;\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 (!(['tree', 'selection-tree', 'tree-selection'].includes(this.type) && cellType === 'body')) {\n return;\n }\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 // 计算树形图标的偏移量\n const { TREE_INDENT = 16, CHECKBOX_SIZE, TREE_ICON_SIZE } = this.ctx.config;\n iconOffsetX = level * TREE_INDENT;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\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 }\n let iconWidth = TREE_ICON_SIZE;\n let iconHeight = TREE_ICON_SIZE;\n let drawX = this.drawX;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (this.visibleWidth - iconWidth - 2 * CELL_PADDING) / 2;\n // 居中对齐,改成左对齐\n this.align = 'left';\n }\n let iconX = drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n let drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n const selectionImage = this.getImage('selection');\n const dragImage = this.getImage('drag');\n const dragImageWidth = dragImage ? dragImage.width : 0;\n if (this.type === 'selection-tree' && selectionImage) {\n const selectionImageX = selectionImage.x;\n const selectionImageWidth = selectionImage.width;\n // 树形图标在左侧,checkbox 在树形图标右侧\n iconX = iconOffsetX + selectionImageX + selectionImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n } else if (this.type === 'tree-selection') {\n // 树形选择,两个图标宽度,文本已经有CELL_PADDING间距,/2看起来好看些\n iconX += dragImageWidth;\n drawTextX = iconX + CHECKBOX_SIZE + iconWidth - CELL_PADDING / 2;\n } else {\n // 普通tree,文本已经有CELL_PADDING间距,/2看起来好看些\n iconX += dragImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n }\n // 更改文本距离\n this.drawTextX = drawTextX;\n this.drawTextWidth = this.drawX + this.visibleWidth - drawTextX; // 减去树形图标的宽度\n // 判断是否溢出格子\n if (iconX + iconWidth + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + iconHeight + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n // 不论是否需要绘制图标,都更新图标的“基准位置”,供树线使用\n this.setImage('tree', new CellImage(iconName, iconX, iconY, iconWidth, iconHeight, icon));\n // 树连线仅在绘制阶段调用,避免在 update 阶段被清屏\n }\n private updateDragImage() {\n if (this.cellType === 'body' && this.column.dragRow) {\n const { DRAG_ROW_ICON_SIZE, CELL_PADDING } = this.ctx.config;\n const dragImageX = this.drawX + CELL_PADDING / 2;\n const dragImageY = this.drawY + (this.visibleHeight - DRAG_ROW_ICON_SIZE) / 2;\n const dragImage = new CellImage('drag', dragImageX, dragImageY, DRAG_ROW_ICON_SIZE, DRAG_ROW_ICON_SIZE, this.ctx.icons.get('drag'));\n if (this.rowspan === 0) {\n dragImage.setVisible(false);\n }\n this.setImage('drag', dragImage);\n }\n }\n private drawTreeLine() {\n const { TREE_LINE, TREE_INDENT = 16, TREE_ICON_SIZE = 16, TREE_LINE_COLOR = '#e1e6eb' } = this.ctx.config;\n // 仅 body 且树类型才绘制\n if (!TREE_LINE || this.cellType !== 'body') return;\n if (!['tree', 'selection-tree', 'tree-selection'].includes(this.type)) return;\n if (this.rowspan === 0 || this.colspan === 0) return;\n\n const row = this.ctx.database.getRowForRowKey(this.rowKey) || {};\n const level: number = row.level ?? 0;\n // 以当前树图标为中心点\n const treeImage = this.getImage('tree');\n if (!treeImage) return;\n const treeImageX = treeImage.x;\n const treeImageY = treeImage.y;\n const treeImageWidth = treeImage.width;\n const treeImageHeight = treeImage.height;\n const iconCenterX = treeImageX + treeImageWidth / 2;\n const iconCenterY = treeImageY + treeImageHeight / 2;\n\n // 基于已计算的树图标位置反推基准点:当前图标左侧减去 level * TREE_INDENT\n // 这样无论对齐方式如何(left/center/right),都以实际图标为基准定位所有竖线\n let baseX = treeImageX - level * TREE_INDENT;\n\n // 逐层画竖线(仅当 level > 0 才需要祖先连线)\n const parentRowKeys: string[] = Array.isArray(row.parentRowKeys) ? row.parentRowKeys : [];\n if (level > 0) {\n // 祖先层(0..level-2):是否继续取决于该层“下一层链路节点”是否为最后子项\n // 例如当前节点 0-2-1:\n // - 对 i=0(根 0 对应竖线),应看其下一层链路节点 0-2 是否为最后子项。\n // 若 0-2 是最后子项(没有 0-3),则 i=0 的竖线在本行不应出现。\n for (let i = 0; i < level - 1; i += 1) {\n const nextKey = parentRowKeys[i + 1];\n const nextRow = nextKey ? this.ctx.database.getRowForRowKey(nextKey) || {} : {};\n const nextIsLast = !!nextRow.isLastChild;\n if (nextIsLast) continue;\n // 以当前树图标 X 为基准向左回推\n const vx = Math.round(treeImageX - (level - i) * TREE_INDENT + TREE_ICON_SIZE / 2);\n this.ctx.paint.drawLine([vx, this.drawY, vx, this.drawY + this.visibleHeight], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n }\n // 父层(level-1):无论父是不是末尾,都需要连接当前节点形成 L 型\n const vxParent = Math.round(treeImageX - TREE_INDENT + TREE_ICON_SIZE / 2);\n const toCenter = !!row.isLastChild;\n const y2 = toCenter ? iconCenterY : this.drawY + this.visibleHeight;\n this.ctx.paint.drawLine([vxParent, this.drawY, vxParent, y2], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n // 当前层的横线:从当前层竖线到图标中心\n const currVX = Math.round(baseX + (level - 1) * TREE_INDENT + TREE_ICON_SIZE / 2);\n this.ctx.paint.drawLine([currVX, iconCenterY, iconCenterX, iconCenterY], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n }\n\n // 1) 父节点行:在图标正下画一段短竖线(展开时绘制,符合视觉预期)\n if (row.hasChildren && row.expand) {\n const shortTop = treeImageY + treeImageHeight;\n const shortBottom = this.drawY + this.visibleHeight;\n this.ctx.paint.drawLine([iconCenterX, shortTop, iconCenterX, shortBottom], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\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 FINDER_CELL_BG_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, font } =\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 if (font) {\n this.drawTextFont = font;\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 && !this.ctx.dragRowIng) {\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 && !this.ctx.dragRowIng) {\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 // 只读\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, font } =\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 if (font) {\n this.drawTextFont = font;\n }\n }\n // 高亮查找结果\n const { rowIndex, colIndex, type } = this.ctx.finderBar;\n if (rowIndex === this.rowIndex && colIndex === this.colIndex && type === 'body') {\n bgColor = FINDER_CELL_BG_COLOR;\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 if (!['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(type)) {\n return;\n }\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n let drawX = this.drawX + CELL_PADDING;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n }\n let iconX = drawX;\n let iconY = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n\n // 对于 selection-tree 类型,checkbox 应该居中显示\n if (type === 'selection-tree') {\n } else if (type === 'tree-selection') {\n // 更新选择器的位置\n const { TREE_INDENT = 16, TREE_ICON_SIZE } = this.ctx.config;\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { level = 0 } = row || {};\n const iconOffsetX = level * TREE_INDENT;\n iconX = drawX + TREE_ICON_SIZE + iconOffsetX; // 树形图标右侧 + 间距\n }\n\n let checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n\n if (type === 'selection-tree' || type === 'tree-selection') {\n // 树形选择逻辑\n const treeState = this.ctx.database.getTreeSelectionState(rowKey);\n if (treeState.indeterminate && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else if (treeState.checked && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (!treeState.checked && 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 } else {\n // 普通选择逻辑\n const check = this.ctx.database.getRowSelection(rowKey);\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 }\n const dragImage = this.getImage('drag');\n const drawDragImageWidth = dragImage ? dragImage.width : 0;\n iconX += drawDragImageWidth;\n // 判断是否溢出格子\n if (iconX + CHECKBOX_SIZE + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + CHECKBOX_SIZE + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n const selectionImage = new CellImage(checkboxName, iconX, iconY, CHECKBOX_SIZE, CHECKBOX_SIZE, checkboxImage);\n if (type === 'index-selection') {\n selectionImage.setVisible(false);\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n selectionImage.setVisible(true);\n }\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n const hoverCell = this.ctx.hoverCell;\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n if (hoverCell && hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n selectionImage.setVisible(true);\n }\n }\n this.setImage('selection', selectionImage);\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 && !this.ctx.dragRowIng && 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 const hoverImage = new CellImage(this.hoverIconName, _x, _y, CELL_HOVER_ICON_SIZE, CELL_HOVER_ICON_SIZE, drawImageSource);\n if (this.rowspan === 0 || this.colspan === 0) {\n hoverImage.setVisible(false);\n }\n this.setImage('hover', hoverImage);\n }\n }\n /**\n * 获取自动高度\n * @returns\n */\n getAutoHeight() {\n if (this.cellType !== 'body') {\n return 0;\n }\n if (!this.autoRowHeight) {\n return 0;\n }\n if (this.rowspan === 0) {\n return 0;\n }\n // 如果有渲染函数,使用渲染函数计算高度\n if (this.render) {\n const renderHeight = this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex);\n if (this.rowspan > 1) {\n // 如果计算高度小于可见高度,返回0,表示不显示\n if (renderHeight < this.visibleHeight) {\n return 0;\n }\n return Math.round(renderHeight - (this.visibleHeight - this.height));\n }\n return Math.round(renderHeight);\n }\n if (!(this.displayText && typeof this.displayText === 'string')) {\n return 0;\n }\n\n const { BODY_FONT, CELL_PADDING, CELL_LINE_HEIGHT } = this.ctx.config;\n const cacheTextKey = `${this.displayText}_${this.drawTextWidth}_${this.drawTextFont}`;\n const calculatedHeight = this.ctx.paint.calculateTextHeight(this.displayText, this.drawTextWidth, {\n font: this.drawTextFont || BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color: this.drawTextColor,\n autoRowHeight: this.autoRowHeight,\n lineHeight: CELL_LINE_HEIGHT,\n maxLineClamp: this.maxLineClamp,\n cacheTextKey,\n });\n // 合并单元格处理\n if (this.rowspan > 1) {\n // 如果计算高度小于可见高度,返回0,表示不显示\n if (calculatedHeight < this.visibleHeight) {\n return 0;\n }\n return Math.round(calculatedHeight - (this.visibleHeight - this.height));\n }\n // 转成整数\n return Math.round(calculatedHeight);\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 && this.renderFooterType === 'default') {\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 // 自定义渲染为 default 且非混合渲染时不显示 canvas 文本\n if (this.render && this.renderType === 'default' && !this.mixedRender) {\n return '';\n }\n const selectionImage = this.getImage('selection');\n if (this.type === 'index-selection' && selectionImage && selectionImage.visible) {\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 // 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;\n let top = this.drawY - this.ctx.body.y;\n // 固定列\n if (this.fixed === 'left') {\n left = this.drawX;\n } else if (this.fixed === 'right') {\n left = this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth);\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = this.drawY - this.ctx.footer.y;\n }\n }\n // 定位到居中\n if (this.autoRowHeight && this.render && this.verticalAlign === 'middle') {\n const renderHeight = this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex);\n if (renderHeight < this.visibleHeight && renderHeight > 0) {\n const remainTop = (this.visibleHeight - renderHeight) / 2;\n top = top + remainTop;\n }\n }\n // 防止覆盖层叠加显示,直接隐藏后显示\n if (this.autoRowHeight && this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex) === 0) {\n left = -99999;\n top = -99999;\n }\n let autoStyle = {};\n if (this.rowspan === 0) {\n autoStyle = {\n display: 'none',\n };\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left: `${Math.round(left - 1)}px`,\n top: `${Math.round(top - 1)}px`,\n width: `${this.visibleWidth}px`,\n height: this.autoRowHeight && this.renderType === 'default' ? 'auto' : `${this.visibleHeight}px`,\n // height: `${this.visibleHeight}px`,\n // minHeight: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n ...autoStyle,\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.drawTreeLine();\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, CELL_LINE_HEIGHT } = this.ctx.config;\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 if (['', null, undefined].includes(text)) {\n return false;\n }\n // 如果text 不是字符串,则转换为字符串\n if (typeof text !== 'string') {\n text = `${text}`;\n }\n const cacheTextKey = `${text}_${this.drawTextWidth}_${this.drawTextFont}`;\n this.ellipsis = this.ctx.paint.drawText(\n text,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: this.drawTextFont || BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n autoRowHeight: this.autoRowHeight,\n lineHeight: CELL_LINE_HEIGHT,\n maxLineClamp: this.maxLineClamp,\n cacheTextKey,\n layoutCallback: (layout) => {\n this.ctx.emit(\n 'registerTextLayout',\n `${this.cellType}-${this.rowIndex}-${this.colIndex}`,\n layout,\n );\n },\n },\n );\n return this.ellipsis;\n }\n private drawImage() {\n // 遍历cellImages\n this.getImages().forEach((image, key) => {\n if (image.visible && image.source) {\n if (key === 'hover') {\n // 绘制hover图标背景\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n image.drawWrapper(this.ctx, {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n });\n }\n this.ctx.paint.drawImage(\n image.source,\n image.x,\n image.y,\n image.width,\n image.height,\n );\n }\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 ErrorResult,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n SortByType,\n SortStateMap,\n CustomHeader,\n Fixed,\n RowMaxHeightData,\n ErrorItem,\n} from './types';\nimport { generateShortUUID, toLeaf, compareDates, getNumberPrecision } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\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 customHeader: CustomHeader = {\n fixedData: {},\n sortData: {},\n hideData: {},\n resizableData: {},\n };\n\n overlayerAutoHeightMap = new Map<string, number>();\n private maxRowHeightCellMap = new Map<string, RowMaxHeightData>(); // 记录每行的计算高度(按 rowKey 存储)\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 private sortState: SortStateMap = new Map();\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.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.ctx.paint.clearTextCache();\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 this.maxRowHeightCellMap.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?.includes('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 const siblingsLength = dataList.length;\n const {\n ROW_KEY = '',\n DEFAULT_EXPAND_ALL,\n CELL_HEIGHT,\n SELECTABLE_METHOD,\n CHECKBOX_KEY,\n TREE_CHILDREN_KEY,\n } = this.ctx.config;\n dataList.forEach((item, index) => {\n if (TREE_CHILDREN_KEY !== 'children') {\n item.children = item[TREE_CHILDREN_KEY];\n }\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 calculatedHeight: -1,\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 parentRowKey: parentRowKeys[parentRowKeys.length - 1] || '',\n isLastChild: index === siblingsLength - 1,\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 setBatchRowHeight(rowIndexHeightList: { rowIndex: number; height: number }[]) {\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n }\n });\n this.clearBufferData(); // 清除缓存数据\n }\n // 批量设置计算行高度\n setBatchCalculatedRowHeight(rowIndexHeightList: { rowIndex: number; height: number }[]): boolean {\n // 判断是否需要更新\n const isNoNeedUpdate = rowIndexHeightList.every(({ height, rowIndex }) => {\n const position = this.getPositionForRowIndex(rowIndex);\n return position.calculatedHeight === height;\n });\n if (isNoNeedUpdate) {\n return false;\n }\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n const { height: rowMaxHeight = -1 } = this.getMaxRowHeightItem(rowKey) || {};\n row.calculatedHeight = Math.max(height, rowMaxHeight);\n }\n });\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n return true;\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 generateColumns(columns: Column[]): Column[] {\n const _generateColumns = (columns: Column[]): Column[] => {\n return columns.map((column: Column) => {\n const children =\n column.children && Array.isArray(column.children) ? _generateColumns(column.children) : undefined;\n const dataMap = {\n hide: this.customHeader?.hideData?.[column.key],\n fixed: this.customHeader?.fixedData?.[column.key],\n sort: this.customHeader?.sortData?.[column.key],\n width: this.customHeader?.resizableData?.[column.key],\n };\n const obj: any = {};\n for (const [key, value] of Object.entries(dataMap)) {\n if (value !== undefined) obj[key] = value;\n }\n const allHide = children && children.every((item) => item.hide); // 所有子项都隐藏那父级也要隐藏\n return {\n ...column,\n children,\n hide: allHide || (typeof column.hide === 'function' ? column.hide(column) : column.hide),\n ...obj,\n };\n });\n };\n return _generateColumns(columns);\n }\n getColumns() {\n const list = this.generateColumns(this.columns);\n return list;\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n this.init();\n }\n getOriginalData() {\n return this.data;\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, calculatedHeight } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n // 计算行高度和设置高度取最大\n const _height = Math.max(calculatedHeight, height);\n this.sumHeight += _height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height: _height,\n bottom: this.sumHeight,\n calculatedHeight: calculatedHeight,\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 // 说明需要排序\n if (this.sortState.size) {\n // 按时间戳排序,最早的先排序\n const sortedEntries = Array.from(this.sortState.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp);\n // 对 sortedData 进行排序\n _data = this.sortDataRecursive(_data, sortedEntries);\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 /**\n * 获取排序状态\n */\n getSortState(key: string) {\n return this.sortState.get(key) || { direction: 'none' as const, timestamp: 0 };\n }\n\n /**\n * 设置排序状态\n */\n setSortState(key: string, direction: 'asc' | 'desc' | 'none') {\n const timestamp = Date.now();\n if (this.ctx.config.SORT_STRICTLY) {\n // 严格排序,清除所有排序状态\n this.sortState.clear();\n }\n if (direction === 'none') {\n // 清除排序状态\n this.sortState.delete(key);\n } else {\n this.sortState.set(key, { direction, timestamp });\n }\n this.ctx.emit('sortChange', this.sortState);\n this.clearBufferData();\n this.ctx.emit('draw');\n }\n\n /**\n * 清除所有排序状态\n */\n clearSort() {\n this.sortState.clear();\n this.ctx.emit('sortChange', this.sortState);\n this.clearBufferData();\n this.ctx.emit('draw');\n }\n\n /**\n * 递归排序方法,支持树形数据\n * @param data 要排序的数据\n * @param sortedEntries 排序条目,按时间戳排序\n * @returns 排序后的数据\n */\n private sortDataRecursive(\n data: any[],\n sortedEntries: [string, { direction: 'asc' | 'desc' | 'none'; timestamp: number }][],\n ): any[] {\n // 对当前层级进行排序\n let sortedData = [...data];\n\n // 逐层应用排序条件\n for (const [key, { direction }] of sortedEntries) {\n if (direction === 'none') continue;\n\n const cellHeader = this.getColumnByKey(key);\n if (!cellHeader || !cellHeader.column.sortBy) continue;\n\n // 对当前层级进行单列排序\n sortedData = this.applySingleColumnSort(sortedData, key, direction, cellHeader.column.sortBy);\n }\n\n // 递归处理子节点\n return sortedData.map((item) => {\n if (item.children && Array.isArray(item.children)) {\n item.children = this.sortDataRecursive(item.children, sortedEntries);\n }\n return item;\n });\n }\n\n /**\n * 对数组进行单列排序\n * @param data 要排序的数据\n * @param key 排序的列键\n * @param direction 排序方向\n * @param sortBy 排序类型\n * @returns 排序后的数据\n */\n private applySingleColumnSort(data: any[], key: string, direction: 'asc' | 'desc', sortBy: SortByType): any[] {\n return data.sort((a, b) => {\n const aValue = a[key];\n const bValue = b[key];\n\n let comparison = 0;\n\n if (typeof sortBy === 'function') {\n comparison = sortBy(a, b);\n } else if (sortBy === 'number') {\n const aNum = Number(aValue) || 0;\n const bNum = Number(bValue) || 0;\n comparison = aNum - bNum;\n } else if (sortBy === 'string') {\n const aStr = String(aValue || '');\n const bStr = String(bValue || '');\n comparison = aStr.localeCompare(bStr);\n } else if (sortBy === 'date') {\n comparison = compareDates(aValue, bValue);\n }\n return direction === 'asc' ? comparison : -comparison;\n });\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(\n _list: ChangeItem[],\n history = false,\n checkReadonly = true,\n historyAcion: HistoryAction = 'none',\n ) {\n let historyList: HistoryItemData[] = [];\n let _checkReadonly = checkReadonly;\n // key 为字符串,value 为行数据\n const rowList: Map<string, any> = new Map();\n const errList: ErrorItem[] = [];\n let changeList: BeforeValueChangeItem[] = [];\n for (const item of _list) {\n const { rowKey, key } = item;\n let value = item.value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n const _changeItem: BeforeValueChangeItem = {\n ...item,\n oldValue,\n row,\n };\n if (cell?.type === 'number') {\n if (['', undefined, null].includes(value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(String(value))) {\n // 正则获取小数点后的精度\n const precision = getNumberPrecision(value);\n if (typeof cell.precision === 'number' && cell.precision >= 0 && precision > cell.precision) {\n const factor = 10 ** cell.precision;\n value = Math.round(Number(value) * factor) / factor;\n const message = this.ctx.locale.getText('numberTruncated', { precision: cell.precision });\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_PRECISION',\n message,\n });\n } else if (typeof cell.min === 'number' && Number(value) < cell.min) {\n const message = this.ctx.locale.getText('numberMin', { min: cell.min });\n value = cell.min;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_MIN',\n message,\n });\n } else if (typeof cell.max === 'number' && Number(value) > cell.max) {\n const message = this.ctx.locale.getText('numberMax', { max: cell.max });\n value = cell.max;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_MAX',\n message,\n });\n } else {\n value = Number(value);\n }\n } else {\n value = oldValue;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_INVALID_NUMBER',\n message: this.ctx.locale.getText('invalidNumber'),\n });\n }\n } else if (\n cell?.editorType === 'text' &&\n typeof cell.maxlength === 'number' &&\n String(value).length > cell.maxlength\n ) {\n value = String(value).slice(0, cell.maxlength);\n const message = this.ctx.locale.getText('stringMaxlength', { maxlength: cell.maxlength });\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_STRING_MAXLENGTH',\n message,\n });\n }\n // 过滤无效项和相同值项\n if (value !== oldValue) {\n changeList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n if (errList.length) {\n const err: ErrorResult = {\n code: 'ERR_BATCH_SET_ITEM_VALUE',\n message: this.ctx.locale.getText('batchSetItemValueError'),\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 (historyAcion === 'none' && typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n _checkReadonly = false; // 允许编辑只读\n }\n const promsieValidators: Promise<unknown>[] = [];\n changeList.forEach((data) => {\n promsieValidators.push(this.getValidator(data.rowKey, data.key));\n const { value, rowKey, key, row } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowList.set(rowKey, row);\n // 不加历史,不重绘,不是编辑器,不检验只读\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 const rows = Array.from(rowList.values());\n await Promise.all(promsieValidators);\n // 没有校验错误,且有改变数据,则触发validateChangedData事件\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n const changeListValid = changeList.map((item) => {\n const errorTip = !!this.getValidationError(item.rowKey, item.key).length;\n return {\n ...item,\n errorTip,\n };\n });\n this.ctx.emit('change', changeListValid, 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 * @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 const changeItem: BeforeChangeItem = {\n rowKey,\n key,\n value,\n oldValue,\n row,\n };\n // 是否是否是编辑器进来的\n if (isEditor) {\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n this.batchSetItemValue([changeItem], history, false);\n this.ctx.emit('editChange', {\n ...changeItem,\n originalValue,\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 ...changeItem,\n originalValue,\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, cellType?: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n\n // 检查是否是树形选择列\n if (cellType === 'selection-tree' || cellType === 'tree-selection') {\n this.toggleTreeSelection(rowKey);\n } else {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n\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 // 切换树形选择状态\n toggleTreeSelection(rowKey: string) {\n const treeState = this.getTreeSelectionState(rowKey);\n const mode = this.ctx.config.TREE_SELECT_MODE;\n if (mode === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 父项选中的情况点击清空父项选择和所有子项选择,其他情况点击父项,勾选父项和所有子项选择(递归)\n if (treeState.checked && !treeState.indeterminate) {\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n } else {\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n }\n } else if (mode === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n if (treeState.checked && !treeState.indeterminate) {\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n } else {\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n }\n } else if (mode === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n }\n\n // 触发选择变化事件\n this.ctx.emit('selectionChange', this.getSelectionRows());\n this.ctx.emit('draw');\n }\n\n // 递归选中树形选择\n private selectTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach((childKey) => {\n this.setRowSelectionByParent(childKey, true);\n this.selectTreeSelectionRecursive(childKey);\n });\n }\n\n // 递归取消树形选择\n private clearTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach((childKey) => {\n this.setRowSelectionByParent(childKey, false);\n this.clearTreeSelectionRecursive(childKey);\n });\n }\n\n // 向上递归更新父项状态\n private updateParentTreeSelection(rowKey: string) {\n const parentKey = this.getTreeParent(rowKey);\n if (!parentKey) {\n return;\n }\n\n // 获取父项的所有直接子项\n const children = this.getTreeChildren(parentKey);\n const childSelections = children.map((childKey) => this.selectionMap.get(childKey));\n const checkedChildren = childSelections.filter((s) => s?.check).length;\n const totalChildren = childSelections.length;\n\n // 计算父项应该的状态\n let parentShouldBeChecked = false;\n if (totalChildren > 0) {\n if (checkedChildren === 0) {\n // 所有子项都未选中,父项应该未选中\n parentShouldBeChecked = false;\n } else if (checkedChildren === totalChildren) {\n // 所有子项都选中,父项应该选中\n parentShouldBeChecked = true;\n } else {\n // 部分子项选中,父项应该半选\n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式下半选算作选中\n parentShouldBeChecked = true;\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式下半选不算作选中\n parentShouldBeChecked = false;\n }\n }\n }\n\n // 更新父项状态\n const parentSelection = this.selectionMap.get(parentKey);\n if (parentSelection && parentSelection.check !== parentShouldBeChecked) {\n parentSelection.check = parentShouldBeChecked;\n this.setRowSelectionByCheckboxKey(parentKey, parentShouldBeChecked);\n\n // 递归更新更上层的父项\n this.updateParentTreeSelection(parentKey);\n }\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\n // 如果是树形选择模式,需要向上递归更新父项状态\n if (this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n this.updateParentTreeSelection(rowKey);\n }\n\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n setRowSelectionByParent(rowKey: string, check: boolean) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\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 // 获取树形选择状态\n getTreeSelectionState(rowKey: string) {\n const row = this.getRowForRowKey(rowKey);\n if (!row) {\n return { checked: false, indeterminate: false };\n }\n\n const selectionMap = this.selectionMap.get(rowKey);\n const checked = selectionMap?.check || false;\n\n // 计算半选状态\n const children = this.getTreeChildren(rowKey);\n if (children.length === 0) {\n return { checked, indeterminate: false };\n }\n\n let indeterminate = false;\n let finalChecked = checked;\n\n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 其中半选是算在最终选择的数据里面的\n\n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n\n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map((descKey) => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter((s) => s?.check).length;\n const totalDescendants = descendantSelections.length;\n\n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || someChecked; // 自身选中或有后代选中就算选中(包括半选)\n\n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n\n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map((descKey) => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter((s) => s?.check).length;\n const totalDescendants = descendantSelections.length;\n\n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || allChecked; // 只有全选才算选中,半选不算选中\n\n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n } else if (this.ctx.config.TREE_SELECT_MODE === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n indeterminate = false;\n finalChecked = checked;\n }\n\n const result = { checked: finalChecked, indeterminate };\n return result;\n }\n\n // 获取树形子节点\n getTreeChildren(rowKey: string): string[] {\n const row = this.getRowForRowKey(rowKey);\n if (!row || !row.item || !row.item.children) {\n return [];\n }\n\n const children: string[] = [];\n const collectChildren = (items: any[]) => {\n for (const item of items) {\n const itemKey = this.getRowKeyByItem(item);\n if (itemKey) {\n children.push(itemKey);\n }\n if (item.children && item.children.length > 0) {\n collectChildren(item.children);\n }\n }\n };\n\n collectChildren(row.item.children);\n return children;\n }\n\n // 获取树形父节点\n getTreeParent(rowKey: string): string | null {\n const findParent = (data: any[], targetKey: string): string | null => {\n for (const item of data) {\n const itemKey = this.getRowKeyByItem(item);\n if (item.children) {\n for (const child of item.children) {\n const childKey = this.getRowKeyByItem(child);\n if (childKey === targetKey) {\n return itemKey;\n }\n const result = findParent(item.children, targetKey);\n if (result) {\n return result;\n }\n }\n }\n }\n return null;\n };\n\n return findParent(this.data, rowKey);\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 // 检查是否是树形选择模式\n const isTreeSelectionMode =\n this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n\n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\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 // 直接设置选中状态,跳过递归计算\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = true;\n this.setRowSelectionByCheckboxKey(rowKey, true);\n }\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\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 }\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 const isTreeSelectionMode =\n this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\n this.rowKeyMap.forEach((_, rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = false;\n this.setRowSelectionByCheckboxKey(rowKey, false);\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\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 calculatedHeight: 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\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 // 只读不验证\n const readonly = this.ctx.database.getReadonly(rowKey, key);\n if (readonly) {\n return new Promise((resolve) => {\n resolve([]);\n });\n }\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 (row === undefined || 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 setValidationErrorByRowKey(rowKey: string, key: string, message: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowKey(rowKey);\n const rowIndex = row?.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, isUpdate = true) {\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', isUpdate);\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 * 计算树形数据的最大深度\n * @param data 树形数据\n * @param currentDepth 当前深度\n * @returns 最大深度\n */\n private calculateMaxTreeDepth(data: any[], currentDepth: number = 0): number {\n let maxDepth = currentDepth;\n\n data.forEach((item) => {\n if (Array.isArray(item.children) && item.children.length > 0) {\n const childMaxDepth = this.calculateMaxTreeDepth(item.children, currentDepth + 1);\n maxDepth = Math.max(maxDepth, childMaxDepth);\n }\n });\n\n return maxDepth;\n }\n setOverlayerAutoHeightMap(map: Map<string, number>) {\n this.overlayerAutoHeightMap = map;\n }\n getOverlayerAutoHeightMap() {\n return this.overlayerAutoHeightMap;\n }\n getOverlayerAutoHeight(rowIndex: number, colIndex: number) {\n const key = `${rowIndex}\\u200b_${colIndex}`;\n const height = this.overlayerAutoHeightMap.get(key) || 0;\n return height;\n }\n setCustomHeader(customHeader: CustomHeader, ignoreEmit = false) {\n (['fixedData', 'sortData', 'hideData', 'resizableData'] as (keyof CustomHeader)[]).forEach((key) => {\n const value = customHeader[key];\n if (value !== undefined) {\n this.customHeader[key] = value as any;\n }\n });\n if (!ignoreEmit) {\n const obj = this.clearCustomHeaderInvalidValues(this.columns);\n this.ctx.emit('customHeaderChange', obj);\n }\n }\n resetCustomHeader() {\n this.customHeader = {};\n this.ctx.emit('resetHeader');\n this.ctx.emit('customHeaderChange', this.customHeader);\n }\n getCustomHeader() {\n return this.customHeader;\n }\n setCustomHeaderResizableData(key: string, width: number) {\n // 统一设置方法\n let { resizableData = {} } = this.customHeader;\n resizableData[key] = width;\n this.setCustomHeader({\n resizableData,\n });\n }\n setCustomHeaderHideData(keys: string[], hide: boolean) {\n let { hideData = {} } = this.customHeader;\n keys.forEach((key) => {\n hideData[key] = hide;\n });\n this.setCustomHeader({\n hideData,\n });\n this.ctx.emit('resetHeader');\n }\n setCustomHeaderFixedData(keys: string[], fixed: Fixed | '') {\n let { fixedData = {} } = this.customHeader;\n keys.forEach((key) => {\n fixedData[key] = fixed;\n });\n this.setCustomHeader({\n fixedData,\n });\n this.ctx.emit('resetHeader');\n }\n // 递归处理\n clearCustomHeaderInvalidValues(columns: Column[]) {\n const clearCustomHeaderInvalidValues = (columns: Column[], customHeader: CustomHeader = {}) => {\n columns.forEach((column) => {\n if (column.children && column.children.length > 0) {\n clearCustomHeaderInvalidValues(column.children, customHeader);\n }\n // 用一个小的 helper 函数,减少重复代码\n const assignIfDifferent = (field: keyof CustomHeader, columnValue: any) => {\n const value = this.customHeader[field]?.[column.key];\n if (value !== undefined && value !== columnValue) {\n if (!customHeader[field]) {\n customHeader[field] = {} as any;\n }\n (customHeader[field] as any)[column.key] = value;\n // 如果固定源数据为空,则删除\n if (field === 'fixedData' && !value && !columnValue) {\n delete customHeader[field]?.[column.key];\n }\n }\n };\n assignIfDifferent('fixedData', column.fixed);\n assignIfDifferent('sortData', column.sort);\n assignIfDifferent('hideData', column.hide);\n assignIfDifferent('resizableData', column.width);\n });\n };\n let obj: CustomHeader = {};\n clearCustomHeaderInvalidValues(columns, obj);\n return obj;\n }\n setMaxRowHeightItem(rowKey: string, key: string, height: number) {\n this.maxRowHeightCellMap.set(rowKey, {\n key,\n height,\n });\n }\n getMaxRowHeightItem(rowKey: string) {\n return this.maxRowHeightCellMap.get(rowKey);\n }\n clearChangeData() {\n this.changedDataMap.clear();\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, 'back');\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, 'forward');\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype ListenerEntry = {\r\n target: EventTarget;\r\n name: string;\r\n fn: EventListenerOrEventListenerObject;\r\n options?: AddEventListenerOptions | boolean;\r\n};\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: Set<ListenerEntry> = new Set();\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 this.bind(document, '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 }\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 const entries = Array.from(this.eventTasks);\r\n entries.forEach(({ target, name, fn, options }) => {\r\n this.unbind(target, name, fn, options);\r\n });\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.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n const _e = e as MouseEvent;\r\n const rect = this.ctx.containerElement.getBoundingClientRect();\r\n const x = _e.clientX - rect.left;\r\n const y = _e.clientY - rect.top;\r\n this.ctx.mouseX = x;\r\n this.ctx.mouseY = y;\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 // 拖拽表头中不处理\r\n if(this.ctx.dragHeaderIng){\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.add({ target, name, fn, options });\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean): void {\r\n target.removeEventListener(name, fn as EventListener, options as any);\r\n for (const entry of this.eventTasks) {\r\n if (entry.target === target && entry.name === name && entry.fn === fn) {\r\n this.eventTasks.delete(entry);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\n\ntype EventMap = Map<string, EventCallback[]>;\n\nclass EventBus {\n private events: EventMap = new Map();\n constructor() {}\n has(event: string): boolean {\n return this.events.has(event);\n }\n // 订阅事件\n on(event: string, callback: EventCallback): void {\n const callbacks = this.events.get(event) || [];\n callbacks.push(callback);\n this.events.set(event, callbacks);\n }\n // 一次性订阅事件\n once(event: string, callback: EventCallback) {\n const onceCallback: EventCallback = (...args) => {\n callback(...args);\n this.off(event, onceCallback);\n };\n this.on(event, onceCallback);\n return this;\n }\n // 取消订阅事件\n off(event: string, callback: EventCallback): void {\n const callbacks = this.events.get(event);\n if (callbacks) {\n const index = callbacks.indexOf(callback);\n if (index >= 0) {\n callbacks.splice(index, 1);\n if (callbacks.length === 0) {\n this.events.delete(event);\n } else {\n this.events.set(event, callbacks);\n }\n }\n }\n }\n // 发布事件\n emit(event: string, ...args: any[]): void {\n const callbacks = this.events.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n }\n\n destroy(): void {\n this.events.clear();\n }\n}\nexport default EventBus;\n","import { Align, LineClampType, VerticalAlign } from './types';\nimport type { TextGlyph, TextLayout, TextLayoutLine, TextLineItem, TextLineSegment } from './TextSelector';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineDashOffset?: 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 autoRowHeight?: boolean;\n lineHeight?: number;\n maxLineClamp?: LineClampType;\n offsetLeft?: number;\n offsetRight?: number;\n textCallback?: (textInfo: TextInfo) => void;\n layoutCallback?: (layout: TextLayout) => void;\n cacheTextKey?: string;\n};\nexport type TextInfo = {\n x: number;\n y: number;\n width: number;\n height: number;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n private textCacheMap = new Map<string, string[]>();\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 getCtx() {\n return this.ctx;\n }\n clearTextCache() {\n this.textCacheMap.clear();\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 this.ctx.restore();\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 = options.lineDashOffset ?? 0;\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 maxLineClamp = 1,\n autoRowHeight = false,\n offsetLeft = 0,\n offsetRight = 0,\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n if (['', null, undefined].includes(text)) {\n this.ctx.restore();\n return false;\n }\n const fontSize = parseInt(font.match(/\\d+/)?.[0] || '12');\n const lineHeight = fontSize * (options.lineHeight || 1.2);\n const layout = this.buildTextLayout(text, x, y, width, height, {\n font,\n color,\n align,\n padding,\n verticalAlign,\n maxLineClamp,\n autoRowHeight,\n lineHeight,\n offsetLeft,\n offsetRight,\n });\n this.ctx.textBaseline = 'top';\n this.ctx.textAlign = 'left';\n layout.lines.forEach((line) => {\n this.ctx.fillText(line.text, line.drawX, line.drawY);\n });\n if (options.textCallback && layout.lines.length) {\n const maxLineWidth = layout.lines.reduce((max, line) => Math.max(max, line.width), 0);\n const textMaxWidth = Math.round(maxLineWidth);\n let left = layout.lines[0]?.drawX ?? x + padding + offsetLeft;\n let right = left + textMaxWidth;\n if (align === 'center') {\n left = x + width / 2 - textMaxWidth / 2;\n right = x + width / 2 + textMaxWidth / 2;\n } else if (align === 'right') {\n left = x + width - padding - offsetRight - textMaxWidth;\n right = x + width - padding - offsetRight;\n }\n const textInfo = {\n x: layout.lines[0]?.drawX ?? left,\n y: layout.contentY,\n width: textMaxWidth,\n height: layout.lines.length * lineHeight,\n left,\n right,\n top: layout.contentY,\n bottom: layout.contentY + layout.lines.length * lineHeight,\n };\n options.textCallback(textInfo);\n }\n if (options.layoutCallback) {\n options.layoutCallback(layout);\n }\n this.ctx.restore();\n return layout.ellipsis;\n }\n\n private buildTextLayout(\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n options: {\n font: string;\n color: string;\n align: Align;\n padding: number;\n verticalAlign: VerticalAlign;\n maxLineClamp: LineClampType;\n autoRowHeight: boolean;\n lineHeight: number;\n offsetLeft: number;\n offsetRight: number;\n },\n ): TextLayout {\n const {\n font,\n color,\n align,\n padding,\n verticalAlign,\n maxLineClamp,\n autoRowHeight,\n lineHeight,\n offsetLeft,\n offsetRight,\n } = options;\n this.ctx.save();\n this.ctx.font = font;\n const availableWidth = width - padding * 2 - offsetLeft - offsetRight;\n const contentWidth = availableWidth;\n const contentHeight = height - padding * 2;\n const chars = Array.from(text);\n let lines = this.wrapTextToLines(text, availableWidth);\n const maxTextLine = Math.round(contentHeight / lineHeight);\n let totalTextLine = Math.min(lines.length, Math.max(maxTextLine, 1));\n if (maxLineClamp === 'auto' && autoRowHeight) {\n totalTextLine = lines.length;\n } else if (typeof maxLineClamp === 'number' && maxLineClamp < totalTextLine && maxLineClamp !== 1) {\n totalTextLine = maxLineClamp;\n } else {\n if (maxLineClamp === 1) {\n lines = [{ items: chars.map((char, i) => ({ char, sourceIndex: i })), text, caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n totalTextLine = 1;\n }\n if (maxLineClamp === 'auto' && maxTextLine === 1) {\n lines = [{ items: chars.map((char, i) => ({ char, sourceIndex: i })), text, caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n totalTextLine = 1;\n }\n }\n let ellipsis = false;\n const visibleLines = lines.slice(0, totalTextLine);\n if (lines.length > totalTextLine) {\n ellipsis = true;\n const remainingLines = lines.slice(totalTextLine - 1);\n const ellipsisLine = this.buildEllipsisLine(remainingLines, width, padding);\n ellipsisLine.lineIndex = totalTextLine - 1;\n visibleLines[totalTextLine - 1] = ellipsisLine;\n } else if (totalTextLine > 0) {\n const lastLineIndex = totalTextLine - 1;\n const remainingLines = lines.slice(lastLineIndex);\n const remainingText = remainingLines.map((line) => line.text).join('');\n const { ellipsis: widthEllipsis } = this.handleEllipsis(remainingText, width, padding, font);\n if (widthEllipsis) {\n ellipsis = true;\n const ellipsisLine = this.buildEllipsisLine(remainingLines, width, padding);\n ellipsisLine.lineIndex = lastLineIndex;\n visibleLines[lastLineIndex] = ellipsisLine;\n }\n }\n const totalTextHeight = visibleLines.length * lineHeight;\n let contentY = y + padding;\n if (verticalAlign === 'middle') {\n contentY = y + (height - totalTextHeight) / 2;\n } else if (verticalAlign === 'bottom') {\n contentY = y + height - totalTextHeight - padding;\n }\n const glyphs: TextGlyph[] = [];\n visibleLines.forEach((line, index) => {\n line.lineIndex = index;\n const segments = this.buildLineSegments(line);\n const lineWidth = segments.reduce((sum, segment) => sum + segment.width, 0);\n let lineX = x + padding + offsetLeft;\n if (align === 'center') {\n lineX = x + (width - lineWidth) / 2;\n } else if (align === 'right') {\n lineX = x + width - padding - offsetRight - lineWidth;\n }\n const lineY = contentY + index * lineHeight;\n line.drawX = lineX;\n line.drawY = lineY;\n line.width = lineWidth;\n line.segments = segments;\n segments.forEach((segment) => {\n if (segment.sourceIndex < 0) {\n return;\n }\n glyphs.push({\n char: segment.char,\n index: segment.sourceIndex,\n line: index,\n x: lineX + segment.x,\n y: lineY,\n width: segment.width,\n height: lineHeight,\n });\n });\n });\n this.ctx.restore();\n return {\n text,\n chars,\n glyphs,\n lines: visibleLines,\n box: { x, y, width, height },\n contentBox: { x: x + padding + offsetLeft, y: y + padding, width: contentWidth, height: contentHeight },\n contentY,\n lineHeight,\n font,\n color,\n align,\n ellipsis,\n };\n }\n\n private wrapTextToLines(text: string, maxWidth: number): TextLayoutLine[] {\n if (!text) {\n return [{ items: [], text: '', caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n }\n const chars = Array.from(text);\n const lines: TextLayoutLine[] = [];\n let currentItems: TextLineItem[] = [];\n let currentWidth = 0;\n let lineCaretIndex = 0;\n\n const flushLine = (nextCaretIndex: number) => {\n const lineText = currentItems.map((item) => item.char).join('');\n lines.push({\n items: currentItems,\n text: lineText,\n caretIndex: lineCaretIndex,\n lineIndex: lines.length,\n drawX: 0,\n drawY: 0,\n width: 0,\n segments: [],\n });\n currentItems = [];\n currentWidth = 0;\n lineCaretIndex = nextCaretIndex;\n };\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n if (char === '\\n') {\n flushLine(i + 1);\n continue;\n }\n const charWidth = this.ctx.measureText(char).width;\n if (currentWidth + charWidth > maxWidth && currentItems.length > 0) {\n flushLine(currentItems[currentItems.length - 1].sourceIndex + 1);\n currentItems.push({ char, sourceIndex: i });\n currentWidth = charWidth;\n continue;\n }\n currentItems.push({ char, sourceIndex: i });\n currentWidth += charWidth;\n }\n if (currentItems.length > 0 || lines.length === 0) {\n flushLine(chars.length);\n }\n return lines;\n }\n\n private buildEllipsisLine(remainingLines: TextLayoutLine[], width: number, padding: number): TextLayoutLine {\n const remainingItems = remainingLines.flatMap((line) => line.items);\n const remainingText = remainingItems.map((item) => item.char).join('');\n const { _text, ellipsis } = this.handleEllipsis(remainingText, width, padding, this.ctx.font);\n const contentText = ellipsis ? _text.slice(0, -3) : _text;\n const items: TextLineItem[] = [];\n for (let i = 0; i < contentText.length; i++) {\n const item = remainingItems[i];\n if (!item) {\n break;\n }\n items.push({ char: item.char, sourceIndex: item.sourceIndex });\n }\n if (ellipsis) {\n items.push(\n { char: '.', sourceIndex: -1, ellipsis: true },\n { char: '.', sourceIndex: -1, ellipsis: true },\n { char: '.', sourceIndex: -1, ellipsis: true },\n );\n }\n return {\n items,\n text: _text,\n caretIndex: remainingLines[0]?.caretIndex ?? 0,\n lineIndex: 0,\n drawX: 0,\n drawY: 0,\n width: 0,\n segments: [],\n };\n }\n\n private buildLineSegments(line: TextLayoutLine): TextLineSegment[] {\n const segments: TextLineSegment[] = [];\n let offsetX = 0;\n line.items.forEach((item, itemIndex) => {\n const segmentWidth = this.ctx.measureText(item.char).width;\n segments.push({\n char: item.char,\n itemIndex,\n sourceIndex: item.sourceIndex,\n x: offsetX,\n width: segmentWidth,\n });\n offsetX += segmentWidth;\n });\n return segments;\n }\n\n /**\n * 将文本按宽度换行\n * @param text\n * @param maxWidth\n * @returns\n */\n private wrapText(text: string, maxWidth: number, cacheTextKey = ''): string[] {\n if (!text) return [''];\n // 缓存文本\n if (cacheTextKey && this.textCacheMap.has(cacheTextKey)) {\n return this.textCacheMap.get(cacheTextKey) || [''];\n }\n const lines: string[] = [];\n const paragraphs = text.split('\\n');\n\n for (const paragraph of paragraphs) {\n if (paragraph === '') {\n lines.push('');\n continue;\n }\n\n const words = paragraph.split('');\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine + word;\n const testWidth = this.ctx.measureText(testLine).width;\n if (testWidth <= maxWidth) {\n currentLine = testLine;\n } else {\n if (currentLine) {\n lines.push(currentLine);\n currentLine = word;\n } else {\n // 单个字符也超出宽度,强制换行\n lines.push(word);\n currentLine = '';\n }\n }\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n const result = lines.length > 0 ? lines : [''];\n if (cacheTextKey) {\n this.textCacheMap.set(cacheTextKey, result);\n }\n return result;\n }\n\n /**\n * 计算文本自适应高度\n * @param text\n * @param width\n * @param options\n * @returns 计算出的高度\n */\n calculateTextHeight(text: string = '', width: number, options: DrawTextOptions = {}): number {\n const {\n font = '12px Arial',\n padding = 0,\n align = 'center',\n color = '#495060',\n maxLineClamp = 1,\n cacheTextKey = '',\n } = options;\n this.ctx.save();\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textAlign = align;\n // // 获取字体高度\n const fontSize = parseInt(font.match(/\\d+/)?.[0] || '12');\n const lineHeight = fontSize * (options.lineHeight || 1.2); // 默认行高为字体大小的1.2倍\n\n // 将文本按可用宽度分割成行\n const availableWidth = width - padding * 2;\n const lines = this.wrapText(text, availableWidth, cacheTextKey);\n // 计算总行数\n let totalLines = 1;\n if (maxLineClamp === 'auto') {\n totalLines = lines.length;\n } else {\n if (lines.length > maxLineClamp) {\n totalLines = maxLineClamp;\n } else {\n totalLines = lines.length;\n }\n }\n this.ctx.restore();\n // 计算总高度:行数 * 行高 + 上下padding\n return Math.max(Math.floor(totalLines * lineHeight + padding * 2), Math.floor(fontSize + padding * 2));\n }\n handleEllipsis(\n text: string,\n width: number,\n padding: number = 0,\n font: string = '12px Arial',\n ): { _text: string; ellipsis: boolean } {\n this.ctx.save();\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n this.ctx.restore();\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n // 如果宽度小于省略号宽度,则不进行省略,直接返回空字符串\n if (width <= ellipsesWidth + padding * 2) {\n this.ctx.restore();\n return {\n _text: '',\n ellipsis: true,\n };\n }\n const textWidth = this.ctx.measureText(text).width;\n const lineWidth = width - padding * 2;\n // 单行文本省略\n if (textWidth && textWidth >= lineWidth) {\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 >= lineWidth - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n ellipsis = true;\n break;\n }\n }\n }\n this.ctx.restore();\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\nimport {\n Align,\n BeforeAutofillDataMethod,\n BeforeBodyContextMenuMethod,\n BeforeCellValueChangeMethod,\n BeforeCopyMethod,\n BeforeDragRowMethod,\n BeforeHeaderContextMenuMethod,\n BeforePasteDataMethod,\n BeforeSetAutofillMethod,\n BeforeSetSelectorMethod,\n CellEditorMethod,\n CellHeaderStyleMethod,\n CellHoverIconMethod,\n CellReadonlyMethod,\n CellRenderMethod,\n CellRulesMethod,\n CellStyleMethod,\n CellTypeMethod,\n ConfigType,\n ExpandLazyMethod,\n FooterPosition,\n FormatterMethod,\n MenuItem,\n SelectableMethod,\n SelectorCellValueType,\n SpanMethod,\n TreeSelectMode,\n VerticalAlign,\n} from './types';\nimport { getCssVar } from './util';\n\nexport default class Config {\n private _config: ConfigType = {};\n /** CSS 类名前缀 */\n CSS_PREFIX = 'e-virt-table';\n /** 图标集合 */\n ICONS: IconType[] = [];\n /** 行的唯一标识键 */\n ROW_KEY = '';\n /** 禁用编辑,优先等级最高 */\n DISABLED = false;\n /** 表头字体 */\n HEADER_FONT = '12px normal Arial';\n /** 单元格字体 */\n BODY_FONT = '12px normal Arial';\n /** 边框 */\n BORDER = true;\n /** 斑马纹 */\n STRIPE = false;\n /** 斑马纹颜色 */\n STRIPE_COLOR = '#fafafa';\n /** 区域边框颜色 */\n BORDER_COLOR = '#e1e6eb';\n /** 高度,为 0 表示自适应 */\n HEIGHT = 0;\n /** 占位文本颜色 */\n PLACEHOLDER_COLOR = '#CDD0DC';\n /** 空数据 body 高度 */\n EMPTY_BODY_HEIGHT = 120;\n /** 自定义空样式 */\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 空数据文本 */\n EMPTY_TEXT = '';\n /** 加载文本 */\n LOADING_TEXT = '';\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\n MAX_HEIGHT = 1000;\n /** 区域边框圆角 */\n BORDER_RADIUS = 8;\n /** 启用偏移高度内部计算表格高度 */\n ENABLE_OFFSET_HEIGHT = false;\n /** 偏移高度 */\n OFFSET_HEIGHT = 0;\n /** 表头高度 */\n HEADER_HEIGHT = 36;\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\n ENABLE_HEADER_STICKY = false;\n /** 表头背景色 */\n HEADER_BG_COLOR = '#F8FAFF';\n /** body 背景色 */\n BODY_BG_COLOR = '#FFF';\n /** 表头文本颜色 */\n HEADER_TEXT_COLOR = '#1D2129';\n /** 必填*颜色 */\n REQUIRED_COLOR = '#F56C6C';\n /** body文本颜色 */\n BODY_TEXT_COLOR = '#4E5969';\n /** footer文本颜色 */\n FOOTER_TEXT_COLOR = '#4E5969';\n /** 加载 svg 图标 */\n LOADING_ICON_SVG = '';\n /** 加载 svg 图标颜色 */\n LOADING_ICON_COLOR = '#4E5969';\n /** 树形展开svg 图标 */\n EXPAND_ICON_SVG = '';\n /** 树形收缩svg 图标 */\n SHRINK_ICON_SVG = '';\n /** 展开图标颜色 */\n EXPAND_ICON_COLOR = '#4E5969';\n /** 收缩图标颜色 */\n SHRINK_ICON_COLOR = '#4E5969';\n /** 错误提示颜色 */\n ERROR_TIP_ICON_COLOR = 'red';\n /** 错误提示图标大小 */\n ERROR_TIP_ICON_SIZE = 6;\n /** 所有列对齐方式 */\n COLUMNS_ALIGN: Align = 'left';\n /** 所有列垂直对齐方式 */\n COLUMNS_VERTICAL_ALIGN: VerticalAlign = 'middle';\n /** 是否开启懒加载\t */\n EXPAND_LAZY = true;\n /** 默认展开全部\t */\n DEFAULT_EXPAND_ALL = false;\n /** 表格 body 部分的宽度 */\n CELL_WIDTH = 100;\n /** body 单元格默认行高 */\n CELL_HEIGHT = 36;\n /** 表格 body 部分的 padding */\n CELL_PADDING = 8;\n /** hover编辑图标大小 */\n CELL_HOVER_ICON_SIZE = 14;\n /** hover编辑图标背景色 */\n CELL_HOVER_ICON_BG_COLOR = '#fff';\n /** hover编辑图标边框颜色 */\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\n /** 滚动条轨道尺寸 */\n SCROLLER_TRACK_SIZE = 14;\n /** 滚动条滑块尺寸 */\n SCROLLER_SIZE = 8;\n /** 滚动条滑块颜色 */\n SCROLLER_COLOR = '#dee0e3';\n /** 轨道颜色 */\n SCROLLER_TRACK_COLOR = '#fff';\n /** 滚动条滑块聚焦时的颜色 */\n SCROLLER_FOCUS_COLOR = '#bbbec4';\n /** 选中区域边框颜色 */\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\n /** 选中区域背景颜色 */\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\n /** 当前焦点单元格所在行、列的背景色 */\n SELECT_ROW_COL_BG_COLOR = 'transparent';\n /** 填充点的边框颜色 */\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\n /** 可编辑背景色 */\n EDIT_BG_COLOR = '#fcf6ed';\n /** 选择 key,合并时用 */\n CHECKBOX_KEY = '';\n /** 选择框颜色 */\n CHECKBOX_COLOR = 'rgb(82,146,247)';\n /** 查找结果当前行颜色 */\n FINDER_CELL_BG_COLOR = 'rgb(255,229,144)';\n /** 启用查找 */\n ENABLE_FINDER = true;\n /** 选择框大小 */\n CHECKBOX_SIZE = 20;\n /** 选择框禁用图标 */\n CHECKBOX_DISABLED_SVG = '';\n /** 选择框禁用图标颜色 */\n CHECKBOX_DISABLED_COLOR = '#F1F2F4';\n /** 选择框选中图标 */\n CHECKBOX_CHECK_SVG = '';\n /** 选择框未中图标 */\n CHECKBOX_UNCHECK_SVG = '';\n /** 选择框未中图标颜色 */\n CHECKBOX_UNCHECK_COLOR = '#DDE0EA';\n /** 选择框半选中图标 */\n CHECKBOX_INDETERMINATE_SVG = '';\n /** 选择框选中禁用图标 */\n CHECKBOX_CHECK_DISABLED_SVG = '';\n /** 选择框选中禁用图标颜色 */\n CHECKBOX_CHECK_DISABLED_COLOR = '#DDE0EA';\n /** 编辑图标 */\n ICON_EDIT_SVG = '';\n /** 编辑图标颜色 */\n ICON_EDIT_COLOR = '#4E5969';\n /** 选择图标 */\n ICON_SELECT_SVG = '';\n /** 选择图标颜色 */\n ICON_SELECT_COLOR = '#4E5969';\n /** 启用严格排序,即不支持多列排序 */\n SORT_STRICTLY = true;\n /** 排序升序图标 */\n SORT_ASC_ICON_SVG = '';\n /** 排序降序图标 */\n SORT_DESC_ICON_SVG = '';\n /** 排序默认图标 */\n SORTABLE_ICON_SVG = '';\n /** 排序图标颜色 */\n SORT_ICON_COLOR = 'rgb(82,146,247)';\n /** 单元格只读背景色 */\n READONLY_COLOR = '#fff';\n /** 单元格只读文本颜色 */\n READONLY_TEXT_COLOR = '#4E5969';\n /** 单元格错误提示文本颜色 */\n ERROR_TIP_COLOR = '#ED3F14';\n /** 合计底部背景色 */\n FOOTER_BG_COLOR = '#fafafa';\n /** 合计底部固定 */\n FOOTER_FIXED = true;\n /** 合计底部位置 */\n FOOTER_POSITION: FooterPosition = 'bottom';\n /** 单元格底部高度 */\n CELL_FOOTER_HEIGHT = 36;\n /** 启用选择器 */\n ENABLE_SELECTOR = true;\n /** 树形选择模式 */\n TREE_SELECT_MODE: TreeSelectMode = 'auto';\n /** 树形子项key名称 */\n TREE_CHILDREN_KEY = 'children';\n /** 树形缩进宽度 */\n TREE_INDENT = 20;\n /** 树形图标大小 */\n TREE_ICON_SIZE = 20;\n /**树形划线 */\n TREE_LINE = false;\n /** 树形划线颜色 */\n TREE_LINE_COLOR = '#e1e6eb';\n /** 启用单点击立马编辑 */\n ENABLE_EDIT_SINGLE_CLICK = false;\n /** 启用点击选择器编辑 */\n ENABLE_EDIT_CLICK_SELECTOR = true;\n /** 选择器X最小范围 */\n SELECTOR_AREA_MIN_X = 0;\n /** 选择器X最大范围colMax - offset */\n SELECTOR_AREA_MAX_X_OFFSET = 0;\n /** 选择器X最大范围,0默认最大colMax */\n SELECTOR_AREA_MAX_X = 0;\n /** 选择器Y最小范围 */\n SELECTOR_AREA_MIN_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y_OFFSET = 0;\n /** 选择器值类型,value,displayText,区别displayText受format影响 */\n SELECTOR_CELL_VALUE_TYPE: SelectorCellValueType = 'value'; // displayText | value\n /** 启用自动主题 */\n ENABLE_AUTO_THEME = true;\n /** 启用选择器-选择器单选 */\n ENABLE_SELECTOR_SINGLE = false;\n /** 启用选择器-批量跨列选择 */\n ENABLE_SELECTOR_SPAN_COL = true;\n /** 启用选择器-批量跨行选择 */\n ENABLE_SELECTOR_SPAN_ROW = true;\n /** 启用选择器-批量选中列 */\n ENABLE_SELECTOR_ALL_ROWS = true;\n /** 启用选择器-批量选中行 */\n ENABLE_SELECTOR_ALL_COLS = true;\n /** 启用合并格子数据关联 */\n ENABLE_MERGE_CELL_LINK = false;\n /** 启用填充器 */\n ENABLE_AUTOFILL = false;\n /** 启用选择器-批量跨列选择 */\n ENABLE_AUTOFILL_SPAN_COL = true;\n /** 启用选择器-批量跨行选择 */\n ENABLE_AUTOFILL_SPAN_ROW = true;\n /** 启用body右键菜单 */\n ENABLE_CONTEXT_MENU = false;\n /** 启用表头右键菜单 */\n ENABLE_HEADER_CONTEXT_MENU = false;\n /** 启用文字选中复制 */\n ENABLE_TEXT_SELECTION = true;\n /** 启用复制 */\n ENABLE_COPY = true;\n /** 启用粘贴 */\n ENABLE_PASTER = true;\n /** 启用调整行高 */\n ENABLE_RESIZE_ROW = true;\n /** 启用列宽可调整 */\n ENABLE_RESIZE_COLUMN = true;\n /** 行调整线颜色 */\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\n /** 列调整线颜色 */\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\n /** 启用列调整文本 */\n ENABLE_RESIZE_COLUMN_TEXT = true;\n /** 列调整线颜色 */\n RESIZE_COLUMN_TEXT_COLOR = '#fff';\n /** 列调整线文本背景色 */\n RESIZE_COLUMN_TEXT_BG_COLOR = 'rgb(82,146,247)';\n /** 最小调整行高 */\n RESIZE_ROW_MIN_HEIGHT = 36;\n /** 列宽最小值 */\n RESIZE_COLUMN_MIN_WIDTH = 40;\n /** 拖拽提示背景色 */\n DRAG_TIP_BG_COLOR = 'rgba(82,146,247,0.1)';\n /** 拖拽提示线颜色 */\n DRAG_TIP_LINE_COLOR = 'rgb(82,146,247)';\n /** 拖拽提示文本颜色 */\n /** 启用键盘 */\n ENABLE_KEYBOARD = true;\n /** 启用历史 */\n ENABLE_HISTORY = false;\n ENABLE_VALIDATOR_IMMEDIATE = true;\n /** 历史栈数量 */\n HISTORY_NUM = 50;\n /** 启用悬浮高亮 */\n HIGHLIGHT_HOVER_ROW = false;\n /** 悬浮颜色 */\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\n /** 高亮选中当前行 */\n HIGHLIGHT_SELECTED_ROW = false;\n /** 高亮当前行颜色 */\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\n /** 提示背景颜色 */\n TOOLTIP_BG_COLOR = '#303133';\n /** 提示文本颜色 */\n TOOLTIP_TEXT_COLOR = '#fff';\n /** 提示层级 */\n TOOLTIP_ZINDEX = 3000;\n /** 自定义提示样式 */\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 自定义右键菜单 */\n CONTEXT_MENU: MenuItem[] = [{ value: 'copy' }, { value: 'cut' }, { value: 'paste' }, { value: 'clearSelected' }];\n CUSTOM_BODY_CONTEXT_MENU: MenuItem[] = [];\n HEADER_CONTEXT_MENU: MenuItem[] = [\n { value: 'fixedLeft' },\n { value: 'fixedRight' },\n { value: 'fixedNone' },\n { value: 'hide' },\n { value: 'visible' },\n { value: 'resetHeader' },\n ];\n CUSTOM_HEADER_CONTEXT_MENU: MenuItem[] = [];\n /** 格子多行文本行高,isAutoRowHeight才会生效 */\n CELL_LINE_HEIGHT = 1.2;\n /** 全局自动行高 */\n AUTO_ROW_HEIGHT = false;\n /** 启用拖拽表头 */\n ENABLE_DRAG_COLUMN = false;\n /** 启用拖拽行 */\n ENABLE_DRAG_ROW = false;\n /** 启用拖拽行跨级,针对tree数据结构 */\n ENABLE_DRAG_ROW_CROSS_LEVEL = false;\n /** 启用拖拽行自定义 */\n ENABLE_DRAG_ROW_CUSTOM = false;\n /** 拖拽提示线颜色 */\n DRAG_ROW_TIP_LINE_COLOR = 'rgb(82,146,247)';\n /** 拖拽行图标 */\n DRAG_ROW_ICON_SVG = '';\n /** 拖拽行图标大小 */\n DRAG_ROW_ICON_SIZE = 18;\n /** 拖拽行图标颜色 */\n DRAG_ROW_ICON_COLOR = '#bec4c7';\n /** header 格子样式 */\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\n /** body 格子样式 */\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\n /** footer 格子样式 */\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\n /** 自定义只读 */\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\n /** 格式化方法更改(formatter优先等级比较高) */\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\n /** 自定义校验规则 */\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\n /** 自定义只读 */\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\n /** 自定义编辑器类型 */\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\n /** 自定义只读 */\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\n /** 自定义只读 */\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\n /** 自定义跨列/行渲染 */\n SPAN_METHOD?: SpanMethod;\n /** 自定义选择禁用 */\n SELECTABLE_METHOD?: SelectableMethod;\n /** 自定义选择禁用 */\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\n /** 数值改变前回调 */\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\n /** 粘贴前回调 */\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\n /** 数值填充前回调 */\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\n /** 设置选择器前回调 */\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\n /** 设置填充器前回调 */\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\n /** 自定义表头右键菜单 */\n BEFORE_HEADER_CONTEXT_MENU_METHOD?: BeforeHeaderContextMenuMethod;\n /** 自定义BODY右键菜单 */\n BEFORE_BODY_CONTEXT_MENU_METHOD?: BeforeBodyContextMenuMethod;\n /** 数据复制前回调 */\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\n BEFORE_DRAG_ROW_METHOD?: BeforeDragRowMethod;\n constructor(config: Partial<Config>) {\n this._config = config;\n this.updateCssVar();\n }\n /** 初始化 */\n init(config: ConfigType) {\n this._config = config;\n this.updateCssVar();\n }\n /** 同步css 样式变量 */\n updateCssVar() {\n let obj: any = {};\n Object.keys(this).forEach((key) => {\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\n const val = getCssVar(cssKey);\n if (val) {\n obj[key] = val;\n }\n }\n });\n Object.assign(this, obj, this._config);\n }\n}\n","export default \"<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\"","export default \"<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>\\n\"","export default \"<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>\\n\"","export default \"<svg t=\\\"1755138507987\\\" class=\\\"icon\\\" viewBox=\\\"0 0 1024 1024\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" p-id=\\\"5079\\\" width=\\\"200\\\" height=\\\"200\\\"><path d=\\\"M512 938.688a42.688 42.688 0 0 1-35.072-18.432l-192-277.312A42.56 42.56 0 0 1 320 576h384a42.752 42.752 0 0 1 35.072 66.944l-192 277.312a42.688 42.688 0 0 1-35.072 18.432\\\" fill=\\\"currentColor\\\" p-id=\\\"2016\\\"></path><path d=\\\"M704 448H320a42.752 42.752 0 0 1-35.072-66.944l192-277.312c16-23.04 54.208-23.04 70.144 0l192 277.312A42.56 42.56 0 0 1 704 448\\\" fill=\\\"currentColor\\\" p-id=\\\"2015\\\"></path></svg>\\n\"","export default \"<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>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2s.9-2 2-2s2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2s-2 .9-2 2s.9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2z\\\" fill=\\\"currentColor\\\"></path></svg>\\n\"","export default \"<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\\\" p-id=\\\"4709\\\"></path></svg>\\n\"","export default \"<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>\\n\"","export default \"<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\\\" 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>\\n\"","export default \"<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>\\n\"","import Context from './Context';\r\nimport expandSvg from './svg/expand.svg?raw';\r\nimport svgcheckboxCheck from './svg/checkbox-check.svg?raw';\r\nimport svgSelect from './svg/select.svg?raw';\r\nimport svgSortable from './svg/sortable.svg?raw';\r\nimport svgLoading from './svg/loading.svg?raw';\r\nimport svgDrag from './svg/drag.svg?raw';\r\nimport svgCheckboxUncheck from './svg/checkbox-uncheck.svg?raw';\r\nimport svgCheckboxIndeterminate from './svg/checkbox-indeterminate.svg?raw';\r\nimport svgCheckboxDisabled from './svg/checkbox-disabled.svg?raw';\r\nimport svgIconEdit from './svg/icon-edit.svg?raw';\r\n\r\ntype ConfigColorNameType =\r\n | 'LOADING_ICON_COLOR'\r\n | 'EXPAND_ICON_COLOR'\r\n | 'SHRINK_ICON_COLOR'\r\n | 'CHECKBOX_COLOR'\r\n | 'SORT_ICON_COLOR'\r\n | 'ICON_EDIT_COLOR'\r\n | 'ICON_SELECT_COLOR'\r\n | 'CHECKBOX_DISABLED_COLOR'\r\n | 'CHECKBOX_UNCHECK_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 | 'ICON_EDIT_SVG'\r\n | 'ICON_SELECT_SVG'\r\n | 'CHECKBOX_CHECK_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG'\r\n | 'SORT_ASC_ICON_SVG'\r\n | 'SORT_DESC_ICON_SVG'\r\n | 'SORTABLE_ICON_SVG'\r\n | 'DRAG_ROW_ICON_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\n// 用替换节约点打包体积\r\nconst svgSortAsc = svgSortable.replace(`fill=\"currentColor\" p-id=\"2016\"`, `fill=\"#bec4c7\" p-id=\"2016\"`);\r\nconst svgSortDesc = svgSortable.replace(`fill=\"currentColor\" p-id=\"2015\"`, `fill=\"#bec4c7\" p-id=\"2015\"`);\r\nexport { expandSvg, svgcheckboxCheck, svgSelect, svgSortable, svgSortAsc, svgSortDesc, svgLoading, svgDrag };\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: svgLoading,\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: expandSvg,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'SHRINK_ICON_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 configColorName: 'CHECKBOX_UNCHECK_COLOR',\r\n svg: svgCheckboxUncheck,\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: svgcheckboxCheck,\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: svgCheckboxIndeterminate,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_DISABLED_SVG',\r\n svg: svgcheckboxCheck,\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n configColorName: 'CHECKBOX_DISABLED_COLOR',\r\n svg: svgCheckboxDisabled,\r\n color: '#F1F2F4',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'ICON_EDIT_SVG',\r\n configColorName: 'ICON_EDIT_COLOR',\r\n svg: svgIconEdit,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'ICON_SELECT_SVG',\r\n configColorName: 'ICON_SELECT_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'sort-asc',\r\n configName: 'SORT_ASC_ICON_SVG',\r\n configColorName: 'SORT_ICON_COLOR',\r\n svg: svgSortAsc,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'sort-desc',\r\n configName: 'SORT_DESC_ICON_SVG',\r\n configColorName: 'SORT_ICON_COLOR',\r\n svg: svgSortDesc,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'sort-default',\r\n configName: 'SORTABLE_ICON_SVG',\r\n svg: svgSortable,\r\n color: '#bec4c7',\r\n },\r\n {\r\n name: 'drag',\r\n configName: 'DRAG_ROW_ICON_SVG',\r\n svg: svgDrag,\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 const attrValue = element.getAttribute('fill');\r\n if (attrValue === 'currentColor' || attrValue === null) {\r\n element.setAttribute('fill', fill);\r\n }\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:' + svgContent));\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 getSvg(name: string) {\r\n return this.list.find((item) => item.name === name);\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\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((entries) => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver', entries);\n this.ctx.emit('containerResize', this.ctx.containerElement);\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 (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (!this.isInsideBody(x, y)) {\n this.ctx.emit('mousedownBodyOutside', e);\n }\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.focusCell = undefined;\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.focusCellHeader = undefined;\n this.ctx.emit('cellMousedown', cell, e);\n }, true);\n });\n // 按上事件\n this.ctx.on('mouseup', (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.emit('cellHeaderMouseup', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellMouseup', 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 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 });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n const hoverIcon = cell.getImage('hover');\n if (!this.ctx.disableHoverIconClick && hoverIcon && hoverIcon.isInside(x, y)) {\n this.ctx.emit('hoverIconClick', cell);\n }\n },\n true,\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 if (!this.ctx.mousedown && this.ctx.stageElement.style.cursor !== 'default') {\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.imageEnterAndLeave(cell, e);\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 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 this.imageEnterAndLeave(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('draw');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n this.handleFooterEvent(x, y, this.ctx.footer.renderRows, (cell: Cell) => {\n this.ctx.emit('cellFooterMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellFooterMouseleave', cell, e);\n }\n this.ctx.emit('cellFooterHoverChange', cell, e);\n });\n });\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n if (this.ctx.dragRowIng || this.ctx.dragHeaderIng || this.ctx.selectColsIng || this.ctx.selectRowsIng || this.ctx.selectorMove || this.ctx.autofillMove) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n cell.cellImages.forEach((image, key) => {\n if (image.isInside(x, y)) {\n if (key === 'drag') {\n this.ctx.stageElement.style.cursor = 'grab';\n } else {\n this.ctx.stageElement.style.cursor = 'pointer';\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.loading) {\n return true;\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(x, 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 isInside = visible ? cell.isInsideVisible(x, y) : cell.isInside(x, y);\n if (isInside) {\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 if (cell.isInside(x, y)) {\n callback(cell);\n return;\n }\n }\n }\n private handleFooterEvent(x: number, y: number, renderRows: Row[], callback: Function) {\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n if (cell.isInside(x, y)) {\n callback(cell);\n return;\n }\n }\n }\n }\n private isInsideBody(_x: number, _y: number) {\n const { body: {\n y,\n visibleHeight,\n height,\n visibleWidth,\n } } = this.ctx;\n const realityHeight = Math.min(height, visibleHeight);\n return _x > 0 && _x < visibleWidth && _y > y && _y < y + realityHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","export default {\r\n numberErrorTip: '只允许输入数字',\r\n emptyText: '暂无数据',\r\n loadingText: '加载中...',\r\n copy: '复制',\r\n cut: '剪切',\r\n paste: '粘贴',\r\n clearSelected: '清空选中内容',\r\n fixedLeft: '左固定',\r\n fixedRight: '右固定',\r\n fixedNone: '取消固定',\r\n hide: '隐藏',\r\n visible: '显示',\r\n resetHeader: '恢复默认',\r\n invalidNumber: '请输入数字类型',\r\n mergeCellNoFill: '合并单元格不能填充',\r\n mergeCellNoCopy: '合并单元格不能复制',\r\n mergeCellNoPaste: '合并单元格不能粘贴',\r\n numberTruncated: '输入的数字已截取至小数点后{precision}位',\r\n batchSetItemValueError: '批量赋值错误',\r\n numberMin: '输入值小于{min},已自动调整为{min}',\r\n numberMax: '输入值大于{max},已自动调整为{max}',\r\n stringMaxlength: '输入值超过{maxlength}个字符,已自动截取',\r\n};\r\n","import EVirtTable from './EVirtTable';\r\nimport defaultLang from './lang/zh-CN';\r\nexport type LangConfig = typeof defaultLang;\r\n\r\nexport default class Locale {\r\n private langConfig?: LangConfig;\r\n use(langConfig: LangConfig) {\r\n this.langConfig = langConfig;\r\n }\r\n getText(key: string, params?: Record<string, any>) {\r\n const config = { ...defaultLang };\r\n // 合并全局默认语言配置\r\n Object.assign(config, EVirtTable.locale, this.langConfig);\r\n const text = config[key as keyof LangConfig];\r\n if (!text) {\r\n return '';\r\n }\r\n return text.replace(/{(\\w+)}/g, (match, p1) => params?.[p1] || match);\r\n }\r\n}\r\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\nimport { FinderResult } from './FinderBar';\r\nimport Locale from './Locale';\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 loadingElement?: 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 allCellHeaders: CellHeader[];\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 locale: Locale = new Locale();\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 loadingElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n textSelectionStr = '';\r\n textSelecting = false;\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isEmpty = 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 disableHoverIconClick = false; // 禁用hoverIconClick,防止填充选择器移动时,触发hoverIconClick\r\n selectColsIng = false; // 选择列中\r\n selectRowsIng = false; // 选择行中\r\n dragHeaderIng = false; // 拖拽表头中\r\n dragRowIng = false; // 拖拽行中\r\n finding = false; // 查找中\r\n contextMenuIng = false; // 右键菜单中\r\n editing = false; // 编辑中\r\n loading = 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 mouseX = 0;\r\n mouseY = 0;\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 allCellHeaders: [],\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 finderBar: FinderResult = {\r\n text: '',\r\n rowIndex: -1,\r\n colIndex: -1,\r\n type: 'body',\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 loadingElement,\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.loadingElement = loadingElement;\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 startAdjustPosition(e: MouseEvent) {\r\n this.emit('startAdjustPosition', e);\r\n }\r\n stopAdjustPosition() {\r\n this.emit('stopAdjustPosition');\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 private mousedownHeader = false; // 是否点击了表头,点击头部处理滚动条调整位置\n private adjustPositionX = '';\n private adjustPositionY = '';\n private timerX = 0; // 水平滚动定时器\n private timerY = 0; // 垂直滚动定时器\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 this.ctx.on('scrollToIndex', (rowIndex: number, colIndex: number) => {\n this.scrollToIndex(rowIndex, colIndex);\n });\n this.ctx.on('cellHeaderMousedown', () => {\n this.mousedownHeader = true;\n });\n this.ctx.on('startAdjustPosition', (e: MouseEvent) => {\n this.startAdjustPosition(e);\n });\n this.ctx.on('stopAdjustPosition', () => {\n this.stopAdjustPosition();\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.mousedownHeader = false;\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 this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n scrollToIndex(rowIndex: number, colIndex: number) {\n this.scrollToRowIndex(rowIndex);\n this.scrollToColIndex(colIndex);\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 * 调整滚动条位置,让到达边界时自动滚动\n */\n private startAdjustPosition(e: MouseEvent) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n let positionX = '';\n let positionY = '';\n if (this.ctx.focusCell?.fixed !== 'left' && offsetX < this.ctx.fixedLeftWidth) {\n positionX = 'left';\n } else if (\n this.ctx.focusCell?.fixed !== 'right' &&\n offsetX > this.ctx.body.visibleWidth - this.ctx.fixedRightWidth\n ) {\n positionX = 'right';\n } else {\n positionX = '';\n this.stopAdjustPosition(true, false);\n }\n\n if (!this.mousedownHeader && offsetY < this.ctx.header.visibleHeight) {\n positionY = 'top';\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\n positionY = 'bottom';\n } else {\n positionY = '';\n this.stopAdjustPosition(false, true);\n }\n if (positionX && this.adjustPositionX !== positionX) {\n this.adjustPositionX = positionX;\n const position = positionX === 'left' ? -1 : 1;\n let scrollSpeedX = 10 * position; // 滚动速度\n if (this.timerX) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n this.timerX = setInterval(() => {\n // 增加滚动速度\n scrollSpeedX *= 1.5; // 加速因子\n const { scrollX } = this.ctx;\n const num = scrollX + scrollSpeedX;\n if (num < 0 || num > this.ctx.body.width) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n this.ctx.setScrollX(num);\n }, 100); // 每100毫秒执行一次\n }\n\n if (positionY && this.adjustPositionY !== positionY) {\n this.adjustPositionY = positionY;\n const position = positionY === 'top' ? -1 : 1;\n let scrollSpeedY = 10 * position; // 滚动速度\n if (this.timerY) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n this.timerY = setInterval(() => {\n // 增加滚动速度\n scrollSpeedY *= 1.5; // 加速因子\n const { scrollY } = this.ctx;\n const num = scrollY + scrollSpeedY;\n if (num < 0 || num > this.ctx.body.height) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n this.ctx.setScrollY(num);\n }, 100); // 每100毫秒执行一次\n }\n }\n private stopAdjustPosition(x = true, y = true) {\n if (x) {\n this.adjustPositionX = '';\n if (this.timerX) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n }\n if (y) {\n this.adjustPositionY = '';\n if (this.timerY) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n }\n }\n}\n","import type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, LineClampType, Render, RenderType, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nimport { TextInfo } from './Paint';\nimport CellImage from './CellImage';\nexport default class CellHeader extends BaseCell {\n align: Align;\n hideHeaderSelection = false;\n verticalAlign: VerticalAlign = 'middle';\n fixed?: Fixed;\n minWidth?: number;\n maxWidth?: number;\n widthFillDisable: boolean;\n type: Type | '';\n operation = false;\n editorType: string;\n level: number;\n text: string;\n hide: boolean = false;\n displayText: string = '';\n colspan: number;\n rowspan: number;\n row: any;\n key: string;\n required = false;\n readonly = false;\n ellipsis = false;\n overflowTooltipShow = true;\n children: Column[] = [];\n column: Column;\n colIndex: number;\n rowKey: string;\n rules?: Rules | Rule;\n hasChildren: boolean;\n render: Render;\n style: Partial<CSSStyleDeclaration> = {};\n drawX = 0;\n drawY = 0;\n sortIconName = 'sort-default';\n sortAscIconName = 'sort-asc';\n sortDescIconName = 'sort-desc';\n visibleWidth = 0;\n visibleHeight = 0;\n maxLineClampHeader: LineClampType = 'auto';\n domDataset: any = {};\n textOffsetRight = 0; // 文本偏移右\n textOffsetLeft = 0; // 文本偏移左\n // 文本信息\n textInfo: TextInfo | undefined = undefined\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n drawCellBgColor = '';\n drawTextColor = '';\n drawTextFont = '';\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource?: HTMLImageElement;\n // 排序相关\n drawSortImageX = 0;\n drawSortImageY = 0;\n drawSortImageWidth = 0;\n drawSortImageHeight = 0;\n drawSortImageName = '';\n drawSortImageSource?: HTMLImageElement;\n renderHeaderType: RenderType = 'default';\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\n super(ctx, x, y, width, height, 'header', column.fixed);\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.visibleWidth = width;\n this.visibleHeight = height;\n this.colIndex = colIndex;\n this.key = column.key;\n this.minWidth = column.minWidth;\n this.maxWidth = column.maxWidth;\n this.hide = (typeof column.hide === 'function' ? column.hide(column) : column.hide) || false;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.hideHeaderSelection = column.hideHeaderSelection || false;\n this.align = column.headerAlign || column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign =\n column.headerVerticalAlign || column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\n this.fixed = column.fixed || '';\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.text = column.title;\n this.column = column;\n this.colspan = column.colspan || 1;\n this.widthFillDisable = column.widthFillDisable || false;\n this.rowspan = column.rowspan || 1;\n this.rules = column.rules;\n this.readonly = column.readonly || false;\n this.required = column.required || false;\n this.sortIconName = column.sortIconName || 'sort-default';\n this.sortAscIconName = column.sortAscIconName || 'sort-asc';\n this.sortDescIconName = column.sortDescIconName || 'sort-desc';\n this.rowKey = generateShortUUID();\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\n this.render = column.renderHeader;\n this.maxLineClampHeader = column.maxLineClampHeader || 'auto';\n this.renderHeaderType = column.renderHeaderType || 'default';\n }\n /**\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\n * @returns\n */\n isVerticalVisible() {\n const { stageHeight } = this.ctx;\n const offsetHeight = stageHeight;\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n updateContainer() {\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\n let bgColor = HEADER_BG_COLOR;\n let textColor = HEADER_TEXT_COLOR;\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\n const { backgroundColor, color, font } =\n headerCellStyleMethod({\n colIndex: this.colIndex,\n column: this.column,\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n if (font) {\n this.drawTextFont = font;\n }\n }\n // 高亮查找结果\n const { colKey, type } = this.ctx.finderBar;\n if (type === 'header' && colKey === this.key) {\n bgColor = this.ctx.config.FINDER_CELL_BG_COLOR;\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateOffset() {\n if (this.column.sortBy) {\n this.textOffsetRight = 16;\n }\n if (this.required) {\n this.textOffsetLeft = 12;\n }\n }\n update() {\n this.updateContainer();\n this.updateOffset();\n this.displayText = this.getText();\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.updateSelection();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.drawTextWidth = this.width;\n this.drawTextHeight = this.height;\n this.updateStyle();\n }\n draw() {\n this.drawEdge();\n this.drawText();\n this.drawBg();\n this.updateSortIcon();\n this.drawImages();\n this.drawRequired();\n }\n drawImages() {\n this.getImages().forEach((image) => {\n if (image.visible && image.source) {\n this.ctx.paint.drawImage(image.source, image.x, image.y, image.width, image.height);\n }\n });\n }\n private drawEdge() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n\n // 有边框的情况下,绘制边框\n paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n }\n private drawText() {\n const {\n paint,\n config: { HEADER_FONT, CELL_PADDING },\n } = this.ctx;\n const cacheTextKey = `${this.displayText}_${this.drawTextWidth}_${this.drawTextFont}`;\n this.ellipsis = paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: this.drawTextFont || HEADER_FONT,\n padding: CELL_PADDING,\n color: this.drawTextColor,\n align: this.align,\n verticalAlign: this.verticalAlign,\n maxLineClamp: this.maxLineClampHeader,\n offsetRight: this.textOffsetRight, // 右边占位\n offsetLeft: this.textOffsetLeft, // 左边占位\n cacheTextKey,\n textCallback: (textInfo: TextInfo) => {\n this.textInfo = textInfo;\n },\n layoutCallback: (layout) => {\n this.ctx.emit('registerTextLayout', `${this.cellType}-${this.colIndex}-${this.level}`, layout);\n },\n },\n );\n }\n private drawRequired() {\n if (!this.required) {\n return;\n }\n if (!this.textInfo) {\n return;\n }\n const { left, top, height } = this.textInfo;\n const { paint, config: { REQUIRED_COLOR } } = this.ctx;\n paint.drawText('*', left - 18, top + (height - 12) / 2, 24, 24, {\n color: REQUIRED_COLOR,\n font: '18px Arial',\n align: 'center',\n verticalAlign: 'middle',\n padding: 0,\n });\n }\n private drawBg() {\n if (this.ctx.dragHeaderIng) {\n return;\n }\n // 选择区背景颜色\n const { ENABLE_SELECTOR, ENABLE_SELECTOR_SINGLE } = this.ctx.config;\n let minX = -1;\n let maxX = -1;\n if (this.ctx.focusCellHeader) {\n minX = this.ctx.focusCellHeader.colIndex;\n maxX = this.ctx.focusCellHeader.colIndex + this.ctx.focusCellHeader.colspan - 1;\n }\n // 启用选择器且不是单选\n if (ENABLE_SELECTOR && !ENABLE_SELECTOR_SINGLE) {\n const { xArr } = this.ctx.selector;\n minX = xArr[0];\n maxX = xArr[1];\n }\n const colSpanMaxIndex = this.colspan + this.colIndex - 1;\n if (this.colIndex >= minX && this.colIndex <= maxX && colSpanMaxIndex <= maxX) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private updateSelection() {\n // 选中框类型\n if (['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(this.type)) {\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n // 默认居中\n let iconX = this.drawX + (this.width - CHECKBOX_SIZE) / 2;\n let iconY = this.drawY + (this.height - CHECKBOX_SIZE) / 2;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n if (this.align === 'left' || this.align === 'right') {\n iconX = this.drawX + CELL_PADDING;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n }\n if (this.verticalAlign === 'top') {\n iconY = this.drawY + CELL_PADDING / 2;\n } else if (this.verticalAlign === 'bottom') {\n iconY = this.drawY + this.height - CHECKBOX_SIZE - CELL_PADDING / 2;\n }\n if (this.column.dragRow) {\n iconX += this.ctx.config.DRAG_ROW_ICON_SIZE;\n this.drawTextX += this.ctx.config.DRAG_ROW_ICON_SIZE;\n this.drawTextWidth -= this.ctx.config.DRAG_ROW_ICON_SIZE;\n }\n\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (indeterminate) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else 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 const selectionImage = new CellImage(checkboxName, iconX, iconY, CHECKBOX_SIZE, CHECKBOX_SIZE, checkboxImage);\n selectionImage.setVisible(!this.hideHeaderSelection);\n this.setImage('selection', selectionImage);\n }\n }\n private updateSortIcon() {\n // 如果没有sortBy配置且不是后端排序,不显示排序图标\n if (!this.column.sortBy || !this.textInfo) {\n return;\n }\n const { right, top, height } = this.textInfo;\n const x = right + 4;\n const y = top + (height - 16) / 2;\n const iconSize = 16;\n let iconName = this.sortIconName;\n // 前端排序\n const sortState = this.ctx.database.getSortState(this.key);\n if (sortState.direction === 'asc') {\n iconName = this.sortAscIconName;\n } else if (sortState.direction === 'desc') {\n iconName = this.sortDescIconName;\n }\n const icon = this.ctx.icons.get(iconName);\n const sortImage = new CellImage(iconName, x, y, iconSize, iconSize, icon);\n this.setImage('sort', sortImage);\n }\n\n getText() {\n if (this.render && this.renderHeaderType === 'default') {\n return '';\n }\n if (['', null, undefined].includes(this.text)) {\n return '';\n }\n return `${this.text}`;\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = '';\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 } else {\n // 中间的,需要减去左边固定列的宽度\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left: left,\n top: `${this.drawY + 1}px`,\n width: `${this.width}px`,\n height: `${this.height - 2}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n}\n","export type TreeUtilPosition = 'none' | 'before' | 'after' | 'inside';\r\n\r\ninterface TreeConfig {\r\n key?: string;\r\n childrenKey?: string;\r\n}\r\n\r\ninterface NodeInfo {\r\n parent: any | null;\r\n index: number;\r\n node: any;\r\n}\r\n\r\nexport class TreeUtil {\r\n private root: any[];\r\n private key: string;\r\n private childrenKey: string;\r\n\r\n constructor(initialData: any[], config?: TreeConfig) {\r\n this.root = initialData;\r\n this.key = config?.key || 'key';\r\n this.childrenKey = config?.childrenKey || 'children';\r\n }\r\n\r\n getTree() {\r\n return this.root;\r\n }\r\n\r\n treeMove(sourceKey: any, targetKey: any, position: TreeUtilPosition) {\r\n if (position === 'none') {\r\n return;\r\n }\r\n if (sourceKey === targetKey) {\r\n return;\r\n }\r\n\r\n const sourceInfo = this.findNodeWithParent(this.root, sourceKey);\r\n if (!sourceInfo) return;\r\n\r\n const targetInfo = this.findNodeWithParent(this.root, targetKey);\r\n if (!targetInfo) return;\r\n\r\n const { parent: sourceParent, index: sourceIndex, node: sourceNode } = sourceInfo;\r\n const { parent: targetParent, index: targetIndex, node: targetNode } = targetInfo;\r\n\r\n if (this.isDescendant(sourceNode, targetKey)) {\r\n return;\r\n }\r\n const sourceArray = sourceParent ? sourceParent[this.childrenKey] : this.root;\r\n sourceArray.splice(sourceIndex, 1);\r\n\r\n if (sourceParent && sourceArray.length === 0) {\r\n delete sourceParent[this.childrenKey];\r\n }\r\n if (position === 'inside') {\r\n if (!Array.isArray(targetNode[this.childrenKey])) {\r\n targetNode[this.childrenKey] = [];\r\n }\r\n targetNode[this.childrenKey].push(sourceNode);\r\n return;\r\n }\r\n\r\n const targetArray = targetParent ? targetParent[this.childrenKey] : this.root;\r\n\r\n let insertIndex = targetIndex;\r\n if (sourceParent === targetParent && sourceIndex < targetIndex) {\r\n insertIndex--;\r\n }\r\n if (position === 'after') insertIndex++;\r\n\r\n targetArray.splice(insertIndex, 0, sourceNode);\r\n }\r\n\r\n private findNodeWithParent(tree: any[], nodeKey: any, parent: any | null = null): NodeInfo | null {\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node[this.key] === nodeKey) return { parent, index: i, node };\r\n const children = node[this.childrenKey];\r\n if (Array.isArray(children)) {\r\n const found = this.findNodeWithParent(children, nodeKey, node);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private isDescendant(node: any, targetKey: any): boolean {\r\n const children = node[this.childrenKey];\r\n if (!Array.isArray(children)) return false;\r\n for (const child of children) {\r\n if (child[this.key] === targetKey) return true;\r\n if (this.isDescendant(child, targetKey)) return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle, filterHiddenColumns } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column, ColumnDragChangeEvent } from './types';\nimport { TreeUtil } from './TreeUtil';\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 dragTarget: CellHeader | null = null; //拖拽表头\n private dragingCell: CellHeader | undefined = undefined; //拖拽表头进入的格子\n private dragCellDiff = 0; //拖拽表头\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 visibleColumns: 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.clearSelector();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n this.initSelection();\n this.initSort();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n this.initDragColumn();\n }\n init(isBuffer = false) {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n // 防止resizeAllColumn递归\n if (!isBuffer) {\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n }\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n this.visibleColumns = filterHiddenColumns(this.columns);\n const maxHeaderRow = getMaxRow(this.visibleColumns);\n const leafColumns = toLeaf(this.visibleColumns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.visibleHeight = this.height;\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.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n const spanColumns = sortFixed(calCrossSpan(this.visibleColumns, maxHeaderRow));\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.stageWidth = Math.floor(containerElement.width);\n } else {\n this.ctx.stageWidth = Math.min(\n Math.floor(this.width + SCROLLER_TRACK_SIZE),\n Math.floor(containerElement.width),\n );\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.allCellHeaders = this.allCellHeaders;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n private initSort() {\n this.ctx.on('cellHeaderClick', (cellHeader, e) => {\n if (!cellHeader.isImageInside('sort', e)) {\n return;\n }\n const currentState = this.ctx.database.getSortState(cellHeader.key);\n let newDirection: 'asc' | 'desc' | 'none';\n // 按照 不排序->升序->降序->不排序 的顺序循环\n if (currentState.direction === 'none') {\n newDirection = 'asc';\n } else if (currentState.direction === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = 'none';\n }\n this.ctx.database.setSortState(cellHeader.key, newDirection);\n });\n }\n private initSelection() {\n this.ctx.on('cellHeaderClick', (cellHeader, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cellHeader.isImageInside('selection', e)) {\n return;\n }\n const image = cellHeader.getImage('selection');\n if (['checkbox-uncheck', 'checkbox-indeterminate'].includes(image.name)) {\n this.ctx.database.toggleAllSelection();\n } else if (image.name === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n });\n }\n // 调整表头的宽度\n private initResizeColumn() {\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 y = offsetY;\n const drawX = col.getDrawX();\n const drawY = col.getDrawY();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n y > drawY\n ) {\n const colIndex = col.colIndex + col.colspan - 1;\n const resizeTarget = this.leafCellHeaders.find((item) => item.colIndex === colIndex);\n if (!resizeTarget) {\n return;\n }\n // 中间部分到固定位置\n if (!resizeTarget.fixed && this.ctx.stageWidth - this.ctx.fixedRightWidth < drawX + col.width) {\n return;\n }\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = resizeTarget;\n }\n }\n }\n }\n });\n }\n private initDragColumn() {\n this.ctx.on('cellHeaderMousedown', (cellHeader) => {\n if (this.ctx.stageElement.style.cursor !== 'default') {\n return;\n }\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cellHeader.column.dragDisabled) {\n return;\n }\n if (this.dragTarget === cellHeader) {\n this.ctx.dragHeaderIng = true;\n this.dragCellDiff = this.ctx.mouseX - cellHeader.drawX;\n this.ctx.stageElement.style.cursor = 'grabbing';\n } else {\n this.dragTarget = cellHeader;\n this.ctx.dragHeaderIng = false;\n }\n });\n this.ctx.on('cellMousedown', () => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n this.dragTarget = null;\n this.ctx.dragHeaderIng = false;\n });\n this.ctx.on('mouseup', () => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (this.dragingCell && this.dragTarget) {\n // 需要移动\n const genSortObj = (columns: Column[], obj: any = {}) => {\n columns.forEach((item: Column, index): any => {\n if (item.children) {\n genSortObj(item.children, obj);\n }\n obj[item.key] = index;\n });\n return obj;\n };\n const columns = this.ctx.database.getColumns();\n const sortColumns = calCrossSpan(columns, getMaxRow(columns));\n const tree = new TreeUtil(sortColumns, {\n key: 'key', // 节点唯一标识字段(对应我们之前的field)\n childrenKey: 'children', // 子节点数组字段\n });\n const position = this.dragTarget.colIndex > this.dragingCell.colIndex ? 'before' : 'after';\n tree.treeMove(this.dragTarget.column.key, this.dragingCell.column.key, position);\n const columnsTree = tree.getTree();\n const sortData = genSortObj(columnsTree);\n this.ctx.database.setCustomHeader({ sortData });\n this.init();\n const data: ColumnDragChangeEvent = {\n source: this.dragTarget,\n target: this.dragingCell,\n columns: sortColumns,\n };\n this.ctx.emit('columnDragChange', data);\n }\n if (this.ctx.dragHeaderIng && this.dragTarget) {\n if (this.ctx.stageElement.style.cursor === 'grabbing') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n this.ctx.dragHeaderIng = false;\n this.dragTarget = null;\n this.dragingCell = undefined;\n this.dragCellDiff = 0;\n this.ctx.clearSelector();\n this.ctx.focusCellHeader = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (!this.ctx.dragHeaderIng || !this.dragTarget) {\n return;\n }\n if (!this.dragTarget.fixed) {\n this.ctx.startAdjustPosition(e);\n }\n this.ctx.emit('draw');\n });\n this.ctx.on('cellHoverChange', (cell) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cell.column.dragDisabled) {\n return;\n }\n this.dragingCell = this.getDragCellHeader(cell.colIndex);\n });\n this.ctx.on('cellHeaderHoverChange', (cellHeader) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cellHeader.column.dragDisabled) {\n return;\n }\n this.dragingCell = this.getDragCellHeader(cellHeader.colIndex);\n });\n }\n\n private getDragCellHeader(colIndex: number) {\n if (!this.dragTarget || !this.ctx.dragHeaderIng) {\n return;\n }\n // 同级别\n const {\n column: { parentKey },\n key,\n level,\n fixed,\n } = this.dragTarget;\n\n const dragCellHeader = this.allCellHeaders.find(\n (item) =>\n item.key !== key &&\n item.fixed === fixed &&\n item.column.level === level &&\n item.column.parentKey === parentKey &&\n item.colIndex <= colIndex &&\n item.colIndex + item.colspan - 1 >= colIndex,\n );\n if (this.ctx.dragHeaderIng) {\n const cursor = dragCellHeader ? 'grabbing' : 'not-allowed';\n // 禁用拖拽\n this.ctx.stageElement.style.cursor = cursor;\n }\n return dragCellHeader;\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 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 }\n const width = cell.width + diff + overDiff;\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: width,\n column: cell.column,\n columns: this.columns,\n });\n this.ctx.database.setCustomHeaderResizableData(cell.key, width);\n this.init(true);\n this.ctx.emit('draw');\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.init(true);\n this.ctx.emit(\"draw\");\n }\n getCustomHeader() {\n const columns = this.ctx.database.getColumns();\n const customHeader = this.ctx.database.getCustomHeader();\n const { sortData = {} } = customHeader;\n if (Object.keys(sortData).length === 0) {\n return {\n columns,\n customHeader,\n };\n }\n const _sortColumns = calCrossSpan(columns, getMaxRow(columns));\n return {\n columns: _sortColumns,\n customHeader,\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: {\n RESIZE_COLUMN_LINE_COLOR,\n RESIZE_COLUMN_TEXT_COLOR,\n RESIZE_COLUMN_TEXT_BG_COLOR,\n ENABLE_RESIZE_COLUMN_TEXT,\n },\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 });\n if (ENABLE_RESIZE_COLUMN_TEXT) {\n const newWidth = Math.floor(resizeTargetWidth + this.resizeDiff);\n const text = `${newWidth}px`;\n const rw = 45;\n const rh = 24;\n this.ctx.paint.drawRect(x + rw / 2, this.ctx.mouseY - rh / 2, rw, rh, {\n fillColor: RESIZE_COLUMN_TEXT_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n });\n this.ctx.paint.drawText(text, x + rw / 2, this.ctx.mouseY - rh / 2, rw, rh + 2, {\n padding: 0,\n color: RESIZE_COLUMN_TEXT_COLOR,\n align: 'center',\n verticalAlign: 'middle',\n });\n }\n }\n }\n private drawDragTip() {\n if (this.dragTarget && this.ctx.dragHeaderIng) {\n const { DRAG_TIP_BG_COLOR, DRAG_TIP_LINE_COLOR } = this.ctx.config;\n const rw = this.dragTarget.width;\n // 提示背景\n this.ctx.paint.drawRect(\n this.ctx.mouseX - this.dragCellDiff,\n this.visibleHeight,\n rw,\n this.ctx.body.visibleHeight,\n {\n fillColor: DRAG_TIP_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n },\n );\n if (this.dragingCell) {\n const { drawX, drawY, visibleWidth, colIndex } = this.dragingCell;\n // 向坐移动\n let x = drawX;\n let y = drawY;\n if (colIndex > this.dragTarget.colIndex) {\n // 向右移动\n x = drawX + visibleWidth;\n }\n // 边界处理\n if (colIndex === 0) {\n x = x + 1;\n }\n // 边界处理\n if (colIndex === this.ctx.maxColIndex) {\n x = x - 1;\n }\n const poins = [x, y, x, this.ctx.stageHeight];\n // 倒三角形\n const trianglePoins = [x - 4, y, x + 4, y, x, y + 6, x - 4, y];\n this.ctx.paint.drawLine(trianglePoins, {\n borderColor: DRAG_TIP_LINE_COLOR,\n borderWidth: 1.2,\n fillColor: DRAG_TIP_LINE_COLOR,\n });\n this.ctx.paint.drawLine(poins, {\n borderColor: DRAG_TIP_LINE_COLOR,\n borderWidth: 1.2,\n });\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.drawBottomLine();\n this.drawTipLine();\n this.drawDragTip();\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 calculatedHeightCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n calculatedHeight: number = -1;\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 const calculatedHeightCells: 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 if (cell.autoRowHeight) {\n calculatedHeightCells.push(cell);\n }\n });\n this.cells = cells;\n this.calculatedHeightCells = calculatedHeightCells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n updateCalculatedHeight() {\n const heights = this.calculatedHeightCells.map((cell) => {\n const calculatedHeight = cell.getAutoHeight();\n const { key, height: curRowMaxHeight = -1 } = this.ctx.database.getMaxRowHeightItem(this.rowKey) || {};\n // 设置最大值\n if (calculatedHeight > curRowMaxHeight) {\n this.ctx.database.setMaxRowHeightItem(this.rowKey, cell.key, calculatedHeight);\n } else if (cell.key === key && calculatedHeight < curRowMaxHeight) {\n // 如果计算高度小于当前最大值,则设置为当前最大值\n this.ctx.database.setMaxRowHeightItem(this.rowKey, cell.key, calculatedHeight);\n }\n return calculatedHeight;\n });\n // 获取最高高度\n this.calculatedHeight = heights.length ? Math.max(...heights) : -1;\n return this.calculatedHeight;\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 Cell from './Cell';\nimport type Context from './Context';\nimport Row from './Row';\nimport { TreeUtil, TreeUtilPosition } from './TreeUtil';\nimport { ExpandLazyMethod, Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private dragSource: Cell | null = null; //拖拽行的源\n private dragTarget: Cell | null = null; //拖拽行的目标\n private dragRowDiff = 0; //拖拽行的差值\n private dragPosition: TreeUtilPosition = 'none'; //拖拽行的目标行索引\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.initTree();\n this.initSelection();\n this.initResizeRow();\n this.initDragRow();\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 this.ctx.isEmpty = !this.data.length;\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 private initTree() {\n this.ctx.on('cellClick', (cell, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cell.isImageInside('tree', e)) {\n return;\n }\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 private initSelection() {\n this.ctx.on('cellClick', (cell, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cell.isImageInside('selection', e)) {\n return;\n }\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey, cell.type);\n });\n }\n // 调整行的高度\n private initResizeRow() {\n this.ctx.on('resize', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\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.config.ENABLE_RESIZE_ROW) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\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 const { calculatedHeight } = this.resizeTarget;\n const minHeight = calculatedHeight === -1 ? RESIZE_ROW_MIN_HEIGHT : calculatedHeight;\n if (diff + resizeTargetHeight < minHeight) {\n diff = -(resizeTargetHeight - minHeight);\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 initDragRow() {\n this.ctx.on('cellMousedown', (cell, e) => {\n if (!this.ctx.config.ENABLE_DRAG_ROW) {\n return;\n }\n if (!cell.isImageInside('drag', e)) {\n return;\n }\n this.dragSource = cell;\n // 收起行\n this.ctx.database.expandItem(cell.rowKey, false);\n this.ctx.dragRowIng = true;\n this.dragRowDiff = this.ctx.mouseY - cell.drawY;\n this.ctx.stageElement.style.cursor = 'grabbing';\n this.ctx.clearSelector();\n this.ctx.emit('dragRowMouseDown', cell);\n this.ctx.emit('draw');\n });\n this.ctx.on('mouseup', async () => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n if (this.dragSource && this.dragTarget && this.ctx.stageElement.style.cursor !== 'not-allowed') {\n const dragSource = this.dragSource;\n const dragTarget = this.dragTarget;\n const params = {\n source: dragSource,\n target: dragTarget,\n position: this.dragPosition,\n };\n this.ctx.emit('dragRowChange', params);\n let isDragRow = true;\n const { BEFORE_DRAG_ROW_METHOD } = this.ctx.config;\n // 判断是不是函数\n if (typeof BEFORE_DRAG_ROW_METHOD === 'function') {\n // 判断的是不是Promise\n isDragRow = await BEFORE_DRAG_ROW_METHOD(params);\n }\n if (isDragRow && !this.ctx.config.ENABLE_DRAG_ROW_CUSTOM) {\n const originalData = this.ctx.database.getOriginalData();\n const { TREE_CHILDREN_KEY, ROW_KEY } = this.ctx.config;\n const treeUtil = new TreeUtil(originalData, {\n key: ROW_KEY,\n childrenKey: TREE_CHILDREN_KEY,\n });\n treeUtil.treeMove(dragSource.rowKey, dragTarget.rowKey, this.dragPosition);\n this.ctx.emit('loadData', treeUtil.getTree());\n }\n }\n if (!this.dragTarget) {\n this.ctx.stageElement.style.cursor = 'grab';\n }\n this.ctx.dragRowIng = false;\n this.dragSource = null;\n this.dragTarget = null;\n this.dragPosition = 'after';\n this.dragRowDiff = 0;\n this.ctx.emit('draw');\n });\n this.ctx.on('mousemove', (e) => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n const { offsetY } = this.ctx.getOffset(e);\n const { drawY } = this.dragTarget as Cell;\n if (drawY < offsetY || drawY > offsetY) {\n this.ctx.startAdjustPosition(e);\n } else {\n this.ctx.stopAdjustPosition();\n }\n });\n this.ctx.on('cellMouseenter', (cell) => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n this.dragTarget = cell;\n const { ENABLE_DRAG_ROW_CROSS_LEVEL } = this.ctx.config;\n const dragSource = this.dragSource;\n const dragTarget = this.dragTarget;\n // 不启用跨级拖拽时,判断是否在同一级\n if (!ENABLE_DRAG_ROW_CROSS_LEVEL && dragSource && dragTarget && dragSource.parentRowKey !== dragTarget.parentRowKey) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n return;\n }\n this.ctx.stageElement.style.cursor = 'grabbing';\n this.dragTarget = cell;\n const { drawY, visibleHeight } = cell;\n const scopeHeight = ENABLE_DRAG_ROW_CROSS_LEVEL ? visibleHeight / 3 : visibleHeight / 2;\n if (this.ctx.mouseY <= drawY + scopeHeight) {\n this.dragPosition = 'before';\n } else if (this.ctx.mouseY > drawY + visibleHeight - scopeHeight) {\n this.dragPosition = 'after';\n } else {\n this.dragPosition = 'inside';\n }\n const params = {\n dragSource: this.dragSource,\n dragTarget: this.dragTarget,\n dragPosition: this.dragPosition,\n };\n this.ctx.emit('dragRowMove', params);\n this.ctx.emit('draw');\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 // 拖拽提示线绘制\n drawDragRowTip() {\n if (this.ctx.dragRowIng && this.dragTarget && this.dragSource) {\n const {\n stageWidth,\n config: { DRAG_ROW_TIP_LINE_COLOR, DRAG_TIP_BG_COLOR },\n } = this.ctx;\n const rh = this.dragSource.visibleHeight;\n // 提示背景\n this.ctx.paint.drawRect(0, this.ctx.mouseY - this.dragRowDiff, this.visibleWidth, rh, {\n fillColor: DRAG_TIP_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n });\n const dragTargetDrawY = this.dragTarget.drawY;\n const dragTargetHeight = this.dragTarget.height;\n // 默认上方\n let y = dragTargetDrawY;\n if (['before', 'after'].includes(this.dragPosition)) {\n if (this.dragPosition === 'after') {\n y = dragTargetDrawY + dragTargetHeight;\n }\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: DRAG_ROW_TIP_LINE_COLOR,\n borderWidth: 1.2,\n });\n }\n // 中间位置\n if (['inside'].includes(this.dragPosition)) {\n y = dragTargetDrawY + dragTargetHeight / 2;\n }\n // 倒三角形\n const trianglePoins = [0, y - 4, 6, y, 0, y + 4, 0, y - 4];\n this.ctx.paint.drawLine(trianglePoins, {\n borderColor: DRAG_ROW_TIP_LINE_COLOR,\n borderWidth: 1.2,\n fillColor: DRAG_ROW_TIP_LINE_COLOR,\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 && !this.ctx.isEmpty) {\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 (\n scrollX < Math.floor(header.width - stageWidth - 1) &&\n fixedRightWidth !== SCROLLER_TRACK_SIZE &&\n !this.ctx.isEmpty\n ) {\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 updateAutoHeight(): boolean {\n const rows = this.ctx.body.renderRows;\n const hasAutoHeight = rows.some((row) => row.calculatedHeightCells.length > 0);\n // 如果没有计算格子,不更新\n if (!hasAutoHeight) {\n return false;\n }\n // 更新计算高度\n rows.forEach((row) => {\n row.updateCalculatedHeight();\n });\n // 如果有计算格子,重新计算行高\n const heights = rows.map((row) => ({\n height: row.calculatedHeight,\n rowIndex: row.rowIndex,\n }));\n return this.ctx.database.setBatchCalculatedRowHeight(heights);\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, ErrorResult, 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 ctx: Context;\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 // focus为fixed的不处理\r\n if (this.ctx.focusCellHeader?.fixed) {\r\n return;\r\n }\r\n if (!this.ctx.dragHeaderIng && this.ctx.selectorMove) {\r\n this.ctx.startAdjustPosition(e);\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('cellClick', () => { \r\n this.adjustBoundaryPosition();\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 // 如果是填充返回\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.ctx.selectorMove = false;\r\n this.ctx.stopAdjustPosition();\r\n setTimeout(() => {\r\n this.ctx.disableHoverIconClick = false;\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.textSelecting) {\r\n return;\r\n }\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n if (this.ctx.textSelecting) {\r\n return;\r\n }\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 // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.ctx.clearSelector();\r\n if (cell.operation) {\r\n this.selectAll();\r\n } else {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (this.ctx.finding) {\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 this.adjustBoundaryPosition();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('selectCols', (cell: CellHeader) => {\r\n this.selectCols(cell);\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n if (this.ctx.dragHeaderIng) {\r\n return;\r\n }\r\n if (this.ctx.dragRowIng) {\r\n return;\r\n }\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 this.ctx.disableHoverIconClick = 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 // 启用合并单元格关联\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 // 判断是否选择列中\r\n if (maxY === this.ctx.maxRowIndex && minY === 0) {\r\n this.ctx.selectColsIng = true;\r\n } else {\r\n this.ctx.selectColsIng = false;\r\n }\r\n // 判断是否选择行中\r\n if (maxX === this.ctx.maxColIndex && minX === 0) {\r\n this.ctx.selectRowsIng = true;\r\n } else {\r\n this.ctx.selectRowsIng = false;\r\n }\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 // 如果是选择行或列中就不处理,因为会导致性能问题\r\n if ((maxY === this.ctx.maxRowIndex && minY === 0) || (maxX === this.ctx.maxColIndex && minX === 0)) {\r\n return {\r\n xArr,\r\n yArr,\r\n onlyMergeCell: false,\r\n };\r\n }\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 | Cell) {\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 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.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n this.ctx.clearSelector();\r\n if (this.ctx.mousedown && 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 + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\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 }\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 || this.ctx.textSelectionStr) {\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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: this.ctx.locale.getText('mergeCellNoCopy'),\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: this.ctx.locale.getText('mergeCellNoPaste'),\r\n data: [],\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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 this.ctx.emit('draw');\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 // 判断是否在设置范围内\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 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.5 || Math.abs(scrollY - _scrollY) > 2.5) {\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n }\r\n }\r\n destroy() { }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorResult } 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 if (this.ctx.autofillMove) {\r\n this.ctx.startAdjustPosition(e);\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 this.ctx.stopAdjustPosition();\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 this.ctx.disableHoverIconClick = 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 setTimeout(() => {\r\n this.ctx.disableHoverIconClick = false;\r\n }, 0);\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_AUTOFILL_SPAN_COL, ENABLE_AUTOFILL_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 const xArrSelector = this.ctx.selector.xArr;\r\n const yArrSelector = this.ctx.selector.yArr;\r\n if (!ENABLE_AUTOFILL_SPAN_ROW && JSON.stringify(yArrSelector) !== JSON.stringify(_yArr)) {\r\n return;\r\n }\r\n if (!ENABLE_AUTOFILL_SPAN_COL && JSON.stringify(xArrSelector) !== JSON.stringify(_xArr)) {\r\n return;\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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: this.ctx.locale.getText('mergeCellNoFill'),\r\n data: [],\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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 this.ctx.emit('draw');\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};\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 const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? '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.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\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 const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\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 * 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// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\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 platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\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 resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\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: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\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 * 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 platform.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 platform.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 const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\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\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 platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.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 platform.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\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\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 = originSides.has(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 platform\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 platform.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 = originSides.has(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 platform.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) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\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 // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\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 (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(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 } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\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, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, 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$1(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$1(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\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\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\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 (isOffsetParentAnElement) {\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 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\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 + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\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$1(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\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\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 const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\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 x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\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$1(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$1(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$1(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 && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || 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 firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: 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\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 function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\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 setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(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$1(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\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\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 elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\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 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\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) : []), ...(floating ? 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 && floating) {\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 if (floating) {\n resizeObserver.observe(floating);\n }\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 && !rectsAreEqual(prevRefRect, nextRefRect)) {\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 this.ctx.on('cellFooterMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellFooterHoverChange', (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 this.ctx.on('cellShowTooltip', (cell, message) => {\n this.show(cell, message);\n });\n this.ctx.on('cellHideTooltip', () => {\n this.hide();\n });\n }\n private show(cell: Cell, message?: string) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (this.ctx.contextMenuIng) {\n return;\n }\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 if (message) {\n text = 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\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 this.resetEditorStyle();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n this.focusInput();\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('hoverIconClick', (cell) => {\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 (this.ctx.finding) {\r\n return;\r\n }\r\n // 如果是多选不能输入任何字符, 如果输入框聚焦,则进入编辑模式\r\n const { focusCell } = this.ctx;\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.key === '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.key === '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.key === '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 'CapsLock',\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 const isFocus = document.activeElement === this.inputEl;\r\n if (!isFocus && focusCell.editorType === 'text') {\r\n e.preventDefault();\r\n return;\r\n }\r\n this.startEdit(true);\r\n });\r\n // 重绘可能会导致cellClick事件不能触发,调整用按下cellMouseup按下延时赋值cellTarget\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是选择器,不进入编辑模式\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\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 this.focusInput();\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 this.resetEditorStyle();\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 isTextSelectionActive() {\r\n return (\r\n this.ctx.config.ENABLE_TEXT_SELECTION &&\r\n (this.ctx.textSelecting || !!this.ctx.textSelectionStr)\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.id = 'e-virt-table-editor-textarea';\r\n this.inputEl.setAttribute('rows', '1');\r\n this.inputEl.setAttribute('tabindex', '-1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\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 if (!this.ctx.editing) {\r\n return;\r\n }\r\n // 针对数字类型提示错误信息\r\n const value = this.inputEl.value;\r\n if (this.cellTarget && this.cellTarget.type === 'number' && value !== '') {\r\n this.ctx.emit('cellHideTooltip');\r\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) {\r\n const numberErrorTip = this.ctx.locale.getText('numberErrorTip');\r\n this.ctx.emit('cellShowTooltip', this.cellTarget, numberErrorTip);\r\n }\r\n }\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 // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\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.zIndex = '100';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxWidth = 'none';\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (['text'].includes(editorType)) {\r\n this.inputEl.style.opacity = '1';\r\n this.inputEl.style.position = 'relative';\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}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n this.inputEl.value = ''; // 清空\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n } else {\r\n this.inputEl.style.opacity = '0';\r\n this.inputEl.style.width = '1px';\r\n this.inputEl.style.height = '1px';\r\n this.inputEl.style.position = 'absolute';\r\n this.inputEl.style.left = '0px';\r\n this.inputEl.style.top = '0px';\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 }\r\n }\r\n private focusInput() {\r\n if (document.activeElement !== this.inputEl) {\r\n this.inputEl.focus({ preventScroll: true });\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n if (this.isTextSelectionActive()) {\r\n return;\r\n }\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 const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n // 滚动到焦点单元格\r\n this.ctx.emit('scrollToIndex', focusCell.rowIndex, focusCell.colIndex);\r\n }\r\n this.editCell(focusCell.rowIndex, focusCell.colIndex, ignoreValue);\r\n }\r\n editCell(rowIndex: number, colIndex: number, ignoreValue = false) {\r\n // 直接从renderRows中获取cell,防止focusCell不是最新的\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 // 可视区可见\r\n const isVisible = cell.isVerticalVisible() && cell.isHorizontalVisible();\r\n if (!isVisible) {\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, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\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('cellHideTooltip');\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.resetEditorStyle();\r\n // 聚焦输入框,防止非文本类型无法聚焦\r\n setTimeout(() => {\r\n this.focusInput();\r\n }, 0);\r\n this.ctx.emit('draw');\r\n }\r\n private resetEditorStyle() {\r\n const cell = this.cellTarget;\r\n if (!cell) {\r\n return;\r\n }\r\n this.editorEl.style.left = `${cell.drawX}px`;\r\n this.editorEl.style.top = `${cell.drawY}px`;\r\n this.editorEl.style.maxWidth = `1px`;\r\n this.editorEl.style.maxHeight = `1px`;\r\n this.editorEl.style.zIndex = '-1';\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.inputEl.blur();\r\n this.ctx.emit('draw');\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_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 = this.getText();\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 top: `${top}px`,\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n private getText() {\r\n return this.ctx.config.EMPTY_TEXT || this.ctx.locale.getText('emptyText');\r\n }\r\n draw() {\r\n if (this.ctx.emptyElement) {\r\n return;\r\n }\r\n this.emptyEl.innerText = this.getText();\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\nimport { throttle } from './util';\r\nexport default class Overlayer {\r\n ctx: Context;\r\n observer?: MutationObserver;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private arerMapsEqual(m1: Map<string, number>, m2: Map<string, number>): boolean {\r\n if (m1.size !== m2.size) return false;\r\n\r\n for (let [key, value] of m1) {\r\n if (!m2.has(key)) return false;\r\n if (m2.get(key) !== value) return false;\r\n }\r\n\r\n return true;\r\n }\r\n private init() {\r\n // 监听覆盖层变化,用于自动高度计算\r\n this.observer = new MutationObserver(\r\n throttle(() => {\r\n // 当 DOM 发生变化时执行的回调\r\n const elements = this.ctx.overlayerElement.querySelectorAll('[data-auto-height=\"true\"]');\r\n const map = new Map<string, number>();\r\n elements.forEach((element: Element) => {\r\n const rowIndex = Number(element.getAttribute('data-row-index'));\r\n const colIndex = Number(element.getAttribute('data-col-index'));\r\n if (isNaN(rowIndex) || isNaN(colIndex)) {\r\n return;\r\n }\r\n const rect = element.getBoundingClientRect();\r\n const key = `${rowIndex}\\u200b_${colIndex}`;\r\n map.set(key, Math.round(rect.height));\r\n });\r\n const overlayerAutoHeightMap = this.ctx.database.getOverlayerAutoHeightMap();\r\n const isNeedUpdate = !this.arerMapsEqual(overlayerAutoHeightMap, map);\r\n if (isNeedUpdate) {\r\n this.ctx.database.setOverlayerAutoHeightMap(map);\r\n if (overlayerAutoHeightMap.size === 0 && map.size === 0) {\r\n return;\r\n }\r\n this.ctx.emit('draw');\r\n }\r\n }, 16.67),\r\n );\r\n this.observer.observe(this.ctx.overlayerElement, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n characterData: true,\r\n });\r\n // 自定义覆盖层时,不监听覆盖层变化\r\n if (this.ctx.overlayerElement.getAttribute('data-overlayer') === 'default') {\r\n this.ctx.on('overlayerChange', (container) => {\r\n const overlayerEl = this.ctx.overlayerElement;\r\n // 移除所有子元素\r\n overlayerEl.replaceChildren();\r\n Object.assign(overlayerEl.style, container.style);\r\n container.views.forEach((typeView: OverlayerWrapper) => {\r\n const typeDiv = document.createElement('div');\r\n typeDiv.className = typeView.class;\r\n Object.assign(typeDiv.style, typeView.style);\r\n typeView.views.forEach((cellWrapView) => {\r\n const cellWrap = document.createElement('div');\r\n Object.assign(cellWrap.style, cellWrapView.style);\r\n cellWrapView.cells.forEach((cell) => {\r\n const cellEl = document.createElement('div');\r\n Object.assign(cellEl.style, cell.style);\r\n Object.keys(cell.domDataset).forEach((key) => {\r\n cellEl.setAttribute(key, cell.domDataset[key]);\r\n });\r\n\r\n if (typeof cell.render === 'function') {\r\n cell.render(cellEl, cell);\r\n }\r\n cellWrap.appendChild(cellEl);\r\n });\r\n typeDiv.appendChild(cellWrap);\r\n });\r\n overlayerEl.appendChild(typeDiv);\r\n });\r\n });\r\n }\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 // 清除MutationObserver\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\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 { computePosition, autoUpdate, flip, shift, offset } from '@floating-ui/dom';\r\nimport { MenuItem } from './types';\r\nimport { expandSvg } from './Icons';\r\n\r\nexport interface MenuOptions {\r\n onClick?: (itemData: MenuItem, value: string) => void;\r\n}\r\n\r\ninterface MenuElement extends HTMLElement {\r\n _submenu?: HTMLElement;\r\n _cleanup?: () => void;\r\n}\r\n\r\nexport class DOMTreeMenu {\r\n private container: HTMLElement;\r\n private menuData: MenuItem[];\r\n private onClick?: (itemData: MenuItem, value: string) => void;\r\n private activeSubmenus = new Set<HTMLElement>();\r\n private boundMouseEnterHandler: (e: MouseEvent) => void;\r\n private boundMouseLeaveHandler: (e: MouseEvent) => void;\r\n private boundClickHandler: (e: MouseEvent) => void;\r\n\r\n constructor(container: HTMLElement, menuData: MenuItem[] = [], options: MenuOptions = {}) {\r\n this.container = container;\r\n this.menuData = menuData;\r\n this.onClick = options.onClick;\r\n // 绑定事件处理器\r\n this.boundMouseEnterHandler = (e: MouseEvent) => this.handleMouseEvent(e, 'enter');\r\n this.boundMouseLeaveHandler = (e: MouseEvent) => this.handleMouseEvent(e, 'leave');\r\n this.boundClickHandler = (e: MouseEvent) => this.handleClick(e);\r\n\r\n this.createMenu();\r\n this.bindEvents();\r\n }\r\n\r\n private createMenu(): void {\r\n this.container.className = 'e-virt-table-main-menu';\r\n // 确保菜单可见\r\n this.container.style.display = 'block';\r\n const mainMenu = document.createDocumentFragment();\r\n this.menuData.forEach((item) => {\r\n mainMenu.appendChild(this.createMenuItem(item));\r\n });\r\n this.container.appendChild(mainMenu);\r\n }\r\n\r\n private createMenuItem(item: MenuItem, isSubmenu = false): HTMLElement {\r\n const menuItem = this.createElement(\r\n 'div',\r\n isSubmenu ? 'e-virt-table-submenu-item' : 'e-virt-table-menu-item',\r\n ) as MenuElement;\r\n\r\n menuItem.setAttribute(isSubmenu ? 'data-submenu' : 'data-menu', item.value);\r\n\r\n if (item.disabled) menuItem.classList.add('disabled');\r\n\r\n const contentContainer = this.createElement('div', 'e-virt-table-menu-item-content');\r\n\r\n if (item.icon) {\r\n const iconContainer = this.createElement('span', 'e-virt-table-menu-item-icon');\r\n iconContainer.innerHTML = item.icon;\r\n contentContainer.appendChild(iconContainer);\r\n } else {\r\n contentContainer.classList.add('menu-item-no-icon');\r\n }\r\n\r\n const textSpan = this.createElement('span', 'e-virt-table-menu-item-text');\r\n textSpan.textContent = item.label || '';\r\n contentContainer.appendChild(textSpan);\r\n menuItem.appendChild(contentContainer);\r\n\r\n if (item.children?.length) {\r\n const arrowContainer = this.createElement('span', 'e-virt-table-menu-arrow');\r\n arrowContainer.innerHTML = expandSvg;\r\n menuItem.appendChild(arrowContainer);\r\n const submenu = this.createSubmenu(item.children);\r\n menuItem._submenu = submenu;\r\n this.container.appendChild(submenu);\r\n }\r\n\r\n return menuItem;\r\n }\r\n\r\n private createSubmenu(submenuData: MenuItem[]): HTMLElement {\r\n const submenu = this.createElement('div', 'e-virt-table-submenu');\r\n submenuData.forEach((item) => {\r\n submenu.appendChild(this.createMenuItem(item, true));\r\n });\r\n return submenu;\r\n }\r\n\r\n private createElement(tagName: string, className = ''): HTMLElement {\r\n const element = document.createElement(tagName);\r\n if (className) element.className = className;\r\n return element;\r\n }\r\n\r\n private bindEvents(): void {\r\n this.container.addEventListener('mouseenter', this.boundMouseEnterHandler, true);\r\n this.container.addEventListener('mouseleave', this.boundMouseLeaveHandler, true);\r\n this.container.addEventListener('click', this.boundClickHandler);\r\n }\r\n\r\n private handleMouseEvent(e: MouseEvent, type: 'enter' | 'leave'): void {\r\n // 阻止事件冒泡,防止触发外部的鼠标事件\r\n e.stopPropagation();\r\n\r\n const target = e.target as HTMLElement;\r\n const menuItem = target.closest('.e-virt-table-menu-item, .e-virt-table-submenu-item') as MenuElement;\r\n\r\n if (\r\n menuItem &&\r\n (this.container.contains(menuItem) || menuItem.classList.contains('e-virt-table-submenu-item'))\r\n ) {\r\n if (type === 'enter') {\r\n this.handleHover(menuItem);\r\n } else {\r\n this.handleLeave(menuItem);\r\n }\r\n }\r\n }\r\n\r\n private handleHover(menuItem: MenuElement): void {\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n this.container\r\n .querySelectorAll('.e-virt-table-menu-item')\r\n .forEach((item) => item.classList.remove('active'));\r\n if (!menuItem.classList.contains('disabled')) {\r\n menuItem.classList.add('active');\r\n }\r\n }\r\n\r\n const submenu = menuItem._submenu || (menuItem.querySelector('.e-virt-table-submenu') as HTMLElement | null);\r\n if (submenu) {\r\n this.hideSiblingSubmenus(menuItem);\r\n this.showSubmenu(menuItem, submenu);\r\n }\r\n }\r\n\r\n private handleLeave(menuItem: MenuElement): void {\r\n const submenu = menuItem._submenu || menuItem.querySelector('.e-virt-table-submenu');\r\n\r\n setTimeout(() => {\r\n const submenuEl = submenu as HTMLElement | null;\r\n if (submenuEl && !submenuEl.matches(':hover') && !menuItem.matches(':hover')) {\r\n this.hideSubmenu(submenuEl);\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n menuItem.classList.remove('active');\r\n }\r\n }\r\n }, 150);\r\n }\r\n\r\n private hideSiblingSubmenus(menuItem: MenuElement): void {\r\n // 找到同级的所有菜单项\r\n let siblings: NodeListOf<MenuElement>;\r\n \r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n // 主菜单项:隐藏其他主菜单项的子菜单\r\n siblings = this.container.querySelectorAll('.e-virt-table-menu-item') as NodeListOf<MenuElement>;\r\n } else {\r\n // 子菜单项:隐藏同一个子菜单容器中其他子菜单项的子菜单\r\n const parentSubmenu = menuItem.closest('.e-virt-table-submenu');\r\n if (parentSubmenu) {\r\n siblings = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n } else {\r\n return;\r\n }\r\n }\r\n \r\n // 隐藏所有同级菜单项的子菜单(除了当前项)\r\n siblings.forEach((sibling) => {\r\n if (sibling !== menuItem && sibling._submenu) {\r\n this.hideSubmenu(sibling._submenu);\r\n }\r\n });\r\n }\r\n\r\n private async showSubmenu(trigger: HTMLElement, submenu: HTMLElement): Promise<void> {\r\n if (this.activeSubmenus.has(submenu)) return;\r\n\r\n this.activeSubmenus.add(submenu);\r\n submenu.classList.add('show');\r\n\r\n const cleanup = autoUpdate(trigger, submenu, async () => {\r\n // 根据主菜单容器的整体位置判断子菜单显示方向\r\n const containerRect = this.container.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const submenuWidth = submenu.offsetWidth || 200; // 预估宽度\r\n \r\n // 计算主菜单右侧和左侧可用空间\r\n const rightSpace = viewportWidth - containerRect.right;\r\n const leftSpace = containerRect.left;\r\n \r\n // 根据主菜单位置决定所有子菜单的统一方向\r\n const placement = (rightSpace >= submenuWidth || rightSpace >= leftSpace) ? 'right-start' : 'left-start';\r\n \r\n const { x, y } = await computePosition(trigger, submenu, {\r\n placement,\r\n middleware: [offset(8), shift({ padding: 8 })],\r\n });\r\n\r\n Object.assign(submenu.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n });\r\n\r\n (submenu as MenuElement)._cleanup = cleanup;\r\n }\r\n\r\n private hideSubmenu(submenu: HTMLElement): void {\r\n if (!this.activeSubmenus.has(submenu)) return;\r\n\r\n this.activeSubmenus.delete(submenu);\r\n submenu.classList.remove('show');\r\n\r\n this.hideAllChildSubmenus(submenu);\r\n\r\n const menuElement = submenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n }\r\n\r\n private hideAllChildSubmenus(parentSubmenu: HTMLElement): void {\r\n const childMenuItems = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n childMenuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n const childSubmenu = menuItem._submenu;\r\n if (this.activeSubmenus.has(childSubmenu)) {\r\n this.activeSubmenus.delete(childSubmenu);\r\n childSubmenu.classList.remove('show');\r\n\r\n const menuElement = childSubmenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n\r\n this.hideAllChildSubmenus(childSubmenu);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private handleClick(e: MouseEvent): void {\r\n // 阻止事件冒泡,防止触发外部的点击事件\r\n e.stopPropagation();\r\n\r\n const menuItem = (e.target as HTMLElement).closest(\r\n '.e-virt-table-menu-item, .e-virt-table-submenu-item',\r\n ) as MenuElement;\r\n if(!menuItem) return;\r\n if (menuItem.classList.contains('disabled')) return;\r\n\r\n // 如果点击的是有子菜单的菜单项,先显示子菜单\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n const submenu =\r\n menuItem._submenu || (menuItem.querySelector('.e-virt-table-submenu') as HTMLElement | null);\r\n if (submenu) {\r\n this.showSubmenu(menuItem, submenu);\r\n return; // 不执行点击回调,只是显示子菜单\r\n }\r\n }\r\n\r\n const menuValue = menuItem.getAttribute('data-menu') || menuItem?.getAttribute('data-submenu');\r\n const itemData = this.findMenuItem(menuValue || '');\r\n\r\n if (itemData) {\r\n if (this.onClick) {\r\n this.onClick(itemData, menuValue || '');\r\n }\r\n }\r\n }\r\n\r\n private findMenuItem(value: string, items: MenuItem[] = this.menuData): MenuItem | null {\r\n for (const item of items) {\r\n if (item.value === value) return item;\r\n if (item.children) {\r\n const found = this.findMenuItem(value, item.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public positionMenu(e: MouseEvent): void {\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 autoUpdate(virtualReference, this.container, () => {\r\n computePosition(virtualReference, this.container, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n if (this.container) {\r\n Object.assign(this.container.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n public destroy(): void {\r\n // 移除事件监听器\r\n this.container.removeEventListener('mouseenter', this.boundMouseEnterHandler, true);\r\n this.container.removeEventListener('mouseleave', this.boundMouseLeaveHandler, true);\r\n this.container.removeEventListener('click', this.boundClickHandler);\r\n // 递归清理所有子菜单\r\n this.cleanupAllSubmenus(this.container);\r\n\r\n // 隐藏菜单\r\n this.container.style.display = 'none';\r\n\r\n // 清理容器\r\n this.container.replaceChildren();\r\n }\r\n\r\n /**\r\n * 删除指定值的菜单项\r\n * @param value 要删除的菜单项的值\r\n * @returns 是否成功删除\r\n */\r\n public removeMenuItem(value: string): boolean {\r\n // 查找要删除的菜单项\r\n const menuItem = this.container.querySelector(`[data-menu=\"${value}\"]`) as HTMLElement;\r\n if (!menuItem) {\r\n return false;\r\n }\r\n\r\n // 如果菜单项有子菜单,先清理子菜单\r\n const submenu = menuItem.querySelector('.e-virt-table-submenu') as HTMLElement;\r\n if (submenu) {\r\n this.cleanupSubmenuRecursively(submenu);\r\n }\r\n // 从 DOM 中移除菜单项\r\n menuItem.remove();\r\n return true;\r\n }\r\n\r\n /**\r\n * 删除指定值的子菜单项\r\n * @param value 要删除的子菜单项的值\r\n * @returns 是否成功删除\r\n */\r\n public removeSubMenuItem(value: string): boolean {\r\n // 查找要删除的子菜单项\r\n const subMenuItem = this.container.querySelector(`[data-submenu=\"${value}\"]`) as HTMLElement;\r\n if (!subMenuItem) {\r\n return false;\r\n }\r\n\r\n // 找到所属的父级子菜单容器\r\n const parentSubmenu = subMenuItem.closest('.e-virt-table-submenu') as HTMLElement;\r\n \r\n // 如果子菜单项有子菜单,先清理子菜单\r\n const childSubmenu = (subMenuItem as MenuElement)._submenu;\r\n if (childSubmenu) {\r\n this.cleanupSubmenuRecursively(childSubmenu);\r\n }\r\n \r\n // 从 DOM 中移除子菜单项\r\n subMenuItem.remove();\r\n\r\n // 检查父级子菜单容器是否还有其他子菜单项\r\n if (parentSubmenu) {\r\n const remainingItems = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item');\r\n if (remainingItems.length === 0) {\r\n // 没有子项了,找到拥有这个子菜单的父级菜单项并移除\r\n const parentMenuItem = this.container.querySelector(`[data-menu]`) as MenuElement | null;\r\n if (parentMenuItem && parentMenuItem._submenu === parentSubmenu) {\r\n this.removeMenuItem(parentMenuItem.getAttribute('data-menu') || '');\r\n } else {\r\n // 可能是嵌套子菜单,需要查找所有可能的父级\r\n const allMenuItems = this.container.querySelectorAll('[data-menu], [data-submenu]') as NodeListOf<MenuElement>;\r\n for (const item of allMenuItems) {\r\n if (item._submenu === parentSubmenu) {\r\n const parentValue = item.getAttribute('data-menu') || item.getAttribute('data-submenu');\r\n if (parentValue) {\r\n if (item.hasAttribute('data-menu')) {\r\n this.removeMenuItem(parentValue);\r\n } else {\r\n this.removeSubMenuItem(parentValue);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private cleanupAllSubmenus(container: HTMLElement): void {\r\n // 清理所有菜单项的子菜单\r\n const menuItems = container.querySelectorAll('.e-virt-table-menu-item') as NodeListOf<MenuElement>;\r\n menuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n this.cleanupSubmenuRecursively(menuItem._submenu);\r\n menuItem._submenu = undefined;\r\n }\r\n });\r\n }\r\n\r\n private cleanupSubmenuRecursively(submenu: HTMLElement): void {\r\n // 清理当前子菜单的清理函数\r\n const menuElement = submenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n\r\n // 递归清理子菜单中的子菜单\r\n const childMenuItems = submenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n childMenuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n this.cleanupSubmenuRecursively(menuItem._submenu);\r\n }\r\n });\r\n\r\n // 从 DOM 中移除子菜单\r\n submenu.remove();\r\n }\r\n}\r\n","import { Column, MenuItem } from './types';\r\nimport Context from './Context';\r\nimport Cell from './Cell';\r\nimport CellHeader from './CellHeader';\r\nimport { DOMTreeMenu } from './DOMTreeMenu';\r\nimport { toLeaf } from './util';\r\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private currentDOMTreeMenu?: DOMTreeMenu;\r\n private isCustom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n this.contextMenuEl.className = 'e-virt-table-main-menu';\r\n this.isCustom = true;\r\n } else {\r\n this.contextMenuEl = document.createElement('div');\r\n this.isCustom = false;\r\n }\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('outsideMousedown', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('cellContextMenuClick', async (cell: Cell, e: MouseEvent) => {\r\n if (this.isCustom) {\r\n this.contextMenuEl.style.display = 'block';\r\n this.positionMenu(e);\r\n return;\r\n }\r\n const { ENABLE_CONTEXT_MENU, CUSTOM_BODY_CONTEXT_MENU, CONTEXT_MENU, BEFORE_BODY_CONTEXT_MENU_METHOD } = this.ctx.config;\r\n let list: MenuItem[] = CONTEXT_MENU.map((item) => ({\r\n ...item,\r\n label: item.label || this.ctx.locale.getText(item.value),\r\n }));\r\n list = [...list, ...CUSTOM_BODY_CONTEXT_MENU];\r\n if (BEFORE_BODY_CONTEXT_MENU_METHOD) {\r\n list = await BEFORE_BODY_CONTEXT_MENU_METHOD({ list, cell, hide: this.hide.bind(this) });\r\n }\r\n if (!ENABLE_CONTEXT_MENU || list.length === 0) 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 if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n }\r\n this.ctx.contextMenuIng = true;\r\n this.currentDOMTreeMenu = new DOMTreeMenu(this.contextMenuEl, list, {\r\n onClick: (_itemData: MenuItem, value: string) => {\r\n if (value === 'copy') {\r\n this.ctx.emit('contextMenuCopy');\r\n this.hide();\r\n } else if (value === 'paste') {\r\n this.ctx.emit('contextMenuPaste');\r\n this.hide();\r\n } else if (value === 'cut') {\r\n this.ctx.emit('contextMenuCut');\r\n this.hide();\r\n } else if (value === 'clearSelected') {\r\n this.ctx.emit('contextMenuClearSelected');\r\n this.hide();\r\n } else {\r\n if (_itemData.event) {\r\n _itemData.event(e, {\r\n hide: this.hide.bind(this),\r\n cell,\r\n });\r\n }\r\n }\r\n },\r\n });\r\n this.currentDOMTreeMenu.positionMenu(e);\r\n });\r\n this.ctx.on('cellHeaderContextMenuClick', async (cell: CellHeader, e: MouseEvent) => {\r\n if (this.isCustom) {\r\n this.contextMenuEl.style.display = 'block';\r\n this.positionMenu(e);\r\n return;\r\n }\r\n // 判断是否在范围内\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET, BEFORE_HEADER_CONTEXT_MENU_METHOD } = 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 if (cell.colIndex < areaMinX || cell.colIndex > areaMaxX) {\r\n return;\r\n }\r\n const { HEADER_CONTEXT_MENU, CUSTOM_HEADER_CONTEXT_MENU, ENABLE_HEADER_CONTEXT_MENU } = this.ctx.config;\r\n let list: MenuItem[] = HEADER_CONTEXT_MENU.map((item) => ({\r\n ...item,\r\n label: item.label || this.ctx.locale.getText(item.value),\r\n }));\r\n list = [...list, ...CUSTOM_HEADER_CONTEXT_MENU];\r\n if (BEFORE_HEADER_CONTEXT_MENU_METHOD) {\r\n list = await BEFORE_HEADER_CONTEXT_MENU_METHOD({ list, cell, hide: this.hide.bind(this) });\r\n }\r\n if (!ENABLE_HEADER_CONTEXT_MENU || list.length === 0) return;\r\n e.preventDefault();\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const { colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.focusCellHeader = cell;\r\n this.ctx.emit('selectCols', cell);\r\n }\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n }\r\n const columns = this.ctx.database.getColumns();\r\n const menuData = list.map((item) => {\r\n if (item.value === 'visible') {\r\n return {\r\n ...item,\r\n children: this.filterColumns(columns),\r\n };\r\n }\r\n return item;\r\n });\r\n this.ctx.contextMenuIng = true;\r\n this.currentDOMTreeMenu = new DOMTreeMenu(this.contextMenuEl, menuData, {\r\n onClick: (_itemData: MenuItem, value: string) => {\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (value === 'fixedLeft' || value === 'fixedRight' || value === 'fixedNone') {\r\n const fixedKeys = this.ctx.header.allCellHeaders\r\n .filter((item) => item.colIndex >= minX && item.colIndex <= maxX)\r\n .filter((item) => item.level === 0)\r\n .filter((item) => !item.column.fixedDisabled)\r\n .map((item) => item.key);\r\n this.ctx.database.setCustomHeaderFixedData(\r\n fixedKeys,\r\n value === 'fixedLeft' ? 'left' : value === 'fixedRight' ? 'right' : '',\r\n );\r\n this.hide();\r\n } else if (value === 'hide') {\r\n const hideKeys = this.ctx.header.leafCellHeaders\r\n .filter((item) => item.colIndex >= minX && item.colIndex <= maxX)\r\n .filter((item) => !item.children.length)\r\n .filter((item) => !item.column.hideDisabled)\r\n .map((item) => item.key);\r\n if (hideKeys.length > 0) {\r\n this.ctx.database.setCustomHeaderHideData(hideKeys, true);\r\n }\r\n this.hide();\r\n } else if (value === 'visible') {\r\n // 这个分支不应该被触发,因为 visible 是父菜单项\r\n } else if (value.startsWith('visible_')) {\r\n if (!_itemData.key) return;\r\n if (_itemData.children) {\r\n const childKeys = this.getLeafKeys(_itemData.children);\r\n this.ctx.database.setCustomHeaderHideData(childKeys, false);\r\n } else {\r\n this.ctx.database.setCustomHeaderHideData([_itemData.key], false);\r\n }\r\n // 直接删除对应的子菜单项\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.removeSubMenuItem(value);\r\n }\r\n // 检查是否还有隐藏的列\r\n const columns = this.ctx.database.getColumns();\r\n const leafColumns = toLeaf(columns);\r\n const remainingHideColumns = leafColumns.filter((item) => item.hide);\r\n if (remainingHideColumns.length === 0) {\r\n // 如果没有隐藏的列了,隐藏菜单\r\n this.hide();\r\n }\r\n } else if (value === 'resetHeader') {\r\n this.ctx.database.resetCustomHeader();\r\n this.hide();\r\n } else {\r\n if (_itemData.event) {\r\n _itemData.event(e, {\r\n hide: this.hide.bind(this),\r\n cell,\r\n });\r\n }\r\n }\r\n },\r\n });\r\n this.positionMenu(e);\r\n });\r\n this.ctx.on('click', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n private positionMenu(e: MouseEvent): void {\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 autoUpdate(virtualReference, this.contextMenuEl, () => {\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n if (this.contextMenuEl) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n });\r\n });\r\n }\r\n private filterColumns(columns: Column[]): MenuItem[] {\r\n const result: MenuItem[] = [];\r\n\r\n for (const col of columns) {\r\n // 有 children,递归过滤\r\n if (col.children && col.children.length > 0) {\r\n const filteredChildren = this.filterColumns(col.children);\r\n if (filteredChildren.length > 0) {\r\n result.push({\r\n label: col.title,\r\n key: col.key,\r\n value: `visible_${col.key}`,\r\n // disabled: true, // 非末级,且有子项保留 → disabled\r\n children: filteredChildren,\r\n });\r\n }\r\n }\r\n // 末级节点,保留 hide===true 的\r\n else if (col.hide) {\r\n result.push({ label: col.title, value: `visible_${col.key}`, key: col.key });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n // 递归获取所有子项key\r\n private getLeafKeys(tree: MenuItem[]): string[] {\r\n return tree.reduce<string[]>((acc, node) => {\r\n if (!node.children || node.children.length === 0) {\r\n // 叶子节点,收集 value\r\n acc.push(String(node.key));\r\n } else {\r\n // 有子节点,递归收集\r\n acc.push(...this.getLeafKeys(node.children));\r\n }\r\n return acc;\r\n }, []);\r\n }\r\n\r\n hide() {\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n this.currentDOMTreeMenu = undefined;\r\n }\r\n this.contextMenuEl.style.display = 'none';\r\n this.ctx.contextMenuIng = false;\r\n }\r\n destroy() {\r\n this.hide();\r\n this.contextMenuEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private loadingEl: HTMLDivElement;\r\n private textEl: HTMLParagraphElement = document.createElement('p');\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n\r\n if (this.ctx.loadingElement) {\r\n this.loadingEl = this.ctx.loadingElement;\r\n } else {\r\n this.loadingEl = document.createElement('div');\r\n const loadingSpinner = document.createElement('div');\r\n loadingSpinner.className = 'e-virt-table-loading-spinner';\r\n const loadingSvg = this.ctx.icons.getSvg('loading');\r\n if (loadingSvg) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(loadingSvg.svg, 'image/svg+xml');\r\n const svgEl = doc.documentElement;\r\n loadingSpinner.appendChild(svgEl);\r\n }\r\n this.textEl.className = 'e-virt-table-loading-text';\r\n this.textEl.innerText = this.getText();\r\n loadingSpinner.appendChild(this.textEl);\r\n this.loadingEl.appendChild(loadingSpinner);\r\n }\r\n this.loadingEl.className = 'e-virt-table-loading';\r\n this.loadingEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.loadingEl);\r\n }\r\n private getText() {\r\n return this.ctx.config.LOADING_TEXT || this.ctx.locale.getText('loadingText');\r\n }\r\n show() {\r\n this.loadingEl.style.display = 'flex';\r\n }\r\n hide() {\r\n this.loadingEl.style.display = 'none';\r\n }\r\n draw() {\r\n if (this.ctx.loadingElement) {\r\n return;\r\n }\r\n this.textEl.innerText = this.getText();\r\n }\r\n destroy() {\r\n this.loadingEl.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nimport { expandSvg, svgLoading } from './Icons';\r\n\r\nexport interface FinderResult {\r\n type: 'header' | 'body';\r\n rowIndex: number;\r\n colIndex: number;\r\n text: string;\r\n colKey?: string;\r\n}\r\n\r\nexport class FinderBar {\r\n private ctx: Context;\r\n private container: HTMLElement;\r\n private input!: HTMLInputElement;\r\n private prevBtn!: HTMLElement;\r\n private nextBtn!: HTMLElement;\r\n private closeBtn!: HTMLElement;\r\n private countEl!: HTMLElement;\r\n private loadingEl!: HTMLElement;\r\n private isVisible = false;\r\n private searchResults: FinderResult[] = [];\r\n private currentIndex = -1;\r\n private searchData: FinderResult[] = [];\r\n private isComposing = false;\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.container = this.createContainer();\r\n this.ctx.containerElement.appendChild(this.container);\r\n this.bindEvents();\r\n this.ctx.on('keydown', (e: KeyboardEvent) => {\r\n if (!this.ctx.config.ENABLE_FINDER) {\r\n return;\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.code === 'KeyF') {\r\n e.preventDefault();\r\n this.show();\r\n return;\r\n }\r\n if (this.ctx.finding) {\r\n if (e.code === 'Escape') {\r\n e.preventDefault();\r\n this.hide();\r\n return;\r\n }\r\n if (e.code === 'ArrowUp' || (e.shiftKey && e.key === 'Enter')) {\r\n e.preventDefault();\r\n this.navigatePrevious();\r\n return;\r\n }\r\n if (e.code === 'ArrowDown' || e.key === 'Enter') {\r\n e.preventDefault();\r\n this.navigateNext();\r\n return;\r\n }\r\n }\r\n });\r\n this.ctx.on('setSelector', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('outsideMousedown', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n private async initSearchData(): Promise<void> {\r\n this.showLoading();\r\n this.searchData = [];\r\n setTimeout(() => {\r\n const { allCellHeaders } = this.ctx.header;\r\n for (let i = 0; i < allCellHeaders.length; i++) {\r\n const header = allCellHeaders[i];\r\n if (header && ['string', 'number'].includes(typeof header.text)) {\r\n this.searchData.push({\r\n rowIndex: 0,\r\n colIndex: header.colIndex,\r\n text: `${header.text}`,\r\n type: 'header',\r\n colKey: header.key,\r\n });\r\n }\r\n }\r\n const { maxColIndex, maxRowIndex } = this.ctx;\r\n for (let i = 0; i <= maxRowIndex; i++) {\r\n for (let j = 0; j <= maxColIndex; j++) {\r\n const cell = this.ctx.database.getVirtualBodyCell(i, j, false);\r\n const text = cell?.getText();\r\n if (['string', 'number'].includes(typeof text)) {\r\n this.searchData.push({\r\n rowIndex: i,\r\n colIndex: j,\r\n text: `${text}`,\r\n type: 'body',\r\n });\r\n }\r\n }\r\n }\r\n this.hideLoading();\r\n }, 0);\r\n }\r\n\r\n private createContainer(): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = 'e-virt-table-finder-bar';\r\n // 创建输入框容器\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.className = 'e-virt-table-finder-bar-input-wrapper';\r\n // 创建输入框\r\n this.input = document.createElement('input');\r\n this.input.type = 'text';\r\n this.input.className = 'e-virt-table-finder-bar-input';\r\n this.input.placeholder = '';\r\n inputWrapper.appendChild(this.input);\r\n\r\n // 创建 loading 指示器(放在输入框容器内)\r\n this.loadingEl = document.createElement('div');\r\n this.loadingEl.className = 'e-virt-table-finder-bar-loading';\r\n const loadingSvg = svgLoading;\r\n this.loadingEl.innerHTML = loadingSvg;\r\n inputWrapper.appendChild(this.loadingEl);\r\n // 创建计数文本\r\n this.countEl = document.createElement('span');\r\n this.countEl.className = 'e-virt-table-finder-bar-count';\r\n // 创建导航按钮容器\r\n const navContainer = document.createElement('div');\r\n navContainer.className = 'e-virt-table-finder-bar-nav';\r\n // 创建上一个按钮(向上箭头)\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.className = 'e-virt-table-finder-bar-nav-btn prev-btn';\r\n this.prevBtn.innerHTML = expandSvg;\r\n // 创建下一个按钮(向下箭头)\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.className = 'e-virt-table-finder-bar-nav-btn next-btn';\r\n this.nextBtn.innerHTML = expandSvg;\r\n navContainer.appendChild(this.prevBtn);\r\n navContainer.appendChild(this.nextBtn);\r\n\r\n // 创建关闭按钮\r\n this.closeBtn = document.createElement('button');\r\n this.closeBtn.className = 'e-virt-table-finder-bar-nav-btn close-btn';\r\n this.closeBtn.innerHTML = '×';\r\n\r\n container.appendChild(inputWrapper);\r\n container.appendChild(this.countEl);\r\n container.appendChild(navContainer);\r\n container.appendChild(this.closeBtn);\r\n\r\n return container;\r\n }\r\n\r\n private bindEvents(): void {\r\n // 输入框输入事件\r\n this.input.addEventListener('input', () => {\r\n if (!this.isComposing) this.performSearch();\r\n });\r\n this.input.addEventListener('compositionstart', () => {\r\n this.isComposing = true;\r\n });\r\n\r\n this.input.addEventListener('compositionend', () => {\r\n this.isComposing = false;\r\n this.performSearch();\r\n });\r\n // 导航按钮事件\r\n this.prevBtn.addEventListener('click', () => {\r\n this.navigatePrevious();\r\n });\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n this.navigateNext();\r\n });\r\n\r\n // 关闭按钮事件\r\n this.closeBtn.addEventListener('click', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n private performSearch(): void {\r\n const searchText = this.input.value.trim();\r\n this.searchResults = [];\r\n this.currentIndex = -1;\r\n\r\n if (!searchText) {\r\n this.cearFinderBar();\r\n this.updateCount();\r\n return;\r\n }\r\n\r\n this.showLoading();\r\n setTimeout(() => {\r\n // 支持大小写搜索\r\n this.searchResults = this.searchData.filter((item) =>\r\n item.text.toLowerCase().includes(searchText.toLowerCase()),\r\n );\r\n // 如果找到结果,定位到第一个\r\n if (this.searchResults.length > 0) {\r\n this.currentIndex = 0;\r\n this.scrollToCurrentResult();\r\n } else {\r\n // 清空\r\n this.cearFinderBar();\r\n }\r\n this.updateCount();\r\n this.hideLoading();\r\n }, 0);\r\n }\r\n\r\n private scrollToCurrentResult(): void {\r\n if (this.currentIndex < 0 || this.currentIndex >= this.searchResults.length) {\r\n return;\r\n }\r\n const result = this.searchResults[this.currentIndex];\r\n this.ctx.finderBar = result;\r\n const { rowIndex, colIndex } = result;\r\n this.ctx.emit('scrollToIndex', rowIndex, colIndex);\r\n }\r\n\r\n private navigateNext(): void {\r\n if (this.searchResults.length === 0) return;\r\n\r\n this.currentIndex = (this.currentIndex + 1) % this.searchResults.length;\r\n this.scrollToCurrentResult();\r\n this.updateCount();\r\n }\r\n\r\n private navigatePrevious(): void {\r\n if (this.searchResults.length === 0) return;\r\n\r\n this.currentIndex = this.currentIndex <= 0 ? this.searchResults.length - 1 : this.currentIndex - 1;\r\n this.scrollToCurrentResult();\r\n this.updateCount();\r\n }\r\n\r\n private updateCount(): void {\r\n if (this.searchResults.length === 0) {\r\n if (this.input.value.trim()) {\r\n this.countEl.textContent = '0/0';\r\n this.countEl.classList.add('no-results');\r\n } else {\r\n this.countEl.textContent = '';\r\n this.countEl.classList.remove('no-results');\r\n }\r\n } else {\r\n const current = this.currentIndex + 1;\r\n const total = this.searchResults.length;\r\n this.countEl.textContent = `${current}/${total}`;\r\n this.countEl.classList.remove('no-results');\r\n }\r\n }\r\n\r\n public show(): void {\r\n if (this.isVisible) return;\r\n this.isVisible = true;\r\n this.ctx.finding = true;\r\n this.container.classList.add('show');\r\n this.input.focus();\r\n this.initSearchData();\r\n }\r\n\r\n private showLoading(): void {\r\n this.loadingEl.classList.add('show');\r\n this.loadingEl.parentElement?.classList.add('loading');\r\n this.input.readOnly = true;\r\n }\r\n\r\n private hideLoading(): void {\r\n this.loadingEl.classList.remove('show');\r\n this.loadingEl.parentElement?.classList.remove('loading');\r\n this.input.readOnly = false;\r\n }\r\n private cearFinderBar(): void {\r\n this.ctx.finderBar = {\r\n rowIndex: -1,\r\n colIndex: -1,\r\n text: '',\r\n type: 'header',\r\n };\r\n this.ctx.emit('draw');\r\n }\r\n\r\n public hide(): void {\r\n if (!this.isVisible) return;\r\n\r\n this.isVisible = false;\r\n this.container.classList.remove('show');\r\n this.ctx.finding = false;\r\n this.input.value = '';\r\n this.searchResults = [];\r\n this.searchData = [];\r\n this.currentIndex = -1;\r\n this.hideLoading();\r\n this.ctx.finderBar = {\r\n rowIndex: -1,\r\n colIndex: -1,\r\n text: '',\r\n type: 'header',\r\n };\r\n this.updateCount();\r\n this.ctx.emit('draw');\r\n }\r\n\r\n public destroy(): void {\r\n this.hide();\r\n this.container.remove();\r\n }\r\n}\r\n","import type { Align } from './types';\r\nimport type Context from './Context';\r\n\r\nexport type TextSelectionRange = {\r\n start: number;\r\n end: number;\r\n};\r\nexport type TextGlyph = {\r\n char: string;\r\n index: number;\r\n line: number;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n};\r\nexport type TextLineItem = {\r\n char: string;\r\n sourceIndex: number;\r\n ellipsis?: boolean;\r\n};\r\nexport type TextLayoutLine = {\r\n items: TextLineItem[];\r\n text: string;\r\n caretIndex: number;\r\n lineIndex: number;\r\n drawX: number;\r\n drawY: number;\r\n width: number;\r\n segments: TextLineSegment[];\r\n};\r\nexport type TextLineSegment = {\r\n char: string;\r\n itemIndex: number;\r\n sourceIndex: number;\r\n x: number;\r\n width: number;\r\n};\r\nexport type TextLayout = {\r\n text: string;\r\n chars: string[];\r\n glyphs: TextGlyph[];\r\n lines: TextLayoutLine[];\r\n box: { x: number; y: number; width: number; height: number };\r\n contentBox: { x: number; y: number; width: number; height: number };\r\n contentY: number;\r\n lineHeight: number;\r\n font: string;\r\n color: string;\r\n align: Align;\r\n ellipsis: boolean;\r\n};\r\n\r\nexport default class TextSelector {\r\n private ctx: Context;\r\n private layouts = new Map<string, TextLayout>();\r\n private activeCellKey = '';\r\n private selectionStart: number | null = null;\r\n private selectionEnd: number | null = null;\r\n private dragging = false;\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n /** 是否允许进行文字选择(开启配置且不在编辑/查找状态) */\r\n private get canSelect() {\r\n return this.ctx.config.ENABLE_TEXT_SELECTION && !this.ctx.editing && !this.ctx.finding;\r\n }\r\n\r\n /**\r\n * 在所有已注册的文字 layout(body/header/footer)中命中鼠标位置,返回命中的单元格 key 与字符索引。\r\n * 由于固定列/表头会后绘制并覆盖普通单元格,这里取最后一个命中的 layout 作为最顶层结果。\r\n */\r\n private hitTestLayouts(e: MouseEvent): { cellKey: string; index: number } | null {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let hit: { cellKey: string; index: number } | null = null;\r\n for (const [cellKey, layout] of this.layouts) {\r\n const index = this.hitTestText(layout, offsetX, offsetY);\r\n if (index !== null) {\r\n hit = { cellKey, index };\r\n }\r\n }\r\n return hit;\r\n }\r\n\r\n /** 同步选中文本并触发重绘 */\r\n private syncSelection() {\r\n this.ctx.textSelectionStr = this.getSelectedText();\r\n this.ctx.emit('drawView');\r\n }\r\n\r\n private init() {\r\n this.ctx.on('registerTextLayout', (cellKey: string, layout: TextLayout) => {\r\n this.registerLayout(cellKey, layout);\r\n });\r\n this.ctx.on('mousedown', (e) => {\r\n if (!this.canSelect || !this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.containerElement.contains(document.activeElement)) {\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n }\r\n const hit = this.hitTestLayouts(e);\r\n if (!hit) {\r\n this.clearSelection();\r\n return;\r\n }\r\n this.activeCellKey = hit.cellKey;\r\n this.selectionStart = hit.index;\r\n this.selectionEnd = hit.index;\r\n this.dragging = true;\r\n this.ctx.textSelecting = true;\r\n this.syncSelection();\r\n });\r\n this.ctx.on('mousemove', (e) => {\r\n if (!this.canSelect || !this.dragging) {\r\n return;\r\n }\r\n // 拖拽选区限制在起始单元格内\r\n const layout = this.layouts.get(this.activeCellKey);\r\n if (!layout) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const index = this.hitTestText(layout, offsetX, offsetY);\r\n if (index === null) {\r\n return;\r\n }\r\n this.selectionEnd = index;\r\n this.syncSelection();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.dragging = false;\r\n this.ctx.textSelecting = false;\r\n this.ctx.textSelectionStr = this.getSelectedText();\r\n if (this.ctx.textSelectionStr) {\r\n this.ctx.emit('drawView');\r\n }\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n console.log('keydown');\r\n if (!this.canSelect || !((e.ctrlKey || e.metaKey) && e.code === 'KeyC')) {\r\n return;\r\n }\r\n const text = this.getSelectedText();\r\n if (!text) {\r\n return;\r\n }\r\n e.preventDefault();\r\n navigator.clipboard?.writeText(text).catch((error) => console.error('Copy Failure:', error));\r\n });\r\n this.ctx.on('outsideMousedown', () => {\r\n this.clearSelection();\r\n });\r\n }\r\n\r\n /**\r\n * 命中测试,返回字符索引\r\n */\r\n private hitTestText(layout: TextLayout, mouseX: number, mouseY: number): number | null {\r\n const { contentBox, lines, glyphs, contentY, lineHeight } = layout;\r\n if (\r\n mouseX < contentBox.x ||\r\n mouseX > contentBox.x + contentBox.width ||\r\n mouseY < contentBox.y ||\r\n mouseY > contentBox.y + contentBox.height\r\n ) {\r\n return null;\r\n }\r\n const relativeY = mouseY - contentY;\r\n const lineIndex = Math.max(0, Math.min(Math.floor(relativeY / lineHeight), lines.length - 1));\r\n const line = lines[lineIndex];\r\n const lineGlyphs = glyphs.filter((glyph) => glyph.line === lineIndex);\r\n if (!lineGlyphs.length) {\r\n return line.caretIndex;\r\n }\r\n if (mouseX <= lineGlyphs[0].x) {\r\n return lineGlyphs[0].index;\r\n }\r\n for (const glyph of lineGlyphs) {\r\n if (mouseX < glyph.x + glyph.width / 2) {\r\n return glyph.index;\r\n }\r\n }\r\n return lineGlyphs[lineGlyphs.length - 1].index + 1;\r\n }\r\n\r\n registerLayout(cellKey: string, layout: TextLayout) {\r\n this.layouts.set(cellKey, layout);\r\n }\r\n\r\n clearLayouts() {\r\n this.layouts.clear();\r\n }\r\n\r\n draw() {\r\n if (!this.ctx.config.ENABLE_TEXT_SELECTION) {\r\n return;\r\n }\r\n const range = this.getSelectionRange();\r\n if (!range) {\r\n return;\r\n }\r\n const layout = this.layouts.get(this.activeCellKey);\r\n if (!layout) {\r\n return;\r\n }\r\n this.drawTextSelection(layout, range);\r\n }\r\n\r\n /**\r\n * 绘制文字选中高亮\r\n */\r\n private drawTextSelection(\r\n layout: TextLayout,\r\n range: TextSelectionRange,\r\n selectedColor = '#fff',\r\n selectionBgColor = '#3b82f6',\r\n ): void {\r\n if (range.start >= range.end) {\r\n return;\r\n }\r\n const byLine = new Map<number, TextGlyph[]>();\r\n for (const glyph of layout.glyphs) {\r\n if (glyph.index < range.start || glyph.index >= range.end) {\r\n continue;\r\n }\r\n const lineGlyphs = byLine.get(glyph.line);\r\n if (lineGlyphs) {\r\n lineGlyphs.push(glyph);\r\n } else {\r\n byLine.set(glyph.line, [glyph]);\r\n }\r\n }\r\n if (!byLine.size) {\r\n return;\r\n }\r\n const ctx = this.ctx.paint.getCtx();\r\n ctx.save();\r\n ctx.font = layout.font;\r\n ctx.textBaseline = 'top';\r\n ctx.textAlign = 'left';\r\n byLine.forEach((lineGlyphs) => {\r\n const first = lineGlyphs[0];\r\n const last = lineGlyphs[lineGlyphs.length - 1];\r\n ctx.fillStyle = selectionBgColor;\r\n ctx.fillRect(first.x, first.y, last.x + last.width - first.x, first.height);\r\n ctx.fillStyle = selectedColor;\r\n for (const glyph of lineGlyphs) {\r\n ctx.fillText(glyph.char, glyph.x, glyph.y);\r\n }\r\n });\r\n ctx.restore();\r\n }\r\n\r\n private getSelectionRange(): TextSelectionRange | null {\r\n if (this.selectionStart === null || this.selectionEnd === null) {\r\n return null;\r\n }\r\n return {\r\n start: Math.min(this.selectionStart, this.selectionEnd),\r\n end: Math.max(this.selectionStart, this.selectionEnd),\r\n };\r\n }\r\n\r\n private getSelectedText() {\r\n const range = this.getSelectionRange();\r\n if (!range || range.start >= range.end) {\r\n return '';\r\n }\r\n const layout = this.layouts.get(this.activeCellKey);\r\n if (!layout) {\r\n return '';\r\n }\r\n return layout.chars.slice(range.start, range.end).join('');\r\n }\r\n\r\n private clearSelection() {\r\n this.activeCellKey = '';\r\n this.selectionStart = null;\r\n this.selectionEnd = null;\r\n this.dragging = false;\r\n this.ctx.textSelectionStr = '';\r\n }\r\n\r\n destroy() {\r\n this.layouts.clear();\r\n this.clearSelection();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n CustomHeader,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Fixed,\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\nimport Loading from './Loading';\r\nimport { FinderBar } from './FinderBar';\r\nimport { LangConfig } from './Locale';\r\nimport TextSelector from './TextSelector';\r\nexport default class EVirtTable {\r\n static locale: LangConfig;\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 private loading: Loading;\r\n private finderBar: FinderBar;\r\n private textSelector: TextSelector;\r\n private animationFrameId: number | undefined = undefined;\r\n ctx: Context;\r\n static useLocale(langConfig: LangConfig) {\r\n EVirtTable.locale = langConfig;\r\n }\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = this.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.loading = new Loading(this.ctx);\r\n this.finderBar = new FinderBar(this.ctx);\r\n this.ctx.on('loadData', (data) => {\r\n this.loadData(data);\r\n });\r\n this.textSelector = new TextSelector(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\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 overlayerElement.setAttribute('data-overlayer', _overlayerElement ? 'custom' : 'default');\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 private doDraw(ignoreOverlayer = false) {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.textSelector.clearLayouts();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n // 在 body/footer/header 之后绘制,保证文字选中高亮覆盖在三类单元格之上\r\n this.textSelector.draw();\r\n this.body.drawDragRowTip();\r\n this.scroller.draw();\r\n this.empty.draw();\r\n this.loading.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n }\r\n draw(ignoreOverlayer = false) {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n }\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this.doDraw(ignoreOverlayer);\r\n const needReDraw = this.body.updateAutoHeight();\r\n if (needReDraw) {\r\n this.doDraw(ignoreOverlayer);\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 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 setCustomHeader(customHeader: CustomHeader, ignoreEmit = true) {\r\n this.ctx.database.setCustomHeader(customHeader, ignoreEmit);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n getCustomHeader() {\r\n return this.header.getCustomHeader();\r\n }\r\n showColumns(keys: string[], show = true) {\r\n this.ctx.database.setCustomHeaderHideData(keys, !show);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n fixedColumns(keys: string[], fixed: Fixed | '') {\r\n this.ctx.database.setCustomHeaderFixedData(keys, fixed);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(loading: boolean) {\r\n this.ctx.loading = loading;\r\n if (loading) {\r\n this.loading.show();\r\n } else {\r\n this.loading.hide();\r\n }\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\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, rowKey } = item;\r\n if (rowIndex !== undefined && rowKey === undefined) {\r\n const _rowKey = this.ctx.database.getRowKeyForRowIndex(rowIndex);\r\n this.ctx.database.setValidationErrorByRowKey(_rowKey, key, message);\r\n }\r\n if (rowKey) {\r\n this.ctx.database.setValidationErrorByRowKey(rowKey, key, message);\r\n }\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowKey) {\r\n this.scrollToRowkey(err.rowKey);\r\n this.scrollToColkey(err.key);\r\n } else if (err && err.rowIndex !== undefined && 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 // 禁用不验证\r\n if (this.ctx.config.DISABLED) {\r\n return new Promise((resolve) => {\r\n resolve([]);\r\n });\r\n }\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 clearSort() {\r\n this.ctx.database.clearSort();\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 clearChangeData() {\r\n this.ctx.database.clearChangeData();\r\n this.ctx.emit('draw');\r\n }\r\n getReadonly(rowKey: string, key: string) {\r\n return this.ctx.database.getReadonly(rowKey, key);\r\n }\r\n useLocale(langConfig: LangConfig) {\r\n this.ctx.locale.use(langConfig);\r\n }\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.loading.destroy();\r\n this.finderBar.destroy();\r\n this.textSelector.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","wait","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","parentKey","config","colspan","fixed","children","toLeaf","tmp","filterHiddenColumns","columns","col","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","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","parseDate","dateStr","directDate","patterns","pattern","groups","year","month","day","hour","minute","second","compareDates","aDate","bDate","getNumberPrecision","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","image","offsetX","offsetY","CellImage","source","options","visible","mouseX","mouseY","Cell","isUpdate","rowItem","err","dragImage","drawDragImageWidth","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","TREE_INDENT","CHECKBOX_SIZE","TREE_ICON_SIZE","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","drawX","iconX","iconY","drawTextX","selectionImage","dragImageWidth","selectionImageX","selectionImageWidth","DRAG_ROW_ICON_SIZE","dragImageX","dragImageY","TREE_LINE","TREE_LINE_COLOR","treeImage","treeImageX","treeImageY","treeImageWidth","treeImageHeight","iconCenterX","iconCenterY","baseX","parentRowKeys","i","nextKey","vx","vxParent","y2","currVX","shortTop","shortBottom","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","FINDER_CELL_BG_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","font","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","selectable","checkboxImage","checkboxName","treeState","check","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","_x","_y","offsetTop","offsetLeft","drawImageSource","hoverImage","renderHeight","BODY_FONT","CELL_LINE_HEIGHT","cacheTextKey","calculatedHeight","BODY_CELL_FORMATTER_METHOD","left","top","remainTop","autoStyle","paint","BORDER_COLOR","BORDER","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","cellHeader","PLACEHOLDER_COLOR","placeholder","text","layout","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetH","Database","footerData","isClear","_columns","leafColumns","_a","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","TREE_CHILDREN_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","rowIndexHeightList","rowMaxHeight","recursiveData","_generateColumns","dataMap","_b","_d","_c","_f","_e","_h","_g","obj","allHide","_height","_data","sortedEntries","filterMethod","direction","timestamp","sortedData","sortBy","aValue","bValue","comparison","aNum","bNum","aStr","bStr","rowKeys","rowkey","loading","_list","history","checkReadonly","historyAcion","historyList","_checkReadonly","rowList","errList","changeList","oldValue","cell","_changeItem","precision","factor","BEFORE_VALUE_CHANGE_METHOD","promsieValidators","rows","changeListValid","errorTip","_value","reDraw","isEditor","changeKey","originalValue","changeItem","selection","mode","childKey","childSelections","checkedChildren","s","totalChildren","parentShouldBeChecked","parentSelection","draw","selectionMap","checked","indeterminate","finalChecked","getAllDescendantsRecursive","allDescendants","descendantSelections","descKey","checkedDescendants","totalDescendants","someChecked","allChecked","collectChildren","items","itemKey","findParent","targetKey","child","result","_selectable","ignoreReserve","isTreeSelectionMode","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","colKey","rowKeyList","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","currentDepth","maxDepth","childMaxDepth","map","customHeader","ignoreEmit","resizableData","keys","hide","hideData","fixedData","clearCustomHeaderInvalidValues","assignIfDifferent","columnValue","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","target","fn","rect","ENABLE_KEYBOARD","entry","EventBus","event","callback","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","align","padding","verticalAlign","maxLineClamp","autoRowHeight","offsetRight","lineHeight","line","maxLineWidth","max","textMaxWidth","textInfo","availableWidth","contentWidth","contentHeight","chars","lines","maxTextLine","totalTextLine","char","ellipsis","visibleLines","remainingLines","ellipsisLine","lastLineIndex","remainingText","widthEllipsis","totalTextHeight","contentY","glyphs","segments","lineWidth","sum","segment","lineX","lineY","maxWidth","currentItems","currentWidth","lineCaretIndex","flushLine","nextCaretIndex","lineText","charWidth","remainingItems","_text","contentText","itemIndex","segmentWidth","paragraphs","paragraph","words","currentLine","word","testLine","fontSize","totalLines","ellipsesWidth","textWidth","textLength","Config","cssKey","expandSvg","svgcheckboxCheck","svgSelect","svgSortable","svgLoading","svgDrag","svgCheckboxUncheck","svgCheckboxIndeterminate","svgCheckboxDisabled","svgIconEdit","svgSortAsc","svgSortDesc","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","attrValue","url","svgBlob","reject","EventTable","entries","mutations","mutation","hoverIcon","renderRows","cells","renderCellHeaders","realityHeight","defaultLang","Locale","langConfig","EVirtTable","p1","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","loadingElement","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","positionX","positionY","scrollSpeedX","num","scrollSpeedY","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","REQUIRED_COLOR","ENABLE_SELECTOR_SINGLE","colSpanMaxIndex","iconSize","sortState","sortImage","TreeUtil","initialData","sourceKey","sourceInfo","targetInfo","sourceParent","sourceIndex","sourceNode","targetParent","targetIndex","targetNode","sourceArray","targetArray","insertIndex","tree","nodeKey","parent","node","found","Header","isBuffer","HEADER_HEIGHT","maxHeaderRow","_item","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","currentState","newDirection","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","resizeTarget","genSortObj","sortColumns","columnsTree","sortData","dragCellHeader","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","RESIZE_COLUMN_TEXT_COLOR","RESIZE_COLUMN_TEXT_BG_COLOR","ENABLE_RESIZE_COLUMN_TEXT","resizeTargetDrawX","poins","rw","rh","DRAG_TIP_BG_COLOR","DRAG_TIP_LINE_COLOR","trianglePoins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","calculatedHeightCells","heights","curRowMaxHeight","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","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","minHeight","dragSource","dragTarget","isDragRow","BEFORE_DRAG_ROW_METHOD","originalData","treeUtil","ENABLE_DRAG_ROW_CROSS_LEVEL","scopeHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","DRAG_ROW_TIP_LINE_COLOR","dragTargetDrawY","dragTargetHeight","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","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","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","ENABLE_AUTOFILL_SPAN_COL","ENABLE_AUTOFILL_SPAN_ROW","xArrSelector","yArrSelector","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","round","floor","createCoords","v","oppositeSideMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","isStart","getOppositeAxisPlacements","flipAlignment","expandPaddingObject","getPaddingObject","rectToClientRect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","_await$platform$isEle","platform","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","currentMiddleware","nextX","nextY","reset","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","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","getComputedStyle$1","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","doc","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstRect","bottom","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","rectsAreEqual","observeMove","onMove","io","root","cleanup","_io","refresh","skip","threshold","elementRectForRootMargin","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$2","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","numberErrorTip","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip$1","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","m1","m2","overlayerAutoHeightMap","container","overlayerEl","typeView","typeDiv","cellWrapView","cellWrap","cellEl","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","DOMTreeMenu","menuData","mainMenu","isSubmenu","menuItem","contentContainer","iconContainer","textSpan","arrowContainer","submenu","submenuData","tagName","className","submenuEl","siblings","parentSubmenu","sibling","trigger","containerRect","viewportWidth","submenuWidth","rightSpace","leftSpace","menuElement","childSubmenu","menuValue","itemData","virtualReference","subMenuItem","parentMenuItem","allMenuItems","parentValue","ContextMenu","ENABLE_CONTEXT_MENU","CUSTOM_BODY_CONTEXT_MENU","CONTEXT_MENU","BEFORE_BODY_CONTEXT_MENU_METHOD","_itemData","BEFORE_HEADER_CONTEXT_MENU_METHOD","HEADER_CONTEXT_MENU","CUSTOM_HEADER_CONTEXT_MENU","ENABLE_HEADER_CONTEXT_MENU","fixedKeys","hideKeys","childKeys","filteredChildren","Tooltip","loadingSpinner","loadingSvg","svgEl","FinderBar","allCellHeaders","maxColIndex","maxRowIndex","inputWrapper","navContainer","searchText","current","TextSelector","hit","cellKey","contentBox","relativeY","lineIndex","lineGlyphs","glyph","range","selectedColor","selectionBgColor","byLine","first","last","_EVirtTable","Empty","Loading","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","show","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[35,36,37,38]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/CellImage.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/svg/expand.svg?raw","../src/svg/checkbox-check.svg?raw","../src/svg/select.svg?raw","../src/svg/sortable.svg?raw","../src/svg/loading.svg?raw","../src/svg/drag.svg?raw","../src/svg/checkbox-uncheck.svg?raw","../src/svg/checkbox-indeterminate.svg?raw","../src/svg/checkbox-disabled.svg?raw","../src/svg/icon-edit.svg?raw","../src/Icons.ts","../src/EventTable.ts","../src/lang/zh-CN.ts","../src/Locale.ts","../src/ZoomScale.ts","../src/Context.ts","../src/Scroller.ts","../src/CellHeader.ts","../src/TreeUtil.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/DOMTreeMenu.ts","../src/ContextMenu.ts","../src/Loading.ts","../src/FinderBar.ts","../src/TextSelector.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.required && (value === undefined || value === null || value === '')) {\r\n return errors;\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 | (() => 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 const wait = typeof delay === 'function' ? delay() : delay;\r\n if (!lastCalledTime || elapsedTime >= wait) {\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 }, wait - 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, parentKey = ''): Column[] {\r\n return arr\r\n .sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0))\r\n .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, config.key);\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 parentKey,\r\n children: children.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n parentKey,\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\nfunction filterHiddenColumns(columns: Column[]): Column[] {\r\n return columns\r\n .filter((col) => !col.hide) // 先过滤掉自己 hide 的列\r\n .map((col: Column) => {\r\n // 如果有子列\r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n return {\r\n ...col,\r\n children: filterHiddenColumns(col.children), // 递归处理\r\n };\r\n }\r\n return { ...col };\r\n });\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\n\r\n/**\r\n * 解析日期字符串,支持多种常见格式\r\n * @param dateStr 日期字符串\r\n * @returns Date 对象\r\n */\r\nfunction parseDate(dateStr: any): Date {\r\n if (!dateStr) return new Date(0);\r\n\r\n // 如果是数字(时间戳),直接创建Date对象\r\n if (typeof dateStr === 'number') {\r\n return new Date(dateStr);\r\n }\r\n\r\n const str = String(dateStr).trim();\r\n\r\n // 尝试直接解析\r\n const directDate = new Date(str);\r\n if (!isNaN(directDate.getTime())) {\r\n return directDate;\r\n }\r\n\r\n // 支持多种常见格式\r\n const patterns = [\r\n // YYYY-MM-DD\r\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/,\r\n // YYYY/MM/DD\r\n /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})$/,\r\n // YYYY.MM.DD\r\n /^(\\d{4})\\.(\\d{1,2})\\.(\\d{1,2})$/,\r\n // DD-MM-YYYY\r\n /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/,\r\n // DD/MM/YYYY\r\n /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/,\r\n // DD.MM.YYYY\r\n /^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/,\r\n // MM-DD-YYYY\r\n /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/,\r\n // MM/DD/YYYY\r\n /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/,\r\n // MM.DD.YYYY\r\n /^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/,\r\n // YYYYMMDD\r\n /^(\\d{4})(\\d{2})(\\d{2})$/,\r\n // 带时间的格式 YYYY-MM-DD HH:mm:ss\r\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/,\r\n // 带时间的格式 YYYY/MM/DD HH:mm:ss\r\n /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = str.match(pattern);\r\n if (match) {\r\n const groups = match.slice(1).map(Number);\r\n\r\n if (\r\n pattern.source.includes('YYYY-MM-DD') ||\r\n pattern.source.includes('YYYY/MM/DD') ||\r\n pattern.source.includes('YYYY.MM.DD')\r\n ) {\r\n // YYYY-MM-DD 格式\r\n const [year, month, day, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (\r\n pattern.source.includes('DD-MM-YYYY') ||\r\n pattern.source.includes('DD/MM/YYYY') ||\r\n pattern.source.includes('DD.MM.YYYY')\r\n ) {\r\n // DD-MM-YYYY 格式\r\n const [day, month, year, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (\r\n pattern.source.includes('MM-DD-YYYY') ||\r\n pattern.source.includes('MM/DD/YYYY') ||\r\n pattern.source.includes('MM.DD.YYYY')\r\n ) {\r\n // MM-DD-YYYY 格式\r\n const [month, day, year, hour = 0, minute = 0, second = 0] = groups;\r\n return new Date(year, month - 1, day, hour, minute, second);\r\n } else if (pattern.source.includes('YYYYMMDD')) {\r\n // YYYYMMDD 格式\r\n const [year, month, day] = groups;\r\n return new Date(year, month - 1, day);\r\n }\r\n }\r\n }\r\n\r\n // 如果都不匹配,返回无效日期\r\n return new Date(NaN);\r\n}\r\n\r\n/**\r\n * 比较两个日期值,支持多种常见格式\r\n * @param a 第一个日期值\r\n * @param b 第二个日期值\r\n * @returns 比较结果:-1 表示 a < b,0 表示 a = b,1 表示 a > b\r\n */\r\nfunction compareDates(a: any, b: any): number {\r\n const aDate = parseDate(a);\r\n const bDate = parseDate(b);\r\n\r\n if (isNaN(aDate.getTime()) && isNaN(bDate.getTime())) {\r\n return 0; // 都是无效日期\r\n }\r\n if (isNaN(aDate.getTime())) {\r\n return -1; // a 是无效日期,排在前面\r\n }\r\n if (isNaN(bDate.getTime())) {\r\n return 1; // b 是无效日期,排在前面\r\n }\r\n\r\n return aDate.getTime() - bDate.getTime();\r\n}\r\nfunction getNumberPrecision(value: unknown): number {\r\n const match = String(value).match(/\\.(\\d+)/);\r\n return match?.[1].length ?? 0;\r\n}\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 parseDate,\r\n compareDates,\r\n filterHiddenColumns,\r\n getNumberPrecision,\r\n};\r\n","import CellImage from './CellImage';\r\nimport 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 visibleWidth = 0;\r\n visibleHeight = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n drawX = 0;\r\n drawY = 0;\r\n cellImages: Map<string, CellImage> = new Map();\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 isInside(x: number, y: number) {\r\n return x >= this.drawX && x <= this.drawX + this.width && y >= this.drawY && y <= this.drawY + this.height;\r\n }\r\n /**\r\n * 判断是否在可见区域,合并单元格用\r\n * @param x \r\n * @param y \r\n * @returns \r\n */\r\n isInsideVisible(x: number, y: number) {\r\n return x >= this.drawX && x <= this.drawX + this.visibleWidth && y >= this.drawY && y <= this.drawY + this.visibleHeight && this.isInside(x, y);\r\n }\r\n setImage(key: string, image: CellImage) {\r\n this.cellImages.set(key, image);\r\n }\r\n getImages() {\r\n return this.cellImages;\r\n }\r\n getImage(key: string) {\r\n return this.cellImages.get(key);\r\n }\r\n isImageInside(key: string, e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const image = this.getImage(key);\r\n if (image) {\r\n return image.isInside(offsetX, offsetY);\r\n }\r\n return false;\r\n }\r\n}\r\n","import Context from \"./Context\";\r\nimport { RectOptions } from \"./Paint\";\r\n\r\nexport default class CellImage {\r\n source?: HTMLImageElement;\r\n name: string;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visible = true;\r\n constructor(name: string, x: number, y: number, width: number, height: number, source?: HTMLImageElement) {\r\n this.source = source;\r\n this.name = name;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n drawWrapper(ctx: Context, options: RectOptions) {\r\n ctx.paint.drawRect(this.x - 2, this.y - 2, this.width + 4, this.height + 4, {\r\n radius: 4,\r\n borderWidth: 1,\r\n ...options,\r\n });\r\n }\r\n setVisible(visible: boolean) {\r\n this.visible = visible;\r\n }\r\n isInside(\r\n mouseX: number,\r\n mouseY: number\r\n ) {\r\n if (!this.visible) {\r\n return false;\r\n }\r\n if (this.source && mouseX > this.x && mouseX < this.x + this.width && mouseY > this.y && mouseY < this.y + this.height) {\r\n return true;\r\n }\r\n return false;\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 LineClampType,\n RenderType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nimport CellImage from './CellImage';\nexport default class Cell extends BaseCell {\n parentRowKey: string = '';\n parentRowKeys: string[] = [];\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 domDataset: 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 drawTextFont = '';\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n autoRowHeight = false; // 是否启用行高自适应\n calculatedHeight = 0; // 计算出的自适应高度\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n maxLineClamp: LineClampType = 'auto';\n precision?: number = undefined;\n min?: number = undefined;\n max?: number = undefined;\n maxlength?: number = undefined;\n mixedRender?: boolean = false;\n renderType: RenderType = 'default';\n renderFooterType: RenderType = 'default';\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 isUpdate = true, // 是否更新,虚拟的时候可能不需要更新,解决性能问题\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 =\n column.selectorCellValueType || this.ctx.config.SELECTOR_CELL_VALUE_TYPE || 'value';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign = column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\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.autoRowHeight =\n column.autoRowHeight !== undefined ? column.autoRowHeight : this.ctx.config.AUTO_ROW_HEIGHT;\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.maxLineClamp = column.maxLineClamp || 'auto';\n this.precision = column.precision;\n this.min = column.min;\n this.max = column.max;\n this.maxlength = column.maxlength;\n this.mixedRender = column.mixedRender || false;\n this.renderType = column.renderType || 'default';\n this.renderFooterType = column.renderFooterType || 'default';\n const rowItem = this.ctx.database.getRowForRowKey(this.rowKey);\n if (this.cellType === 'body' && rowItem) {\n this.parentRowKey = rowItem.parentRowKey;\n this.parentRowKeys = rowItem.parentRowKeys;\n }\n if (isUpdate) {\n this.update();\n }\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.updateSpan();\n this.updateDragImage();\n const dragImage = this.getImage('drag');\n const drawDragImageWidth = dragImage ? dragImage.width : 0;\n this.drawTextX = this.drawX + drawDragImageWidth;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.drawTextWidth = this.visibleWidth - drawDragImageWidth;\n this.drawTextHeight = this.visibleHeight;\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\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 if (this.autoRowHeight) {\n // 自适应行高\n this.domDataset = {\n 'data-auto-height': true,\n 'data-row-index': this.rowIndex,\n 'data-col-index': this.colIndex,\n };\n }\n this.style = this.getOverlayerViewsStyle();\n }\n isInsideVisible(x: number, y: number) {\n return x >= this.drawX && x <= this.drawX + this.visibleWidth && y >= this.drawY && y <= this.drawY + this.visibleHeight;\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 (!(['tree', 'selection-tree', 'tree-selection'].includes(this.type) && cellType === 'body')) {\n return;\n }\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 // 计算树形图标的偏移量\n const { TREE_INDENT = 16, CHECKBOX_SIZE, TREE_ICON_SIZE } = this.ctx.config;\n iconOffsetX = level * TREE_INDENT;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\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 }\n let iconWidth = TREE_ICON_SIZE;\n let iconHeight = TREE_ICON_SIZE;\n let drawX = this.drawX;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (this.visibleWidth - iconWidth - 2 * CELL_PADDING) / 2;\n // 居中对齐,改成左对齐\n this.align = 'left';\n }\n let iconX = drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n let drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n const selectionImage = this.getImage('selection');\n const dragImage = this.getImage('drag');\n const dragImageWidth = dragImage ? dragImage.width : 0;\n if (this.type === 'selection-tree' && selectionImage) {\n const selectionImageX = selectionImage.x;\n const selectionImageWidth = selectionImage.width;\n // 树形图标在左侧,checkbox 在树形图标右侧\n iconX = iconOffsetX + selectionImageX + selectionImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n } else if (this.type === 'tree-selection') {\n // 树形选择,两个图标宽度,文本已经有CELL_PADDING间距,/2看起来好看些\n iconX += dragImageWidth;\n drawTextX = iconX + CHECKBOX_SIZE + iconWidth - CELL_PADDING / 2;\n } else {\n // 普通tree,文本已经有CELL_PADDING间距,/2看起来好看些\n iconX += dragImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n }\n // 更改文本距离\n this.drawTextX = drawTextX;\n this.drawTextWidth = this.drawX + this.visibleWidth - drawTextX; // 减去树形图标的宽度\n // 判断是否溢出格子\n if (iconX + iconWidth + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + iconHeight + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n // 不论是否需要绘制图标,都更新图标的“基准位置”,供树线使用\n this.setImage('tree', new CellImage(iconName, iconX, iconY, iconWidth, iconHeight, icon));\n // 树连线仅在绘制阶段调用,避免在 update 阶段被清屏\n }\n private updateDragImage() {\n if (this.cellType === 'body' && this.column.dragRow) {\n const { DRAG_ROW_ICON_SIZE, CELL_PADDING } = this.ctx.config;\n const dragImageX = this.drawX + CELL_PADDING / 2;\n const dragImageY = this.drawY + (this.visibleHeight - DRAG_ROW_ICON_SIZE) / 2;\n const dragImage = new CellImage('drag', dragImageX, dragImageY, DRAG_ROW_ICON_SIZE, DRAG_ROW_ICON_SIZE, this.ctx.icons.get('drag'));\n if (this.rowspan === 0) {\n dragImage.setVisible(false);\n }\n this.setImage('drag', dragImage);\n }\n }\n private drawTreeLine() {\n const { TREE_LINE, TREE_INDENT = 16, TREE_ICON_SIZE = 16, TREE_LINE_COLOR = '#e1e6eb' } = this.ctx.config;\n // 仅 body 且树类型才绘制\n if (!TREE_LINE || this.cellType !== 'body') return;\n if (!['tree', 'selection-tree', 'tree-selection'].includes(this.type)) return;\n if (this.rowspan === 0 || this.colspan === 0) return;\n\n const row = this.ctx.database.getRowForRowKey(this.rowKey) || {};\n const level: number = row.level ?? 0;\n // 以当前树图标为中心点\n const treeImage = this.getImage('tree');\n if (!treeImage) return;\n const treeImageX = treeImage.x;\n const treeImageY = treeImage.y;\n const treeImageWidth = treeImage.width;\n const treeImageHeight = treeImage.height;\n const iconCenterX = treeImageX + treeImageWidth / 2;\n const iconCenterY = treeImageY + treeImageHeight / 2;\n\n // 基于已计算的树图标位置反推基准点:当前图标左侧减去 level * TREE_INDENT\n // 这样无论对齐方式如何(left/center/right),都以实际图标为基准定位所有竖线\n let baseX = treeImageX - level * TREE_INDENT;\n\n // 逐层画竖线(仅当 level > 0 才需要祖先连线)\n const parentRowKeys: string[] = Array.isArray(row.parentRowKeys) ? row.parentRowKeys : [];\n if (level > 0) {\n // 祖先层(0..level-2):是否继续取决于该层“下一层链路节点”是否为最后子项\n // 例如当前节点 0-2-1:\n // - 对 i=0(根 0 对应竖线),应看其下一层链路节点 0-2 是否为最后子项。\n // 若 0-2 是最后子项(没有 0-3),则 i=0 的竖线在本行不应出现。\n for (let i = 0; i < level - 1; i += 1) {\n const nextKey = parentRowKeys[i + 1];\n const nextRow = nextKey ? this.ctx.database.getRowForRowKey(nextKey) || {} : {};\n const nextIsLast = !!nextRow.isLastChild;\n if (nextIsLast) continue;\n // 以当前树图标 X 为基准向左回推\n const vx = Math.round(treeImageX - (level - i) * TREE_INDENT + TREE_ICON_SIZE / 2);\n this.ctx.paint.drawLine([vx, this.drawY, vx, this.drawY + this.visibleHeight], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n }\n // 父层(level-1):无论父是不是末尾,都需要连接当前节点形成 L 型\n const vxParent = Math.round(treeImageX - TREE_INDENT + TREE_ICON_SIZE / 2);\n const toCenter = !!row.isLastChild;\n const y2 = toCenter ? iconCenterY : this.drawY + this.visibleHeight;\n this.ctx.paint.drawLine([vxParent, this.drawY, vxParent, y2], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n // 当前层的横线:从当前层竖线到图标中心\n const currVX = Math.round(baseX + (level - 1) * TREE_INDENT + TREE_ICON_SIZE / 2);\n this.ctx.paint.drawLine([currVX, iconCenterY, iconCenterX, iconCenterY], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\n }\n\n // 1) 父节点行:在图标正下画一段短竖线(展开时绘制,符合视觉预期)\n if (row.hasChildren && row.expand) {\n const shortTop = treeImageY + treeImageHeight;\n const shortBottom = this.drawY + this.visibleHeight;\n this.ctx.paint.drawLine([iconCenterX, shortTop, iconCenterX, shortBottom], {\n borderColor: TREE_LINE_COLOR,\n borderWidth: 1,\n lineDash: [4, 4],\n lineDashOffset: 0,\n });\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 FINDER_CELL_BG_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, font } =\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 if (font) {\n this.drawTextFont = font;\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 && !this.ctx.dragRowIng) {\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 && !this.ctx.dragRowIng) {\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 // 只读\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, font } =\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 if (font) {\n this.drawTextFont = font;\n }\n }\n // 高亮查找结果\n const { rowIndex, colIndex, type } = this.ctx.finderBar;\n if (rowIndex === this.rowIndex && colIndex === this.colIndex && type === 'body') {\n bgColor = FINDER_CELL_BG_COLOR;\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 if (!['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(type)) {\n return;\n }\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n let drawX = this.drawX + CELL_PADDING;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n }\n let iconX = drawX;\n let iconY = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n\n // 对于 selection-tree 类型,checkbox 应该居中显示\n if (type === 'selection-tree') {\n } else if (type === 'tree-selection') {\n // 更新选择器的位置\n const { TREE_INDENT = 16, TREE_ICON_SIZE } = this.ctx.config;\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { level = 0 } = row || {};\n const iconOffsetX = level * TREE_INDENT;\n iconX = drawX + TREE_ICON_SIZE + iconOffsetX; // 树形图标右侧 + 间距\n }\n\n let checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n\n if (type === 'selection-tree' || type === 'tree-selection') {\n // 树形选择逻辑\n const treeState = this.ctx.database.getTreeSelectionState(rowKey);\n if (treeState.indeterminate && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else if (treeState.checked && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (!treeState.checked && 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 } else {\n // 普通选择逻辑\n const check = this.ctx.database.getRowSelection(rowKey);\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 }\n const dragImage = this.getImage('drag');\n const drawDragImageWidth = dragImage ? dragImage.width : 0;\n iconX += drawDragImageWidth;\n // 判断是否溢出格子\n if (iconX + CHECKBOX_SIZE + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + CHECKBOX_SIZE + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n const selectionImage = new CellImage(checkboxName, iconX, iconY, CHECKBOX_SIZE, CHECKBOX_SIZE, checkboxImage);\n if (type === 'index-selection') {\n selectionImage.setVisible(false);\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n selectionImage.setVisible(true);\n }\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n const hoverCell = this.ctx.hoverCell;\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n if (hoverCell && hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n selectionImage.setVisible(true);\n }\n }\n this.setImage('selection', selectionImage);\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 && !this.ctx.dragRowIng && 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 const hoverImage = new CellImage(this.hoverIconName, _x, _y, CELL_HOVER_ICON_SIZE, CELL_HOVER_ICON_SIZE, drawImageSource);\n if (this.rowspan === 0 || this.colspan === 0) {\n hoverImage.setVisible(false);\n }\n this.setImage('hover', hoverImage);\n }\n }\n /**\n * 获取自动高度\n * @returns\n */\n getAutoHeight() {\n if (this.cellType !== 'body') {\n return 0;\n }\n if (!this.autoRowHeight) {\n return 0;\n }\n if (this.rowspan === 0) {\n return 0;\n }\n // 如果有渲染函数,使用渲染函数计算高度\n if (this.render) {\n const renderHeight = this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex);\n if (this.rowspan > 1) {\n // 如果计算高度小于可见高度,返回0,表示不显示\n if (renderHeight < this.visibleHeight) {\n return 0;\n }\n return Math.round(renderHeight - (this.visibleHeight - this.height));\n }\n return Math.round(renderHeight);\n }\n if (!(this.displayText && typeof this.displayText === 'string')) {\n return 0;\n }\n\n const { BODY_FONT, CELL_PADDING, CELL_LINE_HEIGHT } = this.ctx.config;\n const cacheTextKey = `${this.displayText}_${this.drawTextWidth}_${this.drawTextFont}`;\n const calculatedHeight = this.ctx.paint.calculateTextHeight(this.displayText, this.drawTextWidth, {\n font: this.drawTextFont || BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color: this.drawTextColor,\n autoRowHeight: this.autoRowHeight,\n lineHeight: CELL_LINE_HEIGHT,\n maxLineClamp: this.maxLineClamp,\n cacheTextKey,\n });\n // 合并单元格处理\n if (this.rowspan > 1) {\n // 如果计算高度小于可见高度,返回0,表示不显示\n if (calculatedHeight < this.visibleHeight) {\n return 0;\n }\n return Math.round(calculatedHeight - (this.visibleHeight - this.height));\n }\n // 转成整数\n return Math.round(calculatedHeight);\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 && this.renderFooterType === 'default') {\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 // 自定义渲染为 default 且非混合渲染时不显示 canvas 文本\n if (this.render && this.renderType === 'default' && !this.mixedRender) {\n return '';\n }\n const selectionImage = this.getImage('selection');\n if (this.type === 'index-selection' && selectionImage && selectionImage.visible) {\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 // 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;\n let top = this.drawY - this.ctx.body.y;\n // 固定列\n if (this.fixed === 'left') {\n left = this.drawX;\n } else if (this.fixed === 'right') {\n left = this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth);\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = this.drawY - this.ctx.footer.y;\n }\n }\n // 定位到居中\n if (this.autoRowHeight && this.render && this.verticalAlign === 'middle') {\n const renderHeight = this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex);\n if (renderHeight < this.visibleHeight && renderHeight > 0) {\n const remainTop = (this.visibleHeight - renderHeight) / 2;\n top = top + remainTop;\n }\n }\n // 防止覆盖层叠加显示,直接隐藏后显示\n if (this.autoRowHeight && this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex) === 0) {\n left = -99999;\n top = -99999;\n }\n let autoStyle = {};\n if (this.rowspan === 0) {\n autoStyle = {\n display: 'none',\n };\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left: `${Math.round(left - 1)}px`,\n top: `${Math.round(top - 1)}px`,\n width: `${this.visibleWidth}px`,\n height: this.autoRowHeight && this.renderType === 'default' ? 'auto' : `${this.visibleHeight}px`,\n // height: `${this.visibleHeight}px`,\n // minHeight: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n ...autoStyle,\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.drawTreeLine();\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, CELL_LINE_HEIGHT } = this.ctx.config;\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 if (['', null, undefined].includes(text)) {\n return false;\n }\n // 如果text 不是字符串,则转换为字符串\n if (typeof text !== 'string') {\n text = `${text}`;\n }\n const cacheTextKey = `${text}_${this.drawTextWidth}_${this.drawTextFont}`;\n this.ellipsis = this.ctx.paint.drawText(\n text,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: this.drawTextFont || BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n autoRowHeight: this.autoRowHeight,\n lineHeight: CELL_LINE_HEIGHT,\n maxLineClamp: this.maxLineClamp,\n cacheTextKey,\n layoutCallback: (layout) => {\n this.ctx.emit(\n 'registerTextLayout',\n `${this.cellType}-${this.rowIndex}-${this.colIndex}`,\n layout,\n );\n },\n },\n );\n return this.ellipsis;\n }\n private drawImage() {\n // 遍历cellImages\n this.getImages().forEach((image, key) => {\n if (image.visible && image.source) {\n if (key === 'hover') {\n // 绘制hover图标背景\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n image.drawWrapper(this.ctx, {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n });\n }\n this.ctx.paint.drawImage(\n image.source,\n image.x,\n image.y,\n image.width,\n image.height,\n );\n }\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 ErrorResult,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n SortByType,\n SortStateMap,\n CustomHeader,\n Fixed,\n RowMaxHeightData,\n ErrorItem,\n} from './types';\nimport { generateShortUUID, toLeaf, compareDates, getNumberPrecision } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\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 customHeader: CustomHeader = {\n fixedData: {},\n sortData: {},\n hideData: {},\n resizableData: {},\n };\n\n overlayerAutoHeightMap = new Map<string, number>();\n private maxRowHeightCellMap = new Map<string, RowMaxHeightData>(); // 记录每行的计算高度(按 rowKey 存储)\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 private sortState: SortStateMap = new Map();\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.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.ctx.paint.clearTextCache();\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 this.maxRowHeightCellMap.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?.includes('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 const siblingsLength = dataList.length;\n const {\n ROW_KEY = '',\n DEFAULT_EXPAND_ALL,\n CELL_HEIGHT,\n SELECTABLE_METHOD,\n CHECKBOX_KEY,\n TREE_CHILDREN_KEY,\n } = this.ctx.config;\n dataList.forEach((item, index) => {\n if (TREE_CHILDREN_KEY !== 'children') {\n item.children = item[TREE_CHILDREN_KEY];\n }\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 calculatedHeight: -1,\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 parentRowKey: parentRowKeys[parentRowKeys.length - 1] || '',\n isLastChild: index === siblingsLength - 1,\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 setBatchRowHeight(rowIndexHeightList: { rowIndex: number; height: number }[]) {\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n }\n });\n this.clearBufferData(); // 清除缓存数据\n }\n // 批量设置计算行高度\n setBatchCalculatedRowHeight(rowIndexHeightList: { rowIndex: number; height: number }[]): boolean {\n // 判断是否需要更新\n const isNoNeedUpdate = rowIndexHeightList.every(({ height, rowIndex }) => {\n const position = this.getPositionForRowIndex(rowIndex);\n return position.calculatedHeight === height;\n });\n if (isNoNeedUpdate) {\n return false;\n }\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n const { height: rowMaxHeight = -1 } = this.getMaxRowHeightItem(rowKey) || {};\n row.calculatedHeight = Math.max(height, rowMaxHeight);\n }\n });\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n return true;\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 generateColumns(columns: Column[]): Column[] {\n const _generateColumns = (columns: Column[]): Column[] => {\n return columns.map((column: Column) => {\n const children =\n column.children && Array.isArray(column.children) ? _generateColumns(column.children) : undefined;\n const dataMap = {\n hide: this.customHeader?.hideData?.[column.key],\n fixed: this.customHeader?.fixedData?.[column.key],\n sort: this.customHeader?.sortData?.[column.key],\n width: this.customHeader?.resizableData?.[column.key],\n };\n const obj: any = {};\n for (const [key, value] of Object.entries(dataMap)) {\n if (value !== undefined) obj[key] = value;\n }\n const allHide = children && children.every((item) => item.hide); // 所有子项都隐藏那父级也要隐藏\n return {\n ...column,\n children,\n hide: allHide || (typeof column.hide === 'function' ? column.hide(column) : column.hide),\n ...obj,\n };\n });\n };\n return _generateColumns(columns);\n }\n getColumns() {\n const list = this.generateColumns(this.columns);\n return list;\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n this.init();\n }\n getOriginalData() {\n return this.data;\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, calculatedHeight } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n // 计算行高度和设置高度取最大\n const _height = Math.max(calculatedHeight, height);\n this.sumHeight += _height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height: _height,\n bottom: this.sumHeight,\n calculatedHeight: calculatedHeight,\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 // 说明需要排序\n if (this.sortState.size) {\n // 按时间戳排序,最早的先排序\n const sortedEntries = Array.from(this.sortState.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp);\n // 对 sortedData 进行排序\n _data = this.sortDataRecursive(_data, sortedEntries);\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 /**\n * 获取排序状态\n */\n getSortState(key: string) {\n return this.sortState.get(key) || { direction: 'none' as const, timestamp: 0 };\n }\n\n /**\n * 设置排序状态\n */\n setSortState(key: string, direction: 'asc' | 'desc' | 'none') {\n const timestamp = Date.now();\n if (this.ctx.config.SORT_STRICTLY) {\n // 严格排序,清除所有排序状态\n this.sortState.clear();\n }\n if (direction === 'none') {\n // 清除排序状态\n this.sortState.delete(key);\n } else {\n this.sortState.set(key, { direction, timestamp });\n }\n this.ctx.emit('sortChange', this.sortState);\n this.clearBufferData();\n this.ctx.emit('draw');\n }\n\n /**\n * 清除所有排序状态\n */\n clearSort() {\n this.sortState.clear();\n this.ctx.emit('sortChange', this.sortState);\n this.clearBufferData();\n this.ctx.emit('draw');\n }\n\n /**\n * 递归排序方法,支持树形数据\n * @param data 要排序的数据\n * @param sortedEntries 排序条目,按时间戳排序\n * @returns 排序后的数据\n */\n private sortDataRecursive(\n data: any[],\n sortedEntries: [string, { direction: 'asc' | 'desc' | 'none'; timestamp: number }][],\n ): any[] {\n // 对当前层级进行排序\n let sortedData = [...data];\n\n // 逐层应用排序条件\n for (const [key, { direction }] of sortedEntries) {\n if (direction === 'none') continue;\n\n const cellHeader = this.getColumnByKey(key);\n if (!cellHeader || !cellHeader.column.sortBy) continue;\n\n // 对当前层级进行单列排序\n sortedData = this.applySingleColumnSort(sortedData, key, direction, cellHeader.column.sortBy);\n }\n\n // 递归处理子节点\n return sortedData.map((item) => {\n if (item.children && Array.isArray(item.children)) {\n item.children = this.sortDataRecursive(item.children, sortedEntries);\n }\n return item;\n });\n }\n\n /**\n * 对数组进行单列排序\n * @param data 要排序的数据\n * @param key 排序的列键\n * @param direction 排序方向\n * @param sortBy 排序类型\n * @returns 排序后的数据\n */\n private applySingleColumnSort(data: any[], key: string, direction: 'asc' | 'desc', sortBy: SortByType): any[] {\n return data.sort((a, b) => {\n const aValue = a[key];\n const bValue = b[key];\n\n let comparison = 0;\n\n if (typeof sortBy === 'function') {\n comparison = sortBy(a, b);\n } else if (sortBy === 'number') {\n const aNum = Number(aValue) || 0;\n const bNum = Number(bValue) || 0;\n comparison = aNum - bNum;\n } else if (sortBy === 'string') {\n const aStr = String(aValue || '');\n const bStr = String(bValue || '');\n comparison = aStr.localeCompare(bStr);\n } else if (sortBy === 'date') {\n comparison = compareDates(aValue, bValue);\n }\n return direction === 'asc' ? comparison : -comparison;\n });\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(\n _list: ChangeItem[],\n history = false,\n checkReadonly = true,\n historyAcion: HistoryAction = 'none',\n ) {\n let historyList: HistoryItemData[] = [];\n let _checkReadonly = checkReadonly;\n // key 为字符串,value 为行数据\n const rowList: Map<string, any> = new Map();\n const errList: ErrorItem[] = [];\n let changeList: BeforeValueChangeItem[] = [];\n for (const item of _list) {\n const { rowKey, key } = item;\n let value = item.value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n const _changeItem: BeforeValueChangeItem = {\n ...item,\n oldValue,\n row,\n };\n if (cell?.type === 'number') {\n if (['', undefined, null].includes(value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(String(value))) {\n // 正则获取小数点后的精度\n const precision = getNumberPrecision(value);\n if (typeof cell.precision === 'number' && cell.precision >= 0 && precision > cell.precision) {\n const factor = 10 ** cell.precision;\n value = Math.round(Number(value) * factor) / factor;\n const message = this.ctx.locale.getText('numberTruncated', { precision: cell.precision });\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_PRECISION',\n message,\n });\n } else if (typeof cell.min === 'number' && Number(value) < cell.min) {\n const message = this.ctx.locale.getText('numberMin', { min: cell.min });\n value = cell.min;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_MIN',\n message,\n });\n } else if (typeof cell.max === 'number' && Number(value) > cell.max) {\n const message = this.ctx.locale.getText('numberMax', { max: cell.max });\n value = cell.max;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_NUMBER_MAX',\n message,\n });\n } else {\n value = Number(value);\n }\n } else {\n value = oldValue;\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_INVALID_NUMBER',\n message: this.ctx.locale.getText('invalidNumber'),\n });\n }\n } else if (\n cell?.editorType === 'text' &&\n typeof cell.maxlength === 'number' &&\n String(value).length > cell.maxlength\n ) {\n value = String(value).slice(0, cell.maxlength);\n const message = this.ctx.locale.getText('stringMaxlength', { maxlength: cell.maxlength });\n errList.push({\n ..._changeItem,\n column: cell?.column,\n code: 'ERR_STRING_MAXLENGTH',\n message,\n });\n }\n // 过滤无效项和相同值项\n if (value !== oldValue) {\n changeList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n if (errList.length) {\n const err: ErrorResult = {\n code: 'ERR_BATCH_SET_ITEM_VALUE',\n message: this.ctx.locale.getText('batchSetItemValueError'),\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 (historyAcion === 'none' && typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n _checkReadonly = false; // 允许编辑只读\n }\n const promsieValidators: Promise<unknown>[] = [];\n changeList.forEach((data) => {\n promsieValidators.push(this.getValidator(data.rowKey, data.key));\n const { value, rowKey, key, row } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowList.set(rowKey, row);\n // 不加历史,不重绘,不是编辑器,不检验只读\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 const rows = Array.from(rowList.values());\n await Promise.all(promsieValidators);\n // 没有校验错误,且有改变数据,则触发validateChangedData事件\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n const changeListValid = changeList.map((item) => {\n const errorTip = !!this.getValidationError(item.rowKey, item.key).length;\n return {\n ...item,\n errorTip,\n };\n });\n this.ctx.emit('change', changeListValid, 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 * @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 const changeItem: BeforeChangeItem = {\n rowKey,\n key,\n value,\n oldValue,\n row,\n };\n // 是否是否是编辑器进来的\n if (isEditor) {\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n this.batchSetItemValue([changeItem], history, false);\n this.ctx.emit('editChange', {\n ...changeItem,\n originalValue,\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 ...changeItem,\n originalValue,\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, cellType?: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n\n // 检查是否是树形选择列\n if (cellType === 'selection-tree' || cellType === 'tree-selection') {\n this.toggleTreeSelection(rowKey);\n } else {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n\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 // 切换树形选择状态\n toggleTreeSelection(rowKey: string) {\n const treeState = this.getTreeSelectionState(rowKey);\n const mode = this.ctx.config.TREE_SELECT_MODE;\n if (mode === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 父项选中的情况点击清空父项选择和所有子项选择,其他情况点击父项,勾选父项和所有子项选择(递归)\n if (treeState.checked && !treeState.indeterminate) {\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n } else {\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n }\n } else if (mode === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n if (treeState.checked && !treeState.indeterminate) {\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n } else {\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n }\n } else if (mode === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n }\n\n // 触发选择变化事件\n this.ctx.emit('selectionChange', this.getSelectionRows());\n this.ctx.emit('draw');\n }\n\n // 递归选中树形选择\n private selectTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach((childKey) => {\n this.setRowSelectionByParent(childKey, true);\n this.selectTreeSelectionRecursive(childKey);\n });\n }\n\n // 递归取消树形选择\n private clearTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach((childKey) => {\n this.setRowSelectionByParent(childKey, false);\n this.clearTreeSelectionRecursive(childKey);\n });\n }\n\n // 向上递归更新父项状态\n private updateParentTreeSelection(rowKey: string) {\n const parentKey = this.getTreeParent(rowKey);\n if (!parentKey) {\n return;\n }\n\n // 获取父项的所有直接子项\n const children = this.getTreeChildren(parentKey);\n const childSelections = children.map((childKey) => this.selectionMap.get(childKey));\n const checkedChildren = childSelections.filter((s) => s?.check).length;\n const totalChildren = childSelections.length;\n\n // 计算父项应该的状态\n let parentShouldBeChecked = false;\n if (totalChildren > 0) {\n if (checkedChildren === 0) {\n // 所有子项都未选中,父项应该未选中\n parentShouldBeChecked = false;\n } else if (checkedChildren === totalChildren) {\n // 所有子项都选中,父项应该选中\n parentShouldBeChecked = true;\n } else {\n // 部分子项选中,父项应该半选\n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式下半选算作选中\n parentShouldBeChecked = true;\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式下半选不算作选中\n parentShouldBeChecked = false;\n }\n }\n }\n\n // 更新父项状态\n const parentSelection = this.selectionMap.get(parentKey);\n if (parentSelection && parentSelection.check !== parentShouldBeChecked) {\n parentSelection.check = parentShouldBeChecked;\n this.setRowSelectionByCheckboxKey(parentKey, parentShouldBeChecked);\n\n // 递归更新更上层的父项\n this.updateParentTreeSelection(parentKey);\n }\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\n // 如果是树形选择模式,需要向上递归更新父项状态\n if (this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n this.updateParentTreeSelection(rowKey);\n }\n\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n setRowSelectionByParent(rowKey: string, check: boolean) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\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 // 获取树形选择状态\n getTreeSelectionState(rowKey: string) {\n const row = this.getRowForRowKey(rowKey);\n if (!row) {\n return { checked: false, indeterminate: false };\n }\n\n const selectionMap = this.selectionMap.get(rowKey);\n const checked = selectionMap?.check || false;\n\n // 计算半选状态\n const children = this.getTreeChildren(rowKey);\n if (children.length === 0) {\n return { checked, indeterminate: false };\n }\n\n let indeterminate = false;\n let finalChecked = checked;\n\n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 其中半选是算在最终选择的数据里面的\n\n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n\n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map((descKey) => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter((s) => s?.check).length;\n const totalDescendants = descendantSelections.length;\n\n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || someChecked; // 自身选中或有后代选中就算选中(包括半选)\n\n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n\n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map((descKey) => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter((s) => s?.check).length;\n const totalDescendants = descendantSelections.length;\n\n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || allChecked; // 只有全选才算选中,半选不算选中\n\n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n } else if (this.ctx.config.TREE_SELECT_MODE === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n indeterminate = false;\n finalChecked = checked;\n }\n\n const result = { checked: finalChecked, indeterminate };\n return result;\n }\n\n // 获取树形子节点\n getTreeChildren(rowKey: string): string[] {\n const row = this.getRowForRowKey(rowKey);\n if (!row || !row.item || !row.item.children) {\n return [];\n }\n\n const children: string[] = [];\n const collectChildren = (items: any[]) => {\n for (const item of items) {\n const itemKey = this.getRowKeyByItem(item);\n if (itemKey) {\n children.push(itemKey);\n }\n if (item.children && item.children.length > 0) {\n collectChildren(item.children);\n }\n }\n };\n\n collectChildren(row.item.children);\n return children;\n }\n\n // 获取树形父节点\n getTreeParent(rowKey: string): string | null {\n const findParent = (data: any[], targetKey: string): string | null => {\n for (const item of data) {\n const itemKey = this.getRowKeyByItem(item);\n if (item.children) {\n for (const child of item.children) {\n const childKey = this.getRowKeyByItem(child);\n if (childKey === targetKey) {\n return itemKey;\n }\n const result = findParent(item.children, targetKey);\n if (result) {\n return result;\n }\n }\n }\n }\n return null;\n };\n\n return findParent(this.data, rowKey);\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 // 检查是否是树形选择模式\n const isTreeSelectionMode =\n this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n\n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\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 // 直接设置选中状态,跳过递归计算\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = true;\n this.setRowSelectionByCheckboxKey(rowKey, true);\n }\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\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 }\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 const isTreeSelectionMode =\n this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\n this.rowKeyMap.forEach((_, rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = false;\n this.setRowSelectionByCheckboxKey(rowKey, false);\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\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 calculatedHeight: 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\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 // 只读不验证\n const readonly = this.ctx.database.getReadonly(rowKey, key);\n if (readonly) {\n return new Promise((resolve) => {\n resolve([]);\n });\n }\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 (row === undefined || 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 setValidationErrorByRowKey(rowKey: string, key: string, message: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowKey(rowKey);\n const rowIndex = row?.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, isUpdate = true) {\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', isUpdate);\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 * 计算树形数据的最大深度\n * @param data 树形数据\n * @param currentDepth 当前深度\n * @returns 最大深度\n */\n private calculateMaxTreeDepth(data: any[], currentDepth: number = 0): number {\n let maxDepth = currentDepth;\n\n data.forEach((item) => {\n if (Array.isArray(item.children) && item.children.length > 0) {\n const childMaxDepth = this.calculateMaxTreeDepth(item.children, currentDepth + 1);\n maxDepth = Math.max(maxDepth, childMaxDepth);\n }\n });\n\n return maxDepth;\n }\n setOverlayerAutoHeightMap(map: Map<string, number>) {\n this.overlayerAutoHeightMap = map;\n }\n getOverlayerAutoHeightMap() {\n return this.overlayerAutoHeightMap;\n }\n getOverlayerAutoHeight(rowIndex: number, colIndex: number) {\n const key = `${rowIndex}\\u200b_${colIndex}`;\n const height = this.overlayerAutoHeightMap.get(key) || 0;\n return height;\n }\n setCustomHeader(customHeader: CustomHeader, ignoreEmit = false) {\n (['fixedData', 'sortData', 'hideData', 'resizableData'] as (keyof CustomHeader)[]).forEach((key) => {\n const value = customHeader[key];\n if (value !== undefined) {\n this.customHeader[key] = value as any;\n }\n });\n if (!ignoreEmit) {\n const obj = this.clearCustomHeaderInvalidValues(this.columns);\n this.ctx.emit('customHeaderChange', obj);\n }\n }\n resetCustomHeader() {\n this.customHeader = {};\n this.ctx.emit('resetHeader');\n this.ctx.emit('customHeaderChange', this.customHeader);\n }\n getCustomHeader() {\n return this.customHeader;\n }\n setCustomHeaderResizableData(key: string, width: number) {\n // 统一设置方法\n let { resizableData = {} } = this.customHeader;\n resizableData[key] = width;\n this.setCustomHeader({\n resizableData,\n });\n }\n setCustomHeaderHideData(keys: string[], hide: boolean) {\n let { hideData = {} } = this.customHeader;\n keys.forEach((key) => {\n hideData[key] = hide;\n });\n this.setCustomHeader({\n hideData,\n });\n this.ctx.emit('resetHeader');\n }\n setCustomHeaderFixedData(keys: string[], fixed: Fixed | '') {\n let { fixedData = {} } = this.customHeader;\n keys.forEach((key) => {\n fixedData[key] = fixed;\n });\n this.setCustomHeader({\n fixedData,\n });\n this.ctx.emit('resetHeader');\n }\n // 递归处理\n clearCustomHeaderInvalidValues(columns: Column[]) {\n const clearCustomHeaderInvalidValues = (columns: Column[], customHeader: CustomHeader = {}) => {\n columns.forEach((column) => {\n if (column.children && column.children.length > 0) {\n clearCustomHeaderInvalidValues(column.children, customHeader);\n }\n // 用一个小的 helper 函数,减少重复代码\n const assignIfDifferent = (field: keyof CustomHeader, columnValue: any) => {\n const value = this.customHeader[field]?.[column.key];\n if (value !== undefined && value !== columnValue) {\n if (!customHeader[field]) {\n customHeader[field] = {} as any;\n }\n (customHeader[field] as any)[column.key] = value;\n // 如果固定源数据为空,则删除\n if (field === 'fixedData' && !value && !columnValue) {\n delete customHeader[field]?.[column.key];\n }\n }\n };\n assignIfDifferent('fixedData', column.fixed);\n assignIfDifferent('sortData', column.sort);\n assignIfDifferent('hideData', column.hide);\n assignIfDifferent('resizableData', column.width);\n });\n };\n let obj: CustomHeader = {};\n clearCustomHeaderInvalidValues(columns, obj);\n return obj;\n }\n setMaxRowHeightItem(rowKey: string, key: string, height: number) {\n this.maxRowHeightCellMap.set(rowKey, {\n key,\n height,\n });\n }\n getMaxRowHeightItem(rowKey: string) {\n return this.maxRowHeightCellMap.get(rowKey);\n }\n clearChangeData() {\n this.changedDataMap.clear();\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, 'back');\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, 'forward');\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype ListenerEntry = {\r\n target: EventTarget;\r\n name: string;\r\n fn: EventListenerOrEventListenerObject;\r\n options?: AddEventListenerOptions | boolean;\r\n};\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: Set<ListenerEntry> = new Set();\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 this.bind(document, '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 }\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 const entries = Array.from(this.eventTasks);\r\n entries.forEach(({ target, name, fn, options }) => {\r\n this.unbind(target, name, fn, options);\r\n });\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.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n const _e = e as MouseEvent;\r\n const rect = this.ctx.containerElement.getBoundingClientRect();\r\n const x = this.ctx.zoomScale.toLogical(_e.clientX - rect.left);\r\n const y = this.ctx.zoomScale.toLogical(_e.clientY - rect.top);\r\n this.ctx.mouseX = x;\r\n this.ctx.mouseY = y;\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 // 拖拽表头中不处理\r\n if (this.ctx.dragHeaderIng) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n const _e = e as WheelEvent;\r\n const { ENABLE_ZOOM_WHEEL } = this.ctx.config;\r\n if (ENABLE_ZOOM_WHEEL && (_e.ctrlKey || _e.metaKey)) {\r\n e.preventDefault();\r\n const delta = _e.deltaY > 0 ? -0.1 : 0.1;\r\n this.ctx.setZoom(this.ctx.getZoom() + delta);\r\n return;\r\n }\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.add({ target, name, fn, options });\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean): void {\r\n target.removeEventListener(name, fn as EventListener, options as any);\r\n for (const entry of this.eventTasks) {\r\n if (entry.target === target && entry.name === name && entry.fn === fn) {\r\n this.eventTasks.delete(entry);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\n\ntype EventMap = Map<string, EventCallback[]>;\n\nclass EventBus {\n private events: EventMap = new Map();\n constructor() {}\n has(event: string): boolean {\n return this.events.has(event);\n }\n // 订阅事件\n on(event: string, callback: EventCallback): void {\n const callbacks = this.events.get(event) || [];\n callbacks.push(callback);\n this.events.set(event, callbacks);\n }\n // 一次性订阅事件\n once(event: string, callback: EventCallback) {\n const onceCallback: EventCallback = (...args) => {\n callback(...args);\n this.off(event, onceCallback);\n };\n this.on(event, onceCallback);\n return this;\n }\n // 取消订阅事件\n off(event: string, callback: EventCallback): void {\n const callbacks = this.events.get(event);\n if (callbacks) {\n const index = callbacks.indexOf(callback);\n if (index >= 0) {\n callbacks.splice(index, 1);\n if (callbacks.length === 0) {\n this.events.delete(event);\n } else {\n this.events.set(event, callbacks);\n }\n }\n }\n }\n // 发布事件\n emit(event: string, ...args: any[]): void {\n const callbacks = this.events.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n }\n\n destroy(): void {\n this.events.clear();\n }\n}\nexport default EventBus;\n","import { Align, LineClampType, VerticalAlign } from './types';\nimport type { TextGlyph, TextLayout, TextLayoutLine, TextLineItem, TextLineSegment } from './TextSelector';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineDashOffset?: 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 autoRowHeight?: boolean;\n lineHeight?: number;\n maxLineClamp?: LineClampType;\n offsetLeft?: number;\n offsetRight?: number;\n textCallback?: (textInfo: TextInfo) => void;\n layoutCallback?: (layout: TextLayout) => void;\n cacheTextKey?: string;\n};\nexport type TextInfo = {\n x: number;\n y: number;\n width: number;\n height: number;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n private textCacheMap = new Map<string, string[]>();\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 getCtx() {\n return this.ctx;\n }\n clearTextCache() {\n this.textCacheMap.clear();\n }\n scale(dpr: number, zoom = 1) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n // dpr 保证清晰度,zoom 实现内容缩放,两者相乘按原生分辨率绘制,不会模糊\n this.ctx.scale(dpr * zoom, dpr * zoom);\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 this.ctx.restore();\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 = options.lineDashOffset ?? 0;\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 maxLineClamp = 1,\n autoRowHeight = false,\n offsetLeft = 0,\n offsetRight = 0,\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n if (['', null, undefined].includes(text)) {\n this.ctx.restore();\n return false;\n }\n const fontSize = parseInt(font.match(/\\d+/)?.[0] || '12');\n const lineHeight = fontSize * (options.lineHeight || 1.2);\n const layout = this.buildTextLayout(text, x, y, width, height, {\n font,\n color,\n align,\n padding,\n verticalAlign,\n maxLineClamp,\n autoRowHeight,\n lineHeight,\n offsetLeft,\n offsetRight,\n });\n this.ctx.textBaseline = 'top';\n this.ctx.textAlign = 'left';\n layout.lines.forEach((line) => {\n this.ctx.fillText(line.text, line.drawX, line.drawY);\n });\n if (options.textCallback && layout.lines.length) {\n const maxLineWidth = layout.lines.reduce((max, line) => Math.max(max, line.width), 0);\n const textMaxWidth = Math.round(maxLineWidth);\n let left = layout.lines[0]?.drawX ?? x + padding + offsetLeft;\n let right = left + textMaxWidth;\n if (align === 'center') {\n left = x + width / 2 - textMaxWidth / 2;\n right = x + width / 2 + textMaxWidth / 2;\n } else if (align === 'right') {\n left = x + width - padding - offsetRight - textMaxWidth;\n right = x + width - padding - offsetRight;\n }\n const textInfo = {\n x: layout.lines[0]?.drawX ?? left,\n y: layout.contentY,\n width: textMaxWidth,\n height: layout.lines.length * lineHeight,\n left,\n right,\n top: layout.contentY,\n bottom: layout.contentY + layout.lines.length * lineHeight,\n };\n options.textCallback(textInfo);\n }\n if (options.layoutCallback) {\n options.layoutCallback(layout);\n }\n this.ctx.restore();\n return layout.ellipsis;\n }\n\n private buildTextLayout(\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n options: {\n font: string;\n color: string;\n align: Align;\n padding: number;\n verticalAlign: VerticalAlign;\n maxLineClamp: LineClampType;\n autoRowHeight: boolean;\n lineHeight: number;\n offsetLeft: number;\n offsetRight: number;\n },\n ): TextLayout {\n const {\n font,\n color,\n align,\n padding,\n verticalAlign,\n maxLineClamp,\n autoRowHeight,\n lineHeight,\n offsetLeft,\n offsetRight,\n } = options;\n this.ctx.save();\n this.ctx.font = font;\n const availableWidth = width - padding * 2 - offsetLeft - offsetRight;\n const contentWidth = availableWidth;\n const contentHeight = height - padding * 2;\n const chars = Array.from(text);\n let lines = this.wrapTextToLines(text, availableWidth);\n const maxTextLine = Math.round(contentHeight / lineHeight);\n let totalTextLine = Math.min(lines.length, Math.max(maxTextLine, 1));\n if (maxLineClamp === 'auto' && autoRowHeight) {\n totalTextLine = lines.length;\n } else if (typeof maxLineClamp === 'number' && maxLineClamp < totalTextLine && maxLineClamp !== 1) {\n totalTextLine = maxLineClamp;\n } else {\n if (maxLineClamp === 1) {\n lines = [{ items: chars.map((char, i) => ({ char, sourceIndex: i })), text, caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n totalTextLine = 1;\n }\n if (maxLineClamp === 'auto' && maxTextLine === 1) {\n lines = [{ items: chars.map((char, i) => ({ char, sourceIndex: i })), text, caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n totalTextLine = 1;\n }\n }\n let ellipsis = false;\n const visibleLines = lines.slice(0, totalTextLine);\n if (lines.length > totalTextLine) {\n ellipsis = true;\n const remainingLines = lines.slice(totalTextLine - 1);\n const ellipsisLine = this.buildEllipsisLine(remainingLines, width, padding);\n ellipsisLine.lineIndex = totalTextLine - 1;\n visibleLines[totalTextLine - 1] = ellipsisLine;\n } else if (totalTextLine > 0) {\n const lastLineIndex = totalTextLine - 1;\n const remainingLines = lines.slice(lastLineIndex);\n const remainingText = remainingLines.map((line) => line.text).join('');\n const { ellipsis: widthEllipsis } = this.handleEllipsis(remainingText, width, padding, font);\n if (widthEllipsis) {\n ellipsis = true;\n const ellipsisLine = this.buildEllipsisLine(remainingLines, width, padding);\n ellipsisLine.lineIndex = lastLineIndex;\n visibleLines[lastLineIndex] = ellipsisLine;\n }\n }\n const totalTextHeight = visibleLines.length * lineHeight;\n let contentY = y + padding;\n if (verticalAlign === 'middle') {\n contentY = y + (height - totalTextHeight) / 2;\n } else if (verticalAlign === 'bottom') {\n contentY = y + height - totalTextHeight - padding;\n }\n const glyphs: TextGlyph[] = [];\n visibleLines.forEach((line, index) => {\n line.lineIndex = index;\n const segments = this.buildLineSegments(line);\n const lineWidth = segments.reduce((sum, segment) => sum + segment.width, 0);\n let lineX = x + padding + offsetLeft;\n if (align === 'center') {\n lineX = x + (width - lineWidth) / 2;\n } else if (align === 'right') {\n lineX = x + width - padding - offsetRight - lineWidth;\n }\n const lineY = contentY + index * lineHeight;\n line.drawX = lineX;\n line.drawY = lineY;\n line.width = lineWidth;\n line.segments = segments;\n segments.forEach((segment) => {\n if (segment.sourceIndex < 0) {\n return;\n }\n glyphs.push({\n char: segment.char,\n index: segment.sourceIndex,\n line: index,\n x: lineX + segment.x,\n y: lineY,\n width: segment.width,\n height: lineHeight,\n });\n });\n });\n this.ctx.restore();\n return {\n text,\n chars,\n glyphs,\n lines: visibleLines,\n box: { x, y, width, height },\n contentBox: { x: x + padding + offsetLeft, y: y + padding, width: contentWidth, height: contentHeight },\n contentY,\n lineHeight,\n font,\n color,\n align,\n ellipsis,\n };\n }\n\n private wrapTextToLines(text: string, maxWidth: number): TextLayoutLine[] {\n if (!text) {\n return [{ items: [], text: '', caretIndex: 0, lineIndex: 0, drawX: 0, drawY: 0, width: 0, segments: [] }];\n }\n const chars = Array.from(text);\n const lines: TextLayoutLine[] = [];\n let currentItems: TextLineItem[] = [];\n let currentWidth = 0;\n let lineCaretIndex = 0;\n\n const flushLine = (nextCaretIndex: number) => {\n const lineText = currentItems.map((item) => item.char).join('');\n lines.push({\n items: currentItems,\n text: lineText,\n caretIndex: lineCaretIndex,\n lineIndex: lines.length,\n drawX: 0,\n drawY: 0,\n width: 0,\n segments: [],\n });\n currentItems = [];\n currentWidth = 0;\n lineCaretIndex = nextCaretIndex;\n };\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n if (char === '\\n') {\n flushLine(i + 1);\n continue;\n }\n const charWidth = this.ctx.measureText(char).width;\n if (currentWidth + charWidth > maxWidth && currentItems.length > 0) {\n flushLine(currentItems[currentItems.length - 1].sourceIndex + 1);\n currentItems.push({ char, sourceIndex: i });\n currentWidth = charWidth;\n continue;\n }\n currentItems.push({ char, sourceIndex: i });\n currentWidth += charWidth;\n }\n if (currentItems.length > 0 || lines.length === 0) {\n flushLine(chars.length);\n }\n return lines;\n }\n\n private buildEllipsisLine(remainingLines: TextLayoutLine[], width: number, padding: number): TextLayoutLine {\n const remainingItems = remainingLines.flatMap((line) => line.items);\n const remainingText = remainingItems.map((item) => item.char).join('');\n const { _text, ellipsis } = this.handleEllipsis(remainingText, width, padding, this.ctx.font);\n const contentText = ellipsis ? _text.slice(0, -3) : _text;\n const items: TextLineItem[] = [];\n for (let i = 0; i < contentText.length; i++) {\n const item = remainingItems[i];\n if (!item) {\n break;\n }\n items.push({ char: item.char, sourceIndex: item.sourceIndex });\n }\n if (ellipsis) {\n items.push(\n { char: '.', sourceIndex: -1, ellipsis: true },\n { char: '.', sourceIndex: -1, ellipsis: true },\n { char: '.', sourceIndex: -1, ellipsis: true },\n );\n }\n return {\n items,\n text: _text,\n caretIndex: remainingLines[0]?.caretIndex ?? 0,\n lineIndex: 0,\n drawX: 0,\n drawY: 0,\n width: 0,\n segments: [],\n };\n }\n\n private buildLineSegments(line: TextLayoutLine): TextLineSegment[] {\n const segments: TextLineSegment[] = [];\n let offsetX = 0;\n line.items.forEach((item, itemIndex) => {\n const segmentWidth = this.ctx.measureText(item.char).width;\n segments.push({\n char: item.char,\n itemIndex,\n sourceIndex: item.sourceIndex,\n x: offsetX,\n width: segmentWidth,\n });\n offsetX += segmentWidth;\n });\n return segments;\n }\n\n /**\n * 将文本按宽度换行\n * @param text\n * @param maxWidth\n * @returns\n */\n private wrapText(text: string, maxWidth: number, cacheTextKey = ''): string[] {\n if (!text) return [''];\n // 缓存文本\n if (cacheTextKey && this.textCacheMap.has(cacheTextKey)) {\n return this.textCacheMap.get(cacheTextKey) || [''];\n }\n const lines: string[] = [];\n const paragraphs = text.split('\\n');\n\n for (const paragraph of paragraphs) {\n if (paragraph === '') {\n lines.push('');\n continue;\n }\n\n const words = paragraph.split('');\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine + word;\n const testWidth = this.ctx.measureText(testLine).width;\n if (testWidth <= maxWidth) {\n currentLine = testLine;\n } else {\n if (currentLine) {\n lines.push(currentLine);\n currentLine = word;\n } else {\n // 单个字符也超出宽度,强制换行\n lines.push(word);\n currentLine = '';\n }\n }\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n const result = lines.length > 0 ? lines : [''];\n if (cacheTextKey) {\n this.textCacheMap.set(cacheTextKey, result);\n }\n return result;\n }\n\n /**\n * 计算文本自适应高度\n * @param text\n * @param width\n * @param options\n * @returns 计算出的高度\n */\n calculateTextHeight(text: string = '', width: number, options: DrawTextOptions = {}): number {\n const {\n font = '12px Arial',\n padding = 0,\n align = 'center',\n color = '#495060',\n maxLineClamp = 1,\n cacheTextKey = '',\n } = options;\n this.ctx.save();\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textAlign = align;\n // // 获取字体高度\n const fontSize = parseInt(font.match(/\\d+/)?.[0] || '12');\n const lineHeight = fontSize * (options.lineHeight || 1.2); // 默认行高为字体大小的1.2倍\n\n // 将文本按可用宽度分割成行\n const availableWidth = width - padding * 2;\n const lines = this.wrapText(text, availableWidth, cacheTextKey);\n // 计算总行数\n let totalLines = 1;\n if (maxLineClamp === 'auto') {\n totalLines = lines.length;\n } else {\n if (lines.length > maxLineClamp) {\n totalLines = maxLineClamp;\n } else {\n totalLines = lines.length;\n }\n }\n this.ctx.restore();\n // 计算总高度:行数 * 行高 + 上下padding\n return Math.max(Math.floor(totalLines * lineHeight + padding * 2), Math.floor(fontSize + padding * 2));\n }\n handleEllipsis(\n text: string,\n width: number,\n padding: number = 0,\n font: string = '12px Arial',\n ): { _text: string; ellipsis: boolean } {\n this.ctx.save();\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n this.ctx.restore();\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n // 如果宽度小于省略号宽度,则不进行省略,直接返回空字符串\n if (width <= ellipsesWidth + padding * 2) {\n this.ctx.restore();\n return {\n _text: '',\n ellipsis: true,\n };\n }\n const textWidth = this.ctx.measureText(text).width;\n const lineWidth = width - padding * 2;\n // 单行文本省略\n if (textWidth && textWidth >= lineWidth) {\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 >= lineWidth - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n ellipsis = true;\n break;\n }\n }\n }\n this.ctx.restore();\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\nimport {\n Align,\n BeforeAutofillDataMethod,\n BeforeBodyContextMenuMethod,\n BeforeCellValueChangeMethod,\n BeforeCopyMethod,\n BeforeDragRowMethod,\n BeforeHeaderContextMenuMethod,\n BeforePasteDataMethod,\n BeforeSetAutofillMethod,\n BeforeSetSelectorMethod,\n CellEditorMethod,\n CellHeaderStyleMethod,\n CellHoverIconMethod,\n CellReadonlyMethod,\n CellRenderMethod,\n CellRulesMethod,\n CellStyleMethod,\n CellTypeMethod,\n ConfigType,\n ExpandLazyMethod,\n FooterPosition,\n FormatterMethod,\n MenuItem,\n SelectableMethod,\n SelectorCellValueType,\n SpanMethod,\n TreeSelectMode,\n VerticalAlign,\n} from './types';\nimport { getCssVar } from './util';\n\nexport default class Config {\n private _config: ConfigType = {};\n /** CSS 类名前缀 */\n CSS_PREFIX = 'e-virt-table';\n /** 图标集合 */\n ICONS: IconType[] = [];\n /** 行的唯一标识键 */\n ROW_KEY = '';\n /** 禁用编辑,优先等级最高 */\n DISABLED = false;\n /** 表头字体 */\n HEADER_FONT = '12px normal Arial';\n /** 单元格字体 */\n BODY_FONT = '12px normal Arial';\n /** 边框 */\n BORDER = true;\n /** 斑马纹 */\n STRIPE = false;\n /** 斑马纹颜色 */\n STRIPE_COLOR = '#fafafa';\n /** 区域边框颜色 */\n BORDER_COLOR = '#e1e6eb';\n /** 高度,为 0 表示自适应 */\n HEIGHT = 0;\n /** 占位文本颜色 */\n PLACEHOLDER_COLOR = '#CDD0DC';\n /** 空数据 body 高度 */\n EMPTY_BODY_HEIGHT = 120;\n /** 自定义空样式 */\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 空数据文本 */\n EMPTY_TEXT = '';\n /** 加载文本 */\n LOADING_TEXT = '';\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\n MAX_HEIGHT = 1000;\n /** 区域边框圆角 */\n BORDER_RADIUS = 8;\n /** 启用偏移高度内部计算表格高度 */\n ENABLE_OFFSET_HEIGHT = false;\n /** 偏移高度 */\n OFFSET_HEIGHT = 0;\n /** 表头高度 */\n HEADER_HEIGHT = 36;\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\n ENABLE_HEADER_STICKY = false;\n /** 表头背景色 */\n HEADER_BG_COLOR = '#F8FAFF';\n /** body 背景色 */\n BODY_BG_COLOR = '#FFF';\n /** 表头文本颜色 */\n HEADER_TEXT_COLOR = '#1D2129';\n /** 必填*颜色 */\n REQUIRED_COLOR = '#F56C6C';\n /** body文本颜色 */\n BODY_TEXT_COLOR = '#4E5969';\n /** footer文本颜色 */\n FOOTER_TEXT_COLOR = '#4E5969';\n /** 加载 svg 图标 */\n LOADING_ICON_SVG = '';\n /** 加载 svg 图标颜色 */\n LOADING_ICON_COLOR = '#4E5969';\n /** 树形展开svg 图标 */\n EXPAND_ICON_SVG = '';\n /** 树形收缩svg 图标 */\n SHRINK_ICON_SVG = '';\n /** 展开图标颜色 */\n EXPAND_ICON_COLOR = '#4E5969';\n /** 收缩图标颜色 */\n SHRINK_ICON_COLOR = '#4E5969';\n /** 错误提示颜色 */\n ERROR_TIP_ICON_COLOR = 'red';\n /** 错误提示图标大小 */\n ERROR_TIP_ICON_SIZE = 6;\n /** 所有列对齐方式 */\n COLUMNS_ALIGN: Align = 'left';\n /** 所有列垂直对齐方式 */\n COLUMNS_VERTICAL_ALIGN: VerticalAlign = 'middle';\n /** 是否开启懒加载\t */\n EXPAND_LAZY = true;\n /** 默认展开全部\t */\n DEFAULT_EXPAND_ALL = false;\n /** 表格 body 部分的宽度 */\n CELL_WIDTH = 100;\n /** body 单元格默认行高 */\n CELL_HEIGHT = 36;\n /** 表格 body 部分的 padding */\n CELL_PADDING = 8;\n /** hover编辑图标大小 */\n CELL_HOVER_ICON_SIZE = 14;\n /** hover编辑图标背景色 */\n CELL_HOVER_ICON_BG_COLOR = '#fff';\n /** hover编辑图标边框颜色 */\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\n /** 内容缩放最小比例 */\n MIN_ZOOM = 0.5;\n /** 内容缩放最大比例 */\n MAX_ZOOM = 2;\n /** 启用 Ctrl + 滚轮内容缩放 */\n ENABLE_ZOOM_WHEEL = true;\n /** 滚动条轨道尺寸 */\n SCROLLER_TRACK_SIZE = 14;\n /** 滚动条滑块尺寸 */\n SCROLLER_SIZE = 8;\n /** 滚动条滑块颜色 */\n SCROLLER_COLOR = '#dee0e3';\n /** 轨道颜色 */\n SCROLLER_TRACK_COLOR = '#fff';\n /** 滚动条滑块聚焦时的颜色 */\n SCROLLER_FOCUS_COLOR = '#bbbec4';\n /** 选中区域边框颜色 */\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\n /** 选中区域背景颜色 */\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\n /** 当前焦点单元格所在行、列的背景色 */\n SELECT_ROW_COL_BG_COLOR = 'transparent';\n /** 填充点的边框颜色 */\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\n /** 可编辑背景色 */\n EDIT_BG_COLOR = '#fcf6ed';\n /** 选择 key,合并时用 */\n CHECKBOX_KEY = '';\n /** 选择框颜色 */\n CHECKBOX_COLOR = 'rgb(82,146,247)';\n /** 查找结果当前行颜色 */\n FINDER_CELL_BG_COLOR = 'rgb(255,229,144)';\n /** 启用查找 */\n ENABLE_FINDER = true;\n /** 选择框大小 */\n CHECKBOX_SIZE = 20;\n /** 选择框禁用图标 */\n CHECKBOX_DISABLED_SVG = '';\n /** 选择框禁用图标颜色 */\n CHECKBOX_DISABLED_COLOR = '#F1F2F4';\n /** 选择框选中图标 */\n CHECKBOX_CHECK_SVG = '';\n /** 选择框未中图标 */\n CHECKBOX_UNCHECK_SVG = '';\n /** 选择框未中图标颜色 */\n CHECKBOX_UNCHECK_COLOR = '#DDE0EA';\n /** 选择框半选中图标 */\n CHECKBOX_INDETERMINATE_SVG = '';\n /** 选择框选中禁用图标 */\n CHECKBOX_CHECK_DISABLED_SVG = '';\n /** 选择框选中禁用图标颜色 */\n CHECKBOX_CHECK_DISABLED_COLOR = '#DDE0EA';\n /** 编辑图标 */\n ICON_EDIT_SVG = '';\n /** 编辑图标颜色 */\n ICON_EDIT_COLOR = '#4E5969';\n /** 选择图标 */\n ICON_SELECT_SVG = '';\n /** 选择图标颜色 */\n ICON_SELECT_COLOR = '#4E5969';\n /** 启用严格排序,即不支持多列排序 */\n SORT_STRICTLY = true;\n /** 排序升序图标 */\n SORT_ASC_ICON_SVG = '';\n /** 排序降序图标 */\n SORT_DESC_ICON_SVG = '';\n /** 排序默认图标 */\n SORTABLE_ICON_SVG = '';\n /** 排序图标颜色 */\n SORT_ICON_COLOR = 'rgb(82,146,247)';\n /** 单元格只读背景色 */\n READONLY_COLOR = '#fff';\n /** 单元格只读文本颜色 */\n READONLY_TEXT_COLOR = '#4E5969';\n /** 单元格错误提示文本颜色 */\n ERROR_TIP_COLOR = '#ED3F14';\n /** 合计底部背景色 */\n FOOTER_BG_COLOR = '#fafafa';\n /** 合计底部固定 */\n FOOTER_FIXED = true;\n /** 合计底部位置 */\n FOOTER_POSITION: FooterPosition = 'bottom';\n /** 单元格底部高度 */\n CELL_FOOTER_HEIGHT = 36;\n /** 启用选择器 */\n ENABLE_SELECTOR = true;\n /** 树形选择模式 */\n TREE_SELECT_MODE: TreeSelectMode = 'auto';\n /** 树形子项key名称 */\n TREE_CHILDREN_KEY = 'children';\n /** 树形缩进宽度 */\n TREE_INDENT = 20;\n /** 树形图标大小 */\n TREE_ICON_SIZE = 20;\n /**树形划线 */\n TREE_LINE = false;\n /** 树形划线颜色 */\n TREE_LINE_COLOR = '#e1e6eb';\n /** 启用单点击立马编辑 */\n ENABLE_EDIT_SINGLE_CLICK = false;\n /** 启用点击选择器编辑 */\n ENABLE_EDIT_CLICK_SELECTOR = true;\n /** 选择器X最小范围 */\n SELECTOR_AREA_MIN_X = 0;\n /** 选择器X最大范围colMax - offset */\n SELECTOR_AREA_MAX_X_OFFSET = 0;\n /** 选择器X最大范围,0默认最大colMax */\n SELECTOR_AREA_MAX_X = 0;\n /** 选择器Y最小范围 */\n SELECTOR_AREA_MIN_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y_OFFSET = 0;\n /** 选择器值类型,value,displayText,区别displayText受format影响 */\n SELECTOR_CELL_VALUE_TYPE: SelectorCellValueType = 'value'; // displayText | value\n /** 启用自动主题 */\n ENABLE_AUTO_THEME = true;\n /** 启用选择器-选择器单选 */\n ENABLE_SELECTOR_SINGLE = false;\n /** 启用选择器-批量跨列选择 */\n ENABLE_SELECTOR_SPAN_COL = true;\n /** 启用选择器-批量跨行选择 */\n ENABLE_SELECTOR_SPAN_ROW = true;\n /** 启用选择器-批量选中列 */\n ENABLE_SELECTOR_ALL_ROWS = true;\n /** 启用选择器-批量选中行 */\n ENABLE_SELECTOR_ALL_COLS = true;\n /** 启用合并格子数据关联 */\n ENABLE_MERGE_CELL_LINK = false;\n /** 启用填充器 */\n ENABLE_AUTOFILL = false;\n /** 启用选择器-批量跨列选择 */\n ENABLE_AUTOFILL_SPAN_COL = true;\n /** 启用选择器-批量跨行选择 */\n ENABLE_AUTOFILL_SPAN_ROW = true;\n /** 启用body右键菜单 */\n ENABLE_CONTEXT_MENU = false;\n /** 启用表头右键菜单 */\n ENABLE_HEADER_CONTEXT_MENU = false;\n /** 启用文字选中复制 */\n ENABLE_TEXT_SELECTION = true;\n /** 启用复制 */\n ENABLE_COPY = true;\n /** 启用粘贴 */\n ENABLE_PASTER = true;\n /** 启用调整行高 */\n ENABLE_RESIZE_ROW = true;\n /** 启用列宽可调整 */\n ENABLE_RESIZE_COLUMN = true;\n /** 行调整线颜色 */\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\n /** 列调整线颜色 */\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\n /** 启用列调整文本 */\n ENABLE_RESIZE_COLUMN_TEXT = true;\n /** 列调整线颜色 */\n RESIZE_COLUMN_TEXT_COLOR = '#fff';\n /** 列调整线文本背景色 */\n RESIZE_COLUMN_TEXT_BG_COLOR = 'rgb(82,146,247)';\n /** 最小调整行高 */\n RESIZE_ROW_MIN_HEIGHT = 36;\n /** 列宽最小值 */\n RESIZE_COLUMN_MIN_WIDTH = 40;\n /** 拖拽提示背景色 */\n DRAG_TIP_BG_COLOR = 'rgba(82,146,247,0.1)';\n /** 拖拽提示线颜色 */\n DRAG_TIP_LINE_COLOR = 'rgb(82,146,247)';\n /** 拖拽提示文本颜色 */\n /** 启用键盘 */\n ENABLE_KEYBOARD = true;\n /** 启用历史 */\n ENABLE_HISTORY = false;\n ENABLE_VALIDATOR_IMMEDIATE = true;\n /** 历史栈数量 */\n HISTORY_NUM = 50;\n /** 启用悬浮高亮 */\n HIGHLIGHT_HOVER_ROW = false;\n /** 悬浮颜色 */\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\n /** 高亮选中当前行 */\n HIGHLIGHT_SELECTED_ROW = false;\n /** 高亮当前行颜色 */\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\n /** 提示背景颜色 */\n TOOLTIP_BG_COLOR = '#303133';\n /** 提示文本颜色 */\n TOOLTIP_TEXT_COLOR = '#fff';\n /** 提示层级 */\n TOOLTIP_ZINDEX = 3000;\n /** 自定义提示样式 */\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 自定义右键菜单 */\n CONTEXT_MENU: MenuItem[] = [{ value: 'copy' }, { value: 'cut' }, { value: 'paste' }, { value: 'clearSelected' }];\n CUSTOM_BODY_CONTEXT_MENU: MenuItem[] = [];\n HEADER_CONTEXT_MENU: MenuItem[] = [\n { value: 'fixedLeft' },\n { value: 'fixedRight' },\n { value: 'fixedNone' },\n { value: 'hide' },\n { value: 'visible' },\n { value: 'resetHeader' },\n ];\n CUSTOM_HEADER_CONTEXT_MENU: MenuItem[] = [];\n /** 格子多行文本行高,isAutoRowHeight才会生效 */\n CELL_LINE_HEIGHT = 1.2;\n /** 全局自动行高 */\n AUTO_ROW_HEIGHT = false;\n /** 启用拖拽表头 */\n ENABLE_DRAG_COLUMN = false;\n /** 启用拖拽行 */\n ENABLE_DRAG_ROW = false;\n /** 启用拖拽行跨级,针对tree数据结构 */\n ENABLE_DRAG_ROW_CROSS_LEVEL = false;\n /** 启用拖拽行自定义 */\n ENABLE_DRAG_ROW_CUSTOM = false;\n /** 拖拽提示线颜色 */\n DRAG_ROW_TIP_LINE_COLOR = 'rgb(82,146,247)';\n /** 拖拽行图标 */\n DRAG_ROW_ICON_SVG = '';\n /** 拖拽行图标大小 */\n DRAG_ROW_ICON_SIZE = 18;\n /** 拖拽行图标颜色 */\n DRAG_ROW_ICON_COLOR = '#bec4c7';\n /** header 格子样式 */\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\n /** body 格子样式 */\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\n /** footer 格子样式 */\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\n /** 自定义只读 */\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\n /** 格式化方法更改(formatter优先等级比较高) */\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\n /** 自定义校验规则 */\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\n /** 自定义只读 */\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\n /** 自定义编辑器类型 */\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\n /** 自定义只读 */\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\n /** 自定义只读 */\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\n /** 自定义跨列/行渲染 */\n SPAN_METHOD?: SpanMethod;\n /** 自定义选择禁用 */\n SELECTABLE_METHOD?: SelectableMethod;\n /** 自定义选择禁用 */\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\n /** 数值改变前回调 */\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\n /** 粘贴前回调 */\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\n /** 数值填充前回调 */\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\n /** 设置选择器前回调 */\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\n /** 设置填充器前回调 */\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\n /** 自定义表头右键菜单 */\n BEFORE_HEADER_CONTEXT_MENU_METHOD?: BeforeHeaderContextMenuMethod;\n /** 自定义BODY右键菜单 */\n BEFORE_BODY_CONTEXT_MENU_METHOD?: BeforeBodyContextMenuMethod;\n /** 数据复制前回调 */\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\n BEFORE_DRAG_ROW_METHOD?: BeforeDragRowMethod;\n constructor(config: Partial<Config>) {\n this._config = config;\n this.updateCssVar();\n }\n /** 初始化 */\n init(config: ConfigType) {\n this._config = config;\n this.updateCssVar();\n }\n /** 同步css 样式变量 */\n updateCssVar() {\n let obj: any = {};\n Object.keys(this).forEach((key) => {\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\n const val = getCssVar(cssKey);\n if (val) {\n obj[key] = val;\n }\n }\n });\n Object.assign(this, obj, this._config);\n }\n}\n","export default \"<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\"","export default \"<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>\\n\"","export default \"<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>\\n\"","export default \"<svg t=\\\"1755138507987\\\" class=\\\"icon\\\" viewBox=\\\"0 0 1024 1024\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" p-id=\\\"5079\\\" width=\\\"200\\\" height=\\\"200\\\"><path d=\\\"M512 938.688a42.688 42.688 0 0 1-35.072-18.432l-192-277.312A42.56 42.56 0 0 1 320 576h384a42.752 42.752 0 0 1 35.072 66.944l-192 277.312a42.688 42.688 0 0 1-35.072 18.432\\\" fill=\\\"currentColor\\\" p-id=\\\"2016\\\"></path><path d=\\\"M704 448H320a42.752 42.752 0 0 1-35.072-66.944l192-277.312c16-23.04 54.208-23.04 70.144 0l192 277.312A42.56 42.56 0 0 1 704 448\\\" fill=\\\"currentColor\\\" p-id=\\\"2015\\\"></path></svg>\\n\"","export default \"<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>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2s.9-2 2-2s2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2s-2 .9-2 2s.9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2z\\\" fill=\\\"currentColor\\\"></path></svg>\\n\"","export default \"<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\\\" p-id=\\\"4709\\\"></path></svg>\\n\"","export default \"<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>\\n\"","export default \"<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\\\" 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>\\n\"","export default \"<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>\\n\"","import Context from './Context';\r\nimport expandSvg from './svg/expand.svg?raw';\r\nimport svgcheckboxCheck from './svg/checkbox-check.svg?raw';\r\nimport svgSelect from './svg/select.svg?raw';\r\nimport svgSortable from './svg/sortable.svg?raw';\r\nimport svgLoading from './svg/loading.svg?raw';\r\nimport svgDrag from './svg/drag.svg?raw';\r\nimport svgCheckboxUncheck from './svg/checkbox-uncheck.svg?raw';\r\nimport svgCheckboxIndeterminate from './svg/checkbox-indeterminate.svg?raw';\r\nimport svgCheckboxDisabled from './svg/checkbox-disabled.svg?raw';\r\nimport svgIconEdit from './svg/icon-edit.svg?raw';\r\n\r\ntype ConfigColorNameType =\r\n | 'LOADING_ICON_COLOR'\r\n | 'EXPAND_ICON_COLOR'\r\n | 'SHRINK_ICON_COLOR'\r\n | 'CHECKBOX_COLOR'\r\n | 'SORT_ICON_COLOR'\r\n | 'ICON_EDIT_COLOR'\r\n | 'ICON_SELECT_COLOR'\r\n | 'CHECKBOX_DISABLED_COLOR'\r\n | 'CHECKBOX_UNCHECK_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 | 'ICON_EDIT_SVG'\r\n | 'ICON_SELECT_SVG'\r\n | 'CHECKBOX_CHECK_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG'\r\n | 'SORT_ASC_ICON_SVG'\r\n | 'SORT_DESC_ICON_SVG'\r\n | 'SORTABLE_ICON_SVG'\r\n | 'DRAG_ROW_ICON_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\n// 用替换节约点打包体积\r\nconst svgSortAsc = svgSortable.replace(`fill=\"currentColor\" p-id=\"2016\"`, `fill=\"#bec4c7\" p-id=\"2016\"`);\r\nconst svgSortDesc = svgSortable.replace(`fill=\"currentColor\" p-id=\"2015\"`, `fill=\"#bec4c7\" p-id=\"2015\"`);\r\nexport { expandSvg, svgcheckboxCheck, svgSelect, svgSortable, svgSortAsc, svgSortDesc, svgLoading, svgDrag };\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: svgLoading,\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: expandSvg,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'SHRINK_ICON_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 configColorName: 'CHECKBOX_UNCHECK_COLOR',\r\n svg: svgCheckboxUncheck,\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: svgcheckboxCheck,\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: svgCheckboxIndeterminate,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_DISABLED_SVG',\r\n svg: svgcheckboxCheck,\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n configColorName: 'CHECKBOX_DISABLED_COLOR',\r\n svg: svgCheckboxDisabled,\r\n color: '#F1F2F4',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'ICON_EDIT_SVG',\r\n configColorName: 'ICON_EDIT_COLOR',\r\n svg: svgIconEdit,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'ICON_SELECT_SVG',\r\n configColorName: 'ICON_SELECT_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'sort-asc',\r\n configName: 'SORT_ASC_ICON_SVG',\r\n configColorName: 'SORT_ICON_COLOR',\r\n svg: svgSortAsc,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'sort-desc',\r\n configName: 'SORT_DESC_ICON_SVG',\r\n configColorName: 'SORT_ICON_COLOR',\r\n svg: svgSortDesc,\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'sort-default',\r\n configName: 'SORTABLE_ICON_SVG',\r\n svg: svgSortable,\r\n color: '#bec4c7',\r\n },\r\n {\r\n name: 'drag',\r\n configName: 'DRAG_ROW_ICON_SVG',\r\n svg: svgDrag,\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 const attrValue = element.getAttribute('fill');\r\n if (attrValue === 'currentColor' || attrValue === null) {\r\n element.setAttribute('fill', fill);\r\n }\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:' + svgContent));\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 getSvg(name: string) {\r\n return this.list.find((item) => item.name === name);\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\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((entries) => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver', entries);\n this.ctx.emit('containerResize', this.ctx.containerElement);\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 (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (!this.isInsideBody(x, y)) {\n this.ctx.emit('mousedownBodyOutside', e);\n }\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.focusCell = undefined;\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.focusCellHeader = undefined;\n this.ctx.emit('cellMousedown', cell, e);\n }, true);\n });\n // 按上事件\n this.ctx.on('mouseup', (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.emit('cellHeaderMouseup', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellMouseup', 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 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 });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n const hoverIcon = cell.getImage('hover');\n if (!this.ctx.disableHoverIconClick && hoverIcon && hoverIcon.isInside(x, y)) {\n this.ctx.emit('hoverIconClick', cell);\n }\n },\n true,\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 if (!this.ctx.mousedown && this.ctx.stageElement.style.cursor !== 'default') {\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.imageEnterAndLeave(cell, e);\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 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 this.imageEnterAndLeave(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('draw');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n this.handleFooterEvent(x, y, this.ctx.footer.renderRows, (cell: Cell) => {\n this.ctx.emit('cellFooterMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellFooterMouseleave', cell, e);\n }\n this.ctx.emit('cellFooterHoverChange', cell, e);\n });\n });\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n if (this.ctx.dragRowIng || this.ctx.dragHeaderIng || this.ctx.selectColsIng || this.ctx.selectRowsIng || this.ctx.selectorMove || this.ctx.autofillMove) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n cell.cellImages.forEach((image, key) => {\n if (image.isInside(x, y)) {\n if (key === 'drag') {\n this.ctx.stageElement.style.cursor = 'grab';\n } else {\n this.ctx.stageElement.style.cursor = 'pointer';\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.loading) {\n return true;\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(x, 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 isInside = visible ? cell.isInsideVisible(x, y) : cell.isInside(x, y);\n if (isInside) {\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 if (cell.isInside(x, y)) {\n callback(cell);\n return;\n }\n }\n }\n private handleFooterEvent(x: number, y: number, renderRows: Row[], callback: Function) {\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n if (cell.isInside(x, y)) {\n callback(cell);\n return;\n }\n }\n }\n }\n private isInsideBody(_x: number, _y: number) {\n const { body: {\n y,\n visibleHeight,\n height,\n visibleWidth,\n } } = this.ctx;\n const realityHeight = Math.min(height, visibleHeight);\n return _x > 0 && _x < visibleWidth && _y > y && _y < y + realityHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","export default {\r\n numberErrorTip: '只允许输入数字',\r\n emptyText: '暂无数据',\r\n loadingText: '加载中...',\r\n copy: '复制',\r\n cut: '剪切',\r\n paste: '粘贴',\r\n clearSelected: '清空选中内容',\r\n fixedLeft: '左固定',\r\n fixedRight: '右固定',\r\n fixedNone: '取消固定',\r\n hide: '隐藏',\r\n visible: '显示',\r\n resetHeader: '恢复默认',\r\n invalidNumber: '请输入数字类型',\r\n mergeCellNoFill: '合并单元格不能填充',\r\n mergeCellNoCopy: '合并单元格不能复制',\r\n mergeCellNoPaste: '合并单元格不能粘贴',\r\n numberTruncated: '输入的数字已截取至小数点后{precision}位',\r\n batchSetItemValueError: '批量赋值错误',\r\n numberMin: '输入值小于{min},已自动调整为{min}',\r\n numberMax: '输入值大于{max},已自动调整为{max}',\r\n stringMaxlength: '输入值超过{maxlength}个字符,已自动截取',\r\n};\r\n","import EVirtTable from './EVirtTable';\r\nimport defaultLang from './lang/zh-CN';\r\nexport type LangConfig = typeof defaultLang;\r\n\r\nexport default class Locale {\r\n private langConfig?: LangConfig;\r\n use(langConfig: LangConfig) {\r\n this.langConfig = langConfig;\r\n }\r\n getText(key: string, params?: Record<string, any>) {\r\n const config = { ...defaultLang };\r\n // 合并全局默认语言配置\r\n Object.assign(config, EVirtTable.locale, this.langConfig);\r\n const text = config[key as keyof LangConfig];\r\n if (!text) {\r\n return '';\r\n }\r\n return text.replace(/{(\\w+)}/g, (match, p1) => params?.[p1] || match);\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\n\r\nconst PX_VALUE_RE = /^-?\\d*\\.?\\d+px$/;\r\n\r\nexport type ViewportRect = {\r\n x: number;\r\n y: number;\r\n left: number;\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\n/** 内容缩放:逻辑坐标 ↔ 物理像素,canvas / DOM 共用 */\r\nexport default class ZoomScale {\r\n value = 1;\r\n\r\n get isDefault() {\r\n return this.value === 1;\r\n }\r\n\r\n clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n }\r\n\r\n /** @returns 是否发生变化 */\r\n set(value: number, min: number, max: number): boolean {\r\n const next = this.clamp(value, min, max);\r\n if (Math.abs(next - this.value) < 0.0001) {\r\n return false;\r\n }\r\n this.value = next;\r\n return true;\r\n }\r\n\r\n /** 逻辑 -> 物理 */\r\n toVisual(logical: number): number {\r\n return logical * this.value;\r\n }\r\n\r\n /** 物理 -> 逻辑 */\r\n toLogical(physical: number): number {\r\n return physical / this.value;\r\n }\r\n\r\n toPx(logical: number): string {\r\n return `${this.toVisual(logical)}px`;\r\n }\r\n\r\n /** DOM 测量高度 -> 逻辑高度 */\r\n domHeightToLogical(physicalHeight: number): number {\r\n return Math.round(physicalHeight / this.value);\r\n }\r\n\r\n /** 逻辑内容尺寸 -> 物理尺寸 */\r\n contentToPhysical(logical: number): number {\r\n return logical * this.value;\r\n }\r\n\r\n scaleStyle<T extends Record<string, any>>(style: T): T {\r\n if (this.isDefault) {\r\n return style;\r\n }\r\n const result: Record<string, any> = { ...style };\r\n for (const key of Object.keys(result)) {\r\n const val = result[key];\r\n if (typeof val === 'string' && PX_VALUE_RE.test(val)) {\r\n result[key] = `${parseFloat(val) * this.value}px`;\r\n }\r\n }\r\n return result as T;\r\n }\r\n\r\n assignScaledStyle(el: HTMLElement, style: Record<string, any>) {\r\n Object.assign(el.style, this.scaleStyle(style));\r\n }\r\n\r\n /** 容器物理宽度 -> 逻辑可视宽度 */\r\n containerWidth(containerPhysicalWidth: number): number {\r\n return Math.floor(containerPhysicalWidth / this.value);\r\n }\r\n\r\n resolveStageWidth(options: {\r\n containerPhysicalWidth: number;\r\n contentWidth: number;\r\n scrollerTrackSize: number;\r\n fillContainer: boolean;\r\n }): { stageWidth: number; stagePhysicalWidth: number } {\r\n const containerLogical = this.containerWidth(options.containerPhysicalWidth);\r\n const stageWidth = options.fillContainer\r\n ? containerLogical\r\n : Math.min(Math.floor(options.contentWidth + options.scrollerTrackSize), containerLogical);\r\n const stagePhysicalWidth = Math.min(\r\n Math.round(this.toVisual(stageWidth)),\r\n Math.floor(options.containerPhysicalWidth),\r\n );\r\n return { stageWidth, stagePhysicalWidth };\r\n }\r\n\r\n applyStageHeight(\r\n stageElement: HTMLDivElement,\r\n physicalHeight: number,\r\n ): { stageHeight: number; stagePhysicalHeight: number } {\r\n const stagePhysicalHeight = Math.floor(physicalHeight);\r\n const stageHeight = Math.floor(stagePhysicalHeight / this.value);\r\n stageElement.style.height = `${stagePhysicalHeight}px`;\r\n return { stageHeight, stagePhysicalHeight };\r\n }\r\n\r\n /** floating-ui 锚点:逻辑单元格 -> 视口物理矩形 */\r\n getViewportRect(\r\n logical: { x: number; y: number; width: number; height: number },\r\n containerRect: DOMRect,\r\n ): ViewportRect {\r\n const x = this.toVisual(logical.x) + containerRect.x;\r\n const y = this.toVisual(logical.y) + containerRect.y;\r\n const width = this.toVisual(logical.width);\r\n const height = this.toVisual(logical.height);\r\n return {\r\n x,\r\n y,\r\n left: x,\r\n top: y,\r\n right: x + width,\r\n bottom: y + height,\r\n width,\r\n height,\r\n };\r\n }\r\n\r\n /** overlayer 单元格:外层物理定位 + 内层 zoom 缩放自定义 render */\r\n createOverlayerCellElement(cell: Cell | CellHeader, cssPrefix: string): HTMLDivElement {\r\n const cellEl = document.createElement('div');\r\n this.assignScaledStyle(cellEl, cell.style);\r\n Object.keys(cell.domDataset || {}).forEach((key) => {\r\n cellEl.setAttribute(key, cell.domDataset[key]);\r\n });\r\n\r\n if (typeof cell.render !== 'function') {\r\n return cellEl;\r\n }\r\n\r\n if (this.isDefault) {\r\n cell.render(cellEl, cell);\r\n return cellEl;\r\n }\r\n\r\n const logicalWidth = 'visibleWidth' in cell ? (cell as Cell).visibleWidth : (cell as CellHeader).width;\r\n const logicalHeight = 'visibleHeight' in cell ? (cell as Cell).visibleHeight : (cell as CellHeader).height;\r\n const isAutoHeight =\r\n 'autoRowHeight' in cell &&\r\n cell.autoRowHeight &&\r\n 'renderType' in cell &&\r\n cell.renderType === 'default';\r\n\r\n const contentEl = document.createElement('div');\r\n contentEl.className = `${cssPrefix}-overlayer-cell-content`;\r\n contentEl.style.width = `${logicalWidth}px`;\r\n contentEl.style.boxSizing = 'border-box';\r\n if (isAutoHeight) {\r\n contentEl.style.height = 'auto';\r\n contentEl.style.minHeight = `${logicalHeight}px`;\r\n cellEl.style.height = 'auto';\r\n } else {\r\n contentEl.style.height = `${logicalHeight}px`;\r\n cellEl.style.height = this.toPx(logicalHeight);\r\n }\r\n contentEl.style.zoom = String(this.value);\r\n cellEl.style.width = this.toPx(logicalWidth);\r\n\r\n cellEl.appendChild(contentEl);\r\n cell.render(contentEl, cell);\r\n return cellEl;\r\n }\r\n}\r\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\nimport { FinderResult } from './FinderBar';\r\nimport Locale from './Locale';\r\nimport ZoomScale from './ZoomScale';\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 loadingElement?: 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 allCellHeaders: CellHeader[];\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 locale: Locale = new Locale();\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 loadingElement?: HTMLDivElement;\r\n stageWidth = 0; // 逻辑可视宽度(物理宽度/zoom)\r\n stageHeight = 0; // 逻辑可视高度(物理高度/zoom)\r\n stagePhysicalWidth = 0;\r\n stagePhysicalHeight = 0;\r\n zoomScale: ZoomScale;\r\n get zoom() {\r\n return this.zoomScale.value;\r\n }\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n textSelectionStr = '';\r\n textSelecting = false;\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isEmpty = 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 disableHoverIconClick = false; // 禁用hoverIconClick,防止填充选择器移动时,触发hoverIconClick\r\n selectColsIng = false; // 选择列中\r\n selectRowsIng = false; // 选择行中\r\n dragHeaderIng = false; // 拖拽表头中\r\n dragRowIng = false; // 拖拽行中\r\n finding = false; // 查找中\r\n contextMenuIng = false; // 右键菜单中\r\n editing = false; // 编辑中\r\n loading = 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 mouseX = 0;\r\n mouseY = 0;\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 allCellHeaders: [],\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 finderBar: FinderResult = {\r\n text: '',\r\n rowIndex: -1,\r\n colIndex: -1,\r\n type: 'body',\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 loadingElement,\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.loadingElement = loadingElement;\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 this.zoomScale = new ZoomScale();\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 startAdjustPosition(e: MouseEvent) {\r\n this.emit('startAdjustPosition', e);\r\n }\r\n stopAdjustPosition() {\r\n this.emit('stopAdjustPosition');\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: this.zoomScale.toLogical(e.clientX - left),\r\n offsetY: this.zoomScale.toLogical(e.clientY - top),\r\n };\r\n }\r\n toVisual(value: number) {\r\n return this.zoomScale.toVisual(value);\r\n }\r\n toLogical(value: number) {\r\n return this.zoomScale.toLogical(value);\r\n }\r\n toVisualPx(value: number) {\r\n return this.zoomScale.toPx(value);\r\n }\r\n scaleStyle<T extends Record<string, any>>(style: T) {\r\n return this.zoomScale.scaleStyle(style);\r\n }\r\n setZoom(zoom: number): void {\r\n const { MIN_ZOOM, MAX_ZOOM } = this.config;\r\n if (!this.zoomScale.set(zoom, MIN_ZOOM, MAX_ZOOM)) {\r\n return;\r\n }\r\n this.emit('zoomChange', this.zoomScale.value);\r\n this.emit('resetHeader');\r\n }\r\n getZoom(): number {\r\n return this.zoomScale.value;\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 // 物理滑动距离换算为逻辑距离\n const deltaY = this.ctx.zoomScale.toLogical(clientY - this.clientY);\n const deltaX = this.ctx.zoomScale.toLogical(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 { clientX, clientY } = e;\n // 滚动条按逻辑坐标绘制,鼠标 offset 是物理像素,需换算\n const offsetX = this.ctx.zoomScale.toLogical(e.offsetX);\n const offsetY = this.ctx.zoomScale.toLogical(e.offsetY);\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 { clientX, clientY, buttons } = e;\n const offsetX = this.ctx.zoomScale.toLogical(e.offsetX);\n const offsetY = this.ctx.zoomScale.toLogical(e.offsetY);\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 // 物理位移换算为逻辑位移\n offset = this.ctx.zoomScale.toLogical(offset);\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 private mousedownHeader = false; // 是否点击了表头,点击头部处理滚动条调整位置\n private adjustPositionX = '';\n private adjustPositionY = '';\n private timerX = 0; // 水平滚动定时器\n private timerY = 0; // 垂直滚动定时器\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 this.ctx.on('scrollToIndex', (rowIndex: number, colIndex: number) => {\n this.scrollToIndex(rowIndex, colIndex);\n });\n this.ctx.on('cellHeaderMousedown', () => {\n this.mousedownHeader = true;\n });\n this.ctx.on('startAdjustPosition', (e: MouseEvent) => {\n this.startAdjustPosition(e);\n });\n this.ctx.on('stopAdjustPosition', () => {\n this.stopAdjustPosition();\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.mousedownHeader = false;\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 this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n scrollToIndex(rowIndex: number, colIndex: number) {\n this.scrollToRowIndex(rowIndex);\n this.scrollToColIndex(colIndex);\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 * 调整滚动条位置,让到达边界时自动滚动\n */\n private startAdjustPosition(e: MouseEvent) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n let positionX = '';\n let positionY = '';\n if (this.ctx.focusCell?.fixed !== 'left' && offsetX < this.ctx.fixedLeftWidth) {\n positionX = 'left';\n } else if (\n this.ctx.focusCell?.fixed !== 'right' &&\n offsetX > this.ctx.body.visibleWidth - this.ctx.fixedRightWidth\n ) {\n positionX = 'right';\n } else {\n positionX = '';\n this.stopAdjustPosition(true, false);\n }\n\n if (!this.mousedownHeader && offsetY < this.ctx.header.visibleHeight) {\n positionY = 'top';\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\n positionY = 'bottom';\n } else {\n positionY = '';\n this.stopAdjustPosition(false, true);\n }\n if (positionX && this.adjustPositionX !== positionX) {\n this.adjustPositionX = positionX;\n const position = positionX === 'left' ? -1 : 1;\n let scrollSpeedX = 10 * position; // 滚动速度\n if (this.timerX) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n this.timerX = setInterval(() => {\n // 增加滚动速度\n scrollSpeedX *= 1.5; // 加速因子\n const { scrollX } = this.ctx;\n const num = scrollX + scrollSpeedX;\n if (num < 0 || num > this.ctx.body.width) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n this.ctx.setScrollX(num);\n }, 100); // 每100毫秒执行一次\n }\n\n if (positionY && this.adjustPositionY !== positionY) {\n this.adjustPositionY = positionY;\n const position = positionY === 'top' ? -1 : 1;\n let scrollSpeedY = 10 * position; // 滚动速度\n if (this.timerY) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n this.timerY = setInterval(() => {\n // 增加滚动速度\n scrollSpeedY *= 1.5; // 加速因子\n const { scrollY } = this.ctx;\n const num = scrollY + scrollSpeedY;\n if (num < 0 || num > this.ctx.body.height) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n this.ctx.setScrollY(num);\n }, 100); // 每100毫秒执行一次\n }\n }\n private stopAdjustPosition(x = true, y = true) {\n if (x) {\n this.adjustPositionX = '';\n if (this.timerX) {\n clearInterval(this.timerX);\n this.timerX = 0;\n }\n }\n if (y) {\n this.adjustPositionY = '';\n if (this.timerY) {\n clearInterval(this.timerY);\n this.timerY = 0;\n }\n }\n }\n}\n","import type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, LineClampType, Render, RenderType, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nimport { TextInfo } from './Paint';\nimport CellImage from './CellImage';\nexport default class CellHeader extends BaseCell {\n align: Align;\n hideHeaderSelection = false;\n verticalAlign: VerticalAlign = 'middle';\n fixed?: Fixed;\n minWidth?: number;\n maxWidth?: number;\n widthFillDisable: boolean;\n type: Type | '';\n operation = false;\n editorType: string;\n level: number;\n text: string;\n hide: boolean = false;\n displayText: string = '';\n colspan: number;\n rowspan: number;\n row: any;\n key: string;\n required = false;\n readonly = false;\n ellipsis = false;\n overflowTooltipShow = true;\n children: Column[] = [];\n column: Column;\n colIndex: number;\n rowKey: string;\n rules?: Rules | Rule;\n hasChildren: boolean;\n render: Render;\n style: Partial<CSSStyleDeclaration> = {};\n drawX = 0;\n drawY = 0;\n sortIconName = 'sort-default';\n sortAscIconName = 'sort-asc';\n sortDescIconName = 'sort-desc';\n visibleWidth = 0;\n visibleHeight = 0;\n maxLineClampHeader: LineClampType = 'auto';\n domDataset: any = {};\n textOffsetRight = 0; // 文本偏移右\n textOffsetLeft = 0; // 文本偏移左\n // 文本信息\n textInfo: TextInfo | undefined = undefined\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n drawCellBgColor = '';\n drawTextColor = '';\n drawTextFont = '';\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource?: HTMLImageElement;\n // 排序相关\n drawSortImageX = 0;\n drawSortImageY = 0;\n drawSortImageWidth = 0;\n drawSortImageHeight = 0;\n drawSortImageName = '';\n drawSortImageSource?: HTMLImageElement;\n renderHeaderType: RenderType = 'default';\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\n super(ctx, x, y, width, height, 'header', column.fixed);\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.visibleWidth = width;\n this.visibleHeight = height;\n this.colIndex = colIndex;\n this.key = column.key;\n this.minWidth = column.minWidth;\n this.maxWidth = column.maxWidth;\n this.hide = (typeof column.hide === 'function' ? column.hide(column) : column.hide) || false;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.hideHeaderSelection = column.hideHeaderSelection || false;\n this.align = column.headerAlign || column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign =\n column.headerVerticalAlign || column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\n this.fixed = column.fixed || '';\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.text = column.title;\n this.column = column;\n this.colspan = column.colspan || 1;\n this.widthFillDisable = column.widthFillDisable || false;\n this.rowspan = column.rowspan || 1;\n this.rules = column.rules;\n this.readonly = column.readonly || false;\n this.required = column.required || false;\n this.sortIconName = column.sortIconName || 'sort-default';\n this.sortAscIconName = column.sortAscIconName || 'sort-asc';\n this.sortDescIconName = column.sortDescIconName || 'sort-desc';\n this.rowKey = generateShortUUID();\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\n this.render = column.renderHeader;\n this.maxLineClampHeader = column.maxLineClampHeader || 'auto';\n this.renderHeaderType = column.renderHeaderType || 'default';\n }\n /**\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\n * @returns\n */\n isVerticalVisible() {\n const { stageHeight } = this.ctx;\n const offsetHeight = stageHeight;\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n updateContainer() {\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\n let bgColor = HEADER_BG_COLOR;\n let textColor = HEADER_TEXT_COLOR;\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\n const { backgroundColor, color, font } =\n headerCellStyleMethod({\n colIndex: this.colIndex,\n column: this.column,\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n if (font) {\n this.drawTextFont = font;\n }\n }\n // 高亮查找结果\n const { colKey, type } = this.ctx.finderBar;\n if (type === 'header' && colKey === this.key) {\n bgColor = this.ctx.config.FINDER_CELL_BG_COLOR;\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateOffset() {\n if (this.column.sortBy) {\n this.textOffsetRight = 16;\n }\n if (this.required) {\n this.textOffsetLeft = 12;\n }\n }\n update() {\n this.updateContainer();\n this.updateOffset();\n this.displayText = this.getText();\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.updateSelection();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.drawTextWidth = this.width;\n this.drawTextHeight = this.height;\n this.updateStyle();\n }\n draw() {\n this.drawEdge();\n this.drawText();\n this.drawBg();\n this.updateSortIcon();\n this.drawImages();\n this.drawRequired();\n }\n drawImages() {\n this.getImages().forEach((image) => {\n if (image.visible && image.source) {\n this.ctx.paint.drawImage(image.source, image.x, image.y, image.width, image.height);\n }\n });\n }\n private drawEdge() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n\n // 有边框的情况下,绘制边框\n paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n }\n private drawText() {\n const {\n paint,\n config: { HEADER_FONT, CELL_PADDING },\n } = this.ctx;\n const cacheTextKey = `${this.displayText}_${this.drawTextWidth}_${this.drawTextFont}`;\n this.ellipsis = paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: this.drawTextFont || HEADER_FONT,\n padding: CELL_PADDING,\n color: this.drawTextColor,\n align: this.align,\n verticalAlign: this.verticalAlign,\n maxLineClamp: this.maxLineClampHeader,\n offsetRight: this.textOffsetRight, // 右边占位\n offsetLeft: this.textOffsetLeft, // 左边占位\n cacheTextKey,\n textCallback: (textInfo: TextInfo) => {\n this.textInfo = textInfo;\n },\n layoutCallback: (layout) => {\n this.ctx.emit('registerTextLayout', `${this.cellType}-${this.colIndex}-${this.level}`, layout);\n },\n },\n );\n }\n private drawRequired() {\n if (!this.required) {\n return;\n }\n if (!this.textInfo) {\n return;\n }\n const { left, top, height } = this.textInfo;\n const { paint, config: { REQUIRED_COLOR } } = this.ctx;\n paint.drawText('*', left - 18, top + (height - 12) / 2, 24, 24, {\n color: REQUIRED_COLOR,\n font: '18px Arial',\n align: 'center',\n verticalAlign: 'middle',\n padding: 0,\n });\n }\n private drawBg() {\n if (this.ctx.dragHeaderIng) {\n return;\n }\n // 选择区背景颜色\n const { ENABLE_SELECTOR, ENABLE_SELECTOR_SINGLE } = this.ctx.config;\n let minX = -1;\n let maxX = -1;\n if (this.ctx.focusCellHeader) {\n minX = this.ctx.focusCellHeader.colIndex;\n maxX = this.ctx.focusCellHeader.colIndex + this.ctx.focusCellHeader.colspan - 1;\n }\n // 启用选择器且不是单选\n if (ENABLE_SELECTOR && !ENABLE_SELECTOR_SINGLE) {\n const { xArr } = this.ctx.selector;\n minX = xArr[0];\n maxX = xArr[1];\n }\n const colSpanMaxIndex = this.colspan + this.colIndex - 1;\n if (this.colIndex >= minX && this.colIndex <= maxX && colSpanMaxIndex <= maxX) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private updateSelection() {\n // 选中框类型\n if (['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(this.type)) {\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n // 默认居中\n let iconX = this.drawX + (this.width - CHECKBOX_SIZE) / 2;\n let iconY = this.drawY + (this.height - CHECKBOX_SIZE) / 2;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n if (this.align === 'left' || this.align === 'right') {\n iconX = this.drawX + CELL_PADDING;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n }\n if (this.verticalAlign === 'top') {\n iconY = this.drawY + CELL_PADDING / 2;\n } else if (this.verticalAlign === 'bottom') {\n iconY = this.drawY + this.height - CHECKBOX_SIZE - CELL_PADDING / 2;\n }\n if (this.column.dragRow) {\n iconX += this.ctx.config.DRAG_ROW_ICON_SIZE;\n this.drawTextX += this.ctx.config.DRAG_ROW_ICON_SIZE;\n this.drawTextWidth -= this.ctx.config.DRAG_ROW_ICON_SIZE;\n }\n\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (indeterminate) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else 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 const selectionImage = new CellImage(checkboxName, iconX, iconY, CHECKBOX_SIZE, CHECKBOX_SIZE, checkboxImage);\n selectionImage.setVisible(!this.hideHeaderSelection);\n this.setImage('selection', selectionImage);\n }\n }\n private updateSortIcon() {\n // 如果没有sortBy配置且不是后端排序,不显示排序图标\n if (!this.column.sortBy || !this.textInfo) {\n return;\n }\n const { right, top, height } = this.textInfo;\n const x = right + 4;\n const y = top + (height - 16) / 2;\n const iconSize = 16;\n let iconName = this.sortIconName;\n // 前端排序\n const sortState = this.ctx.database.getSortState(this.key);\n if (sortState.direction === 'asc') {\n iconName = this.sortAscIconName;\n } else if (sortState.direction === 'desc') {\n iconName = this.sortDescIconName;\n }\n const icon = this.ctx.icons.get(iconName);\n const sortImage = new CellImage(iconName, x, y, iconSize, iconSize, icon);\n this.setImage('sort', sortImage);\n }\n\n getText() {\n if (this.render && this.renderHeaderType === 'default') {\n return '';\n }\n if (['', null, undefined].includes(this.text)) {\n return '';\n }\n return `${this.text}`;\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = '';\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 } else {\n // 中间的,需要减去左边固定列的宽度\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left: left,\n top: `${this.drawY + 1}px`,\n width: `${this.width}px`,\n height: `${this.height - 2}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n}\n","export type TreeUtilPosition = 'none' | 'before' | 'after' | 'inside';\r\n\r\ninterface TreeConfig {\r\n key?: string;\r\n childrenKey?: string;\r\n}\r\n\r\ninterface NodeInfo {\r\n parent: any | null;\r\n index: number;\r\n node: any;\r\n}\r\n\r\nexport class TreeUtil {\r\n private root: any[];\r\n private key: string;\r\n private childrenKey: string;\r\n\r\n constructor(initialData: any[], config?: TreeConfig) {\r\n this.root = initialData;\r\n this.key = config?.key || 'key';\r\n this.childrenKey = config?.childrenKey || 'children';\r\n }\r\n\r\n getTree() {\r\n return this.root;\r\n }\r\n\r\n treeMove(sourceKey: any, targetKey: any, position: TreeUtilPosition) {\r\n if (position === 'none') {\r\n return;\r\n }\r\n if (sourceKey === targetKey) {\r\n return;\r\n }\r\n\r\n const sourceInfo = this.findNodeWithParent(this.root, sourceKey);\r\n if (!sourceInfo) return;\r\n\r\n const targetInfo = this.findNodeWithParent(this.root, targetKey);\r\n if (!targetInfo) return;\r\n\r\n const { parent: sourceParent, index: sourceIndex, node: sourceNode } = sourceInfo;\r\n const { parent: targetParent, index: targetIndex, node: targetNode } = targetInfo;\r\n\r\n if (this.isDescendant(sourceNode, targetKey)) {\r\n return;\r\n }\r\n const sourceArray = sourceParent ? sourceParent[this.childrenKey] : this.root;\r\n sourceArray.splice(sourceIndex, 1);\r\n\r\n if (sourceParent && sourceArray.length === 0) {\r\n delete sourceParent[this.childrenKey];\r\n }\r\n if (position === 'inside') {\r\n if (!Array.isArray(targetNode[this.childrenKey])) {\r\n targetNode[this.childrenKey] = [];\r\n }\r\n targetNode[this.childrenKey].push(sourceNode);\r\n return;\r\n }\r\n\r\n const targetArray = targetParent ? targetParent[this.childrenKey] : this.root;\r\n\r\n let insertIndex = targetIndex;\r\n if (sourceParent === targetParent && sourceIndex < targetIndex) {\r\n insertIndex--;\r\n }\r\n if (position === 'after') insertIndex++;\r\n\r\n targetArray.splice(insertIndex, 0, sourceNode);\r\n }\r\n\r\n private findNodeWithParent(tree: any[], nodeKey: any, parent: any | null = null): NodeInfo | null {\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node[this.key] === nodeKey) return { parent, index: i, node };\r\n const children = node[this.childrenKey];\r\n if (Array.isArray(children)) {\r\n const found = this.findNodeWithParent(children, nodeKey, node);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private isDescendant(node: any, targetKey: any): boolean {\r\n const children = node[this.childrenKey];\r\n if (!Array.isArray(children)) return false;\r\n for (const child of children) {\r\n if (child[this.key] === targetKey) return true;\r\n if (this.isDescendant(child, targetKey)) return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle, filterHiddenColumns } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column, ColumnDragChangeEvent } from './types';\nimport { TreeUtil } from './TreeUtil';\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 dragTarget: CellHeader | null = null; //拖拽表头\n private dragingCell: CellHeader | undefined = undefined; //拖拽表头进入的格子\n private dragCellDiff = 0; //拖拽表头\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 visibleColumns: 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.clearSelector();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n this.initSelection();\n this.initSort();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n this.initDragColumn();\n }\n init(isBuffer = false) {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n // 防止resizeAllColumn递归\n if (!isBuffer) {\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n }\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n this.visibleColumns = filterHiddenColumns(this.columns);\n const maxHeaderRow = getMaxRow(this.visibleColumns);\n const leafColumns = toLeaf(this.visibleColumns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.visibleHeight = this.height;\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.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n const spanColumns = sortFixed(calCrossSpan(this.visibleColumns, maxHeaderRow));\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n const { stageWidth, stagePhysicalWidth } = this.ctx.zoomScale.resolveStageWidth({\n containerPhysicalWidth: containerElement.width,\n contentWidth: this.width,\n scrollerTrackSize: SCROLLER_TRACK_SIZE,\n fillContainer: this.resizeNum > 0,\n });\n this.ctx.stageWidth = stageWidth;\n this.ctx.stagePhysicalWidth = stagePhysicalWidth;\n this.ctx.stageElement.style.width = `${stagePhysicalWidth}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.allCellHeaders = this.allCellHeaders;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n private initSort() {\n this.ctx.on('cellHeaderClick', (cellHeader, e) => {\n if (!cellHeader.isImageInside('sort', e)) {\n return;\n }\n const currentState = this.ctx.database.getSortState(cellHeader.key);\n let newDirection: 'asc' | 'desc' | 'none';\n // 按照 不排序->升序->降序->不排序 的顺序循环\n if (currentState.direction === 'none') {\n newDirection = 'asc';\n } else if (currentState.direction === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = 'none';\n }\n this.ctx.database.setSortState(cellHeader.key, newDirection);\n });\n }\n private initSelection() {\n this.ctx.on('cellHeaderClick', (cellHeader, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cellHeader.isImageInside('selection', e)) {\n return;\n }\n const image = cellHeader.getImage('selection');\n if (['checkbox-uncheck', 'checkbox-indeterminate'].includes(image.name)) {\n this.ctx.database.toggleAllSelection();\n } else if (image.name === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n });\n }\n // 调整表头的宽度\n private initResizeColumn() {\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_COLUMN) {\n return;\n }\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 // 鼠标在表头上,边界处理(offsetX 为物理像素,转成逻辑坐标再与逻辑宽度比较)\n const { offsetX: logicalOffsetX } = this.ctx.getOffset(e);\n if (logicalOffsetX < 0 || logicalOffsetX > 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 y = offsetY;\n const drawX = col.getDrawX();\n const drawY = col.getDrawY();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n y > drawY\n ) {\n const colIndex = col.colIndex + col.colspan - 1;\n const resizeTarget = this.leafCellHeaders.find((item) => item.colIndex === colIndex);\n if (!resizeTarget) {\n return;\n }\n // 中间部分到固定位置\n if (!resizeTarget.fixed && this.ctx.stageWidth - this.ctx.fixedRightWidth < drawX + col.width) {\n return;\n }\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = resizeTarget;\n }\n }\n }\n }\n });\n }\n private initDragColumn() {\n this.ctx.on('cellHeaderMousedown', (cellHeader) => {\n if (this.ctx.stageElement.style.cursor !== 'default') {\n return;\n }\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cellHeader.column.dragDisabled) {\n return;\n }\n if (this.dragTarget === cellHeader) {\n this.ctx.dragHeaderIng = true;\n this.dragCellDiff = this.ctx.mouseX - cellHeader.drawX;\n this.ctx.stageElement.style.cursor = 'grabbing';\n } else {\n this.dragTarget = cellHeader;\n this.ctx.dragHeaderIng = false;\n }\n });\n this.ctx.on('cellMousedown', () => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n this.dragTarget = null;\n this.ctx.dragHeaderIng = false;\n });\n this.ctx.on('mouseup', () => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (this.dragingCell && this.dragTarget) {\n // 需要移动\n const genSortObj = (columns: Column[], obj: any = {}) => {\n columns.forEach((item: Column, index): any => {\n if (item.children) {\n genSortObj(item.children, obj);\n }\n obj[item.key] = index;\n });\n return obj;\n };\n const columns = this.ctx.database.getColumns();\n const sortColumns = calCrossSpan(columns, getMaxRow(columns));\n const tree = new TreeUtil(sortColumns, {\n key: 'key', // 节点唯一标识字段(对应我们之前的field)\n childrenKey: 'children', // 子节点数组字段\n });\n const position = this.dragTarget.colIndex > this.dragingCell.colIndex ? 'before' : 'after';\n tree.treeMove(this.dragTarget.column.key, this.dragingCell.column.key, position);\n const columnsTree = tree.getTree();\n const sortData = genSortObj(columnsTree);\n this.ctx.database.setCustomHeader({ sortData });\n this.init();\n const data: ColumnDragChangeEvent = {\n source: this.dragTarget,\n target: this.dragingCell,\n columns: sortColumns,\n };\n this.ctx.emit('columnDragChange', data);\n }\n if (this.ctx.dragHeaderIng && this.dragTarget) {\n if (this.ctx.stageElement.style.cursor === 'grabbing') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n this.ctx.dragHeaderIng = false;\n this.dragTarget = null;\n this.dragingCell = undefined;\n this.dragCellDiff = 0;\n this.ctx.clearSelector();\n this.ctx.focusCellHeader = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (!this.ctx.dragHeaderIng || !this.dragTarget) {\n return;\n }\n if (!this.dragTarget.fixed) {\n this.ctx.startAdjustPosition(e);\n }\n this.ctx.emit('draw');\n });\n this.ctx.on('cellHoverChange', (cell) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cell.column.dragDisabled) {\n return;\n }\n this.dragingCell = this.getDragCellHeader(cell.colIndex);\n });\n this.ctx.on('cellHeaderHoverChange', (cellHeader) => {\n if (!this.ctx.config.ENABLE_DRAG_COLUMN) {\n return;\n }\n if (cellHeader.column.dragDisabled) {\n return;\n }\n this.dragingCell = this.getDragCellHeader(cellHeader.colIndex);\n });\n }\n\n private getDragCellHeader(colIndex: number) {\n if (!this.dragTarget || !this.ctx.dragHeaderIng) {\n return;\n }\n // 同级别\n const {\n column: { parentKey },\n key,\n level,\n fixed,\n } = this.dragTarget;\n\n const dragCellHeader = this.allCellHeaders.find(\n (item) =>\n item.key !== key &&\n item.fixed === fixed &&\n item.column.level === level &&\n item.column.parentKey === parentKey &&\n item.colIndex <= colIndex &&\n item.colIndex + item.colspan - 1 >= colIndex,\n );\n if (this.ctx.dragHeaderIng) {\n const cursor = dragCellHeader ? 'grabbing' : 'not-allowed';\n // 禁用拖拽\n this.ctx.stageElement.style.cursor = cursor;\n }\n return dragCellHeader;\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 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 }\n const width = cell.width + diff + overDiff;\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: width,\n column: cell.column,\n columns: this.columns,\n });\n this.ctx.database.setCustomHeaderResizableData(cell.key, width);\n this.init(true);\n this.ctx.emit('draw');\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.init(true);\n this.ctx.emit(\"draw\");\n }\n getCustomHeader() {\n const columns = this.ctx.database.getColumns();\n const customHeader = this.ctx.database.getCustomHeader();\n const { sortData = {} } = customHeader;\n if (Object.keys(sortData).length === 0) {\n return {\n columns,\n customHeader,\n };\n }\n const _sortColumns = calCrossSpan(columns, getMaxRow(columns));\n return {\n columns: _sortColumns,\n customHeader,\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: {\n RESIZE_COLUMN_LINE_COLOR,\n RESIZE_COLUMN_TEXT_COLOR,\n RESIZE_COLUMN_TEXT_BG_COLOR,\n ENABLE_RESIZE_COLUMN_TEXT,\n },\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 });\n if (ENABLE_RESIZE_COLUMN_TEXT) {\n const newWidth = Math.floor(resizeTargetWidth + this.resizeDiff);\n const text = `${newWidth}px`;\n const rw = 45;\n const rh = 24;\n this.ctx.paint.drawRect(x + rw / 2, this.ctx.mouseY - rh / 2, rw, rh, {\n fillColor: RESIZE_COLUMN_TEXT_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n });\n this.ctx.paint.drawText(text, x + rw / 2, this.ctx.mouseY - rh / 2, rw, rh + 2, {\n padding: 0,\n color: RESIZE_COLUMN_TEXT_COLOR,\n align: 'center',\n verticalAlign: 'middle',\n });\n }\n }\n }\n private drawDragTip() {\n if (this.dragTarget && this.ctx.dragHeaderIng) {\n const { DRAG_TIP_BG_COLOR, DRAG_TIP_LINE_COLOR } = this.ctx.config;\n const rw = this.dragTarget.width;\n // 提示背景\n this.ctx.paint.drawRect(\n this.ctx.mouseX - this.dragCellDiff,\n this.visibleHeight,\n rw,\n this.ctx.body.visibleHeight,\n {\n fillColor: DRAG_TIP_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n },\n );\n if (this.dragingCell) {\n const { drawX, drawY, visibleWidth, colIndex } = this.dragingCell;\n // 向坐移动\n let x = drawX;\n let y = drawY;\n if (colIndex > this.dragTarget.colIndex) {\n // 向右移动\n x = drawX + visibleWidth;\n }\n // 边界处理\n if (colIndex === 0) {\n x = x + 1;\n }\n // 边界处理\n if (colIndex === this.ctx.maxColIndex) {\n x = x - 1;\n }\n const poins = [x, y, x, this.ctx.stageHeight];\n // 倒三角形\n const trianglePoins = [x - 4, y, x + 4, y, x, y + 6, x - 4, y];\n this.ctx.paint.drawLine(trianglePoins, {\n borderColor: DRAG_TIP_LINE_COLOR,\n borderWidth: 1.2,\n fillColor: DRAG_TIP_LINE_COLOR,\n });\n this.ctx.paint.drawLine(poins, {\n borderColor: DRAG_TIP_LINE_COLOR,\n borderWidth: 1.2,\n });\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.drawBottomLine();\n this.drawTipLine();\n this.drawDragTip();\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 calculatedHeightCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n calculatedHeight: number = -1;\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 const calculatedHeightCells: 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 if (cell.autoRowHeight) {\n calculatedHeightCells.push(cell);\n }\n });\n this.cells = cells;\n this.calculatedHeightCells = calculatedHeightCells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n updateCalculatedHeight() {\n const heights = this.calculatedHeightCells.map((cell) => {\n const calculatedHeight = cell.getAutoHeight();\n const { key, height: curRowMaxHeight = -1 } = this.ctx.database.getMaxRowHeightItem(this.rowKey) || {};\n // 设置最大值\n if (calculatedHeight > curRowMaxHeight) {\n this.ctx.database.setMaxRowHeightItem(this.rowKey, cell.key, calculatedHeight);\n } else if (cell.key === key && calculatedHeight < curRowMaxHeight) {\n // 如果计算高度小于当前最大值,则设置为当前最大值\n this.ctx.database.setMaxRowHeightItem(this.rowKey, cell.key, calculatedHeight);\n }\n return calculatedHeight;\n });\n // 获取最高高度\n this.calculatedHeight = heights.length ? Math.max(...heights) : -1;\n return this.calculatedHeight;\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 Cell from './Cell';\nimport type Context from './Context';\nimport Row from './Row';\nimport { TreeUtil, TreeUtilPosition } from './TreeUtil';\nimport { ExpandLazyMethod, Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private dragSource: Cell | null = null; //拖拽行的源\n private dragTarget: Cell | null = null; //拖拽行的目标\n private dragRowDiff = 0; //拖拽行的差值\n private dragPosition: TreeUtilPosition = 'none'; //拖拽行的目标行索引\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.initTree();\n this.initSelection();\n this.initResizeRow();\n this.initDragRow();\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 this.ctx.isEmpty = !this.data.length;\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 const { zoomScale } = this.ctx;\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n containerHeight += footerHeight;\n let physicalStageHeight = zoomScale.contentToPhysical(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 > zoomScale.contentToPhysical(header.height + SCROLLER_TRACK_SIZE)) {\n physicalStageHeight = _stageHeight;\n } else if (zoomScale.contentToPhysical(containerHeight) > MAX_HEIGHT) {\n physicalStageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n physicalStageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && zoomScale.contentToPhysical(containerHeight) > MAX_HEIGHT) {\n physicalStageHeight = MAX_HEIGHT;\n }\n if (physicalStageHeight > 0) {\n const { stageHeight, stagePhysicalHeight } = zoomScale.applyStageHeight(\n this.ctx.stageElement,\n physicalStageHeight,\n );\n this.ctx.stageHeight = stageHeight;\n this.ctx.stagePhysicalHeight = stagePhysicalHeight;\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 // canvas 缓冲区按物理尺寸*dpr,保证原生分辨率清晰\n const canvasWidth = this.ctx.stagePhysicalWidth * dpr;\n const canvasHeight = this.ctx.stagePhysicalHeight * 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, this.ctx.zoomScale.value);\n }\n private initTree() {\n this.ctx.on('cellClick', (cell, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cell.isImageInside('tree', e)) {\n return;\n }\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 private initSelection() {\n this.ctx.on('cellClick', (cell, e) => {\n if (this.ctx.stageElement.style.cursor !== 'pointer') {\n return;\n }\n if (!cell.isImageInside('selection', e)) {\n return;\n }\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey, cell.type);\n });\n }\n // 调整行的高度\n private initResizeRow() {\n this.ctx.on('resize', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\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.config.ENABLE_RESIZE_ROW) {\n return;\n }\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 if (!this.ctx.config.ENABLE_RESIZE_ROW) {\n return;\n }\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 const { calculatedHeight } = this.resizeTarget;\n const minHeight = calculatedHeight === -1 ? RESIZE_ROW_MIN_HEIGHT : calculatedHeight;\n if (diff + resizeTargetHeight < minHeight) {\n diff = -(resizeTargetHeight - minHeight);\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 initDragRow() {\n this.ctx.on('cellMousedown', (cell, e) => {\n if (!this.ctx.config.ENABLE_DRAG_ROW) {\n return;\n }\n if (!cell.isImageInside('drag', e)) {\n return;\n }\n this.dragSource = cell;\n // 收起行\n this.ctx.database.expandItem(cell.rowKey, false);\n this.ctx.dragRowIng = true;\n this.dragRowDiff = this.ctx.mouseY - cell.drawY;\n this.ctx.stageElement.style.cursor = 'grabbing';\n this.ctx.clearSelector();\n this.ctx.emit('dragRowMouseDown', cell);\n this.ctx.emit('draw');\n });\n this.ctx.on('mouseup', async () => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n if (this.dragSource && this.dragTarget && this.ctx.stageElement.style.cursor !== 'not-allowed') {\n const dragSource = this.dragSource;\n const dragTarget = this.dragTarget;\n const params = {\n source: dragSource,\n target: dragTarget,\n position: this.dragPosition,\n };\n this.ctx.emit('dragRowChange', params);\n let isDragRow = true;\n const { BEFORE_DRAG_ROW_METHOD } = this.ctx.config;\n // 判断是不是函数\n if (typeof BEFORE_DRAG_ROW_METHOD === 'function') {\n // 判断的是不是Promise\n isDragRow = await BEFORE_DRAG_ROW_METHOD(params);\n }\n if (isDragRow && !this.ctx.config.ENABLE_DRAG_ROW_CUSTOM) {\n const originalData = this.ctx.database.getOriginalData();\n const { TREE_CHILDREN_KEY, ROW_KEY } = this.ctx.config;\n const treeUtil = new TreeUtil(originalData, {\n key: ROW_KEY,\n childrenKey: TREE_CHILDREN_KEY,\n });\n treeUtil.treeMove(dragSource.rowKey, dragTarget.rowKey, this.dragPosition);\n this.ctx.emit('loadData', treeUtil.getTree());\n }\n }\n if (!this.dragTarget) {\n this.ctx.stageElement.style.cursor = 'grab';\n }\n this.ctx.dragRowIng = false;\n this.dragSource = null;\n this.dragTarget = null;\n this.dragPosition = 'after';\n this.dragRowDiff = 0;\n this.ctx.emit('draw');\n });\n this.ctx.on('mousemove', (e) => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n const { offsetY } = this.ctx.getOffset(e);\n const { drawY } = this.dragTarget as Cell;\n if (drawY < offsetY || drawY > offsetY) {\n this.ctx.startAdjustPosition(e);\n } else {\n this.ctx.stopAdjustPosition();\n }\n });\n this.ctx.on('cellMouseenter', (cell) => {\n if (!this.ctx.dragRowIng) {\n return;\n }\n this.dragTarget = cell;\n const { ENABLE_DRAG_ROW_CROSS_LEVEL } = this.ctx.config;\n const dragSource = this.dragSource;\n const dragTarget = this.dragTarget;\n // 不启用跨级拖拽时,判断是否在同一级\n if (!ENABLE_DRAG_ROW_CROSS_LEVEL && dragSource && dragTarget && dragSource.parentRowKey !== dragTarget.parentRowKey) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n return;\n }\n this.ctx.stageElement.style.cursor = 'grabbing';\n this.dragTarget = cell;\n const { drawY, visibleHeight } = cell;\n const scopeHeight = ENABLE_DRAG_ROW_CROSS_LEVEL ? visibleHeight / 3 : visibleHeight / 2;\n if (this.ctx.mouseY <= drawY + scopeHeight) {\n this.dragPosition = 'before';\n } else if (this.ctx.mouseY > drawY + visibleHeight - scopeHeight) {\n this.dragPosition = 'after';\n } else {\n this.dragPosition = 'inside';\n }\n const params = {\n dragSource: this.dragSource,\n dragTarget: this.dragTarget,\n dragPosition: this.dragPosition,\n };\n this.ctx.emit('dragRowMove', params);\n this.ctx.emit('draw');\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 // 拖拽提示线绘制\n drawDragRowTip() {\n if (this.ctx.dragRowIng && this.dragTarget && this.dragSource) {\n const {\n stageWidth,\n config: { DRAG_ROW_TIP_LINE_COLOR, DRAG_TIP_BG_COLOR },\n } = this.ctx;\n const rh = this.dragSource.visibleHeight;\n // 提示背景\n this.ctx.paint.drawRect(0, this.ctx.mouseY - this.dragRowDiff, this.visibleWidth, rh, {\n fillColor: DRAG_TIP_BG_COLOR,\n borderWidth: 0,\n borderColor: 'transparent',\n });\n const dragTargetDrawY = this.dragTarget.drawY;\n const dragTargetHeight = this.dragTarget.height;\n // 默认上方\n let y = dragTargetDrawY;\n if (['before', 'after'].includes(this.dragPosition)) {\n if (this.dragPosition === 'after') {\n y = dragTargetDrawY + dragTargetHeight;\n }\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: DRAG_ROW_TIP_LINE_COLOR,\n borderWidth: 1.2,\n });\n }\n // 中间位置\n if (['inside'].includes(this.dragPosition)) {\n y = dragTargetDrawY + dragTargetHeight / 2;\n }\n // 倒三角形\n const trianglePoins = [0, y - 4, 6, y, 0, y + 4, 0, y - 4];\n this.ctx.paint.drawLine(trianglePoins, {\n borderColor: DRAG_ROW_TIP_LINE_COLOR,\n borderWidth: 1.2,\n fillColor: DRAG_ROW_TIP_LINE_COLOR,\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 && !this.ctx.isEmpty) {\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 (\n scrollX < Math.floor(header.width - stageWidth - 1) &&\n fixedRightWidth !== SCROLLER_TRACK_SIZE &&\n !this.ctx.isEmpty\n ) {\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 updateAutoHeight(): boolean {\n const rows = this.ctx.body.renderRows;\n const hasAutoHeight = rows.some((row) => row.calculatedHeightCells.length > 0);\n // 如果没有计算格子,不更新\n if (!hasAutoHeight) {\n return false;\n }\n // 更新计算高度\n rows.forEach((row) => {\n row.updateCalculatedHeight();\n });\n // 如果有计算格子,重新计算行高\n const heights = rows.map((row) => ({\n height: row.calculatedHeight,\n rowIndex: row.rowIndex,\n }));\n return this.ctx.database.setBatchCalculatedRowHeight(heights);\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, ErrorResult, 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 ctx: Context;\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 // focus为fixed的不处理\r\n if (this.ctx.focusCellHeader?.fixed) {\r\n return;\r\n }\r\n if (!this.ctx.dragHeaderIng && this.ctx.selectorMove) {\r\n this.ctx.startAdjustPosition(e);\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('cellClick', () => { \r\n this.adjustBoundaryPosition();\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 // 如果是填充返回\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.ctx.selectorMove = false;\r\n this.ctx.stopAdjustPosition();\r\n setTimeout(() => {\r\n this.ctx.disableHoverIconClick = false;\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.textSelecting) {\r\n return;\r\n }\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n if (this.ctx.textSelecting) {\r\n return;\r\n }\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 // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.ctx.clearSelector();\r\n if (cell.operation) {\r\n this.selectAll();\r\n } else {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (this.ctx.finding) {\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 this.adjustBoundaryPosition();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('selectCols', (cell: CellHeader) => {\r\n this.selectCols(cell);\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n if (this.ctx.dragHeaderIng) {\r\n return;\r\n }\r\n if (this.ctx.dragRowIng) {\r\n return;\r\n }\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 this.ctx.disableHoverIconClick = 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 // 启用合并单元格关联\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 // 判断是否选择列中\r\n if (maxY === this.ctx.maxRowIndex && minY === 0) {\r\n this.ctx.selectColsIng = true;\r\n } else {\r\n this.ctx.selectColsIng = false;\r\n }\r\n // 判断是否选择行中\r\n if (maxX === this.ctx.maxColIndex && minX === 0) {\r\n this.ctx.selectRowsIng = true;\r\n } else {\r\n this.ctx.selectRowsIng = false;\r\n }\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 // 如果是选择行或列中就不处理,因为会导致性能问题\r\n if ((maxY === this.ctx.maxRowIndex && minY === 0) || (maxX === this.ctx.maxColIndex && minX === 0)) {\r\n return {\r\n xArr,\r\n yArr,\r\n onlyMergeCell: false,\r\n };\r\n }\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 | Cell) {\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 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.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n this.ctx.clearSelector();\r\n if (this.ctx.mousedown && 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 + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\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 }\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 || this.ctx.textSelectionStr) {\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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: this.ctx.locale.getText('mergeCellNoCopy'),\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: this.ctx.locale.getText('mergeCellNoPaste'),\r\n data: [],\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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 this.ctx.emit('draw');\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 // 判断是否在设置范围内\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 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.5 || Math.abs(scrollY - _scrollY) > 2.5) {\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n }\r\n }\r\n destroy() { }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorResult } 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 if (this.ctx.autofillMove) {\r\n this.ctx.startAdjustPosition(e);\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 this.ctx.stopAdjustPosition();\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 this.ctx.disableHoverIconClick = 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 setTimeout(() => {\r\n this.ctx.disableHoverIconClick = false;\r\n }, 0);\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_AUTOFILL_SPAN_COL, ENABLE_AUTOFILL_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 const xArrSelector = this.ctx.selector.xArr;\r\n const yArrSelector = this.ctx.selector.yArr;\r\n if (!ENABLE_AUTOFILL_SPAN_ROW && JSON.stringify(yArrSelector) !== JSON.stringify(_yArr)) {\r\n return;\r\n }\r\n if (!ENABLE_AUTOFILL_SPAN_COL && JSON.stringify(xArrSelector) !== JSON.stringify(_xArr)) {\r\n return;\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: ErrorResult = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: this.ctx.locale.getText('mergeCellNoFill'),\r\n data: [],\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n console.error(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 this.ctx.emit('draw');\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};\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 const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? '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.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\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 const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\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 * 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// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\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 platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\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 resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\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: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\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 * 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 platform.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 platform.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 const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\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\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 platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.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 platform.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\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\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 = originSides.has(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 platform\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 platform.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 = originSides.has(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 platform.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) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\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 // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\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 (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(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 } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\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, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, 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$1(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$1(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\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\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\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 (isOffsetParentAnElement) {\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 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\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 + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\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$1(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\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\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 const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\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 x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\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$1(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$1(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$1(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 && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || 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 firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: 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\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 function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\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 setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(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$1(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\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\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 elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\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 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\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) : []), ...(floating ? 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 && floating) {\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 if (floating) {\n resizeObserver.observe(floating);\n }\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 && !rectsAreEqual(prevRefRect, nextRefRect)) {\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 this.ctx.on('cellFooterMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellFooterHoverChange', (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 this.ctx.on('cellShowTooltip', (cell, message) => {\n this.show(cell, message);\n });\n this.ctx.on('cellHideTooltip', () => {\n this.hide();\n });\n }\n private show(cell: Cell, message?: string) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (this.ctx.contextMenuIng) {\n return;\n }\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 if (message) {\n text = 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 viewportRect = this.ctx.zoomScale.getViewportRect(\n {\n x: cell.drawX,\n y: cell.drawY,\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n },\n targetRect,\n );\n const virtualEl = {\n getBoundingClientRect() {\n return viewportRect;\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\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 this.resetEditorStyle();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n this.focusInput();\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('hoverIconClick', (cell) => {\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 (this.ctx.finding) {\r\n return;\r\n }\r\n // 如果是多选不能输入任何字符, 如果输入框聚焦,则进入编辑模式\r\n const { focusCell } = this.ctx;\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.key === '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.key === '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.key === '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 'CapsLock',\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 const isFocus = document.activeElement === this.inputEl;\r\n if (!isFocus && focusCell.editorType === 'text') {\r\n e.preventDefault();\r\n return;\r\n }\r\n this.startEdit(true);\r\n });\r\n // 重绘可能会导致cellClick事件不能触发,调整用按下cellMouseup按下延时赋值cellTarget\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是选择器,不进入编辑模式\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\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 this.focusInput();\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 this.resetEditorStyle();\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 isTextSelectionActive() {\r\n return (\r\n this.ctx.config.ENABLE_TEXT_SELECTION &&\r\n (this.ctx.textSelecting || !!this.ctx.textSelectionStr)\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.id = 'e-virt-table-editor-textarea';\r\n this.inputEl.setAttribute('rows', '1');\r\n this.inputEl.setAttribute('tabindex', '-1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\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 if (!this.ctx.editing) {\r\n return;\r\n }\r\n // 针对数字类型提示错误信息\r\n const value = this.inputEl.value;\r\n if (this.cellTarget && this.cellTarget.type === 'number' && value !== '') {\r\n this.ctx.emit('cellHideTooltip');\r\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) {\r\n const numberErrorTip = this.ctx.locale.getText('numberErrorTip');\r\n this.ctx.emit('cellShowTooltip', this.cellTarget, numberErrorTip);\r\n }\r\n }\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n // 物理高度换算为逻辑高度做比较\r\n const scrollHeightLogical = this.ctx.toLogical(scrollHeight);\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeightLogical > maxHeight) {\r\n scrollHeight = this.ctx.toVisual(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 = this.ctx.toVisualPx(header.height - 1);\r\n }\r\n if (this.drawY + this.ctx.toLogical(scrollHeight) > bottomY) {\r\n this.editorEl.style.left = this.ctx.toVisualPx(this.drawX - 1);\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = this.ctx.toVisualPx(stageHeight - bottomY);\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 // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\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 const visualMaxHeight = this.ctx.toVisual(maxHeight);\r\n // 显示编辑器(drawX/drawY/width/height 为逻辑值,DOM 定位需*zoom)\r\n this.editorEl.style.zIndex = '100';\r\n this.editorEl.style.left = this.ctx.toVisualPx(this.drawX - 1);\r\n this.editorEl.style.top = this.ctx.toVisualPx(this.drawY);\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxWidth = 'none';\r\n this.editorEl.style.maxHeight = `${visualMaxHeight}px`;\r\n if (['text'].includes(editorType)) {\r\n this.inputEl.style.opacity = '1';\r\n this.inputEl.style.position = 'relative';\r\n this.inputEl.style.minWidth = this.ctx.toVisualPx(width - 1);\r\n this.inputEl.style.minHeight = this.ctx.toVisualPx(height - 1);\r\n this.inputEl.style.maxHeight = `${visualMaxHeight}px`;\r\n this.inputEl.style.width = this.ctx.toVisualPx(width);\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = this.ctx.toVisualPx(CELL_PADDING);\r\n this.inputEl.value = ''; // 清空\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n if (this.ctx.toLogical(this.inputEl.scrollHeight) > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n } else {\r\n this.inputEl.style.opacity = '0';\r\n this.inputEl.style.width = '1px';\r\n this.inputEl.style.height = '1px';\r\n this.inputEl.style.position = 'absolute';\r\n this.inputEl.style.left = '0px';\r\n this.inputEl.style.top = '0px';\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 }\r\n }\r\n private focusInput() {\r\n if (document.activeElement !== this.inputEl) {\r\n this.inputEl.focus({ preventScroll: true });\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n if (this.isTextSelectionActive()) {\r\n return;\r\n }\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 const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n // 滚动到焦点单元格\r\n this.ctx.emit('scrollToIndex', focusCell.rowIndex, focusCell.colIndex);\r\n }\r\n this.editCell(focusCell.rowIndex, focusCell.colIndex, ignoreValue);\r\n }\r\n editCell(rowIndex: number, colIndex: number, ignoreValue = false) {\r\n // 直接从renderRows中获取cell,防止focusCell不是最新的\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 // 可视区可见\r\n const isVisible = cell.isVerticalVisible() && cell.isHorizontalVisible();\r\n if (!isVisible) {\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, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\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('cellHideTooltip');\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.resetEditorStyle();\r\n // 聚焦输入框,防止非文本类型无法聚焦\r\n setTimeout(() => {\r\n this.focusInput();\r\n }, 0);\r\n this.ctx.emit('draw');\r\n }\r\n private resetEditorStyle() {\r\n const cell = this.cellTarget;\r\n if (!cell) {\r\n return;\r\n }\r\n this.editorEl.style.left = this.ctx.toVisualPx(cell.drawX);\r\n this.editorEl.style.top = this.ctx.toVisualPx(cell.drawY);\r\n this.editorEl.style.maxWidth = `1px`;\r\n this.editorEl.style.maxHeight = `1px`;\r\n this.editorEl.style.zIndex = '-1';\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.inputEl.blur();\r\n this.ctx.emit('draw');\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_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 = this.getText();\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 top: this.ctx.toVisualPx(top),\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n private getText() {\r\n return this.ctx.config.EMPTY_TEXT || this.ctx.locale.getText('emptyText');\r\n }\r\n draw() {\r\n if (this.ctx.emptyElement) {\r\n return;\r\n }\r\n this.emptyEl.innerText = this.getText();\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\nimport { throttle } from './util';\r\nexport default class Overlayer {\r\n ctx: Context;\r\n observer?: MutationObserver;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private arerMapsEqual(m1: Map<string, number>, m2: Map<string, number>): boolean {\r\n if (m1.size !== m2.size) return false;\r\n\r\n for (let [key, value] of m1) {\r\n if (!m2.has(key)) return false;\r\n if (m2.get(key) !== value) return false;\r\n }\r\n\r\n return true;\r\n }\r\n private init() {\r\n // 监听覆盖层变化,用于自动高度计算\r\n this.observer = new MutationObserver(\r\n throttle(() => {\r\n // 当 DOM 发生变化时执行的回调\r\n const elements = this.ctx.overlayerElement.querySelectorAll('[data-auto-height=\"true\"]');\r\n const map = new Map<string, number>();\r\n elements.forEach((element: Element) => {\r\n const rowIndex = Number(element.getAttribute('data-row-index'));\r\n const colIndex = Number(element.getAttribute('data-col-index'));\r\n if (isNaN(rowIndex) || isNaN(colIndex)) {\r\n return;\r\n }\r\n const rect = element.getBoundingClientRect();\r\n const key = `${rowIndex}\\u200b_${colIndex}`;\r\n map.set(key, this.ctx.zoomScale.domHeightToLogical(rect.height));\r\n });\r\n const overlayerAutoHeightMap = this.ctx.database.getOverlayerAutoHeightMap();\r\n const isNeedUpdate = !this.arerMapsEqual(overlayerAutoHeightMap, map);\r\n if (isNeedUpdate) {\r\n this.ctx.database.setOverlayerAutoHeightMap(map);\r\n if (overlayerAutoHeightMap.size === 0 && map.size === 0) {\r\n return;\r\n }\r\n this.ctx.emit('draw');\r\n }\r\n }, 16.67),\r\n );\r\n this.observer.observe(this.ctx.overlayerElement, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n characterData: true,\r\n });\r\n // 自定义覆盖层时,不监听覆盖层变化\r\n if (this.ctx.overlayerElement.getAttribute('data-overlayer') === 'default') {\r\n this.ctx.on('overlayerChange', (container) => {\r\n const overlayerEl = this.ctx.overlayerElement;\r\n // 移除所有子元素\r\n overlayerEl.replaceChildren();\r\n Object.assign(overlayerEl.style, container.style);\r\n container.views.forEach((typeView: OverlayerWrapper) => {\r\n const typeDiv = document.createElement('div');\r\n typeDiv.className = typeView.class;\r\n this.ctx.zoomScale.assignScaledStyle(typeDiv, typeView.style);\r\n typeView.views.forEach((cellWrapView) => {\r\n const cellWrap = document.createElement('div');\r\n this.ctx.zoomScale.assignScaledStyle(cellWrap, cellWrapView.style);\r\n cellWrapView.cells.forEach((cell) => {\r\n const cellEl = this.ctx.zoomScale.createOverlayerCellElement(\r\n cell,\r\n this.ctx.config.CSS_PREFIX,\r\n );\r\n cellWrap.appendChild(cellEl);\r\n });\r\n typeDiv.appendChild(cellWrap);\r\n });\r\n overlayerEl.appendChild(typeDiv);\r\n });\r\n });\r\n }\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 // 清除MutationObserver\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\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 { computePosition, autoUpdate, flip, shift, offset } from '@floating-ui/dom';\r\nimport { MenuItem } from './types';\r\nimport { expandSvg } from './Icons';\r\n\r\nexport interface MenuOptions {\r\n onClick?: (itemData: MenuItem, value: string) => void;\r\n}\r\n\r\ninterface MenuElement extends HTMLElement {\r\n _submenu?: HTMLElement;\r\n _cleanup?: () => void;\r\n}\r\n\r\nexport class DOMTreeMenu {\r\n private container: HTMLElement;\r\n private menuData: MenuItem[];\r\n private onClick?: (itemData: MenuItem, value: string) => void;\r\n private activeSubmenus = new Set<HTMLElement>();\r\n private boundMouseEnterHandler: (e: MouseEvent) => void;\r\n private boundMouseLeaveHandler: (e: MouseEvent) => void;\r\n private boundClickHandler: (e: MouseEvent) => void;\r\n\r\n constructor(container: HTMLElement, menuData: MenuItem[] = [], options: MenuOptions = {}) {\r\n this.container = container;\r\n this.menuData = menuData;\r\n this.onClick = options.onClick;\r\n // 绑定事件处理器\r\n this.boundMouseEnterHandler = (e: MouseEvent) => this.handleMouseEvent(e, 'enter');\r\n this.boundMouseLeaveHandler = (e: MouseEvent) => this.handleMouseEvent(e, 'leave');\r\n this.boundClickHandler = (e: MouseEvent) => this.handleClick(e);\r\n\r\n this.createMenu();\r\n this.bindEvents();\r\n }\r\n\r\n private createMenu(): void {\r\n this.container.className = 'e-virt-table-main-menu';\r\n // 确保菜单可见\r\n this.container.style.display = 'block';\r\n const mainMenu = document.createDocumentFragment();\r\n this.menuData.forEach((item) => {\r\n mainMenu.appendChild(this.createMenuItem(item));\r\n });\r\n this.container.appendChild(mainMenu);\r\n }\r\n\r\n private createMenuItem(item: MenuItem, isSubmenu = false): HTMLElement {\r\n const menuItem = this.createElement(\r\n 'div',\r\n isSubmenu ? 'e-virt-table-submenu-item' : 'e-virt-table-menu-item',\r\n ) as MenuElement;\r\n\r\n menuItem.setAttribute(isSubmenu ? 'data-submenu' : 'data-menu', item.value);\r\n\r\n if (item.disabled) menuItem.classList.add('disabled');\r\n\r\n const contentContainer = this.createElement('div', 'e-virt-table-menu-item-content');\r\n\r\n if (item.icon) {\r\n const iconContainer = this.createElement('span', 'e-virt-table-menu-item-icon');\r\n iconContainer.innerHTML = item.icon;\r\n contentContainer.appendChild(iconContainer);\r\n } else {\r\n contentContainer.classList.add('menu-item-no-icon');\r\n }\r\n\r\n const textSpan = this.createElement('span', 'e-virt-table-menu-item-text');\r\n textSpan.textContent = item.label || '';\r\n contentContainer.appendChild(textSpan);\r\n menuItem.appendChild(contentContainer);\r\n\r\n if (item.children?.length) {\r\n const arrowContainer = this.createElement('span', 'e-virt-table-menu-arrow');\r\n arrowContainer.innerHTML = expandSvg;\r\n menuItem.appendChild(arrowContainer);\r\n const submenu = this.createSubmenu(item.children);\r\n menuItem._submenu = submenu;\r\n this.container.appendChild(submenu);\r\n }\r\n\r\n return menuItem;\r\n }\r\n\r\n private createSubmenu(submenuData: MenuItem[]): HTMLElement {\r\n const submenu = this.createElement('div', 'e-virt-table-submenu');\r\n submenuData.forEach((item) => {\r\n submenu.appendChild(this.createMenuItem(item, true));\r\n });\r\n return submenu;\r\n }\r\n\r\n private createElement(tagName: string, className = ''): HTMLElement {\r\n const element = document.createElement(tagName);\r\n if (className) element.className = className;\r\n return element;\r\n }\r\n\r\n private bindEvents(): void {\r\n this.container.addEventListener('mouseenter', this.boundMouseEnterHandler, true);\r\n this.container.addEventListener('mouseleave', this.boundMouseLeaveHandler, true);\r\n this.container.addEventListener('click', this.boundClickHandler);\r\n }\r\n\r\n private handleMouseEvent(e: MouseEvent, type: 'enter' | 'leave'): void {\r\n // 阻止事件冒泡,防止触发外部的鼠标事件\r\n e.stopPropagation();\r\n\r\n const target = e.target as HTMLElement;\r\n const menuItem = target.closest('.e-virt-table-menu-item, .e-virt-table-submenu-item') as MenuElement;\r\n\r\n if (\r\n menuItem &&\r\n (this.container.contains(menuItem) || menuItem.classList.contains('e-virt-table-submenu-item'))\r\n ) {\r\n if (type === 'enter') {\r\n this.handleHover(menuItem);\r\n } else {\r\n this.handleLeave(menuItem);\r\n }\r\n }\r\n }\r\n\r\n private handleHover(menuItem: MenuElement): void {\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n this.container\r\n .querySelectorAll('.e-virt-table-menu-item')\r\n .forEach((item) => item.classList.remove('active'));\r\n if (!menuItem.classList.contains('disabled')) {\r\n menuItem.classList.add('active');\r\n }\r\n }\r\n\r\n const submenu = menuItem._submenu || (menuItem.querySelector('.e-virt-table-submenu') as HTMLElement | null);\r\n if (submenu) {\r\n this.hideSiblingSubmenus(menuItem);\r\n this.showSubmenu(menuItem, submenu);\r\n }\r\n }\r\n\r\n private handleLeave(menuItem: MenuElement): void {\r\n const submenu = menuItem._submenu || menuItem.querySelector('.e-virt-table-submenu');\r\n\r\n setTimeout(() => {\r\n const submenuEl = submenu as HTMLElement | null;\r\n if (submenuEl && !submenuEl.matches(':hover') && !menuItem.matches(':hover')) {\r\n this.hideSubmenu(submenuEl);\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n menuItem.classList.remove('active');\r\n }\r\n }\r\n }, 150);\r\n }\r\n\r\n private hideSiblingSubmenus(menuItem: MenuElement): void {\r\n // 找到同级的所有菜单项\r\n let siblings: NodeListOf<MenuElement>;\r\n \r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n // 主菜单项:隐藏其他主菜单项的子菜单\r\n siblings = this.container.querySelectorAll('.e-virt-table-menu-item') as NodeListOf<MenuElement>;\r\n } else {\r\n // 子菜单项:隐藏同一个子菜单容器中其他子菜单项的子菜单\r\n const parentSubmenu = menuItem.closest('.e-virt-table-submenu');\r\n if (parentSubmenu) {\r\n siblings = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n } else {\r\n return;\r\n }\r\n }\r\n \r\n // 隐藏所有同级菜单项的子菜单(除了当前项)\r\n siblings.forEach((sibling) => {\r\n if (sibling !== menuItem && sibling._submenu) {\r\n this.hideSubmenu(sibling._submenu);\r\n }\r\n });\r\n }\r\n\r\n private async showSubmenu(trigger: HTMLElement, submenu: HTMLElement): Promise<void> {\r\n if (this.activeSubmenus.has(submenu)) return;\r\n\r\n this.activeSubmenus.add(submenu);\r\n submenu.classList.add('show');\r\n\r\n const cleanup = autoUpdate(trigger, submenu, async () => {\r\n // 根据主菜单容器的整体位置判断子菜单显示方向\r\n const containerRect = this.container.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const submenuWidth = submenu.offsetWidth || 200; // 预估宽度\r\n \r\n // 计算主菜单右侧和左侧可用空间\r\n const rightSpace = viewportWidth - containerRect.right;\r\n const leftSpace = containerRect.left;\r\n \r\n // 根据主菜单位置决定所有子菜单的统一方向\r\n const placement = (rightSpace >= submenuWidth || rightSpace >= leftSpace) ? 'right-start' : 'left-start';\r\n \r\n const { x, y } = await computePosition(trigger, submenu, {\r\n placement,\r\n middleware: [offset(8), shift({ padding: 8 })],\r\n });\r\n\r\n Object.assign(submenu.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n });\r\n\r\n (submenu as MenuElement)._cleanup = cleanup;\r\n }\r\n\r\n private hideSubmenu(submenu: HTMLElement): void {\r\n if (!this.activeSubmenus.has(submenu)) return;\r\n\r\n this.activeSubmenus.delete(submenu);\r\n submenu.classList.remove('show');\r\n\r\n this.hideAllChildSubmenus(submenu);\r\n\r\n const menuElement = submenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n }\r\n\r\n private hideAllChildSubmenus(parentSubmenu: HTMLElement): void {\r\n const childMenuItems = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n childMenuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n const childSubmenu = menuItem._submenu;\r\n if (this.activeSubmenus.has(childSubmenu)) {\r\n this.activeSubmenus.delete(childSubmenu);\r\n childSubmenu.classList.remove('show');\r\n\r\n const menuElement = childSubmenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n\r\n this.hideAllChildSubmenus(childSubmenu);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private handleClick(e: MouseEvent): void {\r\n // 阻止事件冒泡,防止触发外部的点击事件\r\n e.stopPropagation();\r\n\r\n const menuItem = (e.target as HTMLElement).closest(\r\n '.e-virt-table-menu-item, .e-virt-table-submenu-item',\r\n ) as MenuElement;\r\n if(!menuItem) return;\r\n if (menuItem.classList.contains('disabled')) return;\r\n\r\n // 如果点击的是有子菜单的菜单项,先显示子菜单\r\n if (menuItem.classList.contains('e-virt-table-menu-item')) {\r\n const submenu =\r\n menuItem._submenu || (menuItem.querySelector('.e-virt-table-submenu') as HTMLElement | null);\r\n if (submenu) {\r\n this.showSubmenu(menuItem, submenu);\r\n return; // 不执行点击回调,只是显示子菜单\r\n }\r\n }\r\n\r\n const menuValue = menuItem.getAttribute('data-menu') || menuItem?.getAttribute('data-submenu');\r\n const itemData = this.findMenuItem(menuValue || '');\r\n\r\n if (itemData) {\r\n if (this.onClick) {\r\n this.onClick(itemData, menuValue || '');\r\n }\r\n }\r\n }\r\n\r\n private findMenuItem(value: string, items: MenuItem[] = this.menuData): MenuItem | null {\r\n for (const item of items) {\r\n if (item.value === value) return item;\r\n if (item.children) {\r\n const found = this.findMenuItem(value, item.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public positionMenu(e: MouseEvent): void {\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 autoUpdate(virtualReference, this.container, () => {\r\n computePosition(virtualReference, this.container, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n if (this.container) {\r\n Object.assign(this.container.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n public destroy(): void {\r\n // 移除事件监听器\r\n this.container.removeEventListener('mouseenter', this.boundMouseEnterHandler, true);\r\n this.container.removeEventListener('mouseleave', this.boundMouseLeaveHandler, true);\r\n this.container.removeEventListener('click', this.boundClickHandler);\r\n // 递归清理所有子菜单\r\n this.cleanupAllSubmenus(this.container);\r\n\r\n // 隐藏菜单\r\n this.container.style.display = 'none';\r\n\r\n // 清理容器\r\n this.container.replaceChildren();\r\n }\r\n\r\n /**\r\n * 删除指定值的菜单项\r\n * @param value 要删除的菜单项的值\r\n * @returns 是否成功删除\r\n */\r\n public removeMenuItem(value: string): boolean {\r\n // 查找要删除的菜单项\r\n const menuItem = this.container.querySelector(`[data-menu=\"${value}\"]`) as HTMLElement;\r\n if (!menuItem) {\r\n return false;\r\n }\r\n\r\n // 如果菜单项有子菜单,先清理子菜单\r\n const submenu = menuItem.querySelector('.e-virt-table-submenu') as HTMLElement;\r\n if (submenu) {\r\n this.cleanupSubmenuRecursively(submenu);\r\n }\r\n // 从 DOM 中移除菜单项\r\n menuItem.remove();\r\n return true;\r\n }\r\n\r\n /**\r\n * 删除指定值的子菜单项\r\n * @param value 要删除的子菜单项的值\r\n * @returns 是否成功删除\r\n */\r\n public removeSubMenuItem(value: string): boolean {\r\n // 查找要删除的子菜单项\r\n const subMenuItem = this.container.querySelector(`[data-submenu=\"${value}\"]`) as HTMLElement;\r\n if (!subMenuItem) {\r\n return false;\r\n }\r\n\r\n // 找到所属的父级子菜单容器\r\n const parentSubmenu = subMenuItem.closest('.e-virt-table-submenu') as HTMLElement;\r\n \r\n // 如果子菜单项有子菜单,先清理子菜单\r\n const childSubmenu = (subMenuItem as MenuElement)._submenu;\r\n if (childSubmenu) {\r\n this.cleanupSubmenuRecursively(childSubmenu);\r\n }\r\n \r\n // 从 DOM 中移除子菜单项\r\n subMenuItem.remove();\r\n\r\n // 检查父级子菜单容器是否还有其他子菜单项\r\n if (parentSubmenu) {\r\n const remainingItems = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item');\r\n if (remainingItems.length === 0) {\r\n // 没有子项了,找到拥有这个子菜单的父级菜单项并移除\r\n const parentMenuItem = this.container.querySelector(`[data-menu]`) as MenuElement | null;\r\n if (parentMenuItem && parentMenuItem._submenu === parentSubmenu) {\r\n this.removeMenuItem(parentMenuItem.getAttribute('data-menu') || '');\r\n } else {\r\n // 可能是嵌套子菜单,需要查找所有可能的父级\r\n const allMenuItems = this.container.querySelectorAll('[data-menu], [data-submenu]') as NodeListOf<MenuElement>;\r\n for (const item of allMenuItems) {\r\n if (item._submenu === parentSubmenu) {\r\n const parentValue = item.getAttribute('data-menu') || item.getAttribute('data-submenu');\r\n if (parentValue) {\r\n if (item.hasAttribute('data-menu')) {\r\n this.removeMenuItem(parentValue);\r\n } else {\r\n this.removeSubMenuItem(parentValue);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private cleanupAllSubmenus(container: HTMLElement): void {\r\n // 清理所有菜单项的子菜单\r\n const menuItems = container.querySelectorAll('.e-virt-table-menu-item') as NodeListOf<MenuElement>;\r\n menuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n this.cleanupSubmenuRecursively(menuItem._submenu);\r\n menuItem._submenu = undefined;\r\n }\r\n });\r\n }\r\n\r\n private cleanupSubmenuRecursively(submenu: HTMLElement): void {\r\n // 清理当前子菜单的清理函数\r\n const menuElement = submenu as MenuElement;\r\n if (menuElement._cleanup) {\r\n menuElement._cleanup();\r\n delete menuElement._cleanup;\r\n }\r\n\r\n // 递归清理子菜单中的子菜单\r\n const childMenuItems = submenu.querySelectorAll('.e-virt-table-submenu-item') as NodeListOf<MenuElement>;\r\n childMenuItems.forEach((menuItem) => {\r\n if (menuItem._submenu) {\r\n this.cleanupSubmenuRecursively(menuItem._submenu);\r\n }\r\n });\r\n\r\n // 从 DOM 中移除子菜单\r\n submenu.remove();\r\n }\r\n}\r\n","import { Column, MenuItem } from './types';\r\nimport Context from './Context';\r\nimport Cell from './Cell';\r\nimport CellHeader from './CellHeader';\r\nimport { DOMTreeMenu } from './DOMTreeMenu';\r\nimport { toLeaf } from './util';\r\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private currentDOMTreeMenu?: DOMTreeMenu;\r\n private isCustom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n this.contextMenuEl.className = 'e-virt-table-main-menu';\r\n this.isCustom = true;\r\n } else {\r\n this.contextMenuEl = document.createElement('div');\r\n this.isCustom = false;\r\n }\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('outsideMousedown', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('cellContextMenuClick', async (cell: Cell, e: MouseEvent) => {\r\n if (this.isCustom) {\r\n this.contextMenuEl.style.display = 'block';\r\n this.positionMenu(e);\r\n return;\r\n }\r\n const { ENABLE_CONTEXT_MENU, CUSTOM_BODY_CONTEXT_MENU, CONTEXT_MENU, BEFORE_BODY_CONTEXT_MENU_METHOD } = this.ctx.config;\r\n let list: MenuItem[] = CONTEXT_MENU.map((item) => ({\r\n ...item,\r\n label: item.label || this.ctx.locale.getText(item.value),\r\n }));\r\n list = [...list, ...CUSTOM_BODY_CONTEXT_MENU];\r\n if (BEFORE_BODY_CONTEXT_MENU_METHOD) {\r\n list = await BEFORE_BODY_CONTEXT_MENU_METHOD({ list, cell, hide: this.hide.bind(this) });\r\n }\r\n if (!ENABLE_CONTEXT_MENU || list.length === 0) 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 if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n }\r\n this.ctx.contextMenuIng = true;\r\n this.currentDOMTreeMenu = new DOMTreeMenu(this.contextMenuEl, list, {\r\n onClick: (_itemData: MenuItem, value: string) => {\r\n if (value === 'copy') {\r\n this.ctx.emit('contextMenuCopy');\r\n this.hide();\r\n } else if (value === 'paste') {\r\n this.ctx.emit('contextMenuPaste');\r\n this.hide();\r\n } else if (value === 'cut') {\r\n this.ctx.emit('contextMenuCut');\r\n this.hide();\r\n } else if (value === 'clearSelected') {\r\n this.ctx.emit('contextMenuClearSelected');\r\n this.hide();\r\n } else {\r\n if (_itemData.event) {\r\n _itemData.event(e, {\r\n hide: this.hide.bind(this),\r\n cell,\r\n });\r\n }\r\n }\r\n },\r\n });\r\n this.currentDOMTreeMenu.positionMenu(e);\r\n });\r\n this.ctx.on('cellHeaderContextMenuClick', async (cell: CellHeader, e: MouseEvent) => {\r\n if (this.isCustom) {\r\n this.contextMenuEl.style.display = 'block';\r\n this.positionMenu(e);\r\n return;\r\n }\r\n // 判断是否在范围内\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET, BEFORE_HEADER_CONTEXT_MENU_METHOD } = 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 if (cell.colIndex < areaMinX || cell.colIndex > areaMaxX) {\r\n return;\r\n }\r\n const { HEADER_CONTEXT_MENU, CUSTOM_HEADER_CONTEXT_MENU, ENABLE_HEADER_CONTEXT_MENU } = this.ctx.config;\r\n let list: MenuItem[] = HEADER_CONTEXT_MENU.map((item) => ({\r\n ...item,\r\n label: item.label || this.ctx.locale.getText(item.value),\r\n }));\r\n list = [...list, ...CUSTOM_HEADER_CONTEXT_MENU];\r\n if (BEFORE_HEADER_CONTEXT_MENU_METHOD) {\r\n list = await BEFORE_HEADER_CONTEXT_MENU_METHOD({ list, cell, hide: this.hide.bind(this) });\r\n }\r\n if (!ENABLE_HEADER_CONTEXT_MENU || list.length === 0) return;\r\n e.preventDefault();\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const { colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.focusCellHeader = cell;\r\n this.ctx.emit('selectCols', cell);\r\n }\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n }\r\n const columns = this.ctx.database.getColumns();\r\n const menuData = list.map((item) => {\r\n if (item.value === 'visible') {\r\n return {\r\n ...item,\r\n children: this.filterColumns(columns),\r\n };\r\n }\r\n return item;\r\n });\r\n this.ctx.contextMenuIng = true;\r\n this.currentDOMTreeMenu = new DOMTreeMenu(this.contextMenuEl, menuData, {\r\n onClick: (_itemData: MenuItem, value: string) => {\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (value === 'fixedLeft' || value === 'fixedRight' || value === 'fixedNone') {\r\n const fixedKeys = this.ctx.header.allCellHeaders\r\n .filter((item) => item.colIndex >= minX && item.colIndex <= maxX)\r\n .filter((item) => item.level === 0)\r\n .filter((item) => !item.column.fixedDisabled)\r\n .map((item) => item.key);\r\n this.ctx.database.setCustomHeaderFixedData(\r\n fixedKeys,\r\n value === 'fixedLeft' ? 'left' : value === 'fixedRight' ? 'right' : '',\r\n );\r\n this.hide();\r\n } else if (value === 'hide') {\r\n const hideKeys = this.ctx.header.leafCellHeaders\r\n .filter((item) => item.colIndex >= minX && item.colIndex <= maxX)\r\n .filter((item) => !item.children.length)\r\n .filter((item) => !item.column.hideDisabled)\r\n .map((item) => item.key);\r\n if (hideKeys.length > 0) {\r\n this.ctx.database.setCustomHeaderHideData(hideKeys, true);\r\n }\r\n this.hide();\r\n } else if (value === 'visible') {\r\n // 这个分支不应该被触发,因为 visible 是父菜单项\r\n } else if (value.startsWith('visible_')) {\r\n if (!_itemData.key) return;\r\n if (_itemData.children) {\r\n const childKeys = this.getLeafKeys(_itemData.children);\r\n this.ctx.database.setCustomHeaderHideData(childKeys, false);\r\n } else {\r\n this.ctx.database.setCustomHeaderHideData([_itemData.key], false);\r\n }\r\n // 直接删除对应的子菜单项\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.removeSubMenuItem(value);\r\n }\r\n // 检查是否还有隐藏的列\r\n const columns = this.ctx.database.getColumns();\r\n const leafColumns = toLeaf(columns);\r\n const remainingHideColumns = leafColumns.filter((item) => item.hide);\r\n if (remainingHideColumns.length === 0) {\r\n // 如果没有隐藏的列了,隐藏菜单\r\n this.hide();\r\n }\r\n } else if (value === 'resetHeader') {\r\n this.ctx.database.resetCustomHeader();\r\n this.hide();\r\n } else {\r\n if (_itemData.event) {\r\n _itemData.event(e, {\r\n hide: this.hide.bind(this),\r\n cell,\r\n });\r\n }\r\n }\r\n },\r\n });\r\n this.positionMenu(e);\r\n });\r\n this.ctx.on('click', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n private positionMenu(e: MouseEvent): void {\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 autoUpdate(virtualReference, this.contextMenuEl, () => {\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n if (this.contextMenuEl) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n });\r\n });\r\n }\r\n private filterColumns(columns: Column[]): MenuItem[] {\r\n const result: MenuItem[] = [];\r\n\r\n for (const col of columns) {\r\n // 有 children,递归过滤\r\n if (col.children && col.children.length > 0) {\r\n const filteredChildren = this.filterColumns(col.children);\r\n if (filteredChildren.length > 0) {\r\n result.push({\r\n label: col.title,\r\n key: col.key,\r\n value: `visible_${col.key}`,\r\n // disabled: true, // 非末级,且有子项保留 → disabled\r\n children: filteredChildren,\r\n });\r\n }\r\n }\r\n // 末级节点,保留 hide===true 的\r\n else if (col.hide) {\r\n result.push({ label: col.title, value: `visible_${col.key}`, key: col.key });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n // 递归获取所有子项key\r\n private getLeafKeys(tree: MenuItem[]): string[] {\r\n return tree.reduce<string[]>((acc, node) => {\r\n if (!node.children || node.children.length === 0) {\r\n // 叶子节点,收集 value\r\n acc.push(String(node.key));\r\n } else {\r\n // 有子节点,递归收集\r\n acc.push(...this.getLeafKeys(node.children));\r\n }\r\n return acc;\r\n }, []);\r\n }\r\n\r\n hide() {\r\n if (this.currentDOMTreeMenu) {\r\n this.currentDOMTreeMenu.destroy();\r\n this.currentDOMTreeMenu = undefined;\r\n }\r\n this.contextMenuEl.style.display = 'none';\r\n this.ctx.contextMenuIng = false;\r\n }\r\n destroy() {\r\n this.hide();\r\n this.contextMenuEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private loadingEl: HTMLDivElement;\r\n private textEl: HTMLParagraphElement = document.createElement('p');\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n\r\n if (this.ctx.loadingElement) {\r\n this.loadingEl = this.ctx.loadingElement;\r\n } else {\r\n this.loadingEl = document.createElement('div');\r\n const loadingSpinner = document.createElement('div');\r\n loadingSpinner.className = 'e-virt-table-loading-spinner';\r\n const loadingSvg = this.ctx.icons.getSvg('loading');\r\n if (loadingSvg) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(loadingSvg.svg, 'image/svg+xml');\r\n const svgEl = doc.documentElement;\r\n loadingSpinner.appendChild(svgEl);\r\n }\r\n this.textEl.className = 'e-virt-table-loading-text';\r\n this.textEl.innerText = this.getText();\r\n loadingSpinner.appendChild(this.textEl);\r\n this.loadingEl.appendChild(loadingSpinner);\r\n }\r\n this.loadingEl.className = 'e-virt-table-loading';\r\n this.loadingEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.loadingEl);\r\n }\r\n private getText() {\r\n return this.ctx.config.LOADING_TEXT || this.ctx.locale.getText('loadingText');\r\n }\r\n show() {\r\n this.loadingEl.style.display = 'flex';\r\n }\r\n hide() {\r\n this.loadingEl.style.display = 'none';\r\n }\r\n draw() {\r\n if (this.ctx.loadingElement) {\r\n return;\r\n }\r\n this.textEl.innerText = this.getText();\r\n }\r\n destroy() {\r\n this.loadingEl.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nimport { expandSvg, svgLoading } from './Icons';\r\n\r\nexport interface FinderResult {\r\n type: 'header' | 'body';\r\n rowIndex: number;\r\n colIndex: number;\r\n text: string;\r\n colKey?: string;\r\n}\r\n\r\nexport class FinderBar {\r\n private ctx: Context;\r\n private container: HTMLElement;\r\n private input!: HTMLInputElement;\r\n private prevBtn!: HTMLElement;\r\n private nextBtn!: HTMLElement;\r\n private closeBtn!: HTMLElement;\r\n private countEl!: HTMLElement;\r\n private loadingEl!: HTMLElement;\r\n private isVisible = false;\r\n private searchResults: FinderResult[] = [];\r\n private currentIndex = -1;\r\n private searchData: FinderResult[] = [];\r\n private isComposing = false;\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.container = this.createContainer();\r\n this.ctx.containerElement.appendChild(this.container);\r\n this.bindEvents();\r\n this.ctx.on('keydown', (e: KeyboardEvent) => {\r\n if (!this.ctx.config.ENABLE_FINDER) {\r\n return;\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.code === 'KeyF') {\r\n e.preventDefault();\r\n this.show();\r\n return;\r\n }\r\n if (this.ctx.finding) {\r\n if (e.code === 'Escape') {\r\n e.preventDefault();\r\n this.hide();\r\n return;\r\n }\r\n if (e.code === 'ArrowUp' || (e.shiftKey && e.key === 'Enter')) {\r\n e.preventDefault();\r\n this.navigatePrevious();\r\n return;\r\n }\r\n if (e.code === 'ArrowDown' || e.key === 'Enter') {\r\n e.preventDefault();\r\n this.navigateNext();\r\n return;\r\n }\r\n }\r\n });\r\n this.ctx.on('setSelector', () => {\r\n this.hide();\r\n });\r\n this.ctx.on('outsideMousedown', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n private async initSearchData(): Promise<void> {\r\n this.showLoading();\r\n this.searchData = [];\r\n setTimeout(() => {\r\n const { allCellHeaders } = this.ctx.header;\r\n for (let i = 0; i < allCellHeaders.length; i++) {\r\n const header = allCellHeaders[i];\r\n if (header && ['string', 'number'].includes(typeof header.text)) {\r\n this.searchData.push({\r\n rowIndex: 0,\r\n colIndex: header.colIndex,\r\n text: `${header.text}`,\r\n type: 'header',\r\n colKey: header.key,\r\n });\r\n }\r\n }\r\n const { maxColIndex, maxRowIndex } = this.ctx;\r\n for (let i = 0; i <= maxRowIndex; i++) {\r\n for (let j = 0; j <= maxColIndex; j++) {\r\n const cell = this.ctx.database.getVirtualBodyCell(i, j, false);\r\n const text = cell?.getText();\r\n if (['string', 'number'].includes(typeof text)) {\r\n this.searchData.push({\r\n rowIndex: i,\r\n colIndex: j,\r\n text: `${text}`,\r\n type: 'body',\r\n });\r\n }\r\n }\r\n }\r\n this.hideLoading();\r\n }, 0);\r\n }\r\n\r\n private createContainer(): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = 'e-virt-table-finder-bar';\r\n // 创建输入框容器\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.className = 'e-virt-table-finder-bar-input-wrapper';\r\n // 创建输入框\r\n this.input = document.createElement('input');\r\n this.input.type = 'text';\r\n this.input.className = 'e-virt-table-finder-bar-input';\r\n this.input.placeholder = '';\r\n inputWrapper.appendChild(this.input);\r\n\r\n // 创建 loading 指示器(放在输入框容器内)\r\n this.loadingEl = document.createElement('div');\r\n this.loadingEl.className = 'e-virt-table-finder-bar-loading';\r\n const loadingSvg = svgLoading;\r\n this.loadingEl.innerHTML = loadingSvg;\r\n inputWrapper.appendChild(this.loadingEl);\r\n // 创建计数文本\r\n this.countEl = document.createElement('span');\r\n this.countEl.className = 'e-virt-table-finder-bar-count';\r\n // 创建导航按钮容器\r\n const navContainer = document.createElement('div');\r\n navContainer.className = 'e-virt-table-finder-bar-nav';\r\n // 创建上一个按钮(向上箭头)\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.className = 'e-virt-table-finder-bar-nav-btn prev-btn';\r\n this.prevBtn.innerHTML = expandSvg;\r\n // 创建下一个按钮(向下箭头)\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.className = 'e-virt-table-finder-bar-nav-btn next-btn';\r\n this.nextBtn.innerHTML = expandSvg;\r\n navContainer.appendChild(this.prevBtn);\r\n navContainer.appendChild(this.nextBtn);\r\n\r\n // 创建关闭按钮\r\n this.closeBtn = document.createElement('button');\r\n this.closeBtn.className = 'e-virt-table-finder-bar-nav-btn close-btn';\r\n this.closeBtn.innerHTML = '×';\r\n\r\n container.appendChild(inputWrapper);\r\n container.appendChild(this.countEl);\r\n container.appendChild(navContainer);\r\n container.appendChild(this.closeBtn);\r\n\r\n return container;\r\n }\r\n\r\n private bindEvents(): void {\r\n // 输入框输入事件\r\n this.input.addEventListener('input', () => {\r\n if (!this.isComposing) this.performSearch();\r\n });\r\n this.input.addEventListener('compositionstart', () => {\r\n this.isComposing = true;\r\n });\r\n\r\n this.input.addEventListener('compositionend', () => {\r\n this.isComposing = false;\r\n this.performSearch();\r\n });\r\n // 导航按钮事件\r\n this.prevBtn.addEventListener('click', () => {\r\n this.navigatePrevious();\r\n });\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n this.navigateNext();\r\n });\r\n\r\n // 关闭按钮事件\r\n this.closeBtn.addEventListener('click', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n private performSearch(): void {\r\n const searchText = this.input.value.trim();\r\n this.searchResults = [];\r\n this.currentIndex = -1;\r\n\r\n if (!searchText) {\r\n this.cearFinderBar();\r\n this.updateCount();\r\n return;\r\n }\r\n\r\n this.showLoading();\r\n setTimeout(() => {\r\n // 支持大小写搜索\r\n this.searchResults = this.searchData.filter((item) =>\r\n item.text.toLowerCase().includes(searchText.toLowerCase()),\r\n );\r\n // 如果找到结果,定位到第一个\r\n if (this.searchResults.length > 0) {\r\n this.currentIndex = 0;\r\n this.scrollToCurrentResult();\r\n } else {\r\n // 清空\r\n this.cearFinderBar();\r\n }\r\n this.updateCount();\r\n this.hideLoading();\r\n }, 0);\r\n }\r\n\r\n private scrollToCurrentResult(): void {\r\n if (this.currentIndex < 0 || this.currentIndex >= this.searchResults.length) {\r\n return;\r\n }\r\n const result = this.searchResults[this.currentIndex];\r\n this.ctx.finderBar = result;\r\n const { rowIndex, colIndex } = result;\r\n this.ctx.emit('scrollToIndex', rowIndex, colIndex);\r\n }\r\n\r\n private navigateNext(): void {\r\n if (this.searchResults.length === 0) return;\r\n\r\n this.currentIndex = (this.currentIndex + 1) % this.searchResults.length;\r\n this.scrollToCurrentResult();\r\n this.updateCount();\r\n }\r\n\r\n private navigatePrevious(): void {\r\n if (this.searchResults.length === 0) return;\r\n\r\n this.currentIndex = this.currentIndex <= 0 ? this.searchResults.length - 1 : this.currentIndex - 1;\r\n this.scrollToCurrentResult();\r\n this.updateCount();\r\n }\r\n\r\n private updateCount(): void {\r\n if (this.searchResults.length === 0) {\r\n if (this.input.value.trim()) {\r\n this.countEl.textContent = '0/0';\r\n this.countEl.classList.add('no-results');\r\n } else {\r\n this.countEl.textContent = '';\r\n this.countEl.classList.remove('no-results');\r\n }\r\n } else {\r\n const current = this.currentIndex + 1;\r\n const total = this.searchResults.length;\r\n this.countEl.textContent = `${current}/${total}`;\r\n this.countEl.classList.remove('no-results');\r\n }\r\n }\r\n\r\n public show(): void {\r\n if (this.isVisible) return;\r\n this.isVisible = true;\r\n this.ctx.finding = true;\r\n this.container.classList.add('show');\r\n this.input.focus();\r\n this.initSearchData();\r\n }\r\n\r\n private showLoading(): void {\r\n this.loadingEl.classList.add('show');\r\n this.loadingEl.parentElement?.classList.add('loading');\r\n this.input.readOnly = true;\r\n }\r\n\r\n private hideLoading(): void {\r\n this.loadingEl.classList.remove('show');\r\n this.loadingEl.parentElement?.classList.remove('loading');\r\n this.input.readOnly = false;\r\n }\r\n private cearFinderBar(): void {\r\n this.ctx.finderBar = {\r\n rowIndex: -1,\r\n colIndex: -1,\r\n text: '',\r\n type: 'header',\r\n };\r\n this.ctx.emit('draw');\r\n }\r\n\r\n public hide(): void {\r\n if (!this.isVisible) return;\r\n\r\n this.isVisible = false;\r\n this.container.classList.remove('show');\r\n this.ctx.finding = false;\r\n this.input.value = '';\r\n this.searchResults = [];\r\n this.searchData = [];\r\n this.currentIndex = -1;\r\n this.hideLoading();\r\n this.ctx.finderBar = {\r\n rowIndex: -1,\r\n colIndex: -1,\r\n text: '',\r\n type: 'header',\r\n };\r\n this.updateCount();\r\n this.ctx.emit('draw');\r\n }\r\n\r\n public destroy(): void {\r\n this.hide();\r\n this.container.remove();\r\n }\r\n}\r\n","import type { Align } from './types';\r\nimport type Context from './Context';\r\nimport type CellHeader from './CellHeader';\r\n\r\nexport type TextSelectionRange = {\r\n start: number;\r\n end: number;\r\n};\r\nexport type TextGlyph = {\r\n char: string;\r\n index: number;\r\n line: number;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n};\r\nexport type TextLineItem = {\r\n char: string;\r\n sourceIndex: number;\r\n ellipsis?: boolean;\r\n};\r\nexport type TextLayoutLine = {\r\n items: TextLineItem[];\r\n text: string;\r\n caretIndex: number;\r\n lineIndex: number;\r\n drawX: number;\r\n drawY: number;\r\n width: number;\r\n segments: TextLineSegment[];\r\n};\r\nexport type TextLineSegment = {\r\n char: string;\r\n itemIndex: number;\r\n sourceIndex: number;\r\n x: number;\r\n width: number;\r\n};\r\nexport type TextLayout = {\r\n text: string;\r\n chars: string[];\r\n glyphs: TextGlyph[];\r\n lines: TextLayoutLine[];\r\n box: { x: number; y: number; width: number; height: number };\r\n contentBox: { x: number; y: number; width: number; height: number };\r\n contentY: number;\r\n lineHeight: number;\r\n font: string;\r\n color: string;\r\n align: Align;\r\n ellipsis: boolean;\r\n};\r\n\r\ntype TextHit = { cellKey: string; index: number };\r\ntype PendingSelect = { cellKey: string; index: number; startX: number; startY: number };\r\n\r\nexport default class TextSelector {\r\n private static readonly DRAG_THRESHOLD = 4;\r\n private ctx: Context;\r\n private layouts = new Map<string, TextLayout>();\r\n private activeCellKey = '';\r\n private selectionStart: number | null = null;\r\n private selectionEnd: number | null = null;\r\n private pending: PendingSelect | null = null;\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.ctx.on('registerTextLayout', (key, layout) => this.layouts.set(key, layout));\r\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\r\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\r\n this.ctx.on('mouseup', () => this.onMouseUp());\r\n this.ctx.on('cellHeaderHoverChange', (cell) => this.yieldToColumnDrag(cell));\r\n this.ctx.on('cellHoverChange', () => this.yieldToColumnDrag());\r\n this.ctx.on('keydown', (e) => this.onCopyKeydown(e));\r\n this.ctx.on('outsideMousedown', () => this.resetSelection());\r\n }\r\n\r\n private get canSelect() {\r\n return this.ctx.config.ENABLE_TEXT_SELECTION && !this.ctx.editing && !this.ctx.finding;\r\n }\r\n\r\n /** 跨表头列或从表头拖入 body 时,让位给列/区域选择 */\r\n private yieldToColumnDrag(target?: CellHeader) {\r\n const anchor = this.ctx.focusCellHeader;\r\n if (!this.ctx.textSelecting || !anchor) {\r\n return;\r\n }\r\n if (target) {\r\n const min = anchor.colIndex;\r\n const max = anchor.colIndex + anchor.colspan - 1;\r\n const tMin = target.colIndex;\r\n const tMax = target.colIndex + target.colspan - 1;\r\n if (tMin >= min && tMax <= max) {\r\n return;\r\n }\r\n }\r\n this.resetSelection();\r\n }\r\n\r\n private onMouseDown(e: MouseEvent) {\r\n if (!this.canSelect || !this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.containerElement.contains(document.activeElement)) {\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n }\r\n const hit = this.hitTest(e);\r\n if (!hit) {\r\n this.resetSelection();\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n this.pending = { cellKey: hit.cellKey, index: hit.index, startX: offsetX, startY: offsetY };\r\n }\r\n\r\n private onMouseMove(e: MouseEvent) {\r\n if (!this.canSelect) {\r\n return;\r\n }\r\n if (!this.ctx.textSelecting) {\r\n this.tryStartDrag(e);\r\n }\r\n if (!this.ctx.textSelecting) {\r\n return;\r\n }\r\n const layout = this.layouts.get(this.activeCellKey);\r\n if (!layout) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const index = this.hitTestText(layout, offsetX, offsetY);\r\n if (index !== null) {\r\n this.selectionEnd = index;\r\n this.updateSelection();\r\n }\r\n }\r\n\r\n private tryStartDrag(e: MouseEvent) {\r\n if (!this.pending || !this.ctx.mousedown) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const dx = Math.abs(offsetX - this.pending.startX);\r\n const dy = Math.abs(offsetY - this.pending.startY);\r\n if (dx < TextSelector.DRAG_THRESHOLD && dy < TextSelector.DRAG_THRESHOLD) {\r\n return;\r\n }\r\n const hit = this.hitTest(e);\r\n if (!hit || hit.cellKey !== this.pending.cellKey) {\r\n this.pending = null;\r\n return;\r\n }\r\n this.activeCellKey = this.pending.cellKey;\r\n this.selectionStart = this.pending.index;\r\n this.selectionEnd = hit.index;\r\n this.pending = null;\r\n this.ctx.textSelecting = true;\r\n this.updateSelection();\r\n }\r\n\r\n private onMouseUp() {\r\n this.pending = null;\r\n this.ctx.textSelecting = false;\r\n this.ctx.textSelectionStr = this.getSelectedText();\r\n if (this.ctx.textSelectionStr) {\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n\r\n private onCopyKeydown(e: KeyboardEvent) {\r\n if (!this.canSelect || !((e.ctrlKey || e.metaKey) && e.code === 'KeyC')) {\r\n return;\r\n }\r\n const text = this.getSelectedText();\r\n if (!text) {\r\n return;\r\n }\r\n e.preventDefault();\r\n navigator.clipboard?.writeText(text).catch((error) => console.error('Copy Failure:', error));\r\n }\r\n\r\n /**\r\n * 命中最顶层文字(固定列/表头后绘制会覆盖普通单元格,取最后一个命中)。\r\n */\r\n private hitTest(e: MouseEvent): TextHit | null {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let hit: TextHit | null = null;\r\n for (const [cellKey, layout] of this.layouts) {\r\n const index = this.hitTestText(layout, offsetX, offsetY);\r\n if (index !== null) {\r\n hit = { cellKey, index };\r\n }\r\n }\r\n return hit;\r\n }\r\n\r\n private updateSelection() {\r\n this.ctx.textSelectionStr = this.getSelectedText();\r\n this.ctx.emit('drawView');\r\n }\r\n\r\n private hitTestText(layout: TextLayout, mouseX: number, mouseY: number): number | null {\r\n const { glyphs, contentY, lineHeight, lines } = layout;\r\n if (!glyphs.length) {\r\n return null;\r\n }\r\n const lineIndex = Math.floor((mouseY - contentY) / lineHeight);\r\n if (lineIndex < 0 || lineIndex >= lines.length) {\r\n return null;\r\n }\r\n const lineGlyphs = glyphs.filter((g) => g.line === lineIndex);\r\n if (!lineGlyphs.length) {\r\n return null;\r\n }\r\n const pad = 2;\r\n const lineTop = contentY + lineIndex * lineHeight;\r\n if (mouseY < lineTop - pad || mouseY >= lineTop + lineHeight + pad) {\r\n return null;\r\n }\r\n const first = lineGlyphs[0];\r\n const last = lineGlyphs[lineGlyphs.length - 1];\r\n if (mouseX < first.x - pad || mouseX > last.x + last.width + pad) {\r\n return null;\r\n }\r\n if (mouseX <= first.x) {\r\n return first.index;\r\n }\r\n for (const glyph of lineGlyphs) {\r\n if (mouseX < glyph.x + glyph.width / 2) {\r\n return glyph.index;\r\n }\r\n }\r\n return last.index + 1;\r\n }\r\n\r\n clearLayouts() {\r\n this.layouts.clear();\r\n }\r\n\r\n draw() {\r\n if (!this.ctx.config.ENABLE_TEXT_SELECTION) {\r\n return;\r\n }\r\n const range = this.getSelectionRange();\r\n const layout = range && this.layouts.get(this.activeCellKey);\r\n if (layout) {\r\n this.drawTextSelection(layout, range);\r\n }\r\n }\r\n\r\n private drawTextSelection(\r\n layout: TextLayout,\r\n range: TextSelectionRange,\r\n selectedColor = '#fff',\r\n selectionBgColor = '#3b82f6',\r\n ) {\r\n if (range.start >= range.end) {\r\n return;\r\n }\r\n const byLine = new Map<number, TextGlyph[]>();\r\n for (const glyph of layout.glyphs) {\r\n if (glyph.index < range.start || glyph.index >= range.end) {\r\n continue;\r\n }\r\n const list = byLine.get(glyph.line) ?? [];\r\n list.push(glyph);\r\n byLine.set(glyph.line, list);\r\n }\r\n if (!byLine.size) {\r\n return;\r\n }\r\n const ctx = this.ctx.paint.getCtx();\r\n ctx.save();\r\n ctx.font = layout.font;\r\n ctx.textBaseline = 'top';\r\n ctx.textAlign = 'left';\r\n byLine.forEach((lineGlyphs) => {\r\n const first = lineGlyphs[0];\r\n const last = lineGlyphs[lineGlyphs.length - 1];\r\n ctx.fillStyle = selectionBgColor;\r\n ctx.fillRect(first.x, first.y - 1, last.x + last.width - first.x, first.height);\r\n ctx.fillStyle = selectedColor;\r\n for (const glyph of lineGlyphs) {\r\n ctx.fillText(glyph.char, glyph.x, glyph.y);\r\n }\r\n });\r\n ctx.restore();\r\n }\r\n\r\n private getSelectionRange(): TextSelectionRange | null {\r\n if (this.selectionStart === null || this.selectionEnd === null) {\r\n return null;\r\n }\r\n return {\r\n start: Math.min(this.selectionStart, this.selectionEnd),\r\n end: Math.max(this.selectionStart, this.selectionEnd),\r\n };\r\n }\r\n\r\n private getSelectedText() {\r\n const range = this.getSelectionRange();\r\n const layout = range && this.layouts.get(this.activeCellKey);\r\n if (!layout || range.start >= range.end) {\r\n return '';\r\n }\r\n return layout.chars.slice(range.start, range.end).join('');\r\n }\r\n\r\n private resetSelection() {\r\n this.activeCellKey = '';\r\n this.selectionStart = null;\r\n this.selectionEnd = null;\r\n this.pending = null;\r\n this.ctx.textSelecting = false;\r\n this.ctx.textSelectionStr = '';\r\n this.ctx.emit('drawView');\r\n }\r\n\r\n destroy() {\r\n this.layouts.clear();\r\n this.resetSelection();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n CustomHeader,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Fixed,\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\nimport Loading from './Loading';\r\nimport { FinderBar } from './FinderBar';\r\nimport { LangConfig } from './Locale';\r\nimport TextSelector from './TextSelector';\r\nexport default class EVirtTable {\r\n static locale: LangConfig;\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 private loading: Loading;\r\n private finderBar: FinderBar;\r\n private textSelector: TextSelector;\r\n private animationFrameId: number | undefined = undefined;\r\n ctx: Context;\r\n static useLocale(langConfig: LangConfig) {\r\n EVirtTable.locale = langConfig;\r\n }\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = this.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.textSelector = new TextSelector(this.ctx);\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.loading = new Loading(this.ctx);\r\n this.finderBar = new FinderBar(this.ctx);\r\n this.ctx.on('loadData', (data) => {\r\n this.loadData(data);\r\n });\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\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 overlayerElement.setAttribute('data-overlayer', _overlayerElement ? 'custom' : 'default');\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 private doDraw(ignoreOverlayer = false) {\r\n this.header.update();\r\n this.body.update();\r\n this.footer.update();\r\n this.ctx.paint.clear();\r\n this.textSelector.clearLayouts();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n // 在 body/footer/header 之后绘制,保证文字选中高亮覆盖在三类单元格之上\r\n this.textSelector.draw();\r\n this.body.drawDragRowTip();\r\n this.scroller.draw();\r\n this.empty.draw();\r\n this.loading.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n }\r\n draw(ignoreOverlayer = false) {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n }\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this.doDraw(ignoreOverlayer);\r\n const needReDraw = this.body.updateAutoHeight();\r\n if (needReDraw) {\r\n this.doDraw(ignoreOverlayer);\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 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 setCustomHeader(customHeader: CustomHeader, ignoreEmit = true) {\r\n this.ctx.database.setCustomHeader(customHeader, ignoreEmit);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n getCustomHeader() {\r\n return this.header.getCustomHeader();\r\n }\r\n showColumns(keys: string[], show = true) {\r\n this.ctx.database.setCustomHeaderHideData(keys, !show);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n fixedColumns(keys: string[], fixed: Fixed | '') {\r\n this.ctx.database.setCustomHeaderFixedData(keys, fixed);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(loading: boolean) {\r\n this.ctx.loading = loading;\r\n if (loading) {\r\n this.loading.show();\r\n } else {\r\n this.loading.hide();\r\n }\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\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 /**\r\n * 设置内容缩放比例(容器大小不变,内容变大/变小,基于原生分辨率重绘不失清晰度)\r\n * @param zoom 缩放比例,范围 MIN_ZOOM ~ MAX_ZOOM\r\n */\r\n setZoom(zoom: number) {\r\n this.ctx.setZoom(zoom);\r\n }\r\n getZoom() {\r\n return this.ctx.getZoom();\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, rowKey } = item;\r\n if (rowIndex !== undefined && rowKey === undefined) {\r\n const _rowKey = this.ctx.database.getRowKeyForRowIndex(rowIndex);\r\n this.ctx.database.setValidationErrorByRowKey(_rowKey, key, message);\r\n }\r\n if (rowKey) {\r\n this.ctx.database.setValidationErrorByRowKey(rowKey, key, message);\r\n }\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowKey) {\r\n this.scrollToRowkey(err.rowKey);\r\n this.scrollToColkey(err.key);\r\n } else if (err && err.rowIndex !== undefined && 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 // 禁用不验证\r\n if (this.ctx.config.DISABLED) {\r\n return new Promise((resolve) => {\r\n resolve([]);\r\n });\r\n }\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 clearSort() {\r\n this.ctx.database.clearSort();\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 clearChangeData() {\r\n this.ctx.database.clearChangeData();\r\n this.ctx.emit('draw');\r\n }\r\n getReadonly(rowKey: string, key: string) {\r\n return this.ctx.database.getReadonly(rowKey, key);\r\n }\r\n useLocale(langConfig: LangConfig) {\r\n this.ctx.locale.use(langConfig);\r\n }\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.loading.destroy();\r\n this.finderBar.destroy();\r\n this.textSelector.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","wait","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","parentKey","config","colspan","fixed","children","toLeaf","tmp","filterHiddenColumns","columns","col","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","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","parseDate","dateStr","directDate","patterns","pattern","groups","year","month","day","hour","minute","second","compareDates","aDate","bDate","getNumberPrecision","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","image","offsetX","offsetY","CellImage","source","options","visible","mouseX","mouseY","Cell","isUpdate","rowItem","err","dragImage","drawDragImageWidth","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","TREE_INDENT","CHECKBOX_SIZE","TREE_ICON_SIZE","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","drawX","iconX","iconY","drawTextX","selectionImage","dragImageWidth","selectionImageX","selectionImageWidth","DRAG_ROW_ICON_SIZE","dragImageX","dragImageY","TREE_LINE","TREE_LINE_COLOR","treeImage","treeImageX","treeImageY","treeImageWidth","treeImageHeight","iconCenterX","iconCenterY","baseX","parentRowKeys","i","nextKey","vx","vxParent","y2","currVX","shortTop","shortBottom","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","FINDER_CELL_BG_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","font","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","selectable","checkboxImage","checkboxName","treeState","check","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","_x","_y","offsetTop","offsetLeft","drawImageSource","hoverImage","renderHeight","BODY_FONT","CELL_LINE_HEIGHT","cacheTextKey","calculatedHeight","BODY_CELL_FORMATTER_METHOD","left","top","remainTop","autoStyle","paint","BORDER_COLOR","BORDER","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","cellHeader","PLACEHOLDER_COLOR","placeholder","text","layout","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetH","Database","footerData","isClear","_columns","leafColumns","_a","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","TREE_CHILDREN_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","rowIndexHeightList","rowMaxHeight","recursiveData","_generateColumns","dataMap","_b","_d","_c","_f","_e","_h","_g","obj","allHide","_height","_data","sortedEntries","filterMethod","direction","timestamp","sortedData","sortBy","aValue","bValue","comparison","aNum","bNum","aStr","bStr","rowKeys","rowkey","loading","_list","history","checkReadonly","historyAcion","historyList","_checkReadonly","rowList","errList","changeList","oldValue","cell","_changeItem","precision","factor","BEFORE_VALUE_CHANGE_METHOD","promsieValidators","rows","changeListValid","errorTip","_value","reDraw","isEditor","changeKey","originalValue","changeItem","selection","mode","childKey","childSelections","checkedChildren","s","totalChildren","parentShouldBeChecked","parentSelection","draw","selectionMap","checked","indeterminate","finalChecked","getAllDescendantsRecursive","allDescendants","descendantSelections","descKey","checkedDescendants","totalDescendants","someChecked","allChecked","collectChildren","items","itemKey","findParent","targetKey","child","result","_selectable","ignoreReserve","isTreeSelectionMode","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","colKey","rowKeyList","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","currentDepth","maxDepth","childMaxDepth","map","customHeader","ignoreEmit","resizableData","keys","hide","hideData","fixedData","clearCustomHeaderInvalidValues","assignIfDifferent","columnValue","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","target","fn","rect","ENABLE_KEYBOARD","ENABLE_ZOOM_WHEEL","delta","entry","EventBus","event","callback","callbacks","onceCallback","Paint","dpr","zoom","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","align","padding","verticalAlign","maxLineClamp","autoRowHeight","offsetRight","lineHeight","line","maxLineWidth","max","textMaxWidth","textInfo","availableWidth","contentWidth","contentHeight","chars","lines","maxTextLine","totalTextLine","char","ellipsis","visibleLines","remainingLines","ellipsisLine","lastLineIndex","remainingText","widthEllipsis","totalTextHeight","contentY","glyphs","segments","lineWidth","sum","segment","lineX","lineY","maxWidth","currentItems","currentWidth","lineCaretIndex","flushLine","nextCaretIndex","lineText","charWidth","remainingItems","_text","contentText","itemIndex","segmentWidth","paragraphs","paragraph","words","currentLine","word","testLine","fontSize","totalLines","ellipsesWidth","textWidth","textLength","Config","cssKey","expandSvg","svgcheckboxCheck","svgSelect","svgSortable","svgLoading","svgDrag","svgCheckboxUncheck","svgCheckboxIndeterminate","svgCheckboxDisabled","svgIconEdit","svgSortAsc","svgSortDesc","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","attrValue","url","svgBlob","reject","EventTable","entries","mutations","mutation","hoverIcon","renderRows","cells","renderCellHeaders","realityHeight","defaultLang","Locale","langConfig","EVirtTable","p1","PX_VALUE_RE","ZoomScale","min","next","logical","physical","physicalHeight","style","containerPhysicalWidth","containerLogical","stagePhysicalWidth","stageElement","stagePhysicalHeight","containerRect","cssPrefix","cellEl","logicalWidth","logicalHeight","isAutoHeight","contentEl","Context","containerOptions","containerElement","canvasElement","overlayerElement","editorElement","emptyElement","loadingElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","MIN_ZOOM","MAX_ZOOM","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","positionX","positionY","scrollSpeedX","num","scrollSpeedY","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","REQUIRED_COLOR","ENABLE_SELECTOR_SINGLE","colSpanMaxIndex","iconSize","sortState","sortImage","TreeUtil","initialData","sourceKey","sourceInfo","targetInfo","sourceParent","sourceIndex","sourceNode","targetParent","targetIndex","targetNode","sourceArray","targetArray","insertIndex","tree","nodeKey","parent","node","found","Header","isBuffer","HEADER_HEIGHT","maxHeaderRow","_item","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","currentState","newDirection","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","logicalOffsetX","renderAllCellHeaders","resizeTarget","genSortObj","sortColumns","columnsTree","sortData","dragCellHeader","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","RESIZE_COLUMN_TEXT_COLOR","RESIZE_COLUMN_TEXT_BG_COLOR","ENABLE_RESIZE_COLUMN_TEXT","resizeTargetDrawX","poins","rw","rh","DRAG_TIP_BG_COLOR","DRAG_TIP_LINE_COLOR","trianglePoins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","calculatedHeightCells","heights","curRowMaxHeight","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","zoomScale","containerHeight","physicalStageHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","minHeight","dragSource","dragTarget","isDragRow","BEFORE_DRAG_ROW_METHOD","originalData","treeUtil","ENABLE_DRAG_ROW_CROSS_LEVEL","scopeHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","DRAG_ROW_TIP_LINE_COLOR","dragTargetDrawY","dragTargetHeight","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","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","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","ENABLE_AUTOFILL_SPAN_COL","ENABLE_AUTOFILL_SPAN_ROW","xArrSelector","yArrSelector","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","round","floor","createCoords","v","oppositeSideMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","isStart","getOppositeAxisPlacements","flipAlignment","expandPaddingObject","getPaddingObject","rectToClientRect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","_await$platform$isEle","platform","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","currentMiddleware","nextX","nextY","reset","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","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","getComputedStyle$1","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","doc","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstRect","bottom","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","rectsAreEqual","observeMove","onMove","io","root","cleanup","_io","refresh","skip","threshold","elementRectForRootMargin","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$2","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","viewportRect","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","numberErrorTip","scrollHeight","scrollHeightLogical","maxHeight","bottomY","ignoreValue","editorType","visualMaxHeight","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip$1","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","m1","m2","overlayerAutoHeightMap","container","overlayerEl","typeView","typeDiv","cellWrapView","cellWrap","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","DOMTreeMenu","menuData","mainMenu","isSubmenu","menuItem","contentContainer","iconContainer","textSpan","arrowContainer","submenu","submenuData","tagName","className","submenuEl","siblings","parentSubmenu","sibling","trigger","viewportWidth","submenuWidth","rightSpace","leftSpace","menuElement","childSubmenu","menuValue","itemData","virtualReference","subMenuItem","parentMenuItem","allMenuItems","parentValue","ContextMenu","ENABLE_CONTEXT_MENU","CUSTOM_BODY_CONTEXT_MENU","CONTEXT_MENU","BEFORE_BODY_CONTEXT_MENU_METHOD","_itemData","BEFORE_HEADER_CONTEXT_MENU_METHOD","HEADER_CONTEXT_MENU","CUSTOM_HEADER_CONTEXT_MENU","ENABLE_HEADER_CONTEXT_MENU","fixedKeys","hideKeys","childKeys","filteredChildren","Tooltip","loadingSpinner","loadingSvg","svgEl","FinderBar","allCellHeaders","maxColIndex","maxRowIndex","inputWrapper","navContainer","searchText","current","_TextSelector","anchor","tMin","tMax","hit","dx","dy","cellKey","lineIndex","lineGlyphs","pad","lineTop","first","last","glyph","range","selectedColor","selectionBgColor","byLine","TextSelector","_EVirtTable","Empty","Loading","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","show","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[36,37,38,39]}
|