web-component-gallery 1.2.26 → 1.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/amap.umd.js CHANGED
@@ -8472,7 +8472,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8472
8472
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8473
8473
 
8474
8474
  "use strict";
8475
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n this.$emit('selectedRecords', selectedKey, selectedRecord);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8475
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600,\n /** 跨分页记录选中数据 */\n selectedRecords: []\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n emptySymbol: {\n type: String,\n default: '/'\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n },\n tableDatas() {\n /** 字段数据为空则添加默认占位符 */\n const dataKeys = this.$attrs.columns.map(column => column.dataIndex);\n return this.datas.map(dataItem => {\n const cloneItem = {\n ...dataItem\n };\n dataKeys.forEach(key => {\n const value = cloneItem[key];\n if (value === null || value === undefined || typeof value === 'string' && !value.trim()) {\n cloneItem[key] = this.emptySymbol;\n }\n });\n return cloneItem;\n });\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n const {\n setAttrs,\n selectedRecords\n } = this;\n const setRecords = selectedRecords.filter(recordItem => selectedKey.includes(recordItem[setAttrs.rowKey]));\n setRecords.length < selectedKey.length && selectedRecords.push(selectedRecord[selectedRecord.length - 1]);\n this.$emit('selectedRecords', selectedKey, selectedRecords);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8476
8476
 
8477
8477
  /***/ }),
8478
8478
 
@@ -8637,7 +8637,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8637
8637
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8638
8638
 
8639
8639
  "use strict";
8640
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.datas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8640
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.tableDatas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8641
8641
 
8642
8642
  /***/ }),
8643
8643
 
@@ -9054,7 +9054,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
9054
9054
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9055
9055
 
9056
9056
  "use strict";
9057
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n let checkNodes = [];\n function traverse(node, nodeIds) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n checkNodes.push(node);\n return true;\n }\n node[hasField] && node[hasField].forEach(childNode => {\n if (traverse(childNode, nodeIds)) return true;\n });\n return false;\n }\n for (let i = 0; i < dataSource.length; i++) {\n if (traverse(dataSource[i], nodeIds)) {\n break;\n }\n }\n return checkNodes;\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
9057
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n const nodeMap = new Map(); // 用于去重的Map\n\n function traverse(node) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n if (!nodeMap.has(node[searchField])) {\n nodeMap.set(node[searchField], node);\n }\n return true;\n }\n node[hasField]?.forEach(childNode => {\n traverse(childNode);\n });\n return false;\n }\n dataSource.forEach(rootNode => {\n traverse(rootNode);\n });\n return Array.from(nodeMap.values()); // 返回去重后的数组\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
9058
9058
 
9059
9059
  /***/ }),
9060
9060
 
@@ -9252,7 +9252,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
9252
9252
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
9253
9253
 
9254
9254
  "use strict";
9255
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
9255
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker > span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
9256
9256
 
9257
9257
  /***/ }),
9258
9258
 
package/dist/form.umd.js CHANGED
@@ -7561,7 +7561,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
7561
7561
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
7562
7562
 
7563
7563
  "use strict";
7564
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
7564
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker > span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
7565
7565
 
7566
7566
  /***/ }),
7567
7567
 
package/dist/index.umd.js CHANGED
@@ -8472,7 +8472,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8472
8472
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8473
8473
 
8474
8474
  "use strict";
8475
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n this.$emit('selectedRecords', selectedKey, selectedRecord);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8475
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600,\n /** 跨分页记录选中数据 */\n selectedRecords: []\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n emptySymbol: {\n type: String,\n default: '/'\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n },\n tableDatas() {\n /** 字段数据为空则添加默认占位符 */\n const dataKeys = this.$attrs.columns.map(column => column.dataIndex);\n return this.datas.map(dataItem => {\n const cloneItem = {\n ...dataItem\n };\n dataKeys.forEach(key => {\n const value = cloneItem[key];\n if (value === null || value === undefined || typeof value === 'string' && !value.trim()) {\n cloneItem[key] = this.emptySymbol;\n }\n });\n return cloneItem;\n });\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n const {\n setAttrs,\n selectedRecords\n } = this;\n const setRecords = selectedRecords.filter(recordItem => selectedKey.includes(recordItem[setAttrs.rowKey]));\n setRecords.length < selectedKey.length && selectedRecords.push(selectedRecord[selectedRecord.length - 1]);\n this.$emit('selectedRecords', selectedKey, selectedRecords);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8476
8476
 
8477
8477
  /***/ }),
8478
8478
 
@@ -8637,7 +8637,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
8637
8637
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8638
8638
 
8639
8639
  "use strict";
8640
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.datas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8640
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.tableDatas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
8641
8641
 
8642
8642
  /***/ }),
8643
8643
 
@@ -9054,7 +9054,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
9054
9054
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9055
9055
 
9056
9056
  "use strict";
9057
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n let checkNodes = [];\n function traverse(node, nodeIds) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n checkNodes.push(node);\n return true;\n }\n node[hasField] && node[hasField].forEach(childNode => {\n if (traverse(childNode, nodeIds)) return true;\n });\n return false;\n }\n for (let i = 0; i < dataSource.length; i++) {\n if (traverse(dataSource[i], nodeIds)) {\n break;\n }\n }\n return checkNodes;\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
9057
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n const nodeMap = new Map(); // 用于去重的Map\n\n function traverse(node) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n if (!nodeMap.has(node[searchField])) {\n nodeMap.set(node[searchField], node);\n }\n return true;\n }\n node[hasField]?.forEach(childNode => {\n traverse(childNode);\n });\n return false;\n }\n dataSource.forEach(rootNode => {\n traverse(rootNode);\n });\n return Array.from(nodeMap.values()); // 返回去重后的数组\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
9058
9058
 
9059
9059
  /***/ }),
9060
9060
 
@@ -9252,7 +9252,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
9252
9252
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
9253
9253
 
9254
9254
  "use strict";
9255
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
9255
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ATimePicker[data-v-32e43c77] {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n}\\n.ATimePicker > span[data-v-32e43c77] {\\n margin: 0 8px;\\n}\\n.ATimePicker[data-v-32e43c77] .ant-time-picker {\\n flex: 1;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://mui/./plugins/lib/form/components/ATimePicker.vue?./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/less-loader/dist/cjs.js??clonedRuleSet-2.use%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
9256
9256
 
9257
9257
  /***/ }),
9258
9258
 
package/dist/table.umd.js CHANGED
@@ -4347,7 +4347,7 @@ eval("//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareC
4347
4347
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4348
4348
 
4349
4349
  "use strict";
4350
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_2__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n this.$emit('selectedRecords', selectedKey, selectedRecord);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
4350
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/icon/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/table/index.js\");\n/* harmony import */ var ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ant-design-vue/es */ \"./node_modules/ant-design-vue/es/pagination/index.js\");\n\n\n\n\n\n\nconst IconFont = ant_design_vue_es__WEBPACK_IMPORTED_MODULE_5__[\"default\"].createFromIconfontCN({\n scriptUrl: '//at.alicdn.com/t/c/font_4640977_auv55jur50b.js'\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n components: {\n Table: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n Pagination: ant_design_vue_es__WEBPACK_IMPORTED_MODULE_7__[\"default\"]\n },\n name: 'uTable',\n data() {\n return {\n pagination: {\n total: 0,\n size: 10,\n current: 1\n },\n tableScrollBody: 600,\n /** 跨分页记录选中数据 */\n selectedRecords: []\n };\n },\n props: {\n // 紧凑型和宽松型 \n // relax 宽松型\n // compact 紧凑型\n tableStyle: {\n type: String,\n default: 'compact'\n },\n // compact 紧凑型情况下是否有分割线\n tableSplit: {\n type: Boolean,\n default: true\n },\n // 表格数据\n datas: {\n type: Array,\n default: () => []\n },\n emptySymbol: {\n type: String,\n default: '/'\n },\n // 选中数据项\n selectedRowKeys: {\n type: Array,\n default: () => []\n },\n // 分页默认值\n paginationParams: {\n type: Object,\n default: () => ({\n total: 0,\n size: 10,\n current: 1\n })\n },\n // 配置分页数据\n pageSizeOptions: {\n type: Array,\n default: () => ['10', '15', '20', '30', '50']\n }\n },\n computed: {\n setAttrs() {\n const h = this.$createElement;\n return {\n pagination: false,\n rowKey: (record, i) => record.id ?? `${this.pagination.current}${i}`,\n rowSelection: {\n selectedRowKeys: this.selectedRowKeys,\n onChange: this.onSelectChange\n },\n locale: {\n emptyText: h(\"div\", {\n \"class\": \"WebComponentTable__List__Empty\"\n }, [h(IconFont, {\n \"attrs\": {\n \"type\": \"icon-zanwushuju\"\n }\n }), h(\"span\", [\"\\u6682\\u65E0\\u6570\\u636E\"])])\n },\n scroll: {\n y: this.tableScrollBody,\n x: this.$attrs.scrollX\n },\n ...this.$attrs\n };\n },\n tableSize() {\n return this.tableStyle == 'compact' ? 'middle' : 'default';\n },\n tableDatas() {\n /** 字段数据为空则添加默认占位符 */\n const dataKeys = this.$attrs.columns.map(column => column.dataIndex);\n return this.datas.map(dataItem => {\n const cloneItem = {\n ...dataItem\n };\n dataKeys.forEach(key => {\n const value = cloneItem[key];\n if (value === null || value === undefined || typeof value === 'string' && !value.trim()) {\n cloneItem[key] = this.emptySymbol;\n }\n });\n return cloneItem;\n });\n }\n },\n watch: {\n paginationParams(newValue) {\n this.pagination = {\n ...newValue\n };\n }\n },\n mounted() {\n this.pagination = {\n ...this.paginationParams\n };\n const scrollTimer = setTimeout(() => {\n this.getScrollBodyH();\n clearTimeout(scrollTimer);\n }, 300);\n window.addEventListener('resize', () => this.getScrollBodyH());\n this.removeDomElement();\n },\n destroyed() {\n // window.removeEventListener( 'resize' )\n },\n methods: {\n /** 根据内容高度计算滚动长度 */\n getScrollBodyH() {\n this.tableScrollBody = this.$refs.Table.clientHeight - this.$refs.TableHead.offsetHeight - this.$refs.TablePagination.offsetHeight - 16 - this.$refs.TableListTitle.offsetHeight - document.querySelector('.ant-table-thead').offsetHeight - 20;\n /** 20为获取高度时抹掉的小数点后两位的浮动空间(存在叠加多个获取错误的情况) */\n console.log(this.$refs.Table.clientHeight, this.tableScrollBody, 'tableScrollBody滚动高度');\n },\n /** 根据高度判断dom元素是否加载 进行删除 */\n removeDomElement() {\n let domElement;\n this.$refs.Table.querySelectorAll('div').forEach(node => {\n node.className == 'ant-table-title' && (domElement = node);\n });\n !this.$scopedSlots.ATableHead && this.$refs.TableHead.remove();\n !this.$scopedSlots.ATableTitle && (domElement.style.padding = '0');\n },\n onSelectChange(selectedKey, selectedRecord) {\n const {\n setAttrs,\n selectedRecords\n } = this;\n const setRecords = selectedRecords.filter(recordItem => selectedKey.includes(recordItem[setAttrs.rowKey]));\n setRecords.length < selectedKey.length && selectedRecords.push(selectedRecord[selectedRecord.length - 1]);\n this.$emit('selectedRecords', selectedKey, selectedRecords);\n },\n paginationChange(current, pageSize) {\n this.pagination = {\n ...this.pagination,\n size: pageSize,\n current\n };\n this.$emit('pageSizeChange', this.pagination);\n }\n }\n});\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options");
4351
4351
 
4352
4352
  /***/ }),
4353
4353
 
@@ -4358,7 +4358,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4358
4358
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4359
4359
 
4360
4360
  "use strict";
4361
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.datas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
4361
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ staticRenderFns: () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n ref: \"Table\",\n class: [_vm.tableStyle, \"WebComponentTable\"]\n }, [_c(\"div\", {\n ref: \"TableHead\",\n staticClass: \"WebComponentTable__Head\"\n }, [_vm._t(\"ATableHead\")], 2), _vm._v(\" \"), _c(\"Table\", _vm._g(_vm._b({\n ref: \"TableList\",\n staticClass: \"WebComponentTable__List\",\n attrs: {\n size: _vm.tableSize,\n \"data-source\": _vm.tableDatas\n },\n scopedSlots: _vm._u([_vm._l(_vm.$attrs.columns, function ({\n dataIndex\n }) {\n return {\n key: dataIndex,\n fn: function () {\n return [_vm._t(dataIndex)];\n },\n proxy: true\n };\n }), {\n key: \"customRender\",\n fn: function (text, record, i, column) {\n return [_vm._t(column.dataIndex, null, {\n customProps: record,\n text: text,\n index: i\n })];\n }\n }], null, true)\n }, \"Table\", _vm.setAttrs, false), _vm.$listeners), [_c(\"div\", {\n ref: \"TableListTitle\",\n staticClass: \"WebComponentTable__List__Title\",\n attrs: {\n slot: \"title\"\n },\n slot: \"title\"\n }, [_vm._t(\"ATableTitle\")], 2)]), _vm._v(\" \"), _c(\"div\", {\n ref: \"TablePagination\",\n staticClass: \"WebComponentTable__Pagination\"\n }, [_vm._t(\"ATablePagination\", function () {\n return [_c(\"Pagination\", {\n attrs: {\n size: \"small\",\n pageSizeOptions: _vm.pageSizeOptions,\n \"show-total\": total => `共 ${total} 条记录`,\n \"show-size-changer\": \"\",\n \"show-quick-jumper\": \"\",\n defaultCurrent: 1,\n pageSize: _vm.pagination.size,\n current: _vm.pagination.current,\n total: _vm.pagination.total\n },\n on: {\n \"update:pageSize\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n \"update:page-size\": function ($event) {\n return _vm.$set(_vm.pagination, \"size\", $event);\n },\n showSizeChange: _vm.paginationChange,\n change: _vm.paginationChange\n }\n })];\n })], 2)], 1);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://mui/./plugins/lib/table/index.vue?./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B2%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options");
4362
4362
 
4363
4363
  /***/ }),
4364
4364
 
package/dist/tree.umd.js CHANGED
@@ -3401,7 +3401,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3401
3401
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3402
3402
 
3403
3403
  "use strict";
3404
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n let checkNodes = [];\n function traverse(node, nodeIds) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n checkNodes.push(node);\n return true;\n }\n node[hasField] && node[hasField].forEach(childNode => {\n if (traverse(childNode, nodeIds)) return true;\n });\n return false;\n }\n for (let i = 0; i < dataSource.length; i++) {\n if (traverse(dataSource[i], nodeIds)) {\n break;\n }\n }\n return checkNodes;\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
3404
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ filterTreeById: () => (/* binding */ filterTreeById),\n/* harmony export */ findCheckNodes: () => (/* binding */ findCheckNodes),\n/* harmony export */ getAllParents: () => (/* binding */ getAllParents),\n/* harmony export */ getTreeKey: () => (/* binding */ getTreeKey),\n/* harmony export */ joinTreeMessage: () => (/* binding */ joinTreeMessage)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n/** 默认TreeData字段 */\nconst defaultReplaceFields = {\n key: 'id',\n title: 'title',\n children: 'children'\n};\n\n/**\r\n * 提取树形结构中的键值集合\r\n * @param {Array} nodes 树形数据\r\n * @param {boolean} [parent=false] 是否只提取父节点\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {string} [replaceFields.children='children'] 子节点字段名\r\n * @param {string} [replaceFields.key='id'] 键名字段名\r\n * @returns {Array} 提取的键值数组\r\n */\nfunction getTreeKey(nodes = [], parent = false, {\n children = 'children',\n key = 'id'\n} = {}) {\n const keys = [];\n function traverse(node) {\n const shouldCollect = !parent || node[children]?.length;\n if (shouldCollect) keys.push(node[key]);\n if (node[children]?.length) {\n node[children].forEach(traverse);\n }\n }\n nodes.forEach(traverse);\n return keys;\n}\n\n/**\r\n * 根据树子节点ID过滤出最后一级child\r\n * @param {array} dataSource 树形结构数据源\r\n * @param {array} nodeIds 需要过滤的数据集\r\n * @param {string} hasField 过滤包含属性(默认为children)\r\n * @param {string} searchField 查找属性(默认为id)\r\n */\n\nfunction findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {\n const nodeMap = new Map(); // 用于去重的Map\n\n function traverse(node) {\n if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {\n if (!nodeMap.has(node[searchField])) {\n nodeMap.set(node[searchField], node);\n }\n return true;\n }\n node[hasField]?.forEach(childNode => {\n traverse(childNode);\n });\n return false;\n }\n dataSource.forEach(rootNode => {\n traverse(rootNode);\n });\n return Array.from(nodeMap.values()); // 返回去重后的数组\n}\n\n/**\r\n * 拼接树节点指定字段为字符串\r\n * @param {Array} nodes 树形数据\r\n * @param {Array} fields 需要拼接的字段数组\r\n * @param {string} replaceField 拼接后存储的字段名\r\n * @param {string} childNode 子节点字段名\r\n * @returns {Array} 处理后的树形数据\r\n */\nfunction joinTreeMessage(nodes = [], fields = [], replaceField = 'message', childNode = 'children') {\n if (!Array.isArray(nodes) || !Array.isArray(fields)) return nodes;\n const processNode = node => {\n node[replaceField] = fields.filter(field => node[field]).map(field => node[field]).join(' ');\n if (Array.isArray(node[childNode])) {\n node[childNode].forEach(processNode);\n }\n };\n nodes.forEach(processNode);\n return nodes;\n}\n\n/**\r\n * 获取树节点对应数据\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} key 目标节点Key\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n */\nfunction filterTreeById(tree, key, {\n children = 'children',\n key: idKey = 'id'\n} = {}) {\n for (const node of tree) {\n if (node[idKey] === key) return [node];\n if (node[children]?.length) {\n const result = filterTreeById(node[children], key, {\n children,\n key: idKey\n });\n if (result.length) return result;\n }\n }\n return [];\n}\n\n/**\r\n * 获取树节点所有父级路径\r\n * @param {Array} tree 树形数据 \r\n * @param {string|number} nodeId 目标节点ID\r\n * @param {Object} [replaceFields={}] 字段映射配置\r\n * @param {boolean} [returnObjects=false] 是否返回完整对象\r\n */\nfunction getAllParents(tree, nodeId, {\n children = 'children',\n key = 'id'\n} = {}, returnObjects = false) {\n if (!tree?.length) return [];\n\n // 创建节点映射表提升查找性能\n const nodeMap = new Map();\n const buildMap = (nodes, parentId) => {\n nodes.forEach(node => {\n // 使用WeakMap存储parentId避免污染原对象\n const metaInfo = new WeakMap();\n metaInfo.set(node, {\n parentId\n });\n nodeMap.set(node[key], {\n node,\n metaInfo\n });\n if (node[children]?.length) buildMap(node[children], node[key]);\n });\n };\n buildMap(tree);\n\n // 回溯构建路径\n const path = [];\n let current = nodeMap.get(nodeId);\n while (current) {\n if (returnObjects) {\n // 直接返回原对象\n path.unshift(current.node);\n } else {\n path.unshift(current.node[key]);\n }\n current = current.metaInfo.get(current.node).parentId ? nodeMap.get(current.metaInfo.get(current.node).parentId) : null;\n }\n\n // 对象集合则返回父级\n return returnObjects ? path[0] : path;\n}\n\n//# sourceURL=webpack://mui/./plugins/utils/Tree.js?");
3405
3405
 
3406
3406
  /***/ }),
3407
3407
 
@@ -67,7 +67,7 @@ export default {
67
67
  width: 100%;
68
68
  display: flex;
69
69
  align-items: center;
70
- span { margin: 0 @padding-xs; }
70
+ &>span { margin: 0 @padding-xs; }
71
71
  :deep(.ant-time-picker) { flex: 1; }
72
72
  }
73
73
  </style>
@@ -8,7 +8,7 @@
8
8
  <Table
9
9
  ref="TableList"
10
10
  :size="tableSize"
11
- :data-source="datas"
11
+ :data-source="tableDatas"
12
12
  v-on="$listeners"
13
13
  v-bind="setAttrs"
14
14
  class="WebComponentTable__List"
@@ -70,7 +70,9 @@ export default {
70
70
  size: 10,
71
71
  current: 1
72
72
  },
73
- tableScrollBody: 600
73
+ tableScrollBody: 600,
74
+ /** 跨分页记录选中数据 */
75
+ selectedRecords: []
74
76
  }
75
77
  },
76
78
  props: {
@@ -91,6 +93,10 @@ export default {
91
93
  type: Array,
92
94
  default: () => []
93
95
  },
96
+ emptySymbol: {
97
+ type: String,
98
+ default: '/'
99
+ },
94
100
  // 选中数据项
95
101
  selectedRowKeys: {
96
102
  type: Array,
@@ -129,6 +135,21 @@ export default {
129
135
  },
130
136
  tableSize() {
131
137
  return this.tableStyle == 'compact' ? 'middle' : 'default'
138
+ },
139
+ tableDatas() {
140
+ /** 字段数据为空则添加默认占位符 */
141
+ const dataKeys = this.$attrs.columns.map(column => column.dataIndex)
142
+ return this.datas.map(dataItem => {
143
+ const cloneItem = {...dataItem}
144
+ dataKeys.forEach(key => {
145
+ const value = cloneItem[key]
146
+ if (value === null || value === undefined ||
147
+ (typeof value === 'string' && !value.trim())) {
148
+ cloneItem[key] = this.emptySymbol
149
+ }
150
+ })
151
+ return cloneItem
152
+ })
132
153
  }
133
154
  },
134
155
  watch: {
@@ -172,7 +193,12 @@ export default {
172
193
  !this.$scopedSlots.ATableTitle && ( domElement.style.padding = '0' )
173
194
  },
174
195
  onSelectChange(selectedKey, selectedRecord) {
175
- this.$emit('selectedRecords', selectedKey, selectedRecord)
196
+ const {setAttrs, selectedRecords} = this
197
+ const setRecords = selectedRecords.filter(recordItem =>
198
+ selectedKey.includes(recordItem[setAttrs.rowKey])
199
+ )
200
+ setRecords.length < selectedKey.length && selectedRecords.push(selectedRecord[selectedRecord.length - 1])
201
+ this.$emit('selectedRecords', selectedKey, selectedRecords)
176
202
  },
177
203
  paginationChange(current, pageSize) {
178
204
  this.pagination = {
package/lib/tree/Tree.vue CHANGED
@@ -136,11 +136,11 @@ export default {
136
136
  getTreeAllGroupKey() {
137
137
  // 获取树的所有组key
138
138
  return getTreeKey(this.initTreeData, true, this.replaceFields)
139
- },
139
+ },
140
140
  innerTreeOptions() {
141
141
  const { key, title, children } = this.replaceFields
142
142
  return findCheckNodes(this.initTreeData, this.innerCheckedKeys, key, children).filter(
143
- e => ((e.label = e[title]), (e.value = e[key]))
143
+ e => ((e.label = e[title]), (e.value = e[key]))
144
144
  )
145
145
  }
146
146
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "web-component-gallery",
3
- "version": "1.2.26",
3
+ "version": "1.2.28",
4
4
  "description": "基于Vue2的Web Components组件库",
5
5
  "main": "dist/index.umd.js",
6
6
  "files": [
@@ -67,7 +67,7 @@ export default {
67
67
  width: 100%;
68
68
  display: flex;
69
69
  align-items: center;
70
- span { margin: 0 @padding-xs; }
70
+ &>span { margin: 0 @padding-xs; }
71
71
  :deep(.ant-time-picker) { flex: 1; }
72
72
  }
73
73
  </style>
@@ -8,7 +8,7 @@
8
8
  <Table
9
9
  ref="TableList"
10
10
  :size="tableSize"
11
- :data-source="datas"
11
+ :data-source="tableDatas"
12
12
  v-on="$listeners"
13
13
  v-bind="setAttrs"
14
14
  class="WebComponentTable__List"
@@ -70,7 +70,9 @@ export default {
70
70
  size: 10,
71
71
  current: 1
72
72
  },
73
- tableScrollBody: 600
73
+ tableScrollBody: 600,
74
+ /** 跨分页记录选中数据 */
75
+ selectedRecords: []
74
76
  }
75
77
  },
76
78
  props: {
@@ -91,6 +93,10 @@ export default {
91
93
  type: Array,
92
94
  default: () => []
93
95
  },
96
+ emptySymbol: {
97
+ type: String,
98
+ default: '/'
99
+ },
94
100
  // 选中数据项
95
101
  selectedRowKeys: {
96
102
  type: Array,
@@ -129,6 +135,21 @@ export default {
129
135
  },
130
136
  tableSize() {
131
137
  return this.tableStyle == 'compact' ? 'middle' : 'default'
138
+ },
139
+ tableDatas() {
140
+ /** 字段数据为空则添加默认占位符 */
141
+ const dataKeys = this.$attrs.columns.map(column => column.dataIndex)
142
+ return this.datas.map(dataItem => {
143
+ const cloneItem = {...dataItem}
144
+ dataKeys.forEach(key => {
145
+ const value = cloneItem[key]
146
+ if (value === null || value === undefined ||
147
+ (typeof value === 'string' && !value.trim())) {
148
+ cloneItem[key] = this.emptySymbol
149
+ }
150
+ })
151
+ return cloneItem
152
+ })
132
153
  }
133
154
  },
134
155
  watch: {
@@ -172,7 +193,12 @@ export default {
172
193
  !this.$scopedSlots.ATableTitle && ( domElement.style.padding = '0' )
173
194
  },
174
195
  onSelectChange(selectedKey, selectedRecord) {
175
- this.$emit('selectedRecords', selectedKey, selectedRecord)
196
+ const {setAttrs, selectedRecords} = this
197
+ const setRecords = selectedRecords.filter(recordItem =>
198
+ selectedKey.includes(recordItem[setAttrs.rowKey])
199
+ )
200
+ setRecords.length < selectedKey.length && selectedRecords.push(selectedRecord[selectedRecord.length - 1])
201
+ this.$emit('selectedRecords', selectedKey, selectedRecords)
176
202
  },
177
203
  paginationChange(current, pageSize) {
178
204
  this.pagination = {
@@ -136,11 +136,11 @@ export default {
136
136
  getTreeAllGroupKey() {
137
137
  // 获取树的所有组key
138
138
  return getTreeKey(this.initTreeData, true, this.replaceFields)
139
- },
139
+ },
140
140
  innerTreeOptions() {
141
141
  const { key, title, children } = this.replaceFields
142
142
  return findCheckNodes(this.initTreeData, this.innerCheckedKeys, key, children).filter(
143
- e => ((e.label = e[title]), (e.value = e[key]))
143
+ e => ((e.label = e[title]), (e.value = e[key]))
144
144
  )
145
145
  }
146
146
  },
@@ -44,30 +44,28 @@ export function getTreeKey(
44
44
  */
45
45
 
46
46
  export function findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {
47
- let checkNodes = []
48
-
49
- function traverse(node, nodeIds) {
50
-
47
+ const nodeMap = new Map() // 用于去重的Map
48
+
49
+ function traverse(node) {
51
50
  if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {
52
- checkNodes.push(node)
51
+ if (!nodeMap.has(node[searchField])) {
52
+ nodeMap.set(node[searchField], node)
53
+ }
53
54
  return true
54
55
  }
55
56
 
56
- node[hasField] && node[hasField].forEach(childNode => {
57
- if (traverse(childNode, nodeIds)) return true
57
+ node[hasField]?.forEach(childNode => {
58
+ traverse(childNode)
58
59
  })
59
-
60
+
60
61
  return false
61
62
  }
62
63
 
63
- for (let i = 0; i < dataSource.length; i++) {
64
-
65
- if (traverse(dataSource[i], nodeIds)) {
66
- break
67
- }
68
- }
64
+ dataSource.forEach(rootNode => {
65
+ traverse(rootNode)
66
+ })
69
67
 
70
- return checkNodes
68
+ return Array.from(nodeMap.values()) // 返回去重后的数组
71
69
  }
72
70
 
73
71
 
@@ -1,9 +1,45 @@
1
+ /**
2
+ * 自动转换HTTP/HTTPS为WS/WSS协议
3
+ * @param {string} url 原始URL
4
+ * @returns {string} 转换后的WebSocket URL
5
+ */
6
+ function normalizeWebSocketUrl(url) {
7
+ // 已经是ws/wss协议直接返回
8
+ if (/^wss?:/i.test(url)) return url
9
+
10
+ // 处理相对路径(如 /socket)
11
+ if (url.startsWith('/')) {
12
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
13
+ return `${protocol}//${window.location.host}${url}`
14
+ }
15
+
16
+ // 处理完整HTTP/HTTPS URL
17
+ const isSecure = window.location.protocol === 'https:'
18
+ return url.replace(/^http(s?):/i, isSecure ? 'wss:' : 'ws:')
19
+ }
20
+
21
+ /**
22
+ * 校验WebSocket URL有效性
23
+ * @param {string} url 待校验URL
24
+ * @returns {boolean} 是否有效
25
+ */
26
+ function isValidWebSocketUrl(url) {
27
+ try {
28
+ const { protocol, hostname } = new URL(url)
29
+ console.log(protocol, hostname, '--protocol, hostname')
30
+ return /^wss?:$/i.test(protocol) && hostname
31
+ } catch {
32
+ return false
33
+ }
34
+ }
35
+
1
36
  const WebSocketManager = {
2
37
  install(Vue, options = {}) {
3
38
  const defaultConfig = {
4
39
  reconnectDelay: 3000,
5
40
  maxReconnect: 5,
6
- heartbeatInterval: 30000
41
+ heartbeatInterval: 30000,
42
+ heartbeatTimeout: 60000
7
43
  }
8
44
  const config = { ...defaultConfig, ...options }
9
45
 
@@ -13,45 +49,80 @@ const WebSocketManager = {
13
49
  let socket = null
14
50
  let reconnectCount = 0
15
51
  let heartbeatTimer = null
52
+ let heartbeatTimeoutTimer = null
16
53
  const callbacks = []
17
54
 
18
55
  const connect = () => {
19
- if (instances.get(url)) return
56
+ return new Promise((resolve, reject) => {
57
+ if (instances.get(url)?.socket?.readyState === WebSocket.OPEN) {
58
+ resolve(instance)
59
+ return
60
+ }
61
+
62
+ /** 拼接时间戳及传递token */
63
+ const finalUrl = normalizeWebSocketUrl(url) + `/${new Date().getTime()}?token=${Vue.prototype.$store.getters.token}`
64
+ console.log(finalUrl, '--finalUrl')
65
+ if (!isValidWebSocketUrl(finalUrl)) {
66
+ throw new Error(`无效的WebSocket URL: ${finalUrl}`)
67
+ }
20
68
 
21
- socket = new WebSocket(url)
22
- instances.set(url, { socket, callbacks })
69
+ socket = new WebSocket(finalUrl)
70
+ instances.set(url, { socket, callbacks })
23
71
 
24
- socket.onopen = () => {
25
- reconnectCount = 0
26
- startHeartbeat()
27
- console.log(`WebSocket连接成功: ${url}`)
28
- }
72
+ socket.onopen = () => {
73
+ reconnectCount = 0
74
+ startHeartbeat()
75
+ resolve(instance)
76
+ }
29
77
 
30
- socket.onmessage = (e) => {
31
- resetHeartbeat()
32
- callbacks.forEach(cb => cb(e.data))
33
- }
78
+ socket.onmessage = (e) => {
79
+ resetHeartbeat()
80
+ try {
81
+ const data = JSON.parse(e.data)
82
+ if (data.type !== 'heartbeat') {
83
+ callbacks.forEach(cb => cb(data))
84
+ }
85
+ } catch (err) {
86
+ callbacks.forEach(cb => cb(e.data))
87
+ }
88
+ }
34
89
 
35
- socket.onclose = (e) => handleClose(e)
36
- socket.onerror = (e) => handleError(e)
90
+ socket.onclose = (e) => {
91
+ handleClose(e)
92
+ if (e.code !== 1000) {
93
+ reject(new Error(`连接关闭: ${e.reason || '未知原因'}`))
94
+ }
95
+ }
96
+
97
+ socket.onerror = (e) => {
98
+ handleError(e)
99
+ reject(new Error('连接错误'))
100
+ }
101
+ })
37
102
  }
38
103
 
39
104
  const startHeartbeat = () => {
105
+ clearTimeout(heartbeatTimeoutTimer)
40
106
  heartbeatTimer = setInterval(() => {
41
- if (socket.readyState === WebSocket.OPEN) {
107
+ if (socket?.readyState === WebSocket.OPEN) {
42
108
  socket.send(JSON.stringify({ type: 'heartbeat' }))
109
+ heartbeatTimeoutTimer = setTimeout(() => {
110
+ socket.close(1006, '心跳超时')
111
+ }, config.heartbeatTimeout)
43
112
  }
44
113
  }, config.heartbeatInterval)
45
114
  }
46
115
 
47
116
  const resetHeartbeat = () => {
117
+ clearTimeout(heartbeatTimeoutTimer)
48
118
  clearInterval(heartbeatTimer)
49
119
  startHeartbeat()
50
120
  }
51
121
 
52
122
  const handleClose = (e) => {
123
+ clearTimeout(heartbeatTimeoutTimer)
53
124
  clearInterval(heartbeatTimer)
54
- if (reconnectCount < config.maxReconnect) {
125
+ if (e.code !== 1000 && reconnectCount < config.maxReconnect) {
55
126
  setTimeout(() => {
56
127
  reconnectCount++
57
128
  connect()
@@ -60,19 +131,22 @@ const WebSocketManager = {
60
131
  }
61
132
 
62
133
  const handleError = (e) => {
63
- console.error(`WebSocket错误: ${url}`, e)
64
- handleClose(e)
134
+ if (e.code === 1006) {
135
+ instances.delete(url)
136
+ }
65
137
  }
66
138
 
67
139
  const close = () => {
140
+ clearTimeout(heartbeatTimeoutTimer)
68
141
  clearInterval(heartbeatTimer)
69
- socket?.close()
142
+ socket?.close(1000, '正常关闭')
70
143
  instances.delete(url)
71
144
  }
72
145
 
73
- return {
146
+ const instance = {
74
147
  connect,
75
148
  close,
149
+ readyState: () => socket?.readyState,
76
150
  onMessage: (callback) => {
77
151
  callbacks.push(callback)
78
152
  return () => {
@@ -83,19 +157,25 @@ const WebSocketManager = {
83
157
  send: (data) => {
84
158
  if (socket?.readyState === WebSocket.OPEN) {
85
159
  socket.send(JSON.stringify(data))
160
+ return true
86
161
  }
162
+ return false
87
163
  }
88
164
  }
165
+ return instance
89
166
  }
90
167
 
91
168
  Vue.prototype.$ws = {
92
- getInstance(url) {
169
+ async getInstance(url) {
93
170
  if (!instances.has(url)) {
94
171
  const instance = createInstance(url)
95
172
  instances.set(url, instance)
96
- return instance
173
+ return instance.connect()
97
174
  }
98
- return instances.get(url)
175
+ const instance = instances.get(url)
176
+ return instance.readyState() === WebSocket.OPEN
177
+ ? Promise.resolve(instance)
178
+ : instance.connect()
99
179
  },
100
180
  closeAll() {
101
181
  instances.forEach(instance => instance.close())
@@ -105,4 +185,4 @@ const WebSocketManager = {
105
185
  }
106
186
  }
107
187
 
108
- export default WebSocketManager
188
+ export default WebSocketManager
package/utils/Tree.js CHANGED
@@ -44,30 +44,28 @@ export function getTreeKey(
44
44
  */
45
45
 
46
46
  export function findCheckNodes(dataSource, nodeIds, searchField = 'id', hasField = 'children') {
47
- let checkNodes = []
48
-
49
- function traverse(node, nodeIds) {
50
-
47
+ const nodeMap = new Map() // 用于去重的Map
48
+
49
+ function traverse(node) {
51
50
  if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {
52
- checkNodes.push(node)
51
+ if (!nodeMap.has(node[searchField])) {
52
+ nodeMap.set(node[searchField], node)
53
+ }
53
54
  return true
54
55
  }
55
56
 
56
- node[hasField] && node[hasField].forEach(childNode => {
57
- if (traverse(childNode, nodeIds)) return true
57
+ node[hasField]?.forEach(childNode => {
58
+ traverse(childNode)
58
59
  })
59
-
60
+
60
61
  return false
61
62
  }
62
63
 
63
- for (let i = 0; i < dataSource.length; i++) {
64
-
65
- if (traverse(dataSource[i], nodeIds)) {
66
- break
67
- }
68
- }
64
+ dataSource.forEach(rootNode => {
65
+ traverse(rootNode)
66
+ })
69
67
 
70
- return checkNodes
68
+ return Array.from(nodeMap.values()) // 返回去重后的数组
71
69
  }
72
70
 
73
71
 
@@ -1,9 +1,45 @@
1
+ /**
2
+ * 自动转换HTTP/HTTPS为WS/WSS协议
3
+ * @param {string} url 原始URL
4
+ * @returns {string} 转换后的WebSocket URL
5
+ */
6
+ function normalizeWebSocketUrl(url) {
7
+ // 已经是ws/wss协议直接返回
8
+ if (/^wss?:/i.test(url)) return url
9
+
10
+ // 处理相对路径(如 /socket)
11
+ if (url.startsWith('/')) {
12
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
13
+ return `${protocol}//${window.location.host}${url}`
14
+ }
15
+
16
+ // 处理完整HTTP/HTTPS URL
17
+ const isSecure = window.location.protocol === 'https:'
18
+ return url.replace(/^http(s?):/i, isSecure ? 'wss:' : 'ws:')
19
+ }
20
+
21
+ /**
22
+ * 校验WebSocket URL有效性
23
+ * @param {string} url 待校验URL
24
+ * @returns {boolean} 是否有效
25
+ */
26
+ function isValidWebSocketUrl(url) {
27
+ try {
28
+ const { protocol, hostname } = new URL(url)
29
+ console.log(protocol, hostname, '--protocol, hostname')
30
+ return /^wss?:$/i.test(protocol) && hostname
31
+ } catch {
32
+ return false
33
+ }
34
+ }
35
+
1
36
  const WebSocketManager = {
2
37
  install(Vue, options = {}) {
3
38
  const defaultConfig = {
4
39
  reconnectDelay: 3000,
5
40
  maxReconnect: 5,
6
- heartbeatInterval: 30000
41
+ heartbeatInterval: 30000,
42
+ heartbeatTimeout: 60000
7
43
  }
8
44
  const config = { ...defaultConfig, ...options }
9
45
 
@@ -13,45 +49,80 @@ const WebSocketManager = {
13
49
  let socket = null
14
50
  let reconnectCount = 0
15
51
  let heartbeatTimer = null
52
+ let heartbeatTimeoutTimer = null
16
53
  const callbacks = []
17
54
 
18
55
  const connect = () => {
19
- if (instances.get(url)) return
56
+ return new Promise((resolve, reject) => {
57
+ if (instances.get(url)?.socket?.readyState === WebSocket.OPEN) {
58
+ resolve(instance)
59
+ return
60
+ }
61
+
62
+ /** 拼接时间戳及传递token */
63
+ const finalUrl = normalizeWebSocketUrl(url) + `/${new Date().getTime()}?token=${Vue.prototype.$store.getters.token}`
64
+ console.log(finalUrl, '--finalUrl')
65
+ if (!isValidWebSocketUrl(finalUrl)) {
66
+ throw new Error(`无效的WebSocket URL: ${finalUrl}`)
67
+ }
20
68
 
21
- socket = new WebSocket(url)
22
- instances.set(url, { socket, callbacks })
69
+ socket = new WebSocket(finalUrl)
70
+ instances.set(url, { socket, callbacks })
23
71
 
24
- socket.onopen = () => {
25
- reconnectCount = 0
26
- startHeartbeat()
27
- console.log(`WebSocket连接成功: ${url}`)
28
- }
72
+ socket.onopen = () => {
73
+ reconnectCount = 0
74
+ startHeartbeat()
75
+ resolve(instance)
76
+ }
29
77
 
30
- socket.onmessage = (e) => {
31
- resetHeartbeat()
32
- callbacks.forEach(cb => cb(e.data))
33
- }
78
+ socket.onmessage = (e) => {
79
+ resetHeartbeat()
80
+ try {
81
+ const data = JSON.parse(e.data)
82
+ if (data.type !== 'heartbeat') {
83
+ callbacks.forEach(cb => cb(data))
84
+ }
85
+ } catch (err) {
86
+ callbacks.forEach(cb => cb(e.data))
87
+ }
88
+ }
34
89
 
35
- socket.onclose = (e) => handleClose(e)
36
- socket.onerror = (e) => handleError(e)
90
+ socket.onclose = (e) => {
91
+ handleClose(e)
92
+ if (e.code !== 1000) {
93
+ reject(new Error(`连接关闭: ${e.reason || '未知原因'}`))
94
+ }
95
+ }
96
+
97
+ socket.onerror = (e) => {
98
+ handleError(e)
99
+ reject(new Error('连接错误'))
100
+ }
101
+ })
37
102
  }
38
103
 
39
104
  const startHeartbeat = () => {
105
+ clearTimeout(heartbeatTimeoutTimer)
40
106
  heartbeatTimer = setInterval(() => {
41
- if (socket.readyState === WebSocket.OPEN) {
107
+ if (socket?.readyState === WebSocket.OPEN) {
42
108
  socket.send(JSON.stringify({ type: 'heartbeat' }))
109
+ heartbeatTimeoutTimer = setTimeout(() => {
110
+ socket.close(1006, '心跳超时')
111
+ }, config.heartbeatTimeout)
43
112
  }
44
113
  }, config.heartbeatInterval)
45
114
  }
46
115
 
47
116
  const resetHeartbeat = () => {
117
+ clearTimeout(heartbeatTimeoutTimer)
48
118
  clearInterval(heartbeatTimer)
49
119
  startHeartbeat()
50
120
  }
51
121
 
52
122
  const handleClose = (e) => {
123
+ clearTimeout(heartbeatTimeoutTimer)
53
124
  clearInterval(heartbeatTimer)
54
- if (reconnectCount < config.maxReconnect) {
125
+ if (e.code !== 1000 && reconnectCount < config.maxReconnect) {
55
126
  setTimeout(() => {
56
127
  reconnectCount++
57
128
  connect()
@@ -60,19 +131,22 @@ const WebSocketManager = {
60
131
  }
61
132
 
62
133
  const handleError = (e) => {
63
- console.error(`WebSocket错误: ${url}`, e)
64
- handleClose(e)
134
+ if (e.code === 1006) {
135
+ instances.delete(url)
136
+ }
65
137
  }
66
138
 
67
139
  const close = () => {
140
+ clearTimeout(heartbeatTimeoutTimer)
68
141
  clearInterval(heartbeatTimer)
69
- socket?.close()
142
+ socket?.close(1000, '正常关闭')
70
143
  instances.delete(url)
71
144
  }
72
145
 
73
- return {
146
+ const instance = {
74
147
  connect,
75
148
  close,
149
+ readyState: () => socket?.readyState,
76
150
  onMessage: (callback) => {
77
151
  callbacks.push(callback)
78
152
  return () => {
@@ -83,19 +157,25 @@ const WebSocketManager = {
83
157
  send: (data) => {
84
158
  if (socket?.readyState === WebSocket.OPEN) {
85
159
  socket.send(JSON.stringify(data))
160
+ return true
86
161
  }
162
+ return false
87
163
  }
88
164
  }
165
+ return instance
89
166
  }
90
167
 
91
168
  Vue.prototype.$ws = {
92
- getInstance(url) {
169
+ async getInstance(url) {
93
170
  if (!instances.has(url)) {
94
171
  const instance = createInstance(url)
95
172
  instances.set(url, instance)
96
- return instance
173
+ return instance.connect()
97
174
  }
98
- return instances.get(url)
175
+ const instance = instances.get(url)
176
+ return instance.readyState() === WebSocket.OPEN
177
+ ? Promise.resolve(instance)
178
+ : instance.connect()
99
179
  },
100
180
  closeAll() {
101
181
  instances.forEach(instance => instance.close())
@@ -105,4 +185,4 @@ const WebSocketManager = {
105
185
  }
106
186
  }
107
187
 
108
- export default WebSocketManager
188
+ export default WebSocketManager