e-virt-table 1.2.25 → 1.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +548 -528
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/Database.js +1 -0
- package/dist/lib/Database.js.map +1 -1
- package/dist/lib/EventTable.js +6 -1
- package/dist/lib/EventTable.js.map +1 -1
- package/package.json +1 -1
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.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/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (!rule.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): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\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 (pattern.source.includes('YYYY-MM-DD') || pattern.source.includes('YYYY/MM/DD') || pattern.source.includes('YYYY.MM.DD')) {\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 (pattern.source.includes('DD-MM-YYYY') || pattern.source.includes('DD/MM/YYYY') || pattern.source.includes('DD.MM.YYYY')) {\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 (pattern.source.includes('MM-DD-YYYY') || pattern.source.includes('MM/DD/YYYY') || pattern.source.includes('MM.DD.YYYY')) {\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\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};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n 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 ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.selectorCellValueType =\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.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.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 if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (!(['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' } =\n 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 = shortTop + Math.min(this.visibleHeight / 2, Math.max(8, TREE_ICON_SIZE / 2));\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 } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n 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 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 return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 树连线(需在文本之前绘制,避免覆盖图标但不遮挡文本)\n this.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 } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(\n this.displayText,\n this.drawTextWidth,\n CELL_PADDING,\n BODY_FONT,\n );\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, this.drawTextWidth, this.drawTextHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (this.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} from './types';\nimport { generateShortUUID, toLeaf, compareDates } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n 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.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n // 判断是否有选择和树形结构\n const _columns = this.getColumns();\n const leafColumns = toLeaf(_columns);\n this.ctx.hasSelection = leafColumns.some((item) => item.type === 'selection');\n this.ctx.hasTree = leafColumns.some((item) => item.type === 'tree');\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n const { ROW_KEY } = this.ctx.config;\n // 清除选中和展开状态,如果没有ROW_KEY清除\n if (!ROW_KEY) {\n // 无行主键时直接清除所有状态\n this.selectionMap.clear();\n this.expandMap.clear();\n } else {\n // 有行主键,根据上下文条件清除部分状态\n if (!this.ctx.hasSelection) {\n this.selectionMap.clear();\n }\n if (!this.ctx.hasTree) {\n this.expandMap.clear();\n }\n }\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n const siblingsLength = dataList.length;\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n 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 * 获取所有行数据(平铺)\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 return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n this.setLoading(true);\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 } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n // 说明需要排序\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 this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @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.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n }\n } else if (mode === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n if (treeState.checked && !treeState.indeterminate) {\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\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.setRowSelection(childKey, true, false);\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.setRowSelection(childKey, false, 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 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 };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n\n /**\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}\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 EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n 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};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n measureTextWidth(text: string, font: string) {\n this.ctx.font = font;\n return this.ctx.measureText(text).width;\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 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 } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n // 如果宽度小于省略号宽度,则不进行省略,直接返回空字符串\n if (width <= ellipsesWidth + padding * 2) {\n return {\n _text: '',\n ellipsis: true,\n };\n }\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\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 表示自适应100% */\n WIDTH = 0;\n /** 最小可调整宽度 */\n RESIZE_MIN_WIDTH = 40;\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 /** 最大高度,为 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 /** 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 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 CHECKBOX_SIZE = 20;\n /** 选择框禁用图标 */\n CHECKBOX_DISABLED_SVG = '';\n /** 选择框选中图标 */\n CHECKBOX_CHECK_SVG = '';\n /** 选择框未中图标 */\n CHECKBOX_UNCHECK_SVG = '';\n /** 选择框半选中图标 */\n CHECKBOX_INDETERMINATE_SVG = '';\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 /** 树形缩进宽度 */\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_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 RESIZE_ROW_MIN_HEIGHT = 36;\n /** 列宽最小值 */\n RESIZE_COLUMN_MIN_WIDTH = 40;\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 /** 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\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG'\r\n | '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 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\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n 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}\r\n","import type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\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 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 drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n drawCellBgColor = '';\n drawTextColor = '';\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.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 }\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 } =\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 }\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.recalculateTextPosition();\n this.drawText();\n this.drawSelector();\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 recalculateTextPosition() {\n // 对于 selection 类型的列,文本在复选框右侧显示\n let textX = this.drawX;\n let textWidth = this.width;\n if (['selection', 'index-selection', 'selection-tree', 'tree-selection'].includes(this.type)) {\n const { CHECKBOX_SIZE } = this.ctx.config;\n if (this.align === 'left' || this.align === 'right') {\n textX = this.drawX + CHECKBOX_SIZE + 4;\n textWidth = this.width - textX + this.drawX;\n } else {\n // 复选框居中位置\n const checkboxCenterX = this.drawX + (this.width - CHECKBOX_SIZE) / 2;\n textX = checkboxCenterX + CHECKBOX_SIZE + 1; // 复选框右侧,最小间距\n // 确保文本有足够的显示空间\n textWidth = this.width - textX + this.drawX;\n }\n }\n\n // 如果有排序图标,调整文本位置\n if (this.column.sortBy) {\n const iconSize = 16;\n const iconMargin = 4;\n\n if (this.align === 'right') {\n // 居右时,文本需要为图标留出空间\n textWidth = this.width - this.ctx.config.CELL_PADDING - iconSize - iconMargin;\n textX = this.drawX + this.ctx.config.CELL_PADDING;\n } else if (this.align === 'center') {\n // 居中时,文本宽度需要考虑图标\n const textWidthNeeded = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n const totalWidth = textWidthNeeded + iconSize + iconMargin;\n if (totalWidth > this.width - this.ctx.config.CELL_PADDING * 2) {\n textWidth = this.width - this.ctx.config.CELL_PADDING * 2 - iconSize - iconMargin;\n }\n }\n }\n this.drawTextX = textX;\n this.drawTextWidth = textWidth;\n }\n private drawText() {\n const {\n paint,\n config: { HEADER_FONT, CELL_PADDING },\n } = this.ctx;\n this.ellipsis = paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: HEADER_FONT,\n padding: CELL_PADDING,\n color: this.drawTextColor,\n align: this.align,\n verticalAlign: this.verticalAlign,\n },\n );\n }\n private drawSelector() {\n // 选择区背景颜色\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr } = this.ctx.selector;\n const [minX, maxX] = xArr;\n if (this.colIndex >= minX && this.colIndex <= 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\n const { CELL_PADDING = 0 } = this.ctx.config;\n const iconSize = 16;\n const iconMargin = 4;\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 // 计算图标位置\n let iconX = 0;\n let iconY = this.drawY + (this.height - iconSize) / 2;\n\n if (this.align === 'left') {\n // 居左:先绘制文字,图标紧跟文字\n const textWidth = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n iconX = this.drawX + CELL_PADDING + textWidth + iconMargin;\n } else if (this.align === 'center') {\n // 居中:先居中绘制文字,然后图标紧跟文字\n const textWidth = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n const textCenterX = this.drawX + this.width / 2;\n const textStartX = textCenterX - textWidth / 2;\n iconX = textStartX + textWidth + iconMargin;\n } else if (this.align === 'right') {\n // 居右:先绘制图标靠右,然后文字根据图标绘制后的位置紧贴在图标的左侧\n iconX = this.drawX + this.width - CELL_PADDING - iconSize;\n }\n\n // 保存图标信息\n this.drawSortImageX = iconX;\n this.drawSortImageY = iconY;\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 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(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell, e);\n this.sortClick(cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n this.selectionClick(cell, e);\n this.treeClick(cell, e);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.hoverCellHeader = undefined; // 清除头部hover\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell, 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 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.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n hasSelection = false; // 是否有选中\r\n hasTree = false; // 是否有树形结构\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history, checkReadonly);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true, checkReadonly);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history, checkReadonly);\r\n } else {\r\n this.database.batchSetItemValue(_list, history, checkReadonly);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 选择器值类型\r\n if (cell.selectorCellValueType === 'displayText') {\r\n cellsData.push(cell.displayText);\r\n } else {\r\n // 默认value\r\n cellsData.push(cell.getValue());\r\n }\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\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 }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 如果是选择器,不进入编辑模式\r\n if (this.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.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\nimport type CellHeader from './CellHeader';\nimport type Context from './Context';\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\nexport default class Overlayer {\n ctx: Context;\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n draw() {\n const overlayer = this.getContainer();\n this.ctx.emit('overlayerChange', overlayer);\n }\n destroy() {\n this.ctx.emit('overlayerChange', {\n style: {},\n views: [],\n });\n }\n private getContainer(): OverlayerContainer {\n const header = this.getHeader();\n const body = this.getBody();\n const footer = this.getFooter();\n let views: OverlayerWrapper[] = [];\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\n if (!FOOTER_FIXED) {\n views = [header, body];\n } else {\n if (FOOTER_POSITION === 'top') {\n views = [header, footer, body];\n } else {\n views = [header, body, footer];\n }\n }\n return {\n views,\n };\n }\n private getHeader() {\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\n let centerCells: CellHeader[] = [];\n let leftCells: CellHeader[] = [];\n let rightCells: CellHeader[] = [];\n renderCellHeaders.forEach((cellHeader) => {\n if (cellHeader.render) {\n if (cellHeader.fixed === 'left') {\n leftCells.push(cellHeader);\n } else if (cellHeader.fixed === 'right') {\n rightCells.push(cellHeader);\n } else {\n centerCells.push(cellHeader);\n }\n }\n });\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${0}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${fixedLeftWidth}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const header: OverlayerWrapper = {\n type: 'header',\n class: `${CSS_PREFIX}-overlayer-header`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return header;\n }\n private getBody() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n let renderRows = this.ctx.body.renderRows;\n // 合计如果不是固定在底部,就加入到渲染行中\n if (!this.ctx.config.FOOTER_FIXED) {\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\n }\n renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer') {\n cell.render = cell.renderFooter;\n }\n if (cell.render) {\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.body;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const body: OverlayerWrapper = {\n type: 'body',\n class: `${CSS_PREFIX}-overlayer-body`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return body;\n }\n private getFooter() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer' && cell.renderFooter) {\n // 把转renderFooter成render统一出口\n cell.render = cell.renderFooter;\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.footer;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n right: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const footer: OverlayerWrapper = {\n type: 'footer',\n class: `${CSS_PREFIX}-overlayer-footer`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return footer;\n }\n}\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\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 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.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(loading: boolean) {\r\n this.ctx.database.setLoading(loading);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(\r\n rowKey: string,\r\n key: string,\r\n value: any,\r\n history = true,\r\n reDraw = true,\r\n isEditor = false\r\n ) {\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 } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n clearSort() {\r\n this.ctx.database.clearSort();\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","c","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","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","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","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","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","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","BODY_FONT","PLACEHOLDER_COLOR","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","_a","newColumn","recursiveData","_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","reDraw","isEditor","changeKey","originalValue","selection","mode","childKey","parentKey","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","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","font","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","svgSortable","svgSortAsc","svgSortDesc","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","textX","HEADER_FONT","iconSize","iconMargin","sortState","EventTable","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","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","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","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","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","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","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.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/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (!rule.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): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\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 (pattern.source.includes('YYYY-MM-DD') || pattern.source.includes('YYYY/MM/DD') || pattern.source.includes('YYYY.MM.DD')) {\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 (pattern.source.includes('DD-MM-YYYY') || pattern.source.includes('DD/MM/YYYY') || pattern.source.includes('DD.MM.YYYY')) {\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 (pattern.source.includes('MM-DD-YYYY') || pattern.source.includes('MM/DD/YYYY') || pattern.source.includes('MM.DD.YYYY')) {\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\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};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n 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 ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.selectorCellValueType =\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.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.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 if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (!(['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' } =\n 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 = shortTop + Math.min(this.visibleHeight / 2, Math.max(8, TREE_ICON_SIZE / 2));\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 } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n 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 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 return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 树连线(需在文本之前绘制,避免覆盖图标但不遮挡文本)\n this.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 } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(\n this.displayText,\n this.drawTextWidth,\n CELL_PADDING,\n BODY_FONT,\n );\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, this.drawTextWidth, this.drawTextHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (this.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} from './types';\nimport { generateShortUUID, toLeaf, compareDates } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n 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.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n // 判断是否有选择和树形结构\n const _columns = this.getColumns();\n const leafColumns = toLeaf(_columns);\n this.ctx.hasSelection = leafColumns.some((item) => item.type === 'selection');\n this.ctx.hasTree = leafColumns.some((item) => item.type === 'tree');\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n const { ROW_KEY } = this.ctx.config;\n // 清除选中和展开状态,如果没有ROW_KEY清除\n if (!ROW_KEY) {\n // 无行主键时直接清除所有状态\n this.selectionMap.clear();\n this.expandMap.clear();\n } else {\n // 有行主键,根据上下文条件清除部分状态\n if (!this.ctx.hasSelection) {\n this.selectionMap.clear();\n }\n if (!this.ctx.hasTree) {\n this.expandMap.clear();\n }\n }\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n const siblingsLength = dataList.length;\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n 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 * 获取所有行数据(平铺)\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n this.setLoading(true);\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 } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n // 说明需要排序\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 this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @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.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n }\n } else if (mode === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n if (treeState.checked && !treeState.indeterminate) {\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\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.setRowSelection(childKey, true, false);\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.setRowSelection(childKey, false, 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 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 };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n\n /**\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}\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 EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n 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};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n measureTextWidth(text: string, font: string) {\n this.ctx.font = font;\n return this.ctx.measureText(text).width;\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 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 } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n // 如果宽度小于省略号宽度,则不进行省略,直接返回空字符串\n if (width <= ellipsesWidth + padding * 2) {\n return {\n _text: '',\n ellipsis: true,\n };\n }\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\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 表示自适应100% */\n WIDTH = 0;\n /** 最小可调整宽度 */\n RESIZE_MIN_WIDTH = 40;\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 /** 最大高度,为 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 /** 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 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 CHECKBOX_SIZE = 20;\n /** 选择框禁用图标 */\n CHECKBOX_DISABLED_SVG = '';\n /** 选择框选中图标 */\n CHECKBOX_CHECK_SVG = '';\n /** 选择框未中图标 */\n CHECKBOX_UNCHECK_SVG = '';\n /** 选择框半选中图标 */\n CHECKBOX_INDETERMINATE_SVG = '';\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 /** 树形缩进宽度 */\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_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 RESIZE_ROW_MIN_HEIGHT = 36;\n /** 列宽最小值 */\n RESIZE_COLUMN_MIN_WIDTH = 40;\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 /** 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\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG'\r\n | '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 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\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n 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}\r\n","import type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\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 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 drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n drawCellBgColor = '';\n drawTextColor = '';\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.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 }\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 } =\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 }\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.recalculateTextPosition();\n this.drawText();\n this.drawSelector();\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 recalculateTextPosition() {\n // 对于 selection 类型的列,文本在复选框右侧显示\n let textX = this.drawX;\n let textWidth = this.width;\n if (['selection', 'index-selection', 'selection-tree', 'tree-selection'].includes(this.type)) {\n const { CHECKBOX_SIZE } = this.ctx.config;\n if (this.align === 'left' || this.align === 'right') {\n textX = this.drawX + CHECKBOX_SIZE + 4;\n textWidth = this.width - textX + this.drawX;\n } else {\n // 复选框居中位置\n const checkboxCenterX = this.drawX + (this.width - CHECKBOX_SIZE) / 2;\n textX = checkboxCenterX + CHECKBOX_SIZE + 1; // 复选框右侧,最小间距\n // 确保文本有足够的显示空间\n textWidth = this.width - textX + this.drawX;\n }\n }\n\n // 如果有排序图标,调整文本位置\n if (this.column.sortBy) {\n const iconSize = 16;\n const iconMargin = 4;\n\n if (this.align === 'right') {\n // 居右时,文本需要为图标留出空间\n textWidth = this.width - this.ctx.config.CELL_PADDING - iconSize - iconMargin;\n textX = this.drawX + this.ctx.config.CELL_PADDING;\n } else if (this.align === 'center') {\n // 居中时,文本宽度需要考虑图标\n const textWidthNeeded = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n const totalWidth = textWidthNeeded + iconSize + iconMargin;\n if (totalWidth > this.width - this.ctx.config.CELL_PADDING * 2) {\n textWidth = this.width - this.ctx.config.CELL_PADDING * 2 - iconSize - iconMargin;\n }\n }\n }\n this.drawTextX = textX;\n this.drawTextWidth = textWidth;\n }\n private drawText() {\n const {\n paint,\n config: { HEADER_FONT, CELL_PADDING },\n } = this.ctx;\n this.ellipsis = paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: HEADER_FONT,\n padding: CELL_PADDING,\n color: this.drawTextColor,\n align: this.align,\n verticalAlign: this.verticalAlign,\n },\n );\n }\n private drawSelector() {\n // 选择区背景颜色\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr } = this.ctx.selector;\n const [minX, maxX] = xArr;\n if (this.colIndex >= minX && this.colIndex <= 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\n const { CELL_PADDING = 0 } = this.ctx.config;\n const iconSize = 16;\n const iconMargin = 4;\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 // 计算图标位置\n let iconX = 0;\n let iconY = this.drawY + (this.height - iconSize) / 2;\n\n if (this.align === 'left') {\n // 居左:先绘制文字,图标紧跟文字\n const textWidth = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n iconX = this.drawX + CELL_PADDING + textWidth + iconMargin;\n } else if (this.align === 'center') {\n // 居中:先居中绘制文字,然后图标紧跟文字\n const textWidth = this.ctx.paint.measureTextWidth(this.displayText, this.ctx.config.HEADER_FONT);\n const textCenterX = this.drawX + this.width / 2;\n const textStartX = textCenterX - textWidth / 2;\n iconX = textStartX + textWidth + iconMargin;\n } else if (this.align === 'right') {\n // 居右:先绘制图标靠右,然后文字根据图标绘制后的位置紧贴在图标的左侧\n iconX = this.drawX + this.width - CELL_PADDING - iconSize;\n }\n\n // 保存图标信息\n this.drawSortImageX = iconX;\n this.drawSortImageY = iconY;\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 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(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell, 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('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell, 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.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n hasSelection = false; // 是否有选中\r\n hasTree = false; // 是否有树形结构\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history, checkReadonly);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true, checkReadonly);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history, checkReadonly);\r\n } else {\r\n this.database.batchSetItemValue(_list, history, checkReadonly);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 选择器值类型\r\n if (cell.selectorCellValueType === 'displayText') {\r\n cellsData.push(cell.displayText);\r\n } else {\r\n // 默认value\r\n cellsData.push(cell.getValue());\r\n }\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\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 }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 如果是选择器,不进入编辑模式\r\n if (this.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.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\nimport type CellHeader from './CellHeader';\nimport type Context from './Context';\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\nexport default class Overlayer {\n ctx: Context;\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n draw() {\n const overlayer = this.getContainer();\n this.ctx.emit('overlayerChange', overlayer);\n }\n destroy() {\n this.ctx.emit('overlayerChange', {\n style: {},\n views: [],\n });\n }\n private getContainer(): OverlayerContainer {\n const header = this.getHeader();\n const body = this.getBody();\n const footer = this.getFooter();\n let views: OverlayerWrapper[] = [];\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\n if (!FOOTER_FIXED) {\n views = [header, body];\n } else {\n if (FOOTER_POSITION === 'top') {\n views = [header, footer, body];\n } else {\n views = [header, body, footer];\n }\n }\n return {\n views,\n };\n }\n private getHeader() {\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\n let centerCells: CellHeader[] = [];\n let leftCells: CellHeader[] = [];\n let rightCells: CellHeader[] = [];\n renderCellHeaders.forEach((cellHeader) => {\n if (cellHeader.render) {\n if (cellHeader.fixed === 'left') {\n leftCells.push(cellHeader);\n } else if (cellHeader.fixed === 'right') {\n rightCells.push(cellHeader);\n } else {\n centerCells.push(cellHeader);\n }\n }\n });\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${0}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${fixedLeftWidth}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const header: OverlayerWrapper = {\n type: 'header',\n class: `${CSS_PREFIX}-overlayer-header`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return header;\n }\n private getBody() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n let renderRows = this.ctx.body.renderRows;\n // 合计如果不是固定在底部,就加入到渲染行中\n if (!this.ctx.config.FOOTER_FIXED) {\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\n }\n renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer') {\n cell.render = cell.renderFooter;\n }\n if (cell.render) {\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.body;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const body: OverlayerWrapper = {\n type: 'body',\n class: `${CSS_PREFIX}-overlayer-body`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return body;\n }\n private getFooter() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer' && cell.renderFooter) {\n // 把转renderFooter成render统一出口\n cell.render = cell.renderFooter;\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.footer;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n right: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const footer: OverlayerWrapper = {\n type: 'footer',\n class: `${CSS_PREFIX}-overlayer-footer`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return footer;\n }\n}\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\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 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.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(loading: boolean) {\r\n this.ctx.database.setLoading(loading);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(\r\n rowKey: string,\r\n key: string,\r\n value: any,\r\n history = true,\r\n reDraw = true,\r\n isEditor = false\r\n ) {\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 } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n clearSort() {\r\n this.ctx.database.clearSort();\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","c","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","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","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","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","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","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","BODY_FONT","PLACEHOLDER_COLOR","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","siblingsLength","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","_a","recursiveData","newColumn","_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","reDraw","isEditor","changeKey","originalValue","selection","mode","childKey","parentKey","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","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","font","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","svgSortable","svgSortAsc","svgSortDesc","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","textX","HEADER_FONT","iconSize","iconMargin","sortState","EventTable","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","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","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","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","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","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","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}
|