e-virt-table 1.3.11 → 1.3.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/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}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n // 防止闪烁\n if (this.autoRowHeight && this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex) === 0) {\n left = '-99999px';\n top = '-99999px';\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\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 };\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} 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 maxRowHeightMap = new Map<string, number>(); // 记录每行的最大渲染高度(按 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.maxRowHeightMap.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 }[]) {\n // 判断是否需要更新\n const isNeedUpdate = rowIndexHeightList.every(({ height, rowIndex }) => {\n const position = this.getPositionForRowIndex(rowIndex);\n return position.calculatedHeight === height;\n });\n if (isNeedUpdate) {\n return;\n }\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n row.calculatedHeight = height;\n\n // 如果开启了记录最大行高功能,更新最大高度记录(使用 rowKey)\n if (this.ctx.config.REMEMBER_MAX_ROW_HEIGHT) {\n const maxHeight = this.maxRowHeightMap.get(rowKey) || row.height;\n if (height > maxHeight) {\n this.maxRowHeightMap.set(rowKey, height);\n }\n }\n }\n });\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n this.ctx.emit('draw');\n }\n /**\n * 清除最大行高记录\n */\n clearMaxRowHeight() {\n this.maxRowHeightMap.clear();\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n this.ctx.emit('draw');\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 return {\n ...column,\n children,\n hide: 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 // 计算行高度和设置高度取最大\n let _height = Math.max(calculatedHeight, height);\n\n // 如果开启了记录最大行高功能\n if (this.ctx.config.REMEMBER_MAX_ROW_HEIGHT) {\n // 使用 rowKey 作为键,获取该行历史最大高度\n const maxHeight = this.maxRowHeightMap.get(rowKey) || height;\n // 如果当前计算高度大于历史最大高度,更新最大高度\n if (_height > maxHeight) {\n this.maxRowHeightMap.set(rowKey, _height);\n _height = _height;\n } else {\n // 使用历史最大高度\n _height = maxHeight;\n }\n }\n\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 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 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;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, 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 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 REMEMBER_MAX_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 (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.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) {\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 adjustPositioning = 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 return cell.getAutoHeight();\n });\n this.calculatedHeight = heights.length ? Math.max(...heights) : -1;\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() {\n const rows = this.ctx.body.renderRows;\n const hasAutoHeight = rows.some((row) => row.calculatedHeightCells.length > 0);\n // 如果没有计算格子,不更新\n if (!hasAutoHeight) {\n return;\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 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.focusCell?.fixed || 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('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 this.ctx.adjustPositioning = false;\r\n this.ctx.disableHoverIconClick = false;\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 });\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 this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n 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 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\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 }\n private show(cell: Cell) {\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 const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n if (this.ctx.disableHoverIconClick) {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('cellMousedown', () => {\r\n this.inputEl.focus({ preventScroll: true });\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 if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n this.startEdit(true);\r\n });\r\n // 重绘可能会导致cellClick事件不能触发,调整用按下cellMouseup按下延时赋值cellTarget\r\n this.ctx.on('cellMouseup', (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 if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.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 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.display = 'inline-block';\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 - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'inline-block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n this.inputEl.value = ''; // 清空\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n this.inputEl.focus({ preventScroll: true });\r\n }\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n }\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 // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\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 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('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.inputEl.style.display = 'inline-block';\r\n this.editorEl.style.zIndex = '-1';\r\n setTimeout(() => {\r\n this.inputEl.focus({ preventScroll: true });\r\n }, 0);\r\n this.ctx.emit('draw');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('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 position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\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) => {\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)) {\r\n return;\r\n }\r\n if (isNaN(colIndex)) {\r\n return;\r\n }\r\n if (!(element instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (element.offsetWidth === 0) {\r\n return;\r\n }\r\n const key = `${rowIndex}\\u200b_${colIndex}`;\r\n map.set(key, Math.round(element.offsetHeight));\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, { childList: true, subtree: true, attributes: true });\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') {\r\n e.preventDefault();\r\n this.navigatePrevious();\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\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 const { allCellHeaders } = this.ctx.header;\r\n await this.batchRun(\r\n allCellHeaders.length,\r\n 0,\r\n 10000,\r\n (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 5,\r\n );\r\n const { maxColIndex, maxRowIndex } = this.ctx;\r\n await this.batchRun(\r\n maxRowIndex,\r\n maxColIndex,\r\n 10000,\r\n (i, 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 5,\r\n );\r\n this.hideLoading();\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.updateCount();\r\n return;\r\n }\r\n\r\n this.showLoading();\r\n this.searchResults = this.searchData.filter((item) => item.text.includes(searchText));\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.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 this.updateCount();\r\n this.hideLoading();\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 async batchRun(\r\n maxRow: number,\r\n maxCol: number,\r\n batchSize: number,\r\n fn: (i: number, j: number) => void | Promise<void>,\r\n interval = 0,\r\n ) {\r\n for (let rowStart = 0; rowStart <= maxRow; rowStart += batchSize) {\r\n const rowEnd = Math.min(rowStart + batchSize - 1, maxRow);\r\n const tasks: Promise<void>[] = [];\r\n // 遍历当前批次的行\r\n for (let i = rowStart; i <= rowEnd; i++) {\r\n for (let j = 0; j <= maxCol; j++) {\r\n tasks.push(Promise.resolve(fn(i, j)));\r\n }\r\n }\r\n // 并行执行当前批次(更快)\r\n await Promise.all(tasks);\r\n // 批次之间休息,避免长时间阻塞\r\n if (interval > 0) {\r\n await new Promise((r) => setTimeout(r, interval));\r\n }\r\n }\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.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 }\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 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 private animationFrameId2: 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 draw(ignoreOverlayer = false) {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n }\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n // 更新自动高度放在第二帧,避免影响绘制性能\r\n if (this.animationFrameId2) {\r\n cancelAnimationFrame(this.animationFrameId2);\r\n }\r\n this.animationFrameId2 = requestAnimationFrame(() => {\r\n this.body.updateAutoHeight();\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\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 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 clearMaxRowHeight() {\r\n this.ctx.database.clearMaxRowHeight();\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\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","c","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","wait","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","parentKey","config","colspan","fixed","children","toLeaf","tmp","filterHiddenColumns","columns","col","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","parseDate","dateStr","directDate","patterns","pattern","groups","year","month","day","hour","minute","second","compareDates","aDate","bDate","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","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","_rowKey","readonly","checkboxKey","checkboxKeys","_a","rowIndexHeightList","maxHeight","recursiveData","_generateColumns","dataMap","_b","_d","_c","_f","_e","_h","_g","obj","_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","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","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","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","maxCol","batchSize","interval","rowStart","rowEnd","tasks","EVirtTable","Empty","Loading","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[22,23,24,25]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/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}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n // 防止闪烁\n if (this.autoRowHeight && this.ctx.database.getOverlayerAutoHeight(this.rowIndex, this.colIndex) === 0) {\n left = '-99999px';\n top = '-99999px';\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\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 };\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} 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 maxRowHeightMap = new Map<string, number>(); // 记录每行的最大渲染高度(按 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.maxRowHeightMap.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 }[]) {\n // 判断是否需要更新\n const isNeedUpdate = rowIndexHeightList.every(({ height, rowIndex }) => {\n const position = this.getPositionForRowIndex(rowIndex);\n return position.calculatedHeight === height;\n });\n if (isNeedUpdate) {\n return;\n }\n rowIndexHeightList.forEach(({ rowIndex, height }) => {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey) {\n const row = this.rowKeyMap.get(rowKey);\n row.calculatedHeight = height;\n\n // 如果开启了记录最大行高功能,更新最大高度记录(使用 rowKey)\n if (this.ctx.config.REMEMBER_MAX_ROW_HEIGHT) {\n const maxHeight = this.maxRowHeightMap.get(rowKey) || row.height;\n if (height > maxHeight) {\n this.maxRowHeightMap.set(rowKey, height);\n }\n }\n }\n });\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n this.ctx.emit('draw');\n }\n /**\n * 清除最大行高记录\n */\n clearMaxRowHeight() {\n this.maxRowHeightMap.clear();\n this.clearBufferData(); // 清除缓存数据\n this.getData(); // 重新获取数据\n this.ctx.emit('draw');\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 return {\n ...column,\n children,\n hide: 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 // 计算行高度和设置高度取最大\n let _height = Math.max(calculatedHeight, height);\n\n // 如果开启了记录最大行高功能\n if (this.ctx.config.REMEMBER_MAX_ROW_HEIGHT) {\n // 使用 rowKey 作为键,获取该行历史最大高度\n const maxHeight = this.maxRowHeightMap.get(rowKey) || height;\n // 如果当前计算高度大于历史最大高度,更新最大高度\n if (_height > maxHeight) {\n this.maxRowHeightMap.set(rowKey, _height);\n _height = _height;\n } else {\n // 使用历史最大高度\n _height = maxHeight;\n }\n }\n\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 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 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;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, 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 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 REMEMBER_MAX_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 (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.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) {\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 adjustPositioning = 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 return cell.getAutoHeight();\n });\n this.calculatedHeight = heights.length ? Math.max(...heights) : -1;\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() {\n const rows = this.ctx.body.renderRows;\n const hasAutoHeight = rows.some((row) => row.calculatedHeightCells.length > 0);\n // 如果没有计算格子,不更新\n if (!hasAutoHeight) {\n return;\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 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.focusCell?.fixed || 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('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 this.ctx.adjustPositioning = false;\r\n this.ctx.disableHoverIconClick = false;\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 });\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 this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n 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 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\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 }\n private show(cell: Cell) {\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 const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n if (this.ctx.disableHoverIconClick) {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('cellMousedown', () => {\r\n this.inputEl.focus({ preventScroll: true });\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 if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n this.startEdit(true);\r\n });\r\n // 重绘可能会导致cellClick事件不能触发,调整用按下cellMouseup按下延时赋值cellTarget\r\n this.ctx.on('cellMouseup', (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 if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.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 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.display = 'inline-block';\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 - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'inline-block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n this.inputEl.value = ''; // 清空\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n this.inputEl.focus({ preventScroll: true });\r\n }\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n }\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 // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\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 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('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.inputEl.style.display = 'inline-block';\r\n this.editorEl.style.zIndex = '-1';\r\n setTimeout(() => {\r\n this.inputEl.focus({ preventScroll: true });\r\n }, 0);\r\n this.ctx.emit('draw');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('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 position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\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) => {\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)) {\r\n return;\r\n }\r\n if (isNaN(colIndex)) {\r\n return;\r\n }\r\n if (!(element instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (element.offsetWidth === 0) {\r\n return;\r\n }\r\n const key = `${rowIndex}\\u200b_${colIndex}`;\r\n map.set(key, Math.round(element.offsetHeight));\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, { childList: true, subtree: true, attributes: true });\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.code === 'Enter')) {\r\n e.preventDefault();\r\n this.navigatePrevious();\r\n return;\r\n }\r\n if (e.code === 'ArrowDown' || e.code === '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 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 private animationFrameId2: 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 draw(ignoreOverlayer = false) {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n }\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n // 更新自动高度放在第二帧,避免影响绘制性能\r\n if (this.animationFrameId2) {\r\n cancelAnimationFrame(this.animationFrameId2);\r\n }\r\n this.animationFrameId2 = requestAnimationFrame(() => {\r\n this.body.updateAutoHeight();\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\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 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 clearMaxRowHeight() {\r\n this.ctx.database.clearMaxRowHeight();\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\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","c","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","wait","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","parentKey","config","colspan","fixed","children","toLeaf","tmp","filterHiddenColumns","columns","col","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","parseDate","dateStr","directDate","patterns","pattern","groups","year","month","day","hour","minute","second","compareDates","aDate","bDate","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","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","_rowKey","readonly","checkboxKey","checkboxKeys","_a","rowIndexHeightList","maxHeight","recursiveData","_generateColumns","dataMap","_b","_d","_c","_f","_e","_h","_g","obj","_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","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","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","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","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[22,23,24,25]}