e-virt-table 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../node_modules/async-validator/dist-web/index.js","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nfunction _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\n/* eslint no-console:0 */\nvar formatRegExp = /%[sdj%]/g;\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {\n warning = function warning(type, errors) {\n if (typeof console !== 'undefined' && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === 'undefined') {\n if (errors.every(function (e) {\n return typeof e === 'string';\n })) {\n console.warn(type, errors);\n }\n }\n };\n}\n\nfunction convertFieldsError(errors) {\n if (!errors || !errors.length) return null;\n var fields = {};\n errors.forEach(function (error) {\n var field = error.field;\n fields[field] = fields[field] || [];\n fields[field].push(error);\n });\n return fields;\n}\nfunction format(template) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var i = 0;\n var len = args.length;\n\n if (typeof template === 'function') {\n return template.apply(null, args);\n }\n\n if (typeof template === 'string') {\n var str = template.replace(formatRegExp, function (x) {\n if (x === '%%') {\n return '%';\n }\n\n if (i >= len) {\n return x;\n }\n\n switch (x) {\n case '%s':\n return String(args[i++]);\n\n case '%d':\n return Number(args[i++]);\n\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n\n break;\n\n default:\n return x;\n }\n });\n return str;\n }\n\n return template;\n}\n\nfunction isNativeStringType(type) {\n return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern';\n}\n\nfunction isEmptyValue(value, type) {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (type === 'array' && Array.isArray(value) && !value.length) {\n return true;\n }\n\n if (isNativeStringType(type) && typeof value === 'string' && !value) {\n return true;\n }\n\n return false;\n}\n\nfunction asyncParallelArray(arr, func, callback) {\n var results = [];\n var total = 0;\n var arrLength = arr.length;\n\n function count(errors) {\n results.push.apply(results, errors || []);\n total++;\n\n if (total === arrLength) {\n callback(results);\n }\n }\n\n arr.forEach(function (a) {\n func(a, count);\n });\n}\n\nfunction asyncSerialArray(arr, func, callback) {\n var index = 0;\n var arrLength = arr.length;\n\n function next(errors) {\n if (errors && errors.length) {\n callback(errors);\n return;\n }\n\n var original = index;\n index = index + 1;\n\n if (original < arrLength) {\n func(arr[original], next);\n } else {\n callback([]);\n }\n }\n\n next([]);\n}\n\nfunction flattenObjArr(objArr) {\n var ret = [];\n Object.keys(objArr).forEach(function (k) {\n ret.push.apply(ret, objArr[k] || []);\n });\n return ret;\n}\n\nvar AsyncValidationError = /*#__PURE__*/function (_Error) {\n _inheritsLoose(AsyncValidationError, _Error);\n\n function AsyncValidationError(errors, fields) {\n var _this;\n\n _this = _Error.call(this, 'Async Validation Error') || this;\n _this.errors = errors;\n _this.fields = fields;\n return _this;\n }\n\n return AsyncValidationError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nfunction asyncMap(objArr, option, func, callback, source) {\n if (option.first) {\n var _pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n callback(errors);\n return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);\n };\n\n var flattenArr = flattenObjArr(objArr);\n asyncSerialArray(flattenArr, func, next);\n });\n\n _pending[\"catch\"](function (e) {\n return e;\n });\n\n return _pending;\n }\n\n var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];\n var objArrKeys = Object.keys(objArr);\n var objArrLength = objArrKeys.length;\n var total = 0;\n var results = [];\n var pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n results.push.apply(results, errors);\n total++;\n\n if (total === objArrLength) {\n callback(results);\n return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);\n }\n };\n\n if (!objArrKeys.length) {\n callback(results);\n resolve(source);\n }\n\n objArrKeys.forEach(function (key) {\n var arr = objArr[key];\n\n if (firstFields.indexOf(key) !== -1) {\n asyncSerialArray(arr, func, next);\n } else {\n asyncParallelArray(arr, func, next);\n }\n });\n });\n pending[\"catch\"](function (e) {\n return e;\n });\n return pending;\n}\n\nfunction isErrorObj(obj) {\n return !!(obj && obj.message !== undefined);\n}\n\nfunction getValue(value, path) {\n var v = value;\n\n for (var i = 0; i < path.length; i++) {\n if (v == undefined) {\n return v;\n }\n\n v = v[path[i]];\n }\n\n return v;\n}\n\nfunction complementError(rule, source) {\n return function (oe) {\n var fieldValue;\n\n if (rule.fullFields) {\n fieldValue = getValue(source, rule.fullFields);\n } else {\n fieldValue = source[oe.field || rule.fullField];\n }\n\n if (isErrorObj(oe)) {\n oe.field = oe.field || rule.fullField;\n oe.fieldValue = fieldValue;\n return oe;\n }\n\n return {\n message: typeof oe === 'function' ? oe() : oe,\n fieldValue: fieldValue,\n field: oe.field || rule.fullField\n };\n };\n}\nfunction deepMerge(target, source) {\n if (source) {\n for (var s in source) {\n if (source.hasOwnProperty(s)) {\n var value = source[s];\n\n if (typeof value === 'object' && typeof target[s] === 'object') {\n target[s] = _extends({}, target[s], value);\n } else {\n target[s] = value;\n }\n }\n }\n }\n\n return target;\n}\n\nvar required$1 = function required(rule, value, source, errors, options, type) {\n if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n errors.push(format(options.messages.required, rule.fullField));\n }\n};\n\n/**\n * Rule for validating whitespace.\n *\n * @param rule The validation rule.\n * @param value The value of the field on the source object.\n * @param source The source object being validated.\n * @param errors An array of errors that this rule may add\n * validation errors to.\n * @param options The validation options.\n * @param options.messages The validation messages.\n */\n\nvar whitespace = function whitespace(rule, value, source, errors, options) {\n if (/^\\s+$/.test(value) || value === '') {\n errors.push(format(options.messages.whitespace, rule.fullField));\n }\n};\n\n// https://github.com/kevva/url-regex/blob/master/index.js\nvar urlReg;\nvar getUrlRegex = (function () {\n if (urlReg) {\n return urlReg;\n }\n\n var word = '[a-fA-F\\\\d:]';\n\n var b = function b(options) {\n return options && options.includeBoundaries ? \"(?:(?<=\\\\s|^)(?=\" + word + \")|(?<=\" + word + \")(?=\\\\s|$))\" : '';\n };\n\n var v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n var v6seg = '[a-fA-F\\\\d]{1,4}';\n var v6 = (\"\\n(?:\\n(?:\" + v6seg + \":){7}(?:\" + v6seg + \"|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\\n(?:\" + v6seg + \":){6}(?:\" + v4 + \"|:\" + v6seg + \"|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\\n(?:\" + v6seg + \":){5}(?::\" + v4 + \"|(?::\" + v6seg + \"){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\\n(?:\" + v6seg + \":){4}(?:(?::\" + v6seg + \"){0,1}:\" + v4 + \"|(?::\" + v6seg + \"){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\\n(?:\" + v6seg + \":){3}(?:(?::\" + v6seg + \"){0,2}:\" + v4 + \"|(?::\" + v6seg + \"){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){2}(?:(?::\" + v6seg + \"){0,3}:\" + v4 + \"|(?::\" + v6seg + \"){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){1}(?:(?::\" + v6seg + \"){0,4}:\" + v4 + \"|(?::\" + v6seg + \"){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\\n(?::(?:(?::\" + v6seg + \"){0,5}:\" + v4 + \"|(?::\" + v6seg + \"){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\\n\").replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim(); // Pre-compile only the exact regexes because adding a global flag make regexes stateful\n\n var v46Exact = new RegExp(\"(?:^\" + v4 + \"$)|(?:^\" + v6 + \"$)\");\n var v4exact = new RegExp(\"^\" + v4 + \"$\");\n var v6exact = new RegExp(\"^\" + v6 + \"$\");\n\n var ip = function ip(options) {\n return options && options.exact ? v46Exact : new RegExp(\"(?:\" + b(options) + v4 + b(options) + \")|(?:\" + b(options) + v6 + b(options) + \")\", 'g');\n };\n\n ip.v4 = function (options) {\n return options && options.exact ? v4exact : new RegExp(\"\" + b(options) + v4 + b(options), 'g');\n };\n\n ip.v6 = function (options) {\n return options && options.exact ? v6exact : new RegExp(\"\" + b(options) + v6 + b(options), 'g');\n };\n\n var protocol = \"(?:(?:[a-z]+:)?//)\";\n var auth = '(?:\\\\S+(?::\\\\S*)?@)?';\n var ipv4 = ip.v4().source;\n var ipv6 = ip.v6().source;\n var host = \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9][-_]*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\";\n var domain = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\";\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n var port = '(?::\\\\d{2,5})?';\n var path = '(?:[/?#][^\\\\s\"]*)?';\n var regex = \"(?:\" + protocol + \"|www\\\\.)\" + auth + \"(?:localhost|\" + ipv4 + \"|\" + ipv6 + \"|\" + host + domain + tld + \")\" + port + path;\n urlReg = new RegExp(\"(?:^\" + regex + \"$)\", 'i');\n return urlReg;\n});\n\n/* eslint max-len:0 */\n\nvar pattern$2 = {\n // http://emailregex.com/\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+\\.)+[a-zA-Z\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}))$/,\n // url: new RegExp(\n // '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$',\n // 'i',\n // ),\n hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n};\nvar types = {\n integer: function integer(value) {\n return types.number(value) && parseInt(value, 10) === value;\n },\n \"float\": function float(value) {\n return types.number(value) && !types.integer(value);\n },\n array: function array(value) {\n return Array.isArray(value);\n },\n regexp: function regexp(value) {\n if (value instanceof RegExp) {\n return true;\n }\n\n try {\n return !!new RegExp(value);\n } catch (e) {\n return false;\n }\n },\n date: function date(value) {\n return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime());\n },\n number: function number(value) {\n if (isNaN(value)) {\n return false;\n }\n\n return typeof value === 'number';\n },\n object: function object(value) {\n return typeof value === 'object' && !types.array(value);\n },\n method: function method(value) {\n return typeof value === 'function';\n },\n email: function email(value) {\n return typeof value === 'string' && value.length <= 320 && !!value.match(pattern$2.email);\n },\n url: function url(value) {\n return typeof value === 'string' && value.length <= 2048 && !!value.match(getUrlRegex());\n },\n hex: function hex(value) {\n return typeof value === 'string' && !!value.match(pattern$2.hex);\n }\n};\n\nvar type$1 = function type(rule, value, source, errors, options) {\n if (rule.required && value === undefined) {\n required$1(rule, value, source, errors, options);\n return;\n }\n\n var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n var ruleType = rule.type;\n\n if (custom.indexOf(ruleType) > -1) {\n if (!types[ruleType](value)) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n } // straight typeof check\n\n } else if (ruleType && typeof value !== rule.type) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n }\n};\n\nvar range = function range(rule, value, source, errors, options) {\n var len = typeof rule.len === 'number';\n var min = typeof rule.min === 'number';\n var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)\n\n var spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var val = value;\n var key = null;\n var num = typeof value === 'number';\n var str = typeof value === 'string';\n var arr = Array.isArray(value);\n\n if (num) {\n key = 'number';\n } else if (str) {\n key = 'string';\n } else if (arr) {\n key = 'array';\n } // if the value is not of a supported type for range validation\n // the validation rule rule should use the\n // type property to also test for a particular type\n\n\n if (!key) {\n return false;\n }\n\n if (arr) {\n val = value.length;\n }\n\n if (str) {\n // 处理码点大于U+010000的文字length属性不准确的bug,如\"𠮷𠮷𠮷\".lenght !== 3\n val = value.replace(spRegexp, '_').length;\n }\n\n if (len) {\n if (val !== rule.len) {\n errors.push(format(options.messages[key].len, rule.fullField, rule.len));\n }\n } else if (min && !max && val < rule.min) {\n errors.push(format(options.messages[key].min, rule.fullField, rule.min));\n } else if (max && !min && val > rule.max) {\n errors.push(format(options.messages[key].max, rule.fullField, rule.max));\n } else if (min && max && (val < rule.min || val > rule.max)) {\n errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n }\n};\n\nvar ENUM$1 = 'enum';\n\nvar enumerable$1 = function enumerable(rule, value, source, errors, options) {\n rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];\n\n if (rule[ENUM$1].indexOf(value) === -1) {\n errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(', ')));\n }\n};\n\nvar pattern$1 = function pattern(rule, value, source, errors, options) {\n if (rule.pattern) {\n if (rule.pattern instanceof RegExp) {\n // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n // flag is accidentally set to `true`, which in a validation scenario\n // is not necessary and the result might be misleading\n rule.pattern.lastIndex = 0;\n\n if (!rule.pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n } else if (typeof rule.pattern === 'string') {\n var _pattern = new RegExp(rule.pattern);\n\n if (!_pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n }\n }\n};\n\nvar rules = {\n required: required$1,\n whitespace: whitespace,\n type: type$1,\n range: range,\n \"enum\": enumerable$1,\n pattern: pattern$1\n};\n\nvar string = function string(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'string');\n\n if (!isEmptyValue(value, 'string')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n rules.pattern(rule, value, source, errors, options);\n\n if (rule.whitespace === true) {\n rules.whitespace(rule, value, source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar method = function method(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar number = function number(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (value === '') {\n value = undefined;\n }\n\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar _boolean = function _boolean(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar regexp = function regexp(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar integer = function integer(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar floatFn = function floatFn(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar array = function array(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if ((value === undefined || value === null) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'array');\n\n if (value !== undefined && value !== null) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar object = function object(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar ENUM = 'enum';\n\nvar enumerable = function enumerable(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules[ENUM](rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar pattern = function pattern(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'string')) {\n rules.pattern(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar date = function date(rule, value, callback, source, options) {\n // console.log('integer rule called %j', rule);\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); // console.log('validate on %s value', value);\n\n if (validate) {\n if (isEmptyValue(value, 'date') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'date')) {\n var dateObject;\n\n if (value instanceof Date) {\n dateObject = value;\n } else {\n dateObject = new Date(value);\n }\n\n rules.type(rule, dateObject, source, errors, options);\n\n if (dateObject) {\n rules.range(rule, dateObject.getTime(), source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar required = function required(rule, value, callback, source, options) {\n var errors = [];\n var type = Array.isArray(value) ? 'array' : typeof value;\n rules.required(rule, value, source, errors, options, type);\n callback(errors);\n};\n\nvar type = function type(rule, value, callback, source, options) {\n var ruleType = rule.type;\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, ruleType) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, ruleType);\n\n if (!isEmptyValue(value, ruleType)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar any = function any(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n }\n\n callback(errors);\n};\n\nvar validators = {\n string: string,\n method: method,\n number: number,\n \"boolean\": _boolean,\n regexp: regexp,\n integer: integer,\n \"float\": floatFn,\n array: array,\n object: object,\n \"enum\": enumerable,\n pattern: pattern,\n date: date,\n url: type,\n hex: type,\n email: type,\n required: required,\n any: any\n};\n\nfunction newMessages() {\n return {\n \"default\": 'Validation error on field %s',\n required: '%s is required',\n \"enum\": '%s must be one of %s',\n whitespace: '%s cannot be empty',\n date: {\n format: '%s date %s is invalid for format %s',\n parse: '%s date could not be parsed, %s is invalid ',\n invalid: '%s date %s is invalid'\n },\n types: {\n string: '%s is not a %s',\n method: '%s is not a %s (function)',\n array: '%s is not an %s',\n object: '%s is not an %s',\n number: '%s is not a %s',\n date: '%s is not a %s',\n \"boolean\": '%s is not a %s',\n integer: '%s is not an %s',\n \"float\": '%s is not a %s',\n regexp: '%s is not a valid %s',\n email: '%s is not a valid %s',\n url: '%s is not a valid %s',\n hex: '%s is not a valid %s'\n },\n string: {\n len: '%s must be exactly %s characters',\n min: '%s must be at least %s characters',\n max: '%s cannot be longer than %s characters',\n range: '%s must be between %s and %s characters'\n },\n number: {\n len: '%s must equal %s',\n min: '%s cannot be less than %s',\n max: '%s cannot be greater than %s',\n range: '%s must be between %s and %s'\n },\n array: {\n len: '%s must be exactly %s in length',\n min: '%s cannot be less than %s in length',\n max: '%s cannot be greater than %s in length',\n range: '%s must be between %s and %s in length'\n },\n pattern: {\n mismatch: '%s value %s does not match pattern %s'\n },\n clone: function clone() {\n var cloned = JSON.parse(JSON.stringify(this));\n cloned.clone = this.clone;\n return cloned;\n }\n };\n}\nvar messages = newMessages();\n\n/**\n * Encapsulates a validation schema.\n *\n * @param descriptor An object declaring validation rules\n * for this schema.\n */\n\nvar Schema = /*#__PURE__*/function () {\n // ========================= Static =========================\n // ======================== Instance ========================\n function Schema(descriptor) {\n this.rules = null;\n this._messages = messages;\n this.define(descriptor);\n }\n\n var _proto = Schema.prototype;\n\n _proto.define = function define(rules) {\n var _this = this;\n\n if (!rules) {\n throw new Error('Cannot configure a schema with no rules');\n }\n\n if (typeof rules !== 'object' || Array.isArray(rules)) {\n throw new Error('Rules must be an object');\n }\n\n this.rules = {};\n Object.keys(rules).forEach(function (name) {\n var item = rules[name];\n _this.rules[name] = Array.isArray(item) ? item : [item];\n });\n };\n\n _proto.messages = function messages(_messages) {\n if (_messages) {\n this._messages = deepMerge(newMessages(), _messages);\n }\n\n return this._messages;\n };\n\n _proto.validate = function validate(source_, o, oc) {\n var _this2 = this;\n\n if (o === void 0) {\n o = {};\n }\n\n if (oc === void 0) {\n oc = function oc() {};\n }\n\n var source = source_;\n var options = o;\n var callback = oc;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (!this.rules || Object.keys(this.rules).length === 0) {\n if (callback) {\n callback(null, source);\n }\n\n return Promise.resolve(source);\n }\n\n function complete(results) {\n var errors = [];\n var fields = {};\n\n function add(e) {\n if (Array.isArray(e)) {\n var _errors;\n\n errors = (_errors = errors).concat.apply(_errors, e);\n } else {\n errors.push(e);\n }\n }\n\n for (var i = 0; i < results.length; i++) {\n add(results[i]);\n }\n\n if (!errors.length) {\n callback(null, source);\n } else {\n fields = convertFieldsError(errors);\n callback(errors, fields);\n }\n }\n\n if (options.messages) {\n var messages$1 = this.messages();\n\n if (messages$1 === messages) {\n messages$1 = newMessages();\n }\n\n deepMerge(messages$1, options.messages);\n options.messages = messages$1;\n } else {\n options.messages = this.messages();\n }\n\n var series = {};\n var keys = options.keys || Object.keys(this.rules);\n keys.forEach(function (z) {\n var arr = _this2.rules[z];\n var value = source[z];\n arr.forEach(function (r) {\n var rule = r;\n\n if (typeof rule.transform === 'function') {\n if (source === source_) {\n source = _extends({}, source);\n }\n\n value = source[z] = rule.transform(value);\n }\n\n if (typeof rule === 'function') {\n rule = {\n validator: rule\n };\n } else {\n rule = _extends({}, rule);\n } // Fill validator. Skip if nothing need to validate\n\n\n rule.validator = _this2.getValidationMethod(rule);\n\n if (!rule.validator) {\n return;\n }\n\n rule.field = z;\n rule.fullField = rule.fullField || z;\n rule.type = _this2.getType(rule);\n series[z] = series[z] || [];\n series[z].push({\n rule: rule,\n value: value,\n source: source,\n field: z\n });\n });\n });\n var errorFields = {};\n return asyncMap(series, options, function (data, doIt) {\n var rule = data.rule;\n var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField === 'object');\n deep = deep && (rule.required || !rule.required && data.value);\n rule.field = data.field;\n\n function addFullField(key, schema) {\n return _extends({}, schema, {\n fullField: rule.fullField + \".\" + key,\n fullFields: rule.fullFields ? [].concat(rule.fullFields, [key]) : [key]\n });\n }\n\n function cb(e) {\n if (e === void 0) {\n e = [];\n }\n\n var errorList = Array.isArray(e) ? e : [e];\n\n if (!options.suppressWarning && errorList.length) {\n Schema.warning('async-validator:', errorList);\n }\n\n if (errorList.length && rule.message !== undefined) {\n errorList = [].concat(rule.message);\n } // Fill error info\n\n\n var filledErrors = errorList.map(complementError(rule, source));\n\n if (options.first && filledErrors.length) {\n errorFields[rule.field] = 1;\n return doIt(filledErrors);\n }\n\n if (!deep) {\n doIt(filledErrors);\n } else {\n // if rule is required but the target object\n // does not exist fail at the rule level and don't\n // go deeper\n if (rule.required && !data.value) {\n if (rule.message !== undefined) {\n filledErrors = [].concat(rule.message).map(complementError(rule, source));\n } else if (options.error) {\n filledErrors = [options.error(rule, format(options.messages.required, rule.field))];\n }\n\n return doIt(filledErrors);\n }\n\n var fieldsSchema = {};\n\n if (rule.defaultField) {\n Object.keys(data.value).map(function (key) {\n fieldsSchema[key] = rule.defaultField;\n });\n }\n\n fieldsSchema = _extends({}, fieldsSchema, data.rule.fields);\n var paredFieldsSchema = {};\n Object.keys(fieldsSchema).forEach(function (field) {\n var fieldSchema = fieldsSchema[field];\n var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];\n paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));\n });\n var schema = new Schema(paredFieldsSchema);\n schema.messages(options.messages);\n\n if (data.rule.options) {\n data.rule.options.messages = options.messages;\n data.rule.options.error = options.error;\n }\n\n schema.validate(data.value, data.rule.options || options, function (errs) {\n var finalErrors = [];\n\n if (filledErrors && filledErrors.length) {\n finalErrors.push.apply(finalErrors, filledErrors);\n }\n\n if (errs && errs.length) {\n finalErrors.push.apply(finalErrors, errs);\n }\n\n doIt(finalErrors.length ? finalErrors : null);\n });\n }\n }\n\n var res;\n\n if (rule.asyncValidator) {\n res = rule.asyncValidator(rule, data.value, cb, data.source, options);\n } else if (rule.validator) {\n try {\n res = rule.validator(rule, data.value, cb, data.source, options);\n } catch (error) {\n console.error == null ? void 0 : console.error(error); // rethrow to report error\n\n if (!options.suppressValidatorError) {\n setTimeout(function () {\n throw error;\n }, 0);\n }\n\n cb(error.message);\n }\n\n if (res === true) {\n cb();\n } else if (res === false) {\n cb(typeof rule.message === 'function' ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + \" fails\");\n } else if (res instanceof Array) {\n cb(res);\n } else if (res instanceof Error) {\n cb(res.message);\n }\n }\n\n if (res && res.then) {\n res.then(function () {\n return cb();\n }, function (e) {\n return cb(e);\n });\n }\n }, function (results) {\n complete(results);\n }, source);\n };\n\n _proto.getType = function getType(rule) {\n if (rule.type === undefined && rule.pattern instanceof RegExp) {\n rule.type = 'pattern';\n }\n\n if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n throw new Error(format('Unknown rule type %s', rule.type));\n }\n\n return rule.type || 'string';\n };\n\n _proto.getValidationMethod = function getValidationMethod(rule) {\n if (typeof rule.validator === 'function') {\n return rule.validator;\n }\n\n var keys = Object.keys(rule);\n var messageIndex = keys.indexOf('message');\n\n if (messageIndex !== -1) {\n keys.splice(messageIndex, 1);\n }\n\n if (keys.length === 1 && keys[0] === 'required') {\n return validators.required;\n }\n\n return validators[this.getType(rule)] || undefined;\n };\n\n return Schema;\n}();\n\nSchema.register = function register(type, validator) {\n if (typeof validator !== 'function') {\n throw new Error('Cannot register a validator by type, validator is not a function');\n }\n\n validators[type] = validator;\n};\n\nSchema.warning = warning;\nSchema.messages = messages;\nSchema.validators = validators;\n\nexport { Schema as default };\n//# sourceMappingURL=index.js.map\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\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};\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 Rules,\n SpanInfo,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\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 = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawImageX = 0;\n drawImageY = 0;\n drawImageWidth = 0;\n drawImageHeight = 0;\n drawImageName = '';\n drawImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || 'center';\n this.verticalAlign = column.verticalAlign || 'middle';\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (this.type === 'tree' && cellType === 'body') {\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n iconOffsetX = level * 8;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n iconOffsetX = level * 8;\n } else {\n iconOffsetX = level * 8;\n }\n let iconWidth = 20;\n let iconHeight = 20;\n if (icon) {\n let iconX = this.drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n this.ctx.paint.drawImage(icon, iconX, iconY, iconWidth, iconHeight);\n this.drawImageX = iconX;\n this.drawImageY = iconY;\n this.drawImageWidth = iconWidth;\n this.drawImageHeight = iconHeight;\n this.drawImageName = iconName;\n this.drawImageSource = icon;\n }\n // 更改文本距离\n this.align = 'left';\n this.drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n }\n }\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n 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 = READONLY_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 focusCell = this.ctx.focusCell;\n const hoverCell = this.ctx.hoverCell;\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 && focusCell) {\n if (focusCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (focusCell.rowIndex >= minY && focusCell.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 = READONLY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n // 选中框类型\n if (['index-selection', 'selection'].includes(type)) {\n const check = this.ctx.database.getRowSelection(rowKey);\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\n const _x = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n const _y = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage && type == 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n } else if (checkboxImage && 'selection' === type) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawImageName = this.hoverIconName;\n this.drawImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.text, this.width, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, this.visibleWidth, this.visibleHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\n }\n if (this.hoverIconName) {\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawImageX - 2,\n this.drawImageY - 2,\n this.drawImageWidth + 4,\n this.drawImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n }\n this.ctx.paint.drawImage(\n this.drawImageSource,\n this.drawImageX,\n this.drawImageY,\n this.drawImageWidth,\n this.drawImageHeight,\n );\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import Schema, { ValidateError } from 'async-validator';\nimport type CellHeader from './CellHeader';\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 Descriptor,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n} from './types';\nimport { generateShortUUID } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateError[]>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n init() {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n this.itemRowKeyMap = new WeakMap();\n const { ROW_KEY, ENABLE_RESERVE_SELECTION } = this.ctx.config;\n // 没有跨页选时清除\n if (!(ENABLE_RESERVE_SELECTION && ROW_KEY)) {\n this.selectionMap.clear();\n }\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) {\n dataList.forEach((item, index) => {\n let hasChildren = item._hasChildren || false;\n if (Array.isArray(item.children) && item.children.length) {\n hasChildren = true;\n this.initData(item.children, level + 1);\n }\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 this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand: DEFAULT_EXPAND_ALL,\n expandLazy: false,\n hasChildren,\n expandLoading: false,\n item,\n });\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.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 let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\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.rowKeyMap.forEach((row: any) => {\n row.expand = 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 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.rowKeyMap.get(rowKey).index;\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(_list: ChangeItem[], history = false) {\n let historyList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n }\n changeList.forEach((data) => {\n const { value, rowKey, key, oldValue } = data;\n rowKeyList.add(rowKey);\n this.setItemValue(rowKey, key, value);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @returns\n */\n async setItemValue(rowKey: string, key: string, _value: any, history = false, reDraw = false, isEditor = false) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange([\n {\n rowKey,\n key,\n value,\n oldValue: item[key],\n row,\n },\n ]);\n if (values && values.length) {\n value = values[0].value;\n }\n }\n // 设置改变值\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n const changeItem: ChangeItem = {\n rowKey,\n key,\n oldValue,\n value,\n row,\n };\n // 实时校验错误\n this.getValidator(rowKey, key).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', [changeItem], [row]);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 添加历史记录\n if (history) {\n this.ctx.history.pushState({\n type: 'single',\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n changeList: [\n {\n rowKey,\n key,\n oldValue,\n newValue: value,\n },\n ],\n });\n }\n\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n } else {\n this.selectionMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\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 let descriptor: Descriptor = {};\n let data: any = {};\n data[key] = this.getItemValue(rowKey, key);\n if (Array.isArray(rules)) {\n const _rules = rules.map((item) => {\n return {\n ...item,\n row: row.item,\n column,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n };\n });\n descriptor[key] = _rules;\n } else {\n descriptor[key] = {\n ...rules,\n row: row.item,\n column,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n };\n }\n\n const validator = new Schema(descriptor);\n validator\n .validate(data)\n .then(() => {\n this.clearValidationError(rowKey, key);\n resolve([]);\n })\n .catch(({ errors }) => {\n const _errors = errors.map((error: any) => ({\n ...error,\n column,\n key,\n row: row.item,\n rowKey,\n }));\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n });\n } else {\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 errors: ValidateError[] = [\n {\n message,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: any[]) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this));\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 }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n 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 this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\r\nimport {\r\n BeforeAutofillDataMethod,\r\n BeforeCellValueChangeMethod,\r\n BeforeCopyMethod,\r\n BeforePasteDataMethod,\r\n BeforeSetAutofillMethod,\r\n BeforeSetSelectorMethod,\r\n CellEditorMethod,\r\n CellHeaderStyleMethod,\r\n CellHoverIconMethod,\r\n CellReadonlyMethod,\r\n CellRenderMethod,\r\n CellRulesMethod,\r\n CellStyleMethod,\r\n CellTypeMethod,\r\n ConfigType,\r\n ExpandLazyMethod,\r\n FooterPosition,\r\n FormatterMethod,\r\n MenuItem,\r\n SelectableMethod,\r\n SpanMethod,\r\n} from './types';\r\n\r\nexport default class Config {\r\n CSS_PREFIX = 'e-virt-table';\r\n ICONS: IconType[] = [];\r\n ROW_KEY = '';\r\n DISABLED = false; //禁用编辑,优先等级最高\r\n HEADER_FONT = '12px normal Arial';\r\n BODY_FONT = '12px normal Arial';\r\n BORDER = true;\r\n STRIPE = false; //斑马纹\r\n STRIPE_COLOR = '#fafafa'; //斑马纹颜色\r\n BORDER_COLOR = '#e1e6eb';\r\n WIDTH = 0;\r\n RESIZE_MIN_WIDTH = 40;\r\n HEIGHT = 0;\r\n PLACEHOLDER_COLOR = '#CDD0DC';\r\n EMPTY_BODY_HEIGHT = 120;\r\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n EMPTY_TEXT = '暂无数据';\r\n MAX_HEIGHT = 1000;\r\n BORDER_RADIUS = 8;\r\n ENABLE_OFFSET_HEIGHT = false;\r\n OFFSET_HEIGHT = 0;\r\n HEADER_HEIGHT = 36;\r\n ENABLE_RESERVE_SELECTION = false; // 启用保留选中行\r\n ENABLE_HEADER_STICKY = false; // 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素\r\n HEADER_BG_COLOR = '#F8FAFF';\r\n BODY_BG_COLOR = '#FFF';\r\n HEADER_TEXT_COLOR = '#1D2129';\r\n LOADING_ICON_SVG = '';\r\n LOADING_ICON_COLOR = '#4E5969';\r\n EXPAND_ICON_SVG = '';\r\n SHRINK_ICON_SVG = '';\r\n EXPAND_ICON_COLOR = '#4E5969';\r\n SHRINK_ICON_COLOR = '#4E5969';\r\n ERROR_TIP_ICON_COLOR = 'red';\r\n ERROR_TIP_ICON_SIZE = 6;\r\n EXPAND_LAZY = true;\r\n DEFAULT_EXPAND_ALL = false;\r\n CELL_WIDTH = 100;\r\n CELL_HEIGHT = 36;\r\n CELL_PADDING = 8;\r\n CELL_HOVER_ICON_SIZE = 14;\r\n CELL_HOVER_ICON_BG_COLOR = '#fff';\r\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\r\n SCROLLER_TRACK_SIZE = 14;\r\n SCROLLER_SIZE = 8;\r\n SCROLLER_COLOR = '#dee0e3';\r\n SCROLLER_TRACK_COLOR = '#fff';\r\n SCROLLER_FOCUS_COLOR = '#bbbec4';\r\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\r\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\r\n SELECT_ROW_COL_BG_COLOR = 'transparent';\r\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\r\n EDIT_BG_COLOR = '#fcf6ed';\r\n CHECKBOX_KEY = '';\r\n CHECKBOX_COLOR = 'rgb(82,146,247)';\r\n CHECKBOX_SIZE = 20;\r\n CHECKBOX_DISABLED_SVG = '';\r\n CHECKBOX_CHECK_SVG = '';\r\n CHECKBOX_UNCHECK_SVG = '';\r\n CHECKBOX_INDETERMINATE_SVG = '';\r\n READONLY_COLOR = '#fff';\r\n READONLY_TEXT_COLOR = '#4E5969';\r\n ERROR_TIP_COLOR = '#ED3F14';\r\n FOOTER_BG_COLOR = '#fafafa';\r\n FOOTER_FIXED = true;\r\n FOOTER_POSITION: FooterPosition = 'bottom';\r\n CELL_FOOTER_HEIGHT = 36;\r\n ENABLE_SELECTOR = true;\r\n ENABLE_EDIT_SINGLE_CLICK = false; // 启用单点击立马编辑\r\n ENABLE_EDIT_CLICK_SELECTOR = true; // 启用点击选择器编辑\r\n SELECTOR_AREA_MIN_X = 0; // 选择器X最小范围\r\n SELECTOR_AREA_MAX_X_OFFSET = 0; // 选择器X最大范围colMax - offset\r\n SELECTOR_AREA_MAX_X = 0; // 选择器X最大范围,0默认最大colMax\r\n SELECTOR_AREA_MIN_Y = 0; // 选择器Y最小范围\r\n SELECTOR_AREA_MAX_Y = 0; // 选择器Y最大范围,0默认rowMax\r\n SELECTOR_AREA_MAX_Y_OFFSET = 0; // 选择器Y最大范围,0默认rowMax\r\n ENABLE_SELECTOR_SINGLE = false;\r\n ENABLE_SELECTOR_SPAN_COL = true;\r\n ENABLE_SELECTOR_SPAN_ROW = true;\r\n ENABLE_SELECTOR_ALL_ROWS = true;\r\n ENABLE_SELECTOR_ALL_COLS = true;\r\n ENABLE_MERGE_CELL_LINK = false; // 启用合并选择器关联\r\n ENABLE_AUTOFILL = false;\r\n ENABLE_CONTEXT_MENU = false;\r\n ENABLE_COPY = true;\r\n ENABLE_PASTER = true;\r\n ENABLE_RESIZE_ROW = true;\r\n ENABLE_RESIZE_COLUMN = true;\r\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\r\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\r\n RESIZE_ROW_MIN_HEIGHT = 36;\r\n RESIZE_COLUMN_MIN_WIDTH = 40;\r\n ENABLE_KEYBOARD = true;\r\n ENABLE_HISTORY = false;\r\n ENABLE_VALIDATOR_IMMEDIATE = true;\r\n HISTORY_NUM = 50;\r\n HIGHLIGHT_HOVER_ROW = false;\r\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\r\n HIGHLIGHT_SELECTED_ROW = false;\r\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\r\n TOOLTIP_BG_COLOR = '#303133';\r\n TOOLTIP_TEXT_COLOR = '#fff';\r\n TOOLTIP_ZINDEX = 3000;\r\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n CONTEXT_MENU: MenuItem[] = [\r\n { label: '复制', value: 'copy' },\r\n { label: '剪切', value: 'cut' },\r\n { label: '粘贴', value: 'paste' },\r\n { label: '清空选中内容', value: 'clearSelected' },\r\n ];\r\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\r\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\r\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\r\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\r\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\r\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\r\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\r\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\r\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\r\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\r\n SPAN_METHOD?: SpanMethod;\r\n SELECTABLE_METHOD?: SelectableMethod;\r\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\r\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\r\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\r\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\r\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\r\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\r\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\r\n constructor(config: Partial<Config>) {\r\n Object.assign(this, config);\r\n }\r\n\r\n init(config: ConfigType) {\r\n Object.assign(this, config);\r\n }\r\n}\r\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color).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) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n const url = URL.createObjectURL(svgBlob);\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport { generateShortUUID } from './util';\r\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Rules, Type, VerticalAlign } from './types';\r\nimport BaseCell from './BaseCell';\r\nexport default class CellHeader extends BaseCell {\r\n align: Align;\r\n verticalAlign: VerticalAlign = 'middle';\r\n fixed?: Fixed;\r\n widthFillDisable: boolean;\r\n type: Type | '';\r\n operation = false;\r\n editorType: string;\r\n level: number;\r\n text: string;\r\n displayText: string = '';\r\n colspan: number;\r\n rowspan: number;\r\n row: any;\r\n key: string;\r\n required = false;\r\n readonly = false;\r\n children: Column[] = [];\r\n column: Column;\r\n colIndex: number;\r\n rowKey: string;\r\n rules?: Rules;\r\n hasChildren: boolean;\r\n render: Render;\r\n style: Partial<CSSStyleDeclaration> = {};\r\n drawX = 0;\r\n drawY = 0;\r\n drawCellBgColor = '';\r\n drawTextColor = '';\r\n drawImageX = 0;\r\n drawImageY = 0;\r\n drawImageWidth = 0;\r\n drawImageHeight = 0;\r\n drawImageName = '';\r\n drawImageSource: HTMLImageElement | undefined;\r\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\r\n super(ctx, x, y, width, height, 'header', column.fixed);\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.colIndex = colIndex;\r\n this.key = column.key;\r\n this.type = column.type || '';\r\n this.editorType = column.editorType || 'text';\r\n this.align = column.align || 'center';\r\n this.verticalAlign = column.verticalAlign || 'middle';\r\n this.fixed = column.fixed;\r\n this.level = column.level || 0;\r\n this.operation = column.operation || false;\r\n this.text = column.title;\r\n this.column = column;\r\n this.colspan = column.colspan || 1;\r\n this.widthFillDisable = column.widthFillDisable || false;\r\n this.rowspan = column.rowspan || 1;\r\n this.rules = column.rules;\r\n this.readonly = column.readonly || false;\r\n this.required = column.required || false;\r\n this.rowKey = generateShortUUID();\r\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\r\n this.render = column.renderHeader;\r\n }\r\n /**\r\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\r\n * @returns\r\n */\r\n isVerticalVisible() {\r\n const { stageHeight } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\r\n }\r\n\r\n /**\r\n * 更新样式\r\n */\r\n updateStyle() {\r\n this.style = this.getOverlayerViewsStyle();\r\n }\r\n updateContainer() {\r\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\r\n let bgColor = HEADER_BG_COLOR;\r\n let textColor = HEADER_TEXT_COLOR;\r\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\r\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\r\n const { backgroundColor, color } =\r\n headerCellStyleMethod({\r\n colIndex: this.colIndex,\r\n column: this.column,\r\n }) || {};\r\n if (backgroundColor) {\r\n bgColor = backgroundColor;\r\n }\r\n // 文字颜色\r\n if (color) {\r\n textColor = color;\r\n }\r\n }\r\n this.drawCellBgColor = bgColor;\r\n this.drawTextColor = textColor;\r\n }\r\n update() {\r\n this.updateContainer();\r\n this.displayText = this.getText();\r\n this.drawX = this.getDrawX();\r\n this.drawY = this.getDrawY();\r\n this.updateStyle();\r\n }\r\n draw() {\r\n const {\r\n paint,\r\n config: { BORDER_COLOR, CELL_PADDING, HEADER_FONT, BORDER },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n // 有边框的情况下,绘制边框\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\r\n fillColor: this.drawCellBgColor,\r\n });\r\n paint.drawText(displayText, drawX, drawY, this.width, this.height, {\r\n font: HEADER_FONT,\r\n padding: CELL_PADDING,\r\n color: this.drawTextColor,\r\n align: this.align,\r\n verticalAlign: this.verticalAlign,\r\n });\r\n this.drawSelection();\r\n this.drawSelector();\r\n }\r\n private drawSelector() {\r\n // 选择区背景颜色\r\n const { ENABLE_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_SELECTOR) {\r\n return;\r\n }\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (this.colIndex >= minX && this.colIndex <= maxX) {\r\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\r\n borderColor: 'transparent',\r\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\r\n });\r\n }\r\n }\r\n private drawSelection() {\r\n const { width, height, type } = this;\r\n // 选中框类型\r\n if (['index-selection', 'selection'].includes(type)) {\r\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\r\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\r\n const _x = this.drawX + (width - CHECKBOX_SIZE) / 2;\r\n const _y = this.drawY + (height - CHECKBOX_SIZE) / 2;\r\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\r\n let checkboxName = 'checkbox-uncheck';\r\n if (indeterminate) {\r\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\r\n checkboxName = 'checkbox-indeterminate';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check');\r\n checkboxName = 'checkbox-check';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\r\n checkboxName = 'checkbox-check-disabled';\r\n } else if (!check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\r\n checkboxName = 'checkbox-uncheck';\r\n } else {\r\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\r\n checkboxName = 'checkbox-disabled';\r\n }\r\n if (checkboxImage) {\r\n this.drawImageX = _x;\r\n this.drawImageY = _y;\r\n this.drawImageWidth = CHECKBOX_SIZE;\r\n this.drawImageHeight = CHECKBOX_SIZE;\r\n this.drawImageName = checkboxName;\r\n this.drawImageSource = checkboxImage;\r\n this.ctx.paint.drawImage(\r\n this.drawImageSource,\r\n this.drawImageX,\r\n this.drawImageY,\r\n this.drawImageWidth,\r\n this.drawImageHeight,\r\n );\r\n }\r\n }\r\n }\r\n getText() {\r\n if (this.render) {\r\n return '';\r\n }\r\n return this.text;\r\n }\r\n /**\r\n * 获取样式\r\n */\r\n getOverlayerViewsStyle() {\r\n let left = '';\r\n if (this.fixed === 'left') {\r\n left = `${this.drawX}px`;\r\n } else if (this.fixed === 'right') {\r\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\r\n } else {\r\n // 中间的,需要减去左边固定列的宽度\r\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\r\n }\r\n return {\r\n position: 'absolute',\r\n overflow: 'hidden',\r\n left: left,\r\n top: `${this.drawY + 1}px`,\r\n width: `${this.width}px`,\r\n height: `${this.height - 2}px`,\r\n pointerEvents: 'initial',\r\n userSelect: 'none',\r\n };\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n 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 // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n // 树事件\n this.treeClick(cell);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.ctx.emit('cellHeaderHoverChange', cell);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n this.selectionEnterAndLeave(cell, e);\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection = ['selection', 'index-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (cell.drawImageName === 'checkbox-uncheck' || cell.drawImageName === 'checkbox-indeterminate') {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.type === 'tree' && this.ctx.isPointer) {\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n }\n }\n private selectionEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否可选\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n }\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 } 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 isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history);\r\n } else {\r\n this.database.batchSetItemValue(_list, history);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.focusCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const item = this.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n if (item) {\r\n cellsData.push(item.value);\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n 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) => sum + (_item?.width || 100), 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 - 0.5 + '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.ctx.columnResizing = false;\n this.clientX = 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 let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let width = item.width || 100; // 读取映射宽度\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 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 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 (this.data.length && 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 - 0.5}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 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\n canvasElement.width = Math.floor(canvasWidth);\n canvasElement.height = Math.floor(canvasHeight);\n // 外层容器样式\n this.ctx.canvasElement.setAttribute(\n 'style',\n ` height:${this.ctx.stageHeight}px;width:${this.ctx.stageWidth}px;`,\n );\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 e.preventDefault();\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 e.preventDefault();\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 e.preventDefault();\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n e.preventDefault();\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 e.preventDefault();\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') {\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 let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n private clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: null,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n // 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);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n let htmlX = 0;\n let htmlY = 0;\n if (documentElement && !isOffsetParentAnElement && !isFixed) {\n const htmlRect = documentElement.getBoundingClientRect();\n htmlY = htmlRect.top + scroll.scrollTop;\n htmlX = htmlRect.left + scroll.scrollLeft -\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect);\n }\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlX;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlY;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.ctx.on('mousemove', (e) => {\n // 鼠标移动时,判断是否在target上,不在则隐藏\n if (!this.ctx.isTarget(e)) {\n return;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n if (\n e.clientX < targetRect.x ||\n e.clientX > targetRect.x + targetRect.width ||\n e.clientY < targetRect.y ||\n e.clientY > targetRect.y + targetRect.height\n ) {\n this.hide();\n }\n });\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 }\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 private 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 === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if(!isVisible){\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\nexport default class Overlayer {\r\n ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n }\r\n draw() {\r\n const overlayer = this.getContainer();\r\n this.ctx.emit('overlayerChange', overlayer);\r\n }\r\n destroy() {\r\n this.ctx.emit('overlayerChange', {\r\n style: {},\r\n views: [],\r\n });\r\n }\r\n private getContainer(): OverlayerContainer {\r\n const header = this.getHeader();\r\n const body = this.getBody();\r\n const footer = this.getFooter();\r\n let views: OverlayerWrapper[] = [];\r\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\r\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\r\n if (!FOOTER_FIXED) {\r\n views = [header, body];\r\n } else {\r\n if (FOOTER_POSITION === 'top') {\r\n views = [header, footer, body];\r\n } else {\r\n views = [header, body, footer];\r\n }\r\n }\r\n return {\r\n views,\r\n };\r\n }\r\n private getHeader() {\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\r\n let centerCells: CellHeader[] = [];\r\n let leftCells: CellHeader[] = [];\r\n let rightCells: CellHeader[] = [];\r\n renderCellHeaders.forEach((cellHeader) => {\r\n if (cellHeader.render) {\r\n if (cellHeader.fixed === 'left') {\r\n leftCells.push(cellHeader);\r\n } else if (cellHeader.fixed === 'right') {\r\n rightCells.push(cellHeader);\r\n } else {\r\n centerCells.push(cellHeader);\r\n }\r\n }\r\n });\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${fixedLeftWidth}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const header: OverlayerWrapper = {\r\n type: 'header',\r\n class: `${CSS_PREFIX}-overlayer-header`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return header;\r\n }\r\n private getBody() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n let renderRows = this.ctx.body.renderRows;\r\n // 合计如果不是固定在底部,就加入到渲染行中\r\n if (!this.ctx.config.FOOTER_FIXED) {\r\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\r\n }\r\n renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer') {\r\n cell.render = cell.renderFooter;\r\n }\r\n if (cell.render) {\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.body;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const body: OverlayerWrapper = {\r\n type: 'body',\r\n class: `${CSS_PREFIX}-overlayer-body`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return body;\r\n }\r\n private getFooter() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer' && cell.renderFooter) {\r\n // 把转renderFooter成render统一出口\r\n cell.render = cell.renderFooter;\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.footer;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n right: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const footer: OverlayerWrapper = {\r\n type: 'footer',\r\n class: `${CSS_PREFIX}-overlayer-footer`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return footer;\r\n }\r\n}\r\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.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 ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n this.ctx.database.init();\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.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(ladong: boolean) {\r\n this.ctx.database.setLoading(ladong);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.setScrollY(0);\r\n this.ctx.setScrollX(0);\r\n this.ctx.database.init();\r\n this.header.init();\r\n this.ctx.database.setFilterMethod(func);\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(rowKey: string, key: string, value: any, history = true, reDraw = true, isEditor = false) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true) {\r\n this.ctx.database.batchSetItemValue(list, history);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw);\r\n this.editor.doneEdit();\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n 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 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 clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["_extends","target","i","source","key","_inheritsLoose","subClass","superClass","_setPrototypeOf","_getPrototypeOf","o","p","_isNativeReflectConstruct","_construct","Parent","args","Class","a","Constructor","instance","_isNativeFunction","fn","_wrapNativeSuper","_cache","Wrapper","formatRegExp","warning","type","errors","e","convertFieldsError","fields","error","field","format","template","_len","_key","len","str","x","isNativeStringType","isEmptyValue","value","asyncParallelArray","arr","func","callback","results","total","arrLength","count","asyncSerialArray","index","next","original","flattenObjArr","objArr","ret","k","AsyncValidationError","_Error","_this","asyncMap","option","_pending","resolve","reject","flattenArr","firstFields","objArrKeys","objArrLength","pending","isErrorObj","obj","getValue","path","v","complementError","rule","oe","fieldValue","deepMerge","s","required$1","options","whitespace","urlReg","getUrlRegex","word","b","v4","v6seg","v6","v46Exact","v4exact","v6exact","ip","protocol","auth","ipv4","ipv6","host","domain","tld","port","regex","pattern$2","types","type$1","custom","ruleType","range","min","max","spRegexp","val","num","ENUM$1","enumerable$1","pattern$1","_pattern","rules","string","validate","method","number","_boolean","regexp","integer","floatFn","array","object","ENUM","enumerable","pattern","date","dateObject","required","any","validators","newMessages","cloned","messages","Schema","descriptor","_proto","name","item","_messages","source_","oc","_this2","complete","add","_errors","messages$1","series","keys","z","r","errorFields","data","doIt","deep","addFullField","schema","cb","errorList","filledErrors","fieldsSchema","paredFieldsSchema","fieldSchema","fieldSchemaList","errs","finalErrors","res","messageIndex","validator","generateShortUUID","c","throttle","delay","lastCalledTime","timeoutId","now","elapsedTime","getMaxRow","sortFixed","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","column","row","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","params","mergeRowkey","visibleRows","rowIndex","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","BaseCell","ctx","y","width","height","cellType","__publicField","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","colIndex","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","rowKey","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","iconX","iconY","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","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","focusCell","hoverCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawX","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","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","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","ROW_KEY","ENABLE_RESERVE_SELECTION","dataList","_a","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","historyList","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","values","changeItem","selection","draw","_selectable","ignoreReserve","_","buffer","bufferState","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","indeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","BODY_CELL_RULES_METHOD","_rules","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","message","hasMergeCell","j","History","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","event","ENABLE_KEYBOARD","EventBus","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","element","svgBlob","url","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","displayText","EventTable","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","leafColumns","sum","_item","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","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","isEmpty","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","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","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","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","round","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","d","_overflowsData$filter2","currentSideAxis","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","leftScroll","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","htmlX","htmlY","htmlRect","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","items","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ladong","ValidateFields","scrollError","_err","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[0,21,22,23,24]}
1
+ {"version":3,"file":"index.es.js","sources":["../node_modules/async-validator/dist-web/index.js","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nfunction _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\n/* eslint no-console:0 */\nvar formatRegExp = /%[sdj%]/g;\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {\n warning = function warning(type, errors) {\n if (typeof console !== 'undefined' && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === 'undefined') {\n if (errors.every(function (e) {\n return typeof e === 'string';\n })) {\n console.warn(type, errors);\n }\n }\n };\n}\n\nfunction convertFieldsError(errors) {\n if (!errors || !errors.length) return null;\n var fields = {};\n errors.forEach(function (error) {\n var field = error.field;\n fields[field] = fields[field] || [];\n fields[field].push(error);\n });\n return fields;\n}\nfunction format(template) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var i = 0;\n var len = args.length;\n\n if (typeof template === 'function') {\n return template.apply(null, args);\n }\n\n if (typeof template === 'string') {\n var str = template.replace(formatRegExp, function (x) {\n if (x === '%%') {\n return '%';\n }\n\n if (i >= len) {\n return x;\n }\n\n switch (x) {\n case '%s':\n return String(args[i++]);\n\n case '%d':\n return Number(args[i++]);\n\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n\n break;\n\n default:\n return x;\n }\n });\n return str;\n }\n\n return template;\n}\n\nfunction isNativeStringType(type) {\n return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern';\n}\n\nfunction isEmptyValue(value, type) {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (type === 'array' && Array.isArray(value) && !value.length) {\n return true;\n }\n\n if (isNativeStringType(type) && typeof value === 'string' && !value) {\n return true;\n }\n\n return false;\n}\n\nfunction asyncParallelArray(arr, func, callback) {\n var results = [];\n var total = 0;\n var arrLength = arr.length;\n\n function count(errors) {\n results.push.apply(results, errors || []);\n total++;\n\n if (total === arrLength) {\n callback(results);\n }\n }\n\n arr.forEach(function (a) {\n func(a, count);\n });\n}\n\nfunction asyncSerialArray(arr, func, callback) {\n var index = 0;\n var arrLength = arr.length;\n\n function next(errors) {\n if (errors && errors.length) {\n callback(errors);\n return;\n }\n\n var original = index;\n index = index + 1;\n\n if (original < arrLength) {\n func(arr[original], next);\n } else {\n callback([]);\n }\n }\n\n next([]);\n}\n\nfunction flattenObjArr(objArr) {\n var ret = [];\n Object.keys(objArr).forEach(function (k) {\n ret.push.apply(ret, objArr[k] || []);\n });\n return ret;\n}\n\nvar AsyncValidationError = /*#__PURE__*/function (_Error) {\n _inheritsLoose(AsyncValidationError, _Error);\n\n function AsyncValidationError(errors, fields) {\n var _this;\n\n _this = _Error.call(this, 'Async Validation Error') || this;\n _this.errors = errors;\n _this.fields = fields;\n return _this;\n }\n\n return AsyncValidationError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nfunction asyncMap(objArr, option, func, callback, source) {\n if (option.first) {\n var _pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n callback(errors);\n return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);\n };\n\n var flattenArr = flattenObjArr(objArr);\n asyncSerialArray(flattenArr, func, next);\n });\n\n _pending[\"catch\"](function (e) {\n return e;\n });\n\n return _pending;\n }\n\n var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];\n var objArrKeys = Object.keys(objArr);\n var objArrLength = objArrKeys.length;\n var total = 0;\n var results = [];\n var pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n results.push.apply(results, errors);\n total++;\n\n if (total === objArrLength) {\n callback(results);\n return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);\n }\n };\n\n if (!objArrKeys.length) {\n callback(results);\n resolve(source);\n }\n\n objArrKeys.forEach(function (key) {\n var arr = objArr[key];\n\n if (firstFields.indexOf(key) !== -1) {\n asyncSerialArray(arr, func, next);\n } else {\n asyncParallelArray(arr, func, next);\n }\n });\n });\n pending[\"catch\"](function (e) {\n return e;\n });\n return pending;\n}\n\nfunction isErrorObj(obj) {\n return !!(obj && obj.message !== undefined);\n}\n\nfunction getValue(value, path) {\n var v = value;\n\n for (var i = 0; i < path.length; i++) {\n if (v == undefined) {\n return v;\n }\n\n v = v[path[i]];\n }\n\n return v;\n}\n\nfunction complementError(rule, source) {\n return function (oe) {\n var fieldValue;\n\n if (rule.fullFields) {\n fieldValue = getValue(source, rule.fullFields);\n } else {\n fieldValue = source[oe.field || rule.fullField];\n }\n\n if (isErrorObj(oe)) {\n oe.field = oe.field || rule.fullField;\n oe.fieldValue = fieldValue;\n return oe;\n }\n\n return {\n message: typeof oe === 'function' ? oe() : oe,\n fieldValue: fieldValue,\n field: oe.field || rule.fullField\n };\n };\n}\nfunction deepMerge(target, source) {\n if (source) {\n for (var s in source) {\n if (source.hasOwnProperty(s)) {\n var value = source[s];\n\n if (typeof value === 'object' && typeof target[s] === 'object') {\n target[s] = _extends({}, target[s], value);\n } else {\n target[s] = value;\n }\n }\n }\n }\n\n return target;\n}\n\nvar required$1 = function required(rule, value, source, errors, options, type) {\n if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n errors.push(format(options.messages.required, rule.fullField));\n }\n};\n\n/**\n * Rule for validating whitespace.\n *\n * @param rule The validation rule.\n * @param value The value of the field on the source object.\n * @param source The source object being validated.\n * @param errors An array of errors that this rule may add\n * validation errors to.\n * @param options The validation options.\n * @param options.messages The validation messages.\n */\n\nvar whitespace = function whitespace(rule, value, source, errors, options) {\n if (/^\\s+$/.test(value) || value === '') {\n errors.push(format(options.messages.whitespace, rule.fullField));\n }\n};\n\n// https://github.com/kevva/url-regex/blob/master/index.js\nvar urlReg;\nvar getUrlRegex = (function () {\n if (urlReg) {\n return urlReg;\n }\n\n var word = '[a-fA-F\\\\d:]';\n\n var b = function b(options) {\n return options && options.includeBoundaries ? \"(?:(?<=\\\\s|^)(?=\" + word + \")|(?<=\" + word + \")(?=\\\\s|$))\" : '';\n };\n\n var v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n var v6seg = '[a-fA-F\\\\d]{1,4}';\n var v6 = (\"\\n(?:\\n(?:\" + v6seg + \":){7}(?:\" + v6seg + \"|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\\n(?:\" + v6seg + \":){6}(?:\" + v4 + \"|:\" + v6seg + \"|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\\n(?:\" + v6seg + \":){5}(?::\" + v4 + \"|(?::\" + v6seg + \"){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\\n(?:\" + v6seg + \":){4}(?:(?::\" + v6seg + \"){0,1}:\" + v4 + \"|(?::\" + v6seg + \"){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\\n(?:\" + v6seg + \":){3}(?:(?::\" + v6seg + \"){0,2}:\" + v4 + \"|(?::\" + v6seg + \"){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){2}(?:(?::\" + v6seg + \"){0,3}:\" + v4 + \"|(?::\" + v6seg + \"){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){1}(?:(?::\" + v6seg + \"){0,4}:\" + v4 + \"|(?::\" + v6seg + \"){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\\n(?::(?:(?::\" + v6seg + \"){0,5}:\" + v4 + \"|(?::\" + v6seg + \"){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\\n\").replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim(); // Pre-compile only the exact regexes because adding a global flag make regexes stateful\n\n var v46Exact = new RegExp(\"(?:^\" + v4 + \"$)|(?:^\" + v6 + \"$)\");\n var v4exact = new RegExp(\"^\" + v4 + \"$\");\n var v6exact = new RegExp(\"^\" + v6 + \"$\");\n\n var ip = function ip(options) {\n return options && options.exact ? v46Exact : new RegExp(\"(?:\" + b(options) + v4 + b(options) + \")|(?:\" + b(options) + v6 + b(options) + \")\", 'g');\n };\n\n ip.v4 = function (options) {\n return options && options.exact ? v4exact : new RegExp(\"\" + b(options) + v4 + b(options), 'g');\n };\n\n ip.v6 = function (options) {\n return options && options.exact ? v6exact : new RegExp(\"\" + b(options) + v6 + b(options), 'g');\n };\n\n var protocol = \"(?:(?:[a-z]+:)?//)\";\n var auth = '(?:\\\\S+(?::\\\\S*)?@)?';\n var ipv4 = ip.v4().source;\n var ipv6 = ip.v6().source;\n var host = \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9][-_]*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\";\n var domain = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\";\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n var port = '(?::\\\\d{2,5})?';\n var path = '(?:[/?#][^\\\\s\"]*)?';\n var regex = \"(?:\" + protocol + \"|www\\\\.)\" + auth + \"(?:localhost|\" + ipv4 + \"|\" + ipv6 + \"|\" + host + domain + tld + \")\" + port + path;\n urlReg = new RegExp(\"(?:^\" + regex + \"$)\", 'i');\n return urlReg;\n});\n\n/* eslint max-len:0 */\n\nvar pattern$2 = {\n // http://emailregex.com/\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+\\.)+[a-zA-Z\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}))$/,\n // url: new RegExp(\n // '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$',\n // 'i',\n // ),\n hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n};\nvar types = {\n integer: function integer(value) {\n return types.number(value) && parseInt(value, 10) === value;\n },\n \"float\": function float(value) {\n return types.number(value) && !types.integer(value);\n },\n array: function array(value) {\n return Array.isArray(value);\n },\n regexp: function regexp(value) {\n if (value instanceof RegExp) {\n return true;\n }\n\n try {\n return !!new RegExp(value);\n } catch (e) {\n return false;\n }\n },\n date: function date(value) {\n return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime());\n },\n number: function number(value) {\n if (isNaN(value)) {\n return false;\n }\n\n return typeof value === 'number';\n },\n object: function object(value) {\n return typeof value === 'object' && !types.array(value);\n },\n method: function method(value) {\n return typeof value === 'function';\n },\n email: function email(value) {\n return typeof value === 'string' && value.length <= 320 && !!value.match(pattern$2.email);\n },\n url: function url(value) {\n return typeof value === 'string' && value.length <= 2048 && !!value.match(getUrlRegex());\n },\n hex: function hex(value) {\n return typeof value === 'string' && !!value.match(pattern$2.hex);\n }\n};\n\nvar type$1 = function type(rule, value, source, errors, options) {\n if (rule.required && value === undefined) {\n required$1(rule, value, source, errors, options);\n return;\n }\n\n var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n var ruleType = rule.type;\n\n if (custom.indexOf(ruleType) > -1) {\n if (!types[ruleType](value)) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n } // straight typeof check\n\n } else if (ruleType && typeof value !== rule.type) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n }\n};\n\nvar range = function range(rule, value, source, errors, options) {\n var len = typeof rule.len === 'number';\n var min = typeof rule.min === 'number';\n var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)\n\n var spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var val = value;\n var key = null;\n var num = typeof value === 'number';\n var str = typeof value === 'string';\n var arr = Array.isArray(value);\n\n if (num) {\n key = 'number';\n } else if (str) {\n key = 'string';\n } else if (arr) {\n key = 'array';\n } // if the value is not of a supported type for range validation\n // the validation rule rule should use the\n // type property to also test for a particular type\n\n\n if (!key) {\n return false;\n }\n\n if (arr) {\n val = value.length;\n }\n\n if (str) {\n // 处理码点大于U+010000的文字length属性不准确的bug,如\"𠮷𠮷𠮷\".lenght !== 3\n val = value.replace(spRegexp, '_').length;\n }\n\n if (len) {\n if (val !== rule.len) {\n errors.push(format(options.messages[key].len, rule.fullField, rule.len));\n }\n } else if (min && !max && val < rule.min) {\n errors.push(format(options.messages[key].min, rule.fullField, rule.min));\n } else if (max && !min && val > rule.max) {\n errors.push(format(options.messages[key].max, rule.fullField, rule.max));\n } else if (min && max && (val < rule.min || val > rule.max)) {\n errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n }\n};\n\nvar ENUM$1 = 'enum';\n\nvar enumerable$1 = function enumerable(rule, value, source, errors, options) {\n rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];\n\n if (rule[ENUM$1].indexOf(value) === -1) {\n errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(', ')));\n }\n};\n\nvar pattern$1 = function pattern(rule, value, source, errors, options) {\n if (rule.pattern) {\n if (rule.pattern instanceof RegExp) {\n // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n // flag is accidentally set to `true`, which in a validation scenario\n // is not necessary and the result might be misleading\n rule.pattern.lastIndex = 0;\n\n if (!rule.pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n } else if (typeof rule.pattern === 'string') {\n var _pattern = new RegExp(rule.pattern);\n\n if (!_pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n }\n }\n};\n\nvar rules = {\n required: required$1,\n whitespace: whitespace,\n type: type$1,\n range: range,\n \"enum\": enumerable$1,\n pattern: pattern$1\n};\n\nvar string = function string(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'string');\n\n if (!isEmptyValue(value, 'string')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n rules.pattern(rule, value, source, errors, options);\n\n if (rule.whitespace === true) {\n rules.whitespace(rule, value, source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar method = function method(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar number = function number(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (value === '') {\n value = undefined;\n }\n\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar _boolean = function _boolean(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar regexp = function regexp(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar integer = function integer(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar floatFn = function floatFn(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar array = function array(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if ((value === undefined || value === null) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'array');\n\n if (value !== undefined && value !== null) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar object = function object(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar ENUM = 'enum';\n\nvar enumerable = function enumerable(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules[ENUM](rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar pattern = function pattern(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'string')) {\n rules.pattern(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar date = function date(rule, value, callback, source, options) {\n // console.log('integer rule called %j', rule);\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); // console.log('validate on %s value', value);\n\n if (validate) {\n if (isEmptyValue(value, 'date') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'date')) {\n var dateObject;\n\n if (value instanceof Date) {\n dateObject = value;\n } else {\n dateObject = new Date(value);\n }\n\n rules.type(rule, dateObject, source, errors, options);\n\n if (dateObject) {\n rules.range(rule, dateObject.getTime(), source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar required = function required(rule, value, callback, source, options) {\n var errors = [];\n var type = Array.isArray(value) ? 'array' : typeof value;\n rules.required(rule, value, source, errors, options, type);\n callback(errors);\n};\n\nvar type = function type(rule, value, callback, source, options) {\n var ruleType = rule.type;\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, ruleType) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, ruleType);\n\n if (!isEmptyValue(value, ruleType)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar any = function any(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n }\n\n callback(errors);\n};\n\nvar validators = {\n string: string,\n method: method,\n number: number,\n \"boolean\": _boolean,\n regexp: regexp,\n integer: integer,\n \"float\": floatFn,\n array: array,\n object: object,\n \"enum\": enumerable,\n pattern: pattern,\n date: date,\n url: type,\n hex: type,\n email: type,\n required: required,\n any: any\n};\n\nfunction newMessages() {\n return {\n \"default\": 'Validation error on field %s',\n required: '%s is required',\n \"enum\": '%s must be one of %s',\n whitespace: '%s cannot be empty',\n date: {\n format: '%s date %s is invalid for format %s',\n parse: '%s date could not be parsed, %s is invalid ',\n invalid: '%s date %s is invalid'\n },\n types: {\n string: '%s is not a %s',\n method: '%s is not a %s (function)',\n array: '%s is not an %s',\n object: '%s is not an %s',\n number: '%s is not a %s',\n date: '%s is not a %s',\n \"boolean\": '%s is not a %s',\n integer: '%s is not an %s',\n \"float\": '%s is not a %s',\n regexp: '%s is not a valid %s',\n email: '%s is not a valid %s',\n url: '%s is not a valid %s',\n hex: '%s is not a valid %s'\n },\n string: {\n len: '%s must be exactly %s characters',\n min: '%s must be at least %s characters',\n max: '%s cannot be longer than %s characters',\n range: '%s must be between %s and %s characters'\n },\n number: {\n len: '%s must equal %s',\n min: '%s cannot be less than %s',\n max: '%s cannot be greater than %s',\n range: '%s must be between %s and %s'\n },\n array: {\n len: '%s must be exactly %s in length',\n min: '%s cannot be less than %s in length',\n max: '%s cannot be greater than %s in length',\n range: '%s must be between %s and %s in length'\n },\n pattern: {\n mismatch: '%s value %s does not match pattern %s'\n },\n clone: function clone() {\n var cloned = JSON.parse(JSON.stringify(this));\n cloned.clone = this.clone;\n return cloned;\n }\n };\n}\nvar messages = newMessages();\n\n/**\n * Encapsulates a validation schema.\n *\n * @param descriptor An object declaring validation rules\n * for this schema.\n */\n\nvar Schema = /*#__PURE__*/function () {\n // ========================= Static =========================\n // ======================== Instance ========================\n function Schema(descriptor) {\n this.rules = null;\n this._messages = messages;\n this.define(descriptor);\n }\n\n var _proto = Schema.prototype;\n\n _proto.define = function define(rules) {\n var _this = this;\n\n if (!rules) {\n throw new Error('Cannot configure a schema with no rules');\n }\n\n if (typeof rules !== 'object' || Array.isArray(rules)) {\n throw new Error('Rules must be an object');\n }\n\n this.rules = {};\n Object.keys(rules).forEach(function (name) {\n var item = rules[name];\n _this.rules[name] = Array.isArray(item) ? item : [item];\n });\n };\n\n _proto.messages = function messages(_messages) {\n if (_messages) {\n this._messages = deepMerge(newMessages(), _messages);\n }\n\n return this._messages;\n };\n\n _proto.validate = function validate(source_, o, oc) {\n var _this2 = this;\n\n if (o === void 0) {\n o = {};\n }\n\n if (oc === void 0) {\n oc = function oc() {};\n }\n\n var source = source_;\n var options = o;\n var callback = oc;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (!this.rules || Object.keys(this.rules).length === 0) {\n if (callback) {\n callback(null, source);\n }\n\n return Promise.resolve(source);\n }\n\n function complete(results) {\n var errors = [];\n var fields = {};\n\n function add(e) {\n if (Array.isArray(e)) {\n var _errors;\n\n errors = (_errors = errors).concat.apply(_errors, e);\n } else {\n errors.push(e);\n }\n }\n\n for (var i = 0; i < results.length; i++) {\n add(results[i]);\n }\n\n if (!errors.length) {\n callback(null, source);\n } else {\n fields = convertFieldsError(errors);\n callback(errors, fields);\n }\n }\n\n if (options.messages) {\n var messages$1 = this.messages();\n\n if (messages$1 === messages) {\n messages$1 = newMessages();\n }\n\n deepMerge(messages$1, options.messages);\n options.messages = messages$1;\n } else {\n options.messages = this.messages();\n }\n\n var series = {};\n var keys = options.keys || Object.keys(this.rules);\n keys.forEach(function (z) {\n var arr = _this2.rules[z];\n var value = source[z];\n arr.forEach(function (r) {\n var rule = r;\n\n if (typeof rule.transform === 'function') {\n if (source === source_) {\n source = _extends({}, source);\n }\n\n value = source[z] = rule.transform(value);\n }\n\n if (typeof rule === 'function') {\n rule = {\n validator: rule\n };\n } else {\n rule = _extends({}, rule);\n } // Fill validator. Skip if nothing need to validate\n\n\n rule.validator = _this2.getValidationMethod(rule);\n\n if (!rule.validator) {\n return;\n }\n\n rule.field = z;\n rule.fullField = rule.fullField || z;\n rule.type = _this2.getType(rule);\n series[z] = series[z] || [];\n series[z].push({\n rule: rule,\n value: value,\n source: source,\n field: z\n });\n });\n });\n var errorFields = {};\n return asyncMap(series, options, function (data, doIt) {\n var rule = data.rule;\n var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField === 'object');\n deep = deep && (rule.required || !rule.required && data.value);\n rule.field = data.field;\n\n function addFullField(key, schema) {\n return _extends({}, schema, {\n fullField: rule.fullField + \".\" + key,\n fullFields: rule.fullFields ? [].concat(rule.fullFields, [key]) : [key]\n });\n }\n\n function cb(e) {\n if (e === void 0) {\n e = [];\n }\n\n var errorList = Array.isArray(e) ? e : [e];\n\n if (!options.suppressWarning && errorList.length) {\n Schema.warning('async-validator:', errorList);\n }\n\n if (errorList.length && rule.message !== undefined) {\n errorList = [].concat(rule.message);\n } // Fill error info\n\n\n var filledErrors = errorList.map(complementError(rule, source));\n\n if (options.first && filledErrors.length) {\n errorFields[rule.field] = 1;\n return doIt(filledErrors);\n }\n\n if (!deep) {\n doIt(filledErrors);\n } else {\n // if rule is required but the target object\n // does not exist fail at the rule level and don't\n // go deeper\n if (rule.required && !data.value) {\n if (rule.message !== undefined) {\n filledErrors = [].concat(rule.message).map(complementError(rule, source));\n } else if (options.error) {\n filledErrors = [options.error(rule, format(options.messages.required, rule.field))];\n }\n\n return doIt(filledErrors);\n }\n\n var fieldsSchema = {};\n\n if (rule.defaultField) {\n Object.keys(data.value).map(function (key) {\n fieldsSchema[key] = rule.defaultField;\n });\n }\n\n fieldsSchema = _extends({}, fieldsSchema, data.rule.fields);\n var paredFieldsSchema = {};\n Object.keys(fieldsSchema).forEach(function (field) {\n var fieldSchema = fieldsSchema[field];\n var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];\n paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));\n });\n var schema = new Schema(paredFieldsSchema);\n schema.messages(options.messages);\n\n if (data.rule.options) {\n data.rule.options.messages = options.messages;\n data.rule.options.error = options.error;\n }\n\n schema.validate(data.value, data.rule.options || options, function (errs) {\n var finalErrors = [];\n\n if (filledErrors && filledErrors.length) {\n finalErrors.push.apply(finalErrors, filledErrors);\n }\n\n if (errs && errs.length) {\n finalErrors.push.apply(finalErrors, errs);\n }\n\n doIt(finalErrors.length ? finalErrors : null);\n });\n }\n }\n\n var res;\n\n if (rule.asyncValidator) {\n res = rule.asyncValidator(rule, data.value, cb, data.source, options);\n } else if (rule.validator) {\n try {\n res = rule.validator(rule, data.value, cb, data.source, options);\n } catch (error) {\n console.error == null ? void 0 : console.error(error); // rethrow to report error\n\n if (!options.suppressValidatorError) {\n setTimeout(function () {\n throw error;\n }, 0);\n }\n\n cb(error.message);\n }\n\n if (res === true) {\n cb();\n } else if (res === false) {\n cb(typeof rule.message === 'function' ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + \" fails\");\n } else if (res instanceof Array) {\n cb(res);\n } else if (res instanceof Error) {\n cb(res.message);\n }\n }\n\n if (res && res.then) {\n res.then(function () {\n return cb();\n }, function (e) {\n return cb(e);\n });\n }\n }, function (results) {\n complete(results);\n }, source);\n };\n\n _proto.getType = function getType(rule) {\n if (rule.type === undefined && rule.pattern instanceof RegExp) {\n rule.type = 'pattern';\n }\n\n if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n throw new Error(format('Unknown rule type %s', rule.type));\n }\n\n return rule.type || 'string';\n };\n\n _proto.getValidationMethod = function getValidationMethod(rule) {\n if (typeof rule.validator === 'function') {\n return rule.validator;\n }\n\n var keys = Object.keys(rule);\n var messageIndex = keys.indexOf('message');\n\n if (messageIndex !== -1) {\n keys.splice(messageIndex, 1);\n }\n\n if (keys.length === 1 && keys[0] === 'required') {\n return validators.required;\n }\n\n return validators[this.getType(rule)] || undefined;\n };\n\n return Schema;\n}();\n\nSchema.register = function register(type, validator) {\n if (typeof validator !== 'function') {\n throw new Error('Cannot register a validator by type, validator is not a function');\n }\n\n validators[type] = validator;\n};\n\nSchema.warning = warning;\nSchema.messages = messages;\nSchema.validators = validators;\n\nexport { Schema as default };\n//# sourceMappingURL=index.js.map\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\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};\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 Rules,\n SpanInfo,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\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 = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawImageX = 0;\n drawImageY = 0;\n drawImageWidth = 0;\n drawImageHeight = 0;\n drawImageName = '';\n drawImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || 'center';\n this.verticalAlign = column.verticalAlign || 'middle';\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (this.type === 'tree' && cellType === 'body') {\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n iconOffsetX = level * 8;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n iconOffsetX = level * 8;\n } else {\n iconOffsetX = level * 8;\n }\n let iconWidth = 20;\n let iconHeight = 20;\n if (icon) {\n let iconX = this.drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n this.ctx.paint.drawImage(icon, iconX, iconY, iconWidth, iconHeight);\n this.drawImageX = iconX;\n this.drawImageY = iconY;\n this.drawImageWidth = iconWidth;\n this.drawImageHeight = iconHeight;\n this.drawImageName = iconName;\n this.drawImageSource = icon;\n }\n // 更改文本距离\n this.align = 'left';\n this.drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n }\n }\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n 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 = READONLY_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 focusCell = this.ctx.focusCell;\n const hoverCell = this.ctx.hoverCell;\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 && focusCell) {\n if (focusCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (focusCell.rowIndex >= minY && focusCell.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 = READONLY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n // 选中框类型\n if (['index-selection', 'selection'].includes(type)) {\n const check = this.ctx.database.getRowSelection(rowKey);\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\n const _x = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n const _y = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage && type == 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n } else if (checkboxImage && 'selection' === type) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawImageName = this.hoverIconName;\n this.drawImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.text, this.width, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, this.visibleWidth, this.visibleHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\n }\n if (this.hoverIconName) {\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawImageX - 2,\n this.drawImageY - 2,\n this.drawImageWidth + 4,\n this.drawImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n }\n this.ctx.paint.drawImage(\n this.drawImageSource,\n this.drawImageX,\n this.drawImageY,\n this.drawImageWidth,\n this.drawImageHeight,\n );\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import Schema, { ValidateError } from 'async-validator';\nimport type CellHeader from './CellHeader';\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 Descriptor,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n} from './types';\nimport { generateShortUUID } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateError[]>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n init() {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n this.itemRowKeyMap = new WeakMap();\n const { ROW_KEY, ENABLE_RESERVE_SELECTION } = this.ctx.config;\n // 没有跨页选时清除\n if (!(ENABLE_RESERVE_SELECTION && ROW_KEY)) {\n this.selectionMap.clear();\n }\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) {\n dataList.forEach((item, index) => {\n let hasChildren = item._hasChildren || false;\n if (Array.isArray(item.children) && item.children.length) {\n hasChildren = true;\n this.initData(item.children, level + 1);\n }\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 this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand: DEFAULT_EXPAND_ALL,\n expandLazy: false,\n hasChildren,\n expandLoading: false,\n item,\n });\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.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 let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\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.rowKeyMap.forEach((row: any) => {\n row.expand = 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 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.rowKeyMap.get(rowKey).index;\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(_list: ChangeItem[], history = false) {\n let historyList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n }\n changeList.forEach((data) => {\n const { value, rowKey, key, oldValue } = data;\n rowKeyList.add(rowKey);\n this.setItemValue(rowKey, key, value);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @returns\n */\n async setItemValue(rowKey: string, key: string, _value: any, history = false, reDraw = false, isEditor = false) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange([\n {\n rowKey,\n key,\n value,\n oldValue: item[key],\n row,\n },\n ]);\n if (values && values.length) {\n value = values[0].value;\n }\n }\n // 设置改变值\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n const changeItem: ChangeItem = {\n rowKey,\n key,\n oldValue,\n value,\n row,\n };\n // 实时校验错误\n this.getValidator(rowKey, key).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', [changeItem], [row]);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 添加历史记录\n if (history) {\n this.ctx.history.pushState({\n type: 'single',\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n changeList: [\n {\n rowKey,\n key,\n oldValue,\n newValue: value,\n },\n ],\n });\n }\n\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n } else {\n this.selectionMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\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 let descriptor: Descriptor = {};\n let data: any = {};\n data[key] = this.getItemValue(rowKey, key);\n if (Array.isArray(rules)) {\n const _rules = rules.map((item) => {\n return {\n ...item,\n row: row.item,\n column,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n };\n });\n descriptor[key] = _rules;\n } else {\n descriptor[key] = {\n ...rules,\n row: row.item,\n column,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n };\n }\n\n const validator = new Schema(descriptor);\n validator\n .validate(data)\n .then(() => {\n this.clearValidationError(rowKey, key);\n resolve([]);\n })\n .catch(({ errors }) => {\n const _errors = errors.map((error: any) => ({\n ...error,\n column,\n key,\n row: row.item,\n rowKey,\n }));\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n });\n } else {\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 errors: ValidateError[] = [\n {\n message,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: any[]) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false);\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n 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 this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\r\nimport {\r\n BeforeAutofillDataMethod,\r\n BeforeCellValueChangeMethod,\r\n BeforeCopyMethod,\r\n BeforePasteDataMethod,\r\n BeforeSetAutofillMethod,\r\n BeforeSetSelectorMethod,\r\n CellEditorMethod,\r\n CellHeaderStyleMethod,\r\n CellHoverIconMethod,\r\n CellReadonlyMethod,\r\n CellRenderMethod,\r\n CellRulesMethod,\r\n CellStyleMethod,\r\n CellTypeMethod,\r\n ConfigType,\r\n ExpandLazyMethod,\r\n FooterPosition,\r\n FormatterMethod,\r\n MenuItem,\r\n SelectableMethod,\r\n SpanMethod,\r\n} from './types';\r\n\r\nexport default class Config {\r\n CSS_PREFIX = 'e-virt-table';\r\n ICONS: IconType[] = [];\r\n ROW_KEY = '';\r\n DISABLED = false; //禁用编辑,优先等级最高\r\n HEADER_FONT = '12px normal Arial';\r\n BODY_FONT = '12px normal Arial';\r\n BORDER = true;\r\n STRIPE = false; //斑马纹\r\n STRIPE_COLOR = '#fafafa'; //斑马纹颜色\r\n BORDER_COLOR = '#e1e6eb';\r\n WIDTH = 0;\r\n RESIZE_MIN_WIDTH = 40;\r\n HEIGHT = 0;\r\n PLACEHOLDER_COLOR = '#CDD0DC';\r\n EMPTY_BODY_HEIGHT = 120;\r\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n EMPTY_TEXT = '暂无数据';\r\n MAX_HEIGHT = 1000;\r\n BORDER_RADIUS = 8;\r\n ENABLE_OFFSET_HEIGHT = false;\r\n OFFSET_HEIGHT = 0;\r\n HEADER_HEIGHT = 36;\r\n ENABLE_RESERVE_SELECTION = false; // 启用保留选中行\r\n ENABLE_HEADER_STICKY = false; // 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素\r\n HEADER_BG_COLOR = '#F8FAFF';\r\n BODY_BG_COLOR = '#FFF';\r\n HEADER_TEXT_COLOR = '#1D2129';\r\n LOADING_ICON_SVG = '';\r\n LOADING_ICON_COLOR = '#4E5969';\r\n EXPAND_ICON_SVG = '';\r\n SHRINK_ICON_SVG = '';\r\n EXPAND_ICON_COLOR = '#4E5969';\r\n SHRINK_ICON_COLOR = '#4E5969';\r\n ERROR_TIP_ICON_COLOR = 'red';\r\n ERROR_TIP_ICON_SIZE = 6;\r\n EXPAND_LAZY = true;\r\n DEFAULT_EXPAND_ALL = false;\r\n CELL_WIDTH = 100;\r\n CELL_HEIGHT = 36;\r\n CELL_PADDING = 8;\r\n CELL_HOVER_ICON_SIZE = 14;\r\n CELL_HOVER_ICON_BG_COLOR = '#fff';\r\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\r\n SCROLLER_TRACK_SIZE = 14;\r\n SCROLLER_SIZE = 8;\r\n SCROLLER_COLOR = '#dee0e3';\r\n SCROLLER_TRACK_COLOR = '#fff';\r\n SCROLLER_FOCUS_COLOR = '#bbbec4';\r\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\r\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\r\n SELECT_ROW_COL_BG_COLOR = 'transparent';\r\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\r\n EDIT_BG_COLOR = '#fcf6ed';\r\n CHECKBOX_KEY = '';\r\n CHECKBOX_COLOR = 'rgb(82,146,247)';\r\n CHECKBOX_SIZE = 20;\r\n CHECKBOX_DISABLED_SVG = '';\r\n CHECKBOX_CHECK_SVG = '';\r\n CHECKBOX_UNCHECK_SVG = '';\r\n CHECKBOX_INDETERMINATE_SVG = '';\r\n READONLY_COLOR = '#fff';\r\n READONLY_TEXT_COLOR = '#4E5969';\r\n ERROR_TIP_COLOR = '#ED3F14';\r\n FOOTER_BG_COLOR = '#fafafa';\r\n FOOTER_FIXED = true;\r\n FOOTER_POSITION: FooterPosition = 'bottom';\r\n CELL_FOOTER_HEIGHT = 36;\r\n ENABLE_SELECTOR = true;\r\n ENABLE_EDIT_SINGLE_CLICK = false; // 启用单点击立马编辑\r\n ENABLE_EDIT_CLICK_SELECTOR = true; // 启用点击选择器编辑\r\n SELECTOR_AREA_MIN_X = 0; // 选择器X最小范围\r\n SELECTOR_AREA_MAX_X_OFFSET = 0; // 选择器X最大范围colMax - offset\r\n SELECTOR_AREA_MAX_X = 0; // 选择器X最大范围,0默认最大colMax\r\n SELECTOR_AREA_MIN_Y = 0; // 选择器Y最小范围\r\n SELECTOR_AREA_MAX_Y = 0; // 选择器Y最大范围,0默认rowMax\r\n SELECTOR_AREA_MAX_Y_OFFSET = 0; // 选择器Y最大范围,0默认rowMax\r\n ENABLE_SELECTOR_SINGLE = false;\r\n ENABLE_SELECTOR_SPAN_COL = true;\r\n ENABLE_SELECTOR_SPAN_ROW = true;\r\n ENABLE_SELECTOR_ALL_ROWS = true;\r\n ENABLE_SELECTOR_ALL_COLS = true;\r\n ENABLE_MERGE_CELL_LINK = false; // 启用合并选择器关联\r\n ENABLE_AUTOFILL = false;\r\n ENABLE_CONTEXT_MENU = false;\r\n ENABLE_COPY = true;\r\n ENABLE_PASTER = true;\r\n ENABLE_RESIZE_ROW = true;\r\n ENABLE_RESIZE_COLUMN = true;\r\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\r\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\r\n RESIZE_ROW_MIN_HEIGHT = 36;\r\n RESIZE_COLUMN_MIN_WIDTH = 40;\r\n ENABLE_KEYBOARD = true;\r\n ENABLE_HISTORY = false;\r\n ENABLE_VALIDATOR_IMMEDIATE = true;\r\n HISTORY_NUM = 50;\r\n HIGHLIGHT_HOVER_ROW = false;\r\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\r\n HIGHLIGHT_SELECTED_ROW = false;\r\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\r\n TOOLTIP_BG_COLOR = '#303133';\r\n TOOLTIP_TEXT_COLOR = '#fff';\r\n TOOLTIP_ZINDEX = 3000;\r\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n CONTEXT_MENU: MenuItem[] = [\r\n { label: '复制', value: 'copy' },\r\n { label: '剪切', value: 'cut' },\r\n { label: '粘贴', value: 'paste' },\r\n { label: '清空选中内容', value: 'clearSelected' },\r\n ];\r\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\r\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\r\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\r\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\r\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\r\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\r\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\r\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\r\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\r\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\r\n SPAN_METHOD?: SpanMethod;\r\n SELECTABLE_METHOD?: SelectableMethod;\r\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\r\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\r\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\r\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\r\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\r\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\r\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\r\n constructor(config: Partial<Config>) {\r\n Object.assign(this, config);\r\n }\r\n\r\n init(config: ConfigType) {\r\n Object.assign(this, config);\r\n }\r\n}\r\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color, item.isBlob).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 并行执行所有异步操作\r\n await Promise.all(promises);\r\n // 加载完成后触发绘制\r\n this.ctx.emit('draw');\r\n }\r\n private async createImageFromSVG(svgContent: string, fill?: string, isBlob = false) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n let url = '';\r\n if (isBlob) {\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n url = URL.createObjectURL(svgBlob);\r\n } else {\r\n url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n }\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport { generateShortUUID } from './util';\r\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Rules, Type, VerticalAlign } from './types';\r\nimport BaseCell from './BaseCell';\r\nexport default class CellHeader extends BaseCell {\r\n align: Align;\r\n verticalAlign: VerticalAlign = 'middle';\r\n fixed?: Fixed;\r\n widthFillDisable: boolean;\r\n type: Type | '';\r\n operation = false;\r\n editorType: string;\r\n level: number;\r\n text: string;\r\n displayText: string = '';\r\n colspan: number;\r\n rowspan: number;\r\n row: any;\r\n key: string;\r\n required = false;\r\n readonly = false;\r\n children: Column[] = [];\r\n column: Column;\r\n colIndex: number;\r\n rowKey: string;\r\n rules?: Rules;\r\n hasChildren: boolean;\r\n render: Render;\r\n style: Partial<CSSStyleDeclaration> = {};\r\n drawX = 0;\r\n drawY = 0;\r\n drawCellBgColor = '';\r\n drawTextColor = '';\r\n drawImageX = 0;\r\n drawImageY = 0;\r\n drawImageWidth = 0;\r\n drawImageHeight = 0;\r\n drawImageName = '';\r\n drawImageSource: HTMLImageElement | undefined;\r\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\r\n super(ctx, x, y, width, height, 'header', column.fixed);\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.colIndex = colIndex;\r\n this.key = column.key;\r\n this.type = column.type || '';\r\n this.editorType = column.editorType || 'text';\r\n this.align = column.align || 'center';\r\n this.verticalAlign = column.verticalAlign || 'middle';\r\n this.fixed = column.fixed;\r\n this.level = column.level || 0;\r\n this.operation = column.operation || false;\r\n this.text = column.title;\r\n this.column = column;\r\n this.colspan = column.colspan || 1;\r\n this.widthFillDisable = column.widthFillDisable || false;\r\n this.rowspan = column.rowspan || 1;\r\n this.rules = column.rules;\r\n this.readonly = column.readonly || false;\r\n this.required = column.required || false;\r\n this.rowKey = generateShortUUID();\r\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\r\n this.render = column.renderHeader;\r\n }\r\n /**\r\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\r\n * @returns\r\n */\r\n isVerticalVisible() {\r\n const { stageHeight } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\r\n }\r\n\r\n /**\r\n * 更新样式\r\n */\r\n updateStyle() {\r\n this.style = this.getOverlayerViewsStyle();\r\n }\r\n updateContainer() {\r\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\r\n let bgColor = HEADER_BG_COLOR;\r\n let textColor = HEADER_TEXT_COLOR;\r\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\r\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\r\n const { backgroundColor, color } =\r\n headerCellStyleMethod({\r\n colIndex: this.colIndex,\r\n column: this.column,\r\n }) || {};\r\n if (backgroundColor) {\r\n bgColor = backgroundColor;\r\n }\r\n // 文字颜色\r\n if (color) {\r\n textColor = color;\r\n }\r\n }\r\n this.drawCellBgColor = bgColor;\r\n this.drawTextColor = textColor;\r\n }\r\n update() {\r\n this.updateContainer();\r\n this.displayText = this.getText();\r\n this.drawX = this.getDrawX();\r\n this.drawY = this.getDrawY();\r\n this.updateStyle();\r\n }\r\n draw() {\r\n const {\r\n paint,\r\n config: { BORDER_COLOR, CELL_PADDING, HEADER_FONT, BORDER },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n // 有边框的情况下,绘制边框\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\r\n fillColor: this.drawCellBgColor,\r\n });\r\n paint.drawText(displayText, drawX, drawY, this.width, this.height, {\r\n font: HEADER_FONT,\r\n padding: CELL_PADDING,\r\n color: this.drawTextColor,\r\n align: this.align,\r\n verticalAlign: this.verticalAlign,\r\n });\r\n this.drawSelection();\r\n this.drawSelector();\r\n }\r\n private drawSelector() {\r\n // 选择区背景颜色\r\n const { ENABLE_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_SELECTOR) {\r\n return;\r\n }\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (this.colIndex >= minX && this.colIndex <= maxX) {\r\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\r\n borderColor: 'transparent',\r\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\r\n });\r\n }\r\n }\r\n private drawSelection() {\r\n const { width, height, type } = this;\r\n // 选中框类型\r\n if (['index-selection', 'selection'].includes(type)) {\r\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\r\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\r\n const _x = this.drawX + (width - CHECKBOX_SIZE) / 2;\r\n const _y = this.drawY + (height - CHECKBOX_SIZE) / 2;\r\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\r\n let checkboxName = 'checkbox-uncheck';\r\n if (indeterminate) {\r\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\r\n checkboxName = 'checkbox-indeterminate';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check');\r\n checkboxName = 'checkbox-check';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\r\n checkboxName = 'checkbox-check-disabled';\r\n } else if (!check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\r\n checkboxName = 'checkbox-uncheck';\r\n } else {\r\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\r\n checkboxName = 'checkbox-disabled';\r\n }\r\n if (checkboxImage) {\r\n this.drawImageX = _x;\r\n this.drawImageY = _y;\r\n this.drawImageWidth = CHECKBOX_SIZE;\r\n this.drawImageHeight = CHECKBOX_SIZE;\r\n this.drawImageName = checkboxName;\r\n this.drawImageSource = checkboxImage;\r\n this.ctx.paint.drawImage(\r\n this.drawImageSource,\r\n this.drawImageX,\r\n this.drawImageY,\r\n this.drawImageWidth,\r\n this.drawImageHeight,\r\n );\r\n }\r\n }\r\n }\r\n getText() {\r\n if (this.render) {\r\n return '';\r\n }\r\n return this.text;\r\n }\r\n /**\r\n * 获取样式\r\n */\r\n getOverlayerViewsStyle() {\r\n let left = '';\r\n if (this.fixed === 'left') {\r\n left = `${this.drawX}px`;\r\n } else if (this.fixed === 'right') {\r\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\r\n } else {\r\n // 中间的,需要减去左边固定列的宽度\r\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\r\n }\r\n return {\r\n position: 'absolute',\r\n overflow: 'hidden',\r\n left: left,\r\n top: `${this.drawY + 1}px`,\r\n width: `${this.width}px`,\r\n height: `${this.height - 2}px`,\r\n pointerEvents: 'initial',\r\n userSelect: 'none',\r\n };\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n 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 // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n // 树事件\n this.treeClick(cell);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.ctx.emit('cellHeaderHoverChange', cell);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n this.selectionEnterAndLeave(cell, e);\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection = ['selection', 'index-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (cell.drawImageName === 'checkbox-uncheck' || cell.drawImageName === 'checkbox-indeterminate') {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.type === 'tree' && this.ctx.isPointer) {\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n }\n }\n private selectionEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否可选\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n }\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 } 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 isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history);\r\n } else {\r\n this.database.batchSetItemValue(_list, history);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.focusCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const item = this.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n if (item) {\r\n cellsData.push(item.value);\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n 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) => sum + (_item?.width || 100), 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 - 0.5 + '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.ctx.columnResizing = false;\n this.clientX = 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 let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let width = item.width || 100; // 读取映射宽度\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 - 0.5}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.floor(canvasWidth);\n canvasElement.height = Math.floor(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 this.ctx.canvasElement.setAttribute(\n 'style',\n ` height:${this.ctx.stageHeight}px;width:${this.ctx.stageWidth}px;`,\n );\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 e.preventDefault();\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 e.preventDefault();\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 e.preventDefault();\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n e.preventDefault();\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 e.preventDefault();\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') {\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 let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n private clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: null,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n // 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);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n ...clippingAncestor,\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n let htmlX = 0;\n let htmlY = 0;\n if (documentElement && !isOffsetParentAnElement && !isFixed) {\n const htmlRect = documentElement.getBoundingClientRect();\n htmlY = htmlRect.top + scroll.scrollTop;\n htmlX = htmlRect.left + scroll.scrollLeft -\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect);\n }\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlX;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlY;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const {\n left,\n top,\n width,\n height\n } = element.getBoundingClientRect();\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.ctx.on('mousemove', (e) => {\n // 鼠标移动时,判断是否在target上,不在则隐藏\n if (!this.ctx.isTarget(e)) {\n return;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n if (\n e.clientX < targetRect.x ||\n e.clientX > targetRect.x + targetRect.width ||\n e.clientY < targetRect.y ||\n e.clientY > targetRect.y + targetRect.height\n ) {\n this.hide();\n }\n });\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 }\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 private 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 === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n // 触发绘制,刷新\r\n this.ctx.emit('draw');\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if(!isVisible){\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport type Context from './Context';\r\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\r\nexport default class Overlayer {\r\n ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n }\r\n draw() {\r\n const overlayer = this.getContainer();\r\n this.ctx.emit('overlayerChange', overlayer);\r\n }\r\n destroy() {\r\n this.ctx.emit('overlayerChange', {\r\n style: {},\r\n views: [],\r\n });\r\n }\r\n private getContainer(): OverlayerContainer {\r\n const header = this.getHeader();\r\n const body = this.getBody();\r\n const footer = this.getFooter();\r\n let views: OverlayerWrapper[] = [];\r\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\r\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\r\n if (!FOOTER_FIXED) {\r\n views = [header, body];\r\n } else {\r\n if (FOOTER_POSITION === 'top') {\r\n views = [header, footer, body];\r\n } else {\r\n views = [header, body, footer];\r\n }\r\n }\r\n return {\r\n views,\r\n };\r\n }\r\n private getHeader() {\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\r\n let centerCells: CellHeader[] = [];\r\n let leftCells: CellHeader[] = [];\r\n let rightCells: CellHeader[] = [];\r\n renderCellHeaders.forEach((cellHeader) => {\r\n if (cellHeader.render) {\r\n if (cellHeader.fixed === 'left') {\r\n leftCells.push(cellHeader);\r\n } else if (cellHeader.fixed === 'right') {\r\n rightCells.push(cellHeader);\r\n } else {\r\n centerCells.push(cellHeader);\r\n }\r\n }\r\n });\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n left: `${fixedLeftWidth}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth + 1}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const header: OverlayerWrapper = {\r\n type: 'header',\r\n class: `${CSS_PREFIX}-overlayer-header`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return header;\r\n }\r\n private getBody() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n let renderRows = this.ctx.body.renderRows;\r\n // 合计如果不是固定在底部,就加入到渲染行中\r\n if (!this.ctx.config.FOOTER_FIXED) {\r\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\r\n }\r\n renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer') {\r\n cell.render = cell.renderFooter;\r\n }\r\n if (cell.render) {\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.body;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0}px`,\r\n right: `${0}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const body: OverlayerWrapper = {\r\n type: 'body',\r\n class: `${CSS_PREFIX}-overlayer-body`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return body;\r\n }\r\n private getFooter() {\r\n const centerCells: Cell[] = [];\r\n const leftCells: Cell[] = [];\r\n const rightCells: Cell[] = [];\r\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\r\n row.cells.forEach((cell: Cell) => {\r\n if (cell.cellType === 'footer' && cell.renderFooter) {\r\n // 把转renderFooter成render统一出口\r\n cell.render = cell.renderFooter;\r\n if (cell.fixed === 'left') {\r\n leftCells.push(cell);\r\n } else if (cell.fixed === 'right') {\r\n rightCells.push(cell);\r\n } else {\r\n centerCells.push(cell);\r\n }\r\n }\r\n });\r\n });\r\n const {\r\n fixedLeftWidth,\r\n fixedRightWidth: _fixedRightWidth,\r\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\r\n } = this.ctx;\r\n const { visibleWidth, visibleHeight } = this.ctx.footer;\r\n // 减去滚动条的宽度\r\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\r\n const left: OverlayerView = {\r\n key: 'left',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedLeftWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: leftCells,\r\n };\r\n const center: OverlayerView = {\r\n key: 'center',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n left: `${fixedLeftWidth - 0.5}px`,\r\n overflow: 'hidden',\r\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: centerCells,\r\n };\r\n const right: OverlayerView = {\r\n key: 'right',\r\n style: {\r\n position: 'absolute',\r\n top: `${0.5}px`,\r\n right: `${0.5}px`,\r\n overflow: 'hidden',\r\n width: `${fixedRightWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n cells: rightCells,\r\n };\r\n const footer: OverlayerWrapper = {\r\n type: 'footer',\r\n class: `${CSS_PREFIX}-overlayer-footer`,\r\n style: {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n width: `${visibleWidth}px`,\r\n height: `${visibleHeight}px`,\r\n },\r\n views: [left, center, right],\r\n };\r\n return footer;\r\n }\r\n}\r\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.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 ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n this.ctx.database.init();\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.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(ladong: boolean) {\r\n this.ctx.database.setLoading(ladong);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.scrollTo(0, 0);\r\n this.ctx.database.setFilterMethod(func);\r\n this.ctx.database.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(rowKey: string, key: string, value: any, history = true, reDraw = true, isEditor = false) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true) {\r\n this.ctx.database.batchSetItemValue(list, history);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw);\r\n this.editor.doneEdit();\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n 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 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 clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["_extends","target","i","source","key","_inheritsLoose","subClass","superClass","_setPrototypeOf","_getPrototypeOf","o","p","_isNativeReflectConstruct","_construct","Parent","args","Class","a","Constructor","instance","_isNativeFunction","fn","_wrapNativeSuper","_cache","Wrapper","formatRegExp","warning","type","errors","e","convertFieldsError","fields","error","field","format","template","_len","_key","len","str","x","isNativeStringType","isEmptyValue","value","asyncParallelArray","arr","func","callback","results","total","arrLength","count","asyncSerialArray","index","next","original","flattenObjArr","objArr","ret","k","AsyncValidationError","_Error","_this","asyncMap","option","_pending","resolve","reject","flattenArr","firstFields","objArrKeys","objArrLength","pending","isErrorObj","obj","getValue","path","v","complementError","rule","oe","fieldValue","deepMerge","s","required$1","options","whitespace","urlReg","getUrlRegex","word","b","v4","v6seg","v6","v46Exact","v4exact","v6exact","ip","protocol","auth","ipv4","ipv6","host","domain","tld","port","regex","pattern$2","types","type$1","custom","ruleType","range","min","max","spRegexp","val","num","ENUM$1","enumerable$1","pattern$1","_pattern","rules","string","validate","method","number","_boolean","regexp","integer","floatFn","array","object","ENUM","enumerable","pattern","date","dateObject","required","any","validators","newMessages","cloned","messages","Schema","descriptor","_proto","name","item","_messages","source_","oc","_this2","complete","add","_errors","messages$1","series","keys","z","r","errorFields","data","doIt","deep","addFullField","schema","cb","errorList","filledErrors","fieldsSchema","paredFieldsSchema","fieldSchema","fieldSchemaList","errs","finalErrors","res","messageIndex","validator","generateShortUUID","c","throttle","delay","lastCalledTime","timeoutId","now","elapsedTime","getMaxRow","sortFixed","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","column","row","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","cLen","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","params","mergeRowkey","visibleRows","rowIndex","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","BaseCell","ctx","y","width","height","cellType","__publicField","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","colIndex","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","rowKey","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","iconX","iconY","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","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","focusCell","hoverCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawX","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","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","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","ROW_KEY","ENABLE_RESERVE_SELECTION","dataList","_a","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","historyList","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","values","changeItem","selection","draw","_selectable","ignoreReserve","_","buffer","bufferState","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","indeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","BODY_CELL_RULES_METHOD","_rules","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","message","hasMergeCell","j","History","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","event","ENABLE_KEYBOARD","EventBus","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","url","svgBlob","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","displayText","EventTable","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","leafColumns","sum","_item","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","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","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","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","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","round","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","d","_overflowsData$filter2","currentSideAxis","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","leftScroll","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","htmlX","htmlY","htmlRect","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","items","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ladong","ValidateFields","scrollError","_err","leafCellHeaders","selected"],"mappings":"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","x_google_ignoreList":[0,21,22,23,24]}