e-virt-table 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 + 1; // +1是为了避免右边界的线被覆盖\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 } = 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 if (HIGHLIGHT_HOVER_ROW && hoverCell?.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (HIGHLIGHT_SELECTED_ROW && focusCell?.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = READONLY_TEXT_COLOR;\n // 只读\n if (['index', 'index-selection', 'selection'].includes(this.type)) {\n this.drawCellBgColor = BODY_BG_COLOR;\n this.drawTextColor = READONLY_TEXT_COLOR;\n return;\n }\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\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 // if (change) {\n // this.setBackgroundColor(\"red\");\n // }\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 { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING } = 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 _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n const _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n if (this.hoverIconName) {\n if (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) {\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 // 过去跨度配置\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 draw() {\n const {\n paint,\n config: { BORDER_COLOR },\n } = this.ctx;\n const { drawX, drawY } = this;\n // 绘制单元格\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER_COLOR,\n fillColor: this.drawCellBgColor,\n });\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n borderWidth: 1,\n fillColor: this.drawCellSkyBgColor,\n });\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\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 } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.text, this.width, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n return this.ctx.paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.visibleWidth,\n this.visibleHeight,\n {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color: this.drawTextColor,\n },\n );\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\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 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 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 this.ctx.paint.drawRect(drawX + this.width - 6, drawY + this.height - 6, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, width, rowIndex, colIndex } = this;\n let x = drawX + 0.5;\n let y = drawY + 0.5;\n let height = this.height;\n // 第一行减去1,不然会被表头覆盖\n if (rowIndex === 0) {\n y = this.y + 1;\n height = height - 1;\n }\n // 最后一列减去1,不然会被右边滚动条覆盖\n if (colIndex === this.ctx.maxColIndex) {\n x = x - 1;\n }\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // 选择\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n this.ctx.paint.drawLine([x, y, x + width - 2, y], {\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 this.ctx.paint.drawLine([x, y + height - 1.5, x + width, y + height - 1.5], {\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 this.ctx.paint.drawLine([x, y, x, y + height - 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 this.ctx.paint.drawLine([x + width - 1.5, y, x + width - 1.5, y + height - 1.5], {\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} 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 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 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 this.initData(this.data);\n this.getData();\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 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 changeList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let list = _list;\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 changeList = _list.map((item) => ({\n rowKey: item.rowKey,\n key: item.key,\n value: item.value,\n oldValue: this.getItemValue(item.rowKey, item.key),\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\n }));\n const values = await beforeCellValueChange(changeList);\n list = values;\n }\n list.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n this.setItemValue(rowKey, key, value);\n rowKeyList.add(rowKey);\n changeList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n const _changeList: ChangeItem[] = changeList.map((item) => {\n const row = this.ctx.database.getRowDataItemForRowKey(item.rowKey);\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n oldValue: item.oldValue,\n row,\n };\n });\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,\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 const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\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 let value = _value;\n // 是否是否是编辑器进来的\n if (isEditor) {\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: _value,\n oldValue: item[key],\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\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 row = this.ctx.database.getRowDataItemForRowKey(rowKey);\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: this.ctx.database.getRowDataItemForRowKey(rowKey),\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 row = this.rowKeyMap.get(rowKey);\n row.check = check;\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n row.check = !row.check;\n this.setRowSelectionByCheckboxKey(rowKey, row.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean) {\n const row = this.rowKeyMap.get(rowKey);\n row.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, row.check);\n const rows = this.getSelectionRows();\n this.ctx.emit('setRowSelection', rows);\n this.ctx.emit('draw');\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.rowKeyMap.forEach((row: any) => {\n if (row.check) {\n rows.push(row.item);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const { check } = this.rowKeyMap.get(rowKey);\n return 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) => {\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n row.check = true;\n }\n } else {\n if (_selectable) {\n row.check = true;\n }\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection() {\n this.rowKeyMap.forEach((row: any) => {\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n row.check = false;\n }\n } else {\n if (_selectable) {\n row.check = false;\n }\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n let total = 0;\n let totalChecked = 0;\n let totalSelectable = 0;\n this.rowKeyMap.forEach((row: any) => {\n total += 1;\n if (row.check) {\n totalChecked += 1;\n }\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n totalSelectable += 1;\n }\n } else {\n if (_selectable) {\n totalSelectable += 1;\n }\n }\n });\n const indeterminate = totalSelectable && totalSelectable > totalChecked && totalChecked > 0;\n const selectable = totalSelectable !== 0;\n const check = totalSelectable && totalSelectable === totalChecked;\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 return undefined;\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 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, 'body');\n return cell;\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, 'mousedown', (e) => {\r\n // 点击容器外\r\n if (!this.ctx.containerElement.contains(e.target as Node)) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n });\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.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 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';\r\n\r\nexport type LineOptions = {\r\n lineCap?: CanvasLineCap;\r\n lineDash?: number[];\r\n lineJoin?: CanvasLineJoin;\r\n borderWidth?: number;\r\n borderColor?: string | CanvasGradient | CanvasPattern;\r\n fillColor?: string | CanvasGradient | CanvasPattern;\r\n};\r\nexport type ShodowOptions = {\r\n side: 'left' | 'right' | 'top' | 'bottom';\r\n shadowWidth: number;\r\n colorStart: string;\r\n colorEnd: string;\r\n fillColor?: string | CanvasGradient | CanvasPattern;\r\n};\r\nexport type RectOptions = {\r\n borderWidth?: number;\r\n borderColor?: string;\r\n fillColor?: string;\r\n radius?: number | [number, number, number, number];\r\n};\r\nexport type DrawTextOptions = {\r\n font?: string;\r\n color?: string;\r\n align?: Align;\r\n padding?: number;\r\n verticalAlign?: VerticalAlign;\r\n};\r\nexport class Paint {\r\n private ctx: CanvasRenderingContext2D;\r\n constructor(target: HTMLCanvasElement) {\r\n const ctx = target.getContext('2d');\r\n if (!ctx) throw new Error('canvas context not found');\r\n this.ctx = ctx;\r\n }\r\n scale(dpr: number) {\r\n this.ctx.scale(dpr, dpr);\r\n }\r\n save() {\r\n this.ctx.save();\r\n }\r\n restore() {\r\n this.ctx.restore();\r\n }\r\n translate(x: number, y: number) {\r\n this.ctx.translate(x, y);\r\n }\r\n\r\n setCursor(cursor = 'default') {\r\n this.ctx.canvas.style.cursor = cursor;\r\n }\r\n clear(x = 0, y = 0, width?: number, height?: number) {\r\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\r\n }\r\n /**\r\n * 在 Canvas 上绘制单侧阴影\r\n * @param {number} x - 矩形的 x 坐标\r\n * @param {number} y - 矩形的 y 坐标\r\n * @param {number} width - 矩形的宽度\r\n * @param {number} height - 矩形的高度\r\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\r\n * @param {number} shadowWidth - 阴影的宽度\r\n * @param {string} color - 阴影的颜色\r\n */\r\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\r\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\r\n this.ctx.save();\r\n if (fillColor) {\r\n this.ctx.fillStyle = fillColor;\r\n this.ctx.fillRect(x, y, width, height);\r\n }\r\n let gradient: CanvasGradient;\r\n switch (side) {\r\n case 'left':\r\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\r\n break;\r\n case 'right':\r\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x + width, y, shadowWidth, height);\r\n break;\r\n case 'top':\r\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\r\n break;\r\n case 'bottom':\r\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x, y + height, width, shadowWidth);\r\n break;\r\n default:\r\n console.error('Invalid side specified for shadow');\r\n break;\r\n }\r\n }\r\n // 绘制线条\r\n drawLine(points: number[], options: LineOptions) {\r\n if (points.length < 4 || points.length % 2 !== 0) {\r\n throw new Error('A valid array of points is required to draw a line');\r\n }\r\n this.ctx.save();\r\n const { borderColor = 'black', borderWidth = 1 } = options;\r\n\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\r\n for (let i = 2; i < points.length; i += 2) {\r\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\r\n }\r\n this.ctx.strokeStyle = borderColor;\r\n this.ctx.lineWidth = borderWidth;\r\n if (options.lineDash) {\r\n this.ctx.lineDashOffset = 4;\r\n this.ctx.setLineDash(options.lineDash);\r\n }\r\n\r\n if (options.fillColor) {\r\n this.ctx.fillStyle = options.fillColor;\r\n this.ctx.fill();\r\n }\r\n if (options.borderColor) {\r\n this.ctx.strokeStyle = options.borderColor;\r\n }\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n this.ctx.restore();\r\n }\r\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\r\n this.ctx.save();\r\n this.ctx.drawImage(img, x, y, width, height);\r\n this.ctx.restore();\r\n }\r\n\r\n drawRect(\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\r\n ) {\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n // 填充颜色\r\n if (fillColor !== undefined) {\r\n this.ctx.fillStyle = fillColor;\r\n }\r\n\r\n // 线条宽度及绘制颜色\r\n if (borderColor !== undefined) {\r\n this.ctx.lineWidth = borderWidth;\r\n this.ctx.strokeStyle = borderColor;\r\n }\r\n if (radius === 0) {\r\n // 绘制矩形路径,- 0.5解决1px模糊的问题\r\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\r\n } else {\r\n // 确保 radius 是一个包含四个元素的数组\r\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\r\n // 绘制圆角矩形路径\r\n this.ctx.moveTo(x + tl, y);\r\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\r\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\r\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\r\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\r\n }\r\n\r\n // 如果有填充色,则填充\r\n if (fillColor !== undefined) {\r\n this.ctx.fill();\r\n }\r\n\r\n // 如果有绘制色,则绘制\r\n if (borderColor !== undefined) {\r\n this.ctx.stroke();\r\n }\r\n this.ctx.restore();\r\n }\r\n /**\r\n * 画文本\r\n * @param text\r\n * @param x\r\n * @param y\r\n * @param width\r\n * @param height\r\n * @param options\r\n * @returns 是否溢出\r\n */\r\n drawText(\r\n text: string = '',\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n options: DrawTextOptions = {},\r\n ): boolean {\r\n this.ctx.save();\r\n const {\r\n font = '12px Arial',\r\n align = 'center',\r\n color = '#495060',\r\n padding = 0,\r\n verticalAlign = 'middle',\r\n } = options;\r\n this.ctx.font = font;\r\n this.ctx.fillStyle = color;\r\n this.ctx.textBaseline = verticalAlign;\r\n this.ctx.textAlign = align;\r\n\r\n let yPos = 0;\r\n if (verticalAlign === 'top') {\r\n yPos = y + padding;\r\n } else if (verticalAlign === 'bottom') {\r\n yPos = y + height - padding;\r\n } else {\r\n yPos = y + (height + 1) / 2;\r\n }\r\n let xPos = 0;\r\n if (align === 'left') {\r\n xPos = x + padding;\r\n } else if (align === 'right') {\r\n xPos = x + width - padding;\r\n } else {\r\n xPos = x + width / 2;\r\n }\r\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\r\n this.ctx.fillText(_text, xPos, yPos);\r\n this.ctx.restore();\r\n return ellipsis;\r\n }\r\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\r\n let ellipsis = false;\r\n let _text = text;\r\n this.ctx.font = font;\r\n if (text === null || text === undefined || text === '') {\r\n return {\r\n _text: '',\r\n ellipsis,\r\n };\r\n }\r\n const ellipsesWidth = this.ctx.measureText('...').width;\r\n const textWidth = this.ctx.measureText(text).width;\r\n\r\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\r\n ellipsis = true;\r\n // text字符截取并添加省略号\r\n let textLength = 0;\r\n for (let i = 0; i < text.length; i++) {\r\n textLength += this.ctx.measureText(text[i]).width;\r\n if (textLength >= width - padding * 2 - ellipsesWidth) {\r\n _text = text.slice(0, i) + '...';\r\n break;\r\n }\r\n }\r\n }\r\n return {\r\n _text,\r\n ellipsis,\r\n };\r\n }\r\n}\r\n\r\nexport default Paint;\r\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_COLOR = '#e1e6eb';\r\n WIDTH = 0;\r\n RESIZE_MIN_WIDTH = 40;\r\n HEIGHT = 0;\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_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 = 20;\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 = false;\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 = 'LOADING_ICON_SVG' | 'EXPAND_ICON_SVG' | 'SHRINK_ICON_SVG' | 'CHECKBOX_UNCHECK_SVG' | 'CHECKBOX_CHECK_SVG' | 'CHECKBOX_DISABLED_SVG' | '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\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: '<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 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 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 },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER_COLOR,\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 });\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('mousemove', (e: MouseEvent) => {\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('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.imageEnterAndLeave(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.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', this.ctx.hoverCell, 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 /**\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();\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 // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\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 } else {\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\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 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 rowIndex = this.database.getRowIndexForRowKey(rowKey);\r\n const colIndex = this.database.getColIndexForKey(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((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history);\r\n }\r\n } else {\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true);\r\n }\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 if (buttons === 0) {\n this.onMouseUp();\n return;\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 // 拖拽移动滚动条\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 },\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 this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE;\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, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor: BORDER_COLOR,\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: BORDER_COLOR,\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 (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 drawFiexShadow() {\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 + 1, 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 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 draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFiexShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\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 draw() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n this.fixedCells.forEach((cell) => {\n cell.draw();\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 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 const { top } = canvasElement.getBoundingClientRect();\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 = 0;\n if (this.data.length && ENABLE_OFFSET_HEIGHT) {\n const windowInnerHeight = window.innerHeight;\n const visibleHeight = windowInnerHeight - top;\n stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (stageHeight < 0) {\n stageHeight = 32;\n console.error(\n 'There is an error in the height calculation ENABLE_OFFSET_HEIGHT and OFFSET_HEIGHT are invalid',\n );\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 } else {\n stageHeight = containerHeight;\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 // 鼠标移动\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 (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 drawFiexShadow() {\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 + 1, 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 this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFiexShadow();\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 drawFiexShadow() {\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 + 1, 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 draw() {\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFiexShadow();\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\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' || (e.shiftKey && e.code === 'Enter')) {\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' || (!e.shiftKey && e.code === 'Enter')) {\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();\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 // 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 type Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\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('cellMouseenter', (cell, e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\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, drawX, drawY, width, height } = cell;\r\n // 绘制自动填充点\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n const pointWh = 6;\r\n const pointX = drawX + width - pointWh;\r\n const pointY = drawY + height - pointWh;\r\n if (offsetX > pointX && offsetY > pointY) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('cellMousedown', () => {\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) => {\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', () => {\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('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\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 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 this.cellTarget = null;\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 if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { drawX, drawY, height, width } = 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 = `${drawX - 1}px`;\r\n this.editorEl.style.top = `${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();\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 || drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n 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 // 隐藏编辑器\r\n this.ctx.containerElement.focus();\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.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 this.editor.doneEdit();\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);\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);\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 /**\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","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","focusCell","hoverCell","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","hoverIconName","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","drawX","drawY","colSpan","cellHeader","BODY_FONT","ellipsis","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","yArr","maxX","maxY","xArrCopy","yArrCopy","minX","minY","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","lineDash","borderWidth","borderColor","fillColor","Database","footerData","dataList","ROW_KEY","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","changeList","rowKeyList","BEFORE_VALUE_CHANGE_METHOD","beforeCellValueChange","oldValue","rows","_changeList","promsieValidators","_value","reDraw","isEditor","changeKey","originalValue","values","changeItem","_selectable","totalChecked","totalSelectable","indeterminate","_a","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","BODY_CELL_RULES_METHOD","_rules","rowSpan","sumHeight","position","cell","topIndex","bottomIndex","leftIndex","rightIndex","offsetTop","offsetLeft","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","text","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","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","offsetY","offsetX","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","offset","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","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","isEmpty","containerHeight","_visibleHeight","canvasWidth","canvasHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","buffer","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","positionX","positionY","scrollSpeedX","scrollSpeedY","ENABLE_MERGE_CELL_LINK","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","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 + 1; // +1是为了避免右边界的线被覆盖\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 } = 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 if (HIGHLIGHT_HOVER_ROW && hoverCell?.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (HIGHLIGHT_SELECTED_ROW && focusCell?.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = READONLY_TEXT_COLOR;\n // 只读\n if (['index', 'index-selection', 'selection'].includes(this.type)) {\n this.drawCellBgColor = BODY_BG_COLOR;\n this.drawTextColor = READONLY_TEXT_COLOR;\n return;\n }\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\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 // if (change) {\n // this.setBackgroundColor(\"red\");\n // }\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 { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING } = 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 _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n const _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n if (this.hoverIconName) {\n if (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) {\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 // 过去跨度配置\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 draw() {\n const {\n paint,\n config: { BORDER_COLOR },\n } = this.ctx;\n const { drawX, drawY } = this;\n // 绘制单元格\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER_COLOR,\n fillColor: this.drawCellBgColor,\n });\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n borderWidth: 1,\n fillColor: this.drawCellSkyBgColor,\n });\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\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 } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.text, this.width, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n return this.ctx.paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.visibleWidth,\n this.visibleHeight,\n {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color: this.drawTextColor,\n },\n );\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\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 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 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 this.ctx.paint.drawRect(drawX + this.width - 6, drawY + this.height - 6, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, width, rowIndex, colIndex } = this;\n let x = drawX + 0.5;\n let y = drawY + 0.5;\n let height = this.height;\n // 第一行减去1,不然会被表头覆盖\n if (rowIndex === 0) {\n y = this.y + 1;\n height = height - 1;\n }\n // 最后一列减去1,不然会被右边滚动条覆盖\n if (colIndex === this.ctx.maxColIndex) {\n x = x - 1;\n }\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // 选择\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n this.ctx.paint.drawLine([x, y, x + width - 2, y], {\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 this.ctx.paint.drawLine([x, y + height - 1.5, x + width, y + height - 1.5], {\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 this.ctx.paint.drawLine([x, y, x, y + height - 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 this.ctx.paint.drawLine([x + width - 1.5, y, x + width - 1.5, y + height - 1.5], {\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} 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 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 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 this.initData(this.data);\n this.getData();\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 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 changeList: HistoryItemData[] = [];\n const rowKeyList: Set<string> = new Set();\n let list = _list;\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 changeList = _list.map((item) => ({\n rowKey: item.rowKey,\n key: item.key,\n value: item.value,\n oldValue: this.getItemValue(item.rowKey, item.key),\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\n }));\n const values = await beforeCellValueChange(changeList);\n list = values;\n }\n list.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n this.setItemValue(rowKey, key, value);\n rowKeyList.add(rowKey);\n changeList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n const _changeList: ChangeItem[] = changeList.map((item) => {\n const row = this.ctx.database.getRowDataItemForRowKey(item.rowKey);\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n oldValue: item.oldValue,\n row,\n };\n });\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,\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 const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\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 let value = _value;\n // 是否是否是编辑器进来的\n if (isEditor) {\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: _value,\n oldValue: item[key],\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\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 row = this.ctx.database.getRowDataItemForRowKey(rowKey);\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: this.ctx.database.getRowDataItemForRowKey(rowKey),\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 row = this.rowKeyMap.get(rowKey);\n row.check = check;\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n row.check = !row.check;\n this.setRowSelectionByCheckboxKey(rowKey, row.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean) {\n const row = this.rowKeyMap.get(rowKey);\n row.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, row.check);\n const rows = this.getSelectionRows();\n this.ctx.emit('setRowSelection', rows);\n this.ctx.emit('draw');\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.rowKeyMap.forEach((row: any) => {\n if (row.check) {\n rows.push(row.item);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const { check } = this.rowKeyMap.get(rowKey);\n return 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) => {\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n row.check = true;\n }\n } else {\n if (_selectable) {\n row.check = true;\n }\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection() {\n this.rowKeyMap.forEach((row: any) => {\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n row.check = false;\n }\n } else {\n if (_selectable) {\n row.check = false;\n }\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n let total = 0;\n let totalChecked = 0;\n let totalSelectable = 0;\n this.rowKeyMap.forEach((row: any) => {\n total += 1;\n if (row.check) {\n totalChecked += 1;\n }\n const _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n const selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n if (selectable) {\n totalSelectable += 1;\n }\n } else {\n if (_selectable) {\n totalSelectable += 1;\n }\n }\n });\n const indeterminate = totalSelectable && totalSelectable > totalChecked && totalChecked > 0;\n const selectable = totalSelectable !== 0;\n const check = totalSelectable && totalSelectable === totalChecked;\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 return undefined;\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 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, 'body');\n return cell;\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, 'mousedown', (e) => {\r\n // 点击容器外\r\n if (!this.ctx.containerElement.contains(e.target as Node) && this.ctx.selector.enable) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n });\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.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 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';\r\n\r\nexport type LineOptions = {\r\n lineCap?: CanvasLineCap;\r\n lineDash?: number[];\r\n lineJoin?: CanvasLineJoin;\r\n borderWidth?: number;\r\n borderColor?: string | CanvasGradient | CanvasPattern;\r\n fillColor?: string | CanvasGradient | CanvasPattern;\r\n};\r\nexport type ShodowOptions = {\r\n side: 'left' | 'right' | 'top' | 'bottom';\r\n shadowWidth: number;\r\n colorStart: string;\r\n colorEnd: string;\r\n fillColor?: string | CanvasGradient | CanvasPattern;\r\n};\r\nexport type RectOptions = {\r\n borderWidth?: number;\r\n borderColor?: string;\r\n fillColor?: string;\r\n radius?: number | [number, number, number, number];\r\n};\r\nexport type DrawTextOptions = {\r\n font?: string;\r\n color?: string;\r\n align?: Align;\r\n padding?: number;\r\n verticalAlign?: VerticalAlign;\r\n};\r\nexport class Paint {\r\n private ctx: CanvasRenderingContext2D;\r\n constructor(target: HTMLCanvasElement) {\r\n const ctx = target.getContext('2d');\r\n if (!ctx) throw new Error('canvas context not found');\r\n this.ctx = ctx;\r\n }\r\n scale(dpr: number) {\r\n this.ctx.scale(dpr, dpr);\r\n }\r\n save() {\r\n this.ctx.save();\r\n }\r\n restore() {\r\n this.ctx.restore();\r\n }\r\n translate(x: number, y: number) {\r\n this.ctx.translate(x, y);\r\n }\r\n\r\n setCursor(cursor = 'default') {\r\n this.ctx.canvas.style.cursor = cursor;\r\n }\r\n clear(x = 0, y = 0, width?: number, height?: number) {\r\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\r\n }\r\n /**\r\n * 在 Canvas 上绘制单侧阴影\r\n * @param {number} x - 矩形的 x 坐标\r\n * @param {number} y - 矩形的 y 坐标\r\n * @param {number} width - 矩形的宽度\r\n * @param {number} height - 矩形的高度\r\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\r\n * @param {number} shadowWidth - 阴影的宽度\r\n * @param {string} color - 阴影的颜色\r\n */\r\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\r\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\r\n this.ctx.save();\r\n if (fillColor) {\r\n this.ctx.fillStyle = fillColor;\r\n this.ctx.fillRect(x, y, width, height);\r\n }\r\n let gradient: CanvasGradient;\r\n switch (side) {\r\n case 'left':\r\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\r\n break;\r\n case 'right':\r\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x + width, y, shadowWidth, height);\r\n break;\r\n case 'top':\r\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\r\n break;\r\n case 'bottom':\r\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\r\n gradient.addColorStop(0, colorStart);\r\n gradient.addColorStop(1, colorEnd);\r\n this.ctx.fillStyle = gradient;\r\n this.ctx.fillRect(x, y + height, width, shadowWidth);\r\n break;\r\n default:\r\n console.error('Invalid side specified for shadow');\r\n break;\r\n }\r\n }\r\n // 绘制线条\r\n drawLine(points: number[], options: LineOptions) {\r\n if (points.length < 4 || points.length % 2 !== 0) {\r\n throw new Error('A valid array of points is required to draw a line');\r\n }\r\n this.ctx.save();\r\n const { borderColor = 'black', borderWidth = 1 } = options;\r\n\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\r\n for (let i = 2; i < points.length; i += 2) {\r\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\r\n }\r\n this.ctx.strokeStyle = borderColor;\r\n this.ctx.lineWidth = borderWidth;\r\n if (options.lineDash) {\r\n this.ctx.lineDashOffset = 4;\r\n this.ctx.setLineDash(options.lineDash);\r\n }\r\n\r\n if (options.fillColor) {\r\n this.ctx.fillStyle = options.fillColor;\r\n this.ctx.fill();\r\n }\r\n if (options.borderColor) {\r\n this.ctx.strokeStyle = options.borderColor;\r\n }\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n this.ctx.restore();\r\n }\r\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\r\n this.ctx.save();\r\n this.ctx.drawImage(img, x, y, width, height);\r\n this.ctx.restore();\r\n }\r\n\r\n drawRect(\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\r\n ) {\r\n this.ctx.save();\r\n this.ctx.beginPath();\r\n // 填充颜色\r\n if (fillColor !== undefined) {\r\n this.ctx.fillStyle = fillColor;\r\n }\r\n\r\n // 线条宽度及绘制颜色\r\n if (borderColor !== undefined) {\r\n this.ctx.lineWidth = borderWidth;\r\n this.ctx.strokeStyle = borderColor;\r\n }\r\n if (radius === 0) {\r\n // 绘制矩形路径,- 0.5解决1px模糊的问题\r\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\r\n } else {\r\n // 确保 radius 是一个包含四个元素的数组\r\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\r\n // 绘制圆角矩形路径\r\n this.ctx.moveTo(x + tl, y);\r\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\r\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\r\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\r\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\r\n }\r\n\r\n // 如果有填充色,则填充\r\n if (fillColor !== undefined) {\r\n this.ctx.fill();\r\n }\r\n\r\n // 如果有绘制色,则绘制\r\n if (borderColor !== undefined) {\r\n this.ctx.stroke();\r\n }\r\n this.ctx.restore();\r\n }\r\n /**\r\n * 画文本\r\n * @param text\r\n * @param x\r\n * @param y\r\n * @param width\r\n * @param height\r\n * @param options\r\n * @returns 是否溢出\r\n */\r\n drawText(\r\n text: string = '',\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n options: DrawTextOptions = {},\r\n ): boolean {\r\n this.ctx.save();\r\n const {\r\n font = '12px Arial',\r\n align = 'center',\r\n color = '#495060',\r\n padding = 0,\r\n verticalAlign = 'middle',\r\n } = options;\r\n this.ctx.font = font;\r\n this.ctx.fillStyle = color;\r\n this.ctx.textBaseline = verticalAlign;\r\n this.ctx.textAlign = align;\r\n\r\n let yPos = 0;\r\n if (verticalAlign === 'top') {\r\n yPos = y + padding;\r\n } else if (verticalAlign === 'bottom') {\r\n yPos = y + height - padding;\r\n } else {\r\n yPos = y + (height + 1) / 2;\r\n }\r\n let xPos = 0;\r\n if (align === 'left') {\r\n xPos = x + padding;\r\n } else if (align === 'right') {\r\n xPos = x + width - padding;\r\n } else {\r\n xPos = x + width / 2;\r\n }\r\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\r\n this.ctx.fillText(_text, xPos, yPos);\r\n this.ctx.restore();\r\n return ellipsis;\r\n }\r\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\r\n let ellipsis = false;\r\n let _text = text;\r\n this.ctx.font = font;\r\n if (text === null || text === undefined || text === '') {\r\n return {\r\n _text: '',\r\n ellipsis,\r\n };\r\n }\r\n const ellipsesWidth = this.ctx.measureText('...').width;\r\n const textWidth = this.ctx.measureText(text).width;\r\n\r\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\r\n ellipsis = true;\r\n // text字符截取并添加省略号\r\n let textLength = 0;\r\n for (let i = 0; i < text.length; i++) {\r\n textLength += this.ctx.measureText(text[i]).width;\r\n if (textLength >= width - padding * 2 - ellipsesWidth) {\r\n _text = text.slice(0, i) + '...';\r\n break;\r\n }\r\n }\r\n }\r\n return {\r\n _text,\r\n ellipsis,\r\n };\r\n }\r\n}\r\n\r\nexport default Paint;\r\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_COLOR = '#e1e6eb';\r\n WIDTH = 0;\r\n RESIZE_MIN_WIDTH = 40;\r\n HEIGHT = 0;\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_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 = 20;\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 = false;\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 = 'LOADING_ICON_SVG' | 'EXPAND_ICON_SVG' | 'SHRINK_ICON_SVG' | 'CHECKBOX_UNCHECK_SVG' | 'CHECKBOX_CHECK_SVG' | 'CHECKBOX_DISABLED_SVG' | '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\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: '<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 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 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 },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER_COLOR,\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 });\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('mousemove', (e: MouseEvent) => {\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('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.imageEnterAndLeave(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.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', this.ctx.hoverCell, 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 /**\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();\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 // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\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 } else {\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\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 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 rowIndex = this.database.getRowIndexForRowKey(rowKey);\r\n const colIndex = this.database.getColIndexForKey(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((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history);\r\n }\r\n } else {\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true);\r\n }\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 if (buttons === 0) {\n this.onMouseUp();\n return;\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 // 拖拽移动滚动条\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 },\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 this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE;\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, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor: BORDER_COLOR,\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: BORDER_COLOR,\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 (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 drawFiexShadow() {\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 + 1, 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 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 draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFiexShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\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 draw() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n this.fixedCells.forEach((cell) => {\n cell.draw();\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 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 const { top } = canvasElement.getBoundingClientRect();\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 = 0;\n if (this.data.length && ENABLE_OFFSET_HEIGHT) {\n const windowInnerHeight = window.innerHeight;\n const visibleHeight = windowInnerHeight - top;\n stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (stageHeight < 0) {\n stageHeight = 32;\n console.error(\n 'There is an error in the height calculation ENABLE_OFFSET_HEIGHT and OFFSET_HEIGHT are invalid',\n );\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 } else {\n stageHeight = containerHeight;\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 // 鼠标移动\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 (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 drawFiexShadow() {\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 + 1, 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 this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFiexShadow();\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 drawFiexShadow() {\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 + 1, 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 draw() {\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFiexShadow();\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\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' || (e.shiftKey && e.code === 'Enter')) {\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' || (!e.shiftKey && e.code === 'Enter')) {\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();\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 // 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 type Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\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('cellMouseenter', (cell, e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\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, drawX, drawY, width, height } = cell;\r\n // 绘制自动填充点\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n const pointWh = 6;\r\n const pointX = drawX + width - pointWh;\r\n const pointY = drawY + height - pointWh;\r\n if (offsetX > pointX && offsetY > pointY) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('cellMousedown', () => {\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) => {\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', () => {\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('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\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 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 this.cellTarget = null;\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 if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { drawX, drawY, height, width } = 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 = `${drawX - 1}px`;\r\n this.editorEl.style.top = `${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();\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 || drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n 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 // 隐藏编辑器\r\n this.ctx.containerElement.focus();\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.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 this.editor.doneEdit();\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);\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);\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 /**\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","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","focusCell","hoverCell","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","hoverIconName","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","drawX","drawY","colSpan","cellHeader","BODY_FONT","ellipsis","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","yArr","maxX","maxY","xArrCopy","yArrCopy","minX","minY","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","lineDash","borderWidth","borderColor","fillColor","Database","footerData","dataList","ROW_KEY","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","changeList","rowKeyList","BEFORE_VALUE_CHANGE_METHOD","beforeCellValueChange","oldValue","rows","_changeList","promsieValidators","_value","reDraw","isEditor","changeKey","originalValue","values","changeItem","_selectable","totalChecked","totalSelectable","indeterminate","_a","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","BODY_CELL_RULES_METHOD","_rules","rowSpan","sumHeight","position","cell","topIndex","bottomIndex","leftIndex","rightIndex","offsetTop","offsetLeft","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","text","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","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","offsetY","offsetX","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","offset","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","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","isEmpty","containerHeight","_visibleHeight","canvasWidth","canvasHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","buffer","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","positionX","positionY","scrollSpeedX","scrollSpeedY","ENABLE_MERGE_CELL_LINK","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","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]}