e-virt-table 1.3.23 → 1.3.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +314 -302
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/Cell.d.ts +3 -1
- package/dist/lib/Cell.js +17 -3
- package/dist/lib/Cell.js.map +1 -1
- package/dist/lib/CellHeader.d.ts +2 -1
- package/dist/lib/CellHeader.js +8 -1
- package/dist/lib/CellHeader.js.map +1 -1
- package/dist/lib/Config.d.ts +5 -1
- package/dist/lib/Config.js +14 -0
- package/dist/lib/Config.js.map +1 -1
- package/dist/lib/ContextMenu.js +28 -6
- package/dist/lib/ContextMenu.js.map +1 -1
- package/dist/lib/DOMTreeMenu.d.ts +0 -1
- package/dist/lib/DOMTreeMenu.js +0 -8
- package/dist/lib/DOMTreeMenu.js.map +1 -1
- package/dist/lib/Editor.js +4 -4
- package/dist/lib/Editor.js.map +1 -1
- package/dist/lib/types.d.ts +11 -0
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/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.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.3/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/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\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};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n LineClampType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n 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 // 画tree图标\n drawTreeImageX = 0;\n drawTreeImageY = 0;\n drawTreeImageWidth = 0;\n drawTreeImageHeight = 0;\n drawTreeImageName = '';\n drawTreeImageSource?: HTMLImageElement;\n // 画selection图标\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource?: HTMLImageElement;\n // 画hover图标\n drawHoverImageX = 0;\n drawHoverImageY = 0;\n drawHoverImageWidth = 0;\n drawHoverImageHeight = 0;\n drawHoverImageName = '';\n drawHoverImageSource?: HTMLImageElement;\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\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 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.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.drawTextWidth = this.visibleWidth;\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 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\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 // 计算树形图标的偏移量\n const { TREE_INDENT = 16, CHECKBOX_SIZE, TREE_ICON_SIZE } = this.ctx.config;\n iconOffsetX = level * TREE_INDENT;\n\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\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 if (this.type === 'selection-tree') {\n // 树形图标在左侧,checkbox 在树形图标右侧\n iconX = iconOffsetX + this.drawSelectionImageX + this.drawSelectionImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n } else if (this.type === 'tree-selection') {\n // 树形选择,两个图标宽度,文本已经有CELL_PADDING间距,/2看起来好看些\n drawTextX = iconX + CHECKBOX_SIZE + iconWidth - CELL_PADDING / 2;\n } else {\n // 普通tree,文本已经有CELL_PADDING间距,/2看起来好看些\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 // 不论是否需要绘制图标,都更新图标的“基准位置”,供树线使用\n this.drawTreeImageX = iconX;\n this.drawTreeImageY = iconY;\n this.drawTreeImageWidth = iconWidth;\n this.drawTreeImageHeight = iconHeight;\n if (icon) {\n this.drawTreeImageName = iconName;\n this.drawTreeImageSource = icon;\n } else {\n this.drawTreeImageName = '';\n this.drawTreeImageSource = undefined;\n }\n // 树连线仅在绘制阶段调用,避免在 update 阶段被清屏\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 // 以当前树图标为中心点\n const iconCenterX = this.drawTreeImageX + this.drawTreeImageWidth / 2;\n const iconCenterY = this.drawTreeImageY + this.drawTreeImageHeight / 2;\n\n // 基于已计算的树图标位置反推基准点:当前图标左侧减去 level * TREE_INDENT\n // 这样无论对齐方式如何(left/center/right),都以实际图标为基准定位所有竖线\n let baseX = this.drawTreeImageX - 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(this.drawTreeImageX - (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(this.drawTreeImageX - 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 = this.drawTreeImageY + this.drawTreeImageHeight;\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) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n\n // 只读\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: HTMLImageElement | undefined = 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 // 判断是否溢出格子\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 if (type === 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n } else {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawHoverImageX = _x;\n this.drawHoverImageY = _y;\n this.drawHoverImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageName = this.hoverIconName;\n this.drawHoverImageSource = drawImageSource;\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) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawSelectionImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = this.drawX - this.ctx.fixedLeftWidth;\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 ? '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 },\n );\n return this.ellipsis;\n }\n private drawImage() {\n if (this.drawSelectionImageSource) {\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n if (this.drawTreeImageSource) {\n this.ctx.paint.drawImage(\n this.drawTreeImageSource,\n this.drawTreeImageX,\n this.drawTreeImageY,\n this.drawTreeImageWidth,\n this.drawTreeImageHeight,\n );\n }\n if (this.drawHoverImageSource) {\n // 绘制hover图标背景\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawHoverImageX - 2,\n this.drawHoverImageY - 2,\n this.drawHoverImageWidth + 4,\n this.drawHoverImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n this.ctx.paint.drawImage(\n this.drawHoverImageSource,\n this.drawHoverImageX,\n this.drawHoverImageY,\n this.drawHoverImageWidth,\n this.drawHoverImageHeight,\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 ErrorType,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n SortByType,\n SortStateMap,\n CustomHeader,\n Fixed,\n RowMaxHeightData,\n} from './types';\nimport { generateShortUUID, toLeaf, compareDates } 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 === '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 /**\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 const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeValueChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n // 过滤旧数据新数据相同的\n changeList = changeList.filter((item) => item.oldValue !== item.value);\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 changeList.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowKeyList.add(rowKey);\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 // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n 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 // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n let changeList: BeforeChangeItem[] = [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ];\n this.batchSetItemValue(changeList, history, false);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 重绘\n if (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';\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 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 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 this.ctx.textAlign = align;\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); // 默认行高为字体大小的1.2倍\n const availableWidth = width - padding * 2 - offsetLeft - offsetRight;\n let textEllipsis = false;\n // 计算总行数,向上取整round\n const maxTextLine = Math.round((height - 2 * padding) / lineHeight);\n // 将文本按可用宽度分割成行,如果为1直接就不计算了,直接绘制\n let lines = this.wrapText(text, availableWidth, options.cacheTextKey);\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 // 处理边界问题\n if (maxLineClamp === 1) {\n lines = [text];\n totalTextLine = 1;\n }\n if (maxLineClamp === 'auto' && maxTextLine === 1) {\n lines = [text];\n totalTextLine = 1;\n }\n }\n // 计算起始Y位置\n let startY = y + padding;\n const totalTextHeight = Math.round(totalTextLine * lineHeight);\n if (verticalAlign === 'middle') {\n startY = y + (height - totalTextHeight) / 2;\n } else if (verticalAlign === 'bottom') {\n startY = y + height - totalTextHeight - padding;\n }\n // 计算起始X位置\n let startX = x + padding + offsetLeft;\n if (align === 'center') {\n startX = x + width / 2;\n } else if (align === 'right') {\n startX = x + width - padding - offsetRight;\n }\n // 绘制每一行用for循环\n for (let i = 0; i < lines.length; i++) {\n const lineText = lines[i];\n const lineY = startY + i * lineHeight;\n this.ctx.textBaseline = 'top';\n // 如果设置了lineClamp,则只绘制lineClamp行\n if (i === totalTextLine - 1) {\n //截取剩余lines,组合成字符串处理省略号\n const remainingLines = lines.slice(i);\n const remainingText = remainingLines.join('');\n const { _text, ellipsis } = this.handleEllipsis(remainingText, width, padding, font);\n this.ctx.fillText(_text, startX, lineY);\n textEllipsis = ellipsis;\n break;\n }\n this.ctx.fillText(lineText, startX, lineY);\n }\n // 文字信息回调,用于画跟随图标的\n if (options.textCallback && lines.length) {\n // 取最长行\n const maxLineWidth = lines.reduce((max, line) => {\n return Math.max(max, this.ctx.measureText(line).width);\n }, 0);\n const textMaxWidth = Math.round(maxLineWidth);\n let left = startX;\n let right = startX + textMaxWidth;\n if (align === 'center') {\n left = startX - textMaxWidth / 2;\n right = startX + textMaxWidth / 2;\n } else if (align === 'right') {\n left = startX - textMaxWidth;\n right = startX;\n }\n const textInfo = {\n x: startX,\n y: startY,\n width: textMaxWidth,\n height: totalTextHeight,\n left,\n right,\n top: startY,\n bottom: startY + totalTextHeight,\n };\n options.textCallback(textInfo);\n }\n this.ctx.restore();\n return textEllipsis;\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 BeforeCellValueChangeMethod,\n BeforeCopyMethod,\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 NUMBER_ERROR_TIP = '只允许输入数字';\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_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[] = [\n { label: '复制', value: 'copy' },\n { label: '剪切', value: 'cut' },\n { label: '粘贴', value: 'paste' },\n { label: '清空选中内容', value: 'clearSelected' },\n ];\n CUSTOM_BODY_CONTEXT_MENU: MenuItem[] = [];\n HEADER_CONTEXT_MENU: MenuItem[] = [\n { label: '左固定', value: 'fixedLeft' },\n { label: '右固定', value: 'fixedRight' },\n { label: '取消固定', value: 'fixedNone' },\n { label: '隐藏', value: 'hide' },\n {\n label: '显示',\n value: 'visible',\n },\n { label: '恢复默认', value: 'resetHeader' },\n ];\n CUSTOM_HEADER_CONTEXT_MENU: MenuItem[] = [];\n /** 格子多行文本行高,isAutoRowHeight才会生效 */\n CELL_LINE_HEIGHT = 1.3;\n /** 全局自动行高 */\n AUTO_ROW_HEIGHT = false;\n /** 启用拖拽表头 */\n ENABLE_DRAG_COLUMN = false;\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_COPY_METHOD?: BeforeCopyMethod;\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","import Context from './Context';\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\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst expandSvg = `<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\nconst svgcheckboxCheck = `<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>`;\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\nconst svgSortable = `<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>`;\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\nconst svgLoading = `<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>`;\r\nexport { expandSvg, svgcheckboxCheck, svgSelect, svgSortable, svgSortAsc, svgSortDesc, svgLoading };\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: '<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>',\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: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_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: '<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>',\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: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: '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 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 type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, LineClampType, Render, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nimport { TextInfo } from './Paint';\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 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 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 }\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 update() {\n this.updateContainer();\n this.displayText = this.getText();\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\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.drawSelection();\n this.drawText();\n this.drawBg();\n this.drawSortIcon();\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, REQUIRED_COLOR },\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.column.sortBy ? 16 : 0, // 排序图标占位\n offsetLeft: this.required ? 12 : 0, // 必填星号占位\n cacheTextKey,\n textCallback: (textInfo: TextInfo) => {\n // 排序图标位置,需要跟随文字变化\n if (this.column.sortBy) {\n this.drawSortImageX = textInfo.right + 4;\n this.drawSortImageY = textInfo.top + (textInfo.height - 16) / 2;\n }\n if (this.required) {\n paint.drawText('*', textInfo.left - 18, textInfo.top + (textInfo.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 },\n },\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 drawSelection() {\n if (this.hideHeaderSelection) {\n return;\n }\n\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\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 if (checkboxImage) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n\n // 不再需要保存文本位置信息,直接在 draw 方法中计算\n }\n }\n private drawSortIcon() {\n // 如果没有sortBy配置且不是后端排序,不显示排序图标\n if (!this.column.sortBy) {\n return;\n }\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 if (!icon) {\n return;\n }\n this.drawSortImageWidth = iconSize;\n this.drawSortImageHeight = iconSize;\n this.drawSortImageName = iconName;\n this.drawSortImageSource = icon;\n\n // 绘制图标\n this.ctx.paint.drawImage(\n this.drawSortImageSource,\n this.drawSortImageX,\n this.drawSortImageY,\n this.drawSortImageWidth,\n this.drawSortImageHeight,\n );\n }\n\n getText() {\n if (this.render) {\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","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver((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 // 判断是否在body外部\n const {\n body: { height, visibleHeight, visibleWidth, y: bodyY },\n } = this.ctx;\n const realityHeight = Math.min(height, visibleHeight);\n const isInBody = x > 0 && x < visibleWidth && y > bodyY && y < bodyY + realityHeight;\n if (!isInBody) {\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 });\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.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMouseup', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(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\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell, e);\n this.sortClick(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 this.selectionClick(cell, e);\n this.treeClick(cell, e);\n },\n true,\n );\n // 正常\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // hoverIcon事件\n this.hoverIconClick(cell);\n },\n false,\n );\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\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 private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer && !this.ctx.disableHoverIconClick) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection =\n ['selection', 'index-selection', 'selection-tree', 'tree-selection'].includes(cell.type) &&\n this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 判断是否点击checkbox图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (\n cell.drawSelectionImageName === 'checkbox-uncheck' ||\n cell.drawSelectionImageName === 'checkbox-indeterminate'\n ) {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawSelectionImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey, cell.type);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isTree = ['tree', 'selection-tree', 'tree-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isTree) {\n return;\n }\n // 判断是否点击tree图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cell.drawTreeImageX,\n cell.drawTreeImageY,\n cell.drawTreeImageWidth,\n cell.drawTreeImageHeight,\n )\n ) {\n return;\n }\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 sortClick(cellHeader: CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cellHeader.drawSortImageX,\n cellHeader.drawSortImageY,\n cellHeader.drawSortImageWidth,\n cellHeader.drawSortImageHeight,\n )\n ) {\n return;\n }\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 * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n // 检查头部图标\n if (cell instanceof CellHeader) {\n // 选中图标\n if (\n cell.drawSelectionImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n // 排序图标\n if (\n cell.drawSortImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSortImageX,\n cell.drawSortImageY,\n cell.drawSortImageWidth,\n cell.drawSortImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n // 检查body图标\n if (cell instanceof Cell) {\n // 选中图标\n if (\n cell.drawSelectionImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否禁用\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n return;\n }\n // hover图标\n if (\n cell.drawHoverImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawHoverImageX,\n cell.drawHoverImageY,\n cell.drawHoverImageWidth,\n cell.drawHoverImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n // tree图标\n if (\n cell.drawTreeImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawTreeImageX,\n cell.drawTreeImageY,\n cell.drawTreeImageWidth,\n cell.drawTreeImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n }\n private isInsideElement(\n x: number,\n y: number,\n xElement: number,\n yElement: number,\n widthElement: number,\n heightElement: number,\n ) {\n if (x > xElement && x < xElement + widthElement && y > yElement && y < yElement + heightElement) {\n return true;\n }\n return false;\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(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private handleFooterEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nimport { FinderResult } from './FinderBar';\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 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 isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = 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 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","type Position = 'before' | 'after';\r\n\r\ninterface TreeConfig {\r\n key?: string;\r\n childrenKey?: string;\r\n}\r\n\r\nexport class TreeUtil<T extends Record<string, any> = any> {\r\n private root: T[];\r\n private key: string;\r\n private childrenKey: string;\r\n\r\n constructor(initialData: T[], 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 /** 获取当前树 */\r\n getTree() {\r\n return this.root;\r\n }\r\n\r\n /** 移动节点 */\r\n treeMove(sourceNode: T, targetNode: T, position: Position) {\r\n // 找到并移除 Source\r\n const sourceInfo = this.findNodeWithParent(this.root, sourceNode[this.key]);\r\n if (!sourceInfo) throw new Error('Source node not found');\r\n const { parent: sourceParent, index: sourceIndex, node: sourceFound } = sourceInfo;\r\n\r\n if (sourceParent) {\r\n const childrenArr = sourceParent[this.childrenKey] as T[];\r\n childrenArr.splice(sourceIndex, 1);\r\n if (childrenArr.length === 0) {\r\n delete sourceParent[this.childrenKey];\r\n }\r\n } else {\r\n this.root.splice(sourceIndex, 1);\r\n }\r\n\r\n // 找到 Target\r\n const targetInfo = this.findNodeWithParent(this.root, targetNode[this.key]);\r\n if (!targetInfo) throw new Error('Target node not found');\r\n const { parent: targetParent, index: targetIndex } = targetInfo;\r\n\r\n // 插入\r\n if (position === 'before') {\r\n if (targetParent) {\r\n (targetParent[this.childrenKey] as T[]).splice(targetIndex, 0, sourceFound);\r\n } else {\r\n this.root.splice(targetIndex, 0, sourceFound);\r\n }\r\n } else if (position === 'after') {\r\n if (targetParent) {\r\n (targetParent[this.childrenKey] as T[]).splice(targetIndex + 1, 0, sourceFound);\r\n } else {\r\n this.root.splice(targetIndex + 1, 0, sourceFound);\r\n }\r\n }\r\n }\r\n\r\n /** 在树中找到节点及其父节点 */\r\n private findNodeWithParent(tree: T[], nodeId: any, parent: T | null = null):\r\n { parent: T | null, index: number, node: T } | null {\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node[this.key] === nodeId) {\r\n return { parent, index: i, node };\r\n }\r\n if (node[this.childrenKey]) {\r\n const found = this.findNodeWithParent(node[this.childrenKey] as T[], nodeId, node);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\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 // 初始化调整列大小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 // 调整表头的宽度\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.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, this.dragingCell.column, 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 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.stageElement.style.cursor = 'default';\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 type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n 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 // 调整行的高度\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 resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0 && !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, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private 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 if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.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.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.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 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) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n 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, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n // 自动填充移动时,调整滚动条位置\r\n 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: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n // 触发绘制\r\n 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};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\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 return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n 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 } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\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 } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = 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 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}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\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) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, 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, 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(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\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, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n 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 (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : 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(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\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(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\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(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\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) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !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\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n 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 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 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 '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) {\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.isPointer) {\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 // 只有文本类型才能聚焦\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 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 this.ctx.emit('cellShowTooltip', this.cellTarget, this.ctx.config.NUMBER_ERROR_TIP);\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 } 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 if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n }\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 this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n 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_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n top: `${top}px`,\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\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 (itemData.event) {\r\n itemData.event(e, this.hide.bind(this));\r\n }\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 private hide(): void {\r\n // 隐藏菜单\r\n this.cleanupAllSubmenus(this.container);\r\n this.container.style.display = 'none';\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', (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 } = this.ctx.config;\r\n const list = [...CONTEXT_MENU, ...CUSTOM_BODY_CONTEXT_MENU];\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 }\r\n },\r\n });\r\n this.currentDOMTreeMenu.positionMenu(e);\r\n });\r\n this.ctx.on('cellHeaderContextMenuClick', (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 } = 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 const list = [...HEADER_CONTEXT_MENU, ...CUSTOM_HEADER_CONTEXT_MENU];\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 }\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 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 const loadingText = document.createElement('p');\r\n loadingText.className = 'e-virt-table-loading-text';\r\n loadingText.innerText = this.ctx.config.LOADING_TEXT;\r\n loadingSpinner.appendChild(loadingText);\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 show() {\r\n this.loadingEl.style.display = 'flex';\r\n }\r\n hide() {\r\n this.loadingEl.style.display = 'none';\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 {\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\n\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n private loading: Loading;\r\n private finderBar: FinderBar;\r\n private animationFrameId: number | undefined = undefined;\r\n ctx: Context;\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('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.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n }\r\n 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\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.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","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","c","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","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","isUpdate","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","TREE_INDENT","CHECKBOX_SIZE","TREE_ICON_SIZE","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","drawX","iconX","iconY","drawTextX","TREE_LINE","TREE_LINE_COLOR","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","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","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","TREE_CHILDREN_KEY","_a","_rowKey","readonly","checkboxKey","checkboxKeys","rowIndexHeightList","rowMaxHeight","recursiveData","_generateColumns","_b","_c","_d","_e","_f","_g","_h","dataMap","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","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","changeListValid","errorTip","reDraw","isEditor","changeKey","originalValue","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","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","availableWidth","textEllipsis","maxTextLine","lines","totalTextLine","startY","totalTextHeight","startX","lineText","lineY","remainingText","_text","ellipsis","maxLineWidth","max","line","textMaxWidth","textInfo","maxWidth","paragraphs","paragraph","words","currentLine","word","testLine","fontSize","totalLines","ellipsesWidth","textWidth","lineWidth","textLength","Config","cssKey","expandSvg","svgcheckboxCheck","svgSelect","svgSortable","svgSortAsc","svgSortDesc","svgLoading","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","attrValue","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","REQUIRED_COLOR","ENABLE_SELECTOR_SINGLE","colSpanMaxIndex","iconSize","sortState","EventTable","entries","mutations","mutation","bodyY","realityHeight","clickY","clickX","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","currentState","newDirection","xElement","yElement","widthElement","heightElement","renderRows","visible","cells","renderCellHeaders","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","TreeUtil","initialData","sourceNode","targetNode","sourceInfo","sourceParent","sourceIndex","sourceFound","childrenArr","targetInfo","targetParent","targetIndex","tree","nodeId","parent","node","found","Header","isBuffer","HEADER_HEIGHT","maxHeaderRow","sum","_item","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","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","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","minHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","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","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","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","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","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","invalidOverflowDisplayValues","isOverflowElement","overflowX","overflowY","display","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","ignoreScrollbarX","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","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","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip$1","EMPTY_TEXT","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","_itemData","HEADER_CONTEXT_MENU","CUSTOM_HEADER_CONTEXT_MENU","ENABLE_HEADER_CONTEXT_MENU","fixedKeys","hideKeys","childKeys","filteredChildren","Tooltip","loadingSpinner","loadingSvg","svgEl","loadingText","FinderBar","allCellHeaders","maxColIndex","maxRowIndex","inputWrapper","navContainer","searchText","current","EVirtTable","Empty","Loading","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","show","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[22,23,24,25]}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/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.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.3/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/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\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};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n LineClampType,\n RenderType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n 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 // 画tree图标\n drawTreeImageX = 0;\n drawTreeImageY = 0;\n drawTreeImageWidth = 0;\n drawTreeImageHeight = 0;\n drawTreeImageName = '';\n drawTreeImageSource?: HTMLImageElement;\n // 画selection图标\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource?: HTMLImageElement;\n // 画hover图标\n drawHoverImageX = 0;\n drawHoverImageY = 0;\n drawHoverImageWidth = 0;\n drawHoverImageHeight = 0;\n drawHoverImageName = '';\n drawHoverImageSource?: HTMLImageElement;\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 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.renderType = column.renderType || 'default';\n this.renderFooterType = column.renderFooterType || 'default';\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.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.drawTextWidth = this.visibleWidth;\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 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\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 // 计算树形图标的偏移量\n const { TREE_INDENT = 16, CHECKBOX_SIZE, TREE_ICON_SIZE } = this.ctx.config;\n iconOffsetX = level * TREE_INDENT;\n\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\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 if (this.type === 'selection-tree') {\n // 树形图标在左侧,checkbox 在树形图标右侧\n iconX = iconOffsetX + this.drawSelectionImageX + this.drawSelectionImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n } else if (this.type === 'tree-selection') {\n // 树形选择,两个图标宽度,文本已经有CELL_PADDING间距,/2看起来好看些\n drawTextX = iconX + CHECKBOX_SIZE + iconWidth - CELL_PADDING / 2;\n } else {\n // 普通tree,文本已经有CELL_PADDING间距,/2看起来好看些\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 // 不论是否需要绘制图标,都更新图标的“基准位置”,供树线使用\n this.drawTreeImageX = iconX;\n this.drawTreeImageY = iconY;\n this.drawTreeImageWidth = iconWidth;\n this.drawTreeImageHeight = iconHeight;\n if (icon) {\n this.drawTreeImageName = iconName;\n this.drawTreeImageSource = icon;\n } else {\n this.drawTreeImageName = '';\n this.drawTreeImageSource = undefined;\n }\n // 树连线仅在绘制阶段调用,避免在 update 阶段被清屏\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 // 以当前树图标为中心点\n const iconCenterX = this.drawTreeImageX + this.drawTreeImageWidth / 2;\n const iconCenterY = this.drawTreeImageY + this.drawTreeImageHeight / 2;\n\n // 基于已计算的树图标位置反推基准点:当前图标左侧减去 level * TREE_INDENT\n // 这样无论对齐方式如何(left/center/right),都以实际图标为基准定位所有竖线\n let baseX = this.drawTreeImageX - 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(this.drawTreeImageX - (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(this.drawTreeImageX - 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 = this.drawTreeImageY + this.drawTreeImageHeight;\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) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n\n // 只读\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: HTMLImageElement | undefined = 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 // 判断是否溢出格子\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 if (type === 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n } else {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawHoverImageX = _x;\n this.drawHoverImageY = _y;\n this.drawHoverImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageName = this.hoverIconName;\n this.drawHoverImageSource = drawImageSource;\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 // 插槽不显示文本\n if (this.render && this.renderType === 'default') {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawSelectionImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = this.drawX - this.ctx.fixedLeftWidth;\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 },\n );\n return this.ellipsis;\n }\n private drawImage() {\n if (this.drawSelectionImageSource) {\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n if (this.drawTreeImageSource) {\n this.ctx.paint.drawImage(\n this.drawTreeImageSource,\n this.drawTreeImageX,\n this.drawTreeImageY,\n this.drawTreeImageWidth,\n this.drawTreeImageHeight,\n );\n }\n if (this.drawHoverImageSource) {\n // 绘制hover图标背景\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawHoverImageX - 2,\n this.drawHoverImageY - 2,\n this.drawHoverImageWidth + 4,\n this.drawHoverImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n this.ctx.paint.drawImage(\n this.drawHoverImageSource,\n this.drawHoverImageX,\n this.drawHoverImageY,\n this.drawHoverImageWidth,\n this.drawHoverImageHeight,\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 ErrorType,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n SortByType,\n SortStateMap,\n CustomHeader,\n Fixed,\n RowMaxHeightData,\n} from './types';\nimport { generateShortUUID, toLeaf, compareDates } 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 === '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 /**\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 const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeValueChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n // 过滤旧数据新数据相同的\n changeList = changeList.filter((item) => item.oldValue !== item.value);\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 changeList.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowKeyList.add(rowKey);\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 // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n 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 // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n let changeList: BeforeChangeItem[] = [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ];\n this.batchSetItemValue(changeList, history, false);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 重绘\n if (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';\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 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 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 this.ctx.textAlign = align;\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); // 默认行高为字体大小的1.2倍\n const availableWidth = width - padding * 2 - offsetLeft - offsetRight;\n let textEllipsis = false;\n // 计算总行数,向上取整round\n const maxTextLine = Math.round((height - 2 * padding) / lineHeight);\n // 将文本按可用宽度分割成行,如果为1直接就不计算了,直接绘制\n let lines = this.wrapText(text, availableWidth, options.cacheTextKey);\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 // 处理边界问题\n if (maxLineClamp === 1) {\n lines = [text];\n totalTextLine = 1;\n }\n if (maxLineClamp === 'auto' && maxTextLine === 1) {\n lines = [text];\n totalTextLine = 1;\n }\n }\n // 计算起始Y位置\n let startY = y + padding;\n const totalTextHeight = Math.round(totalTextLine * lineHeight);\n if (verticalAlign === 'middle') {\n startY = y + (height - totalTextHeight) / 2;\n } else if (verticalAlign === 'bottom') {\n startY = y + height - totalTextHeight - padding;\n }\n // 计算起始X位置\n let startX = x + padding + offsetLeft;\n if (align === 'center') {\n startX = x + width / 2;\n } else if (align === 'right') {\n startX = x + width - padding - offsetRight;\n }\n // 绘制每一行用for循环\n for (let i = 0; i < lines.length; i++) {\n const lineText = lines[i];\n const lineY = startY + i * lineHeight;\n this.ctx.textBaseline = 'top';\n // 如果设置了lineClamp,则只绘制lineClamp行\n if (i === totalTextLine - 1) {\n //截取剩余lines,组合成字符串处理省略号\n const remainingLines = lines.slice(i);\n const remainingText = remainingLines.join('');\n const { _text, ellipsis } = this.handleEllipsis(remainingText, width, padding, font);\n this.ctx.fillText(_text, startX, lineY);\n textEllipsis = ellipsis;\n break;\n }\n this.ctx.fillText(lineText, startX, lineY);\n }\n // 文字信息回调,用于画跟随图标的\n if (options.textCallback && lines.length) {\n // 取最长行\n const maxLineWidth = lines.reduce((max, line) => {\n return Math.max(max, this.ctx.measureText(line).width);\n }, 0);\n const textMaxWidth = Math.round(maxLineWidth);\n let left = startX;\n let right = startX + textMaxWidth;\n if (align === 'center') {\n left = startX - textMaxWidth / 2;\n right = startX + textMaxWidth / 2;\n } else if (align === 'right') {\n left = startX - textMaxWidth;\n right = startX;\n }\n const textInfo = {\n x: startX,\n y: startY,\n width: textMaxWidth,\n height: totalTextHeight,\n left,\n right,\n top: startY,\n bottom: startY + totalTextHeight,\n };\n options.textCallback(textInfo);\n }\n this.ctx.restore();\n return textEllipsis;\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 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 NUMBER_ERROR_TIP = '只允许输入数字';\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_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[] = [\n { label: '复制', value: 'copy' },\n { label: '剪切', value: 'cut' },\n { label: '粘贴', value: 'paste' },\n { label: '清空选中内容', value: 'clearSelected' },\n ];\n CUSTOM_BODY_CONTEXT_MENU: MenuItem[] = [];\n HEADER_CONTEXT_MENU: MenuItem[] = [\n { label: '左固定', value: 'fixedLeft' },\n { label: '右固定', value: 'fixedRight' },\n { label: '取消固定', value: 'fixedNone' },\n { label: '隐藏', value: 'hide' },\n {\n label: '显示',\n value: 'visible',\n },\n { label: '恢复默认', value: 'resetHeader' },\n ];\n CUSTOM_HEADER_CONTEXT_MENU: MenuItem[] = [];\n /** 格子多行文本行高,isAutoRowHeight才会生效 */\n CELL_LINE_HEIGHT = 1.3;\n /** 全局自动行高 */\n AUTO_ROW_HEIGHT = false;\n /** 启用拖拽表头 */\n ENABLE_DRAG_COLUMN = false;\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 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","import Context from './Context';\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\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst expandSvg = `<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\nconst svgcheckboxCheck = `<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>`;\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\nconst svgSortable = `<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>`;\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\nconst svgLoading = `<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>`;\r\nexport { expandSvg, svgcheckboxCheck, svgSelect, svgSortable, svgSortAsc, svgSortDesc, svgLoading };\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: '<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>',\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: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_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: '<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>',\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: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: '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 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 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';\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 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 update() {\n this.updateContainer();\n this.displayText = this.getText();\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\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.drawSelection();\n this.drawText();\n this.drawBg();\n this.drawSortIcon();\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, REQUIRED_COLOR },\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.column.sortBy ? 16 : 0, // 排序图标占位\n offsetLeft: this.required ? 12 : 0, // 必填星号占位\n cacheTextKey,\n textCallback: (textInfo: TextInfo) => {\n // 排序图标位置,需要跟随文字变化\n if (this.column.sortBy) {\n this.drawSortImageX = textInfo.right + 4;\n this.drawSortImageY = textInfo.top + (textInfo.height - 16) / 2;\n }\n if (this.required) {\n paint.drawText('*', textInfo.left - 18, textInfo.top + (textInfo.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 },\n },\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 drawSelection() {\n if (this.hideHeaderSelection) {\n return;\n }\n\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\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 if (checkboxImage) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n\n // 不再需要保存文本位置信息,直接在 draw 方法中计算\n }\n }\n private drawSortIcon() {\n // 如果没有sortBy配置且不是后端排序,不显示排序图标\n if (!this.column.sortBy) {\n return;\n }\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 if (!icon) {\n return;\n }\n this.drawSortImageWidth = iconSize;\n this.drawSortImageHeight = iconSize;\n this.drawSortImageName = iconName;\n this.drawSortImageSource = icon;\n\n // 绘制图标\n this.ctx.paint.drawImage(\n this.drawSortImageSource,\n this.drawSortImageX,\n this.drawSortImageY,\n this.drawSortImageWidth,\n this.drawSortImageHeight,\n );\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","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver((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 // 判断是否在body外部\n const {\n body: { height, visibleHeight, visibleWidth, y: bodyY },\n } = this.ctx;\n const realityHeight = Math.min(height, visibleHeight);\n const isInBody = x > 0 && x < visibleWidth && y > bodyY && y < bodyY + realityHeight;\n if (!isInBody) {\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 });\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.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMouseup', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(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\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell, e);\n this.sortClick(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 this.selectionClick(cell, e);\n this.treeClick(cell, e);\n },\n true,\n );\n // 正常\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // hoverIcon事件\n this.hoverIconClick(cell);\n },\n false,\n );\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\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 private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer && !this.ctx.disableHoverIconClick) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection =\n ['selection', 'index-selection', 'selection-tree', 'tree-selection'].includes(cell.type) &&\n this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 判断是否点击checkbox图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (\n cell.drawSelectionImageName === 'checkbox-uncheck' ||\n cell.drawSelectionImageName === 'checkbox-indeterminate'\n ) {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawSelectionImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey, cell.type);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isTree = ['tree', 'selection-tree', 'tree-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isTree) {\n return;\n }\n // 判断是否点击tree图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cell.drawTreeImageX,\n cell.drawTreeImageY,\n cell.drawTreeImageWidth,\n cell.drawTreeImageHeight,\n )\n ) {\n return;\n }\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 sortClick(cellHeader: CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !this.isInsideElement(\n clickX,\n clickY,\n cellHeader.drawSortImageX,\n cellHeader.drawSortImageY,\n cellHeader.drawSortImageWidth,\n cellHeader.drawSortImageHeight,\n )\n ) {\n return;\n }\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 * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n // 检查头部图标\n if (cell instanceof CellHeader) {\n // 选中图标\n if (\n cell.drawSelectionImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n // 排序图标\n if (\n cell.drawSortImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSortImageX,\n cell.drawSortImageY,\n cell.drawSortImageWidth,\n cell.drawSortImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n // 检查body图标\n if (cell instanceof Cell) {\n // 选中图标\n if (\n cell.drawSelectionImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawSelectionImageX,\n cell.drawSelectionImageY,\n cell.drawSelectionImageWidth,\n cell.drawSelectionImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否禁用\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n return;\n }\n // hover图标\n if (\n cell.drawHoverImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawHoverImageX,\n cell.drawHoverImageY,\n cell.drawHoverImageWidth,\n cell.drawHoverImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n // tree图标\n if (\n cell.drawTreeImageSource &&\n this.isInsideElement(\n x,\n y,\n cell.drawTreeImageX,\n cell.drawTreeImageY,\n cell.drawTreeImageWidth,\n cell.drawTreeImageHeight,\n )\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n }\n private isInsideElement(\n x: number,\n y: number,\n xElement: number,\n yElement: number,\n widthElement: number,\n heightElement: number,\n ) {\n if (x > xElement && x < xElement + widthElement && y > yElement && y < yElement + heightElement) {\n return true;\n }\n return false;\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(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private handleFooterEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nimport { FinderResult } from './FinderBar';\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 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 isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = 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 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","type Position = 'before' | 'after';\r\n\r\ninterface TreeConfig {\r\n key?: string;\r\n childrenKey?: string;\r\n}\r\n\r\nexport class TreeUtil<T extends Record<string, any> = any> {\r\n private root: T[];\r\n private key: string;\r\n private childrenKey: string;\r\n\r\n constructor(initialData: T[], 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 /** 获取当前树 */\r\n getTree() {\r\n return this.root;\r\n }\r\n\r\n /** 移动节点 */\r\n treeMove(sourceNode: T, targetNode: T, position: Position) {\r\n // 找到并移除 Source\r\n const sourceInfo = this.findNodeWithParent(this.root, sourceNode[this.key]);\r\n if (!sourceInfo) throw new Error('Source node not found');\r\n const { parent: sourceParent, index: sourceIndex, node: sourceFound } = sourceInfo;\r\n\r\n if (sourceParent) {\r\n const childrenArr = sourceParent[this.childrenKey] as T[];\r\n childrenArr.splice(sourceIndex, 1);\r\n if (childrenArr.length === 0) {\r\n delete sourceParent[this.childrenKey];\r\n }\r\n } else {\r\n this.root.splice(sourceIndex, 1);\r\n }\r\n\r\n // 找到 Target\r\n const targetInfo = this.findNodeWithParent(this.root, targetNode[this.key]);\r\n if (!targetInfo) throw new Error('Target node not found');\r\n const { parent: targetParent, index: targetIndex } = targetInfo;\r\n\r\n // 插入\r\n if (position === 'before') {\r\n if (targetParent) {\r\n (targetParent[this.childrenKey] as T[]).splice(targetIndex, 0, sourceFound);\r\n } else {\r\n this.root.splice(targetIndex, 0, sourceFound);\r\n }\r\n } else if (position === 'after') {\r\n if (targetParent) {\r\n (targetParent[this.childrenKey] as T[]).splice(targetIndex + 1, 0, sourceFound);\r\n } else {\r\n this.root.splice(targetIndex + 1, 0, sourceFound);\r\n }\r\n }\r\n }\r\n\r\n /** 在树中找到节点及其父节点 */\r\n private findNodeWithParent(tree: T[], nodeId: any, parent: T | null = null):\r\n { parent: T | null, index: number, node: T } | null {\r\n for (let i = 0; i < tree.length; i++) {\r\n const node = tree[i];\r\n if (node[this.key] === nodeId) {\r\n return { parent, index: i, node };\r\n }\r\n if (node[this.childrenKey]) {\r\n const found = this.findNodeWithParent(node[this.childrenKey] as T[], nodeId, node);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\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 // 初始化调整列大小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 // 调整表头的宽度\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.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, this.dragingCell.column, 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 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.stageElement.style.cursor = 'default';\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 type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n 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 // 调整行的高度\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 resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0 && !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, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private 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 if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.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.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.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 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) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n 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, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n // 自动填充移动时,调整滚动条位置\r\n 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: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n // 触发绘制\r\n 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};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\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 return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n 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 } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\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 } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = 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 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}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\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) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, 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, 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(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\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, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n 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 (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : 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(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\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(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\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(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\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) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !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\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n 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 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 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 '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.isPointer) {\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 // 只有文本类型才能聚焦\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 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 this.ctx.emit('cellShowTooltip', this.cellTarget, this.ctx.config.NUMBER_ERROR_TIP);\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 this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n // 触发绘制,刷新\r\n 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_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n top: `${top}px`,\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\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 = [...CONTEXT_MENU, ...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 = [...HEADER_CONTEXT_MENU, ...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 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 const loadingText = document.createElement('p');\r\n loadingText.className = 'e-virt-table-loading-text';\r\n loadingText.innerText = this.ctx.config.LOADING_TEXT;\r\n loadingSpinner.appendChild(loadingText);\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 show() {\r\n this.loadingEl.style.display = 'flex';\r\n }\r\n hide() {\r\n this.loadingEl.style.display = 'none';\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 {\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\n\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n private loading: Loading;\r\n private finderBar: FinderBar;\r\n private animationFrameId: number | undefined = undefined;\r\n ctx: Context;\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('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.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n }\r\n 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\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.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","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","c","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","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","isUpdate","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","TREE_INDENT","CHECKBOX_SIZE","TREE_ICON_SIZE","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","drawX","iconX","iconY","drawTextX","TREE_LINE","TREE_LINE_COLOR","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","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","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","TREE_CHILDREN_KEY","_a","_rowKey","readonly","checkboxKey","checkboxKeys","rowIndexHeightList","rowMaxHeight","recursiveData","_generateColumns","_b","_c","_d","_e","_f","_g","_h","dataMap","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","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","changeListValid","errorTip","reDraw","isEditor","changeKey","originalValue","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","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","availableWidth","textEllipsis","maxTextLine","lines","totalTextLine","startY","totalTextHeight","startX","lineText","lineY","remainingText","_text","ellipsis","maxLineWidth","max","line","textMaxWidth","textInfo","maxWidth","paragraphs","paragraph","words","currentLine","word","testLine","fontSize","totalLines","ellipsesWidth","textWidth","lineWidth","textLength","Config","cssKey","expandSvg","svgcheckboxCheck","svgSelect","svgSortable","svgSortAsc","svgSortDesc","svgLoading","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","attrValue","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","REQUIRED_COLOR","ENABLE_SELECTOR_SINGLE","colSpanMaxIndex","iconSize","sortState","EventTable","entries","mutations","mutation","bodyY","realityHeight","clickY","clickX","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","currentState","newDirection","xElement","yElement","widthElement","heightElement","renderRows","visible","cells","renderCellHeaders","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","TreeUtil","initialData","sourceNode","targetNode","sourceInfo","sourceParent","sourceIndex","sourceFound","childrenArr","targetInfo","targetParent","targetIndex","tree","nodeId","parent","node","found","Header","isBuffer","HEADER_HEIGHT","maxHeaderRow","sum","_item","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","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","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","minHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","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","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","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","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","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","invalidOverflowDisplayValues","isOverflowElement","overflowX","overflowY","display","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","ignoreScrollbarX","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","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","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip$1","EMPTY_TEXT","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","loadingText","FinderBar","allCellHeaders","maxColIndex","maxRowIndex","inputWrapper","navContainer","searchText","current","EVirtTable","Empty","Loading","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","show","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[22,23,24,25]}
|