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 +4 -4
- package/dist/form.umd.js +1 -1
- package/dist/index.umd.js +4 -4
- package/dist/table.umd.js +2 -2
- package/dist/tree.umd.js +1 -1
- package/lib/form/components/ATimePicker.vue +1 -1
- package/lib/table/index.vue +29 -3
- package/lib/tree/Tree.vue +2 -2
- package/package.json +1 -1
- package/plugins/lib/form/components/ATimePicker.vue +1 -1
- package/plugins/lib/table/index.vue +29 -3
- package/plugins/lib/tree/Tree.vue +2 -2
- package/plugins/utils/Tree.js +13 -15
- package/plugins/utils/Websocket.js +105 -25
- package/utils/Tree.js +13 -15
- package/utils/Websocket.js +105 -25
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
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
package/lib/table/index.vue
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<Table
|
|
9
9
|
ref="TableList"
|
|
10
10
|
:size="tableSize"
|
|
11
|
-
:data-source="
|
|
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
|
-
|
|
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
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<Table
|
|
9
9
|
ref="TableList"
|
|
10
10
|
:size="tableSize"
|
|
11
|
-
:data-source="
|
|
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
|
-
|
|
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
|
},
|
package/plugins/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
|
-
|
|
48
|
-
|
|
49
|
-
function traverse(node
|
|
50
|
-
|
|
47
|
+
const nodeMap = new Map() // 用于去重的Map
|
|
48
|
+
|
|
49
|
+
function traverse(node) {
|
|
51
50
|
if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {
|
|
52
|
-
|
|
51
|
+
if (!nodeMap.has(node[searchField])) {
|
|
52
|
+
nodeMap.set(node[searchField], node)
|
|
53
|
+
}
|
|
53
54
|
return true
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
node[hasField]
|
|
57
|
-
|
|
57
|
+
node[hasField]?.forEach(childNode => {
|
|
58
|
+
traverse(childNode)
|
|
58
59
|
})
|
|
59
|
-
|
|
60
|
+
|
|
60
61
|
return false
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
break
|
|
67
|
-
}
|
|
68
|
-
}
|
|
64
|
+
dataSource.forEach(rootNode => {
|
|
65
|
+
traverse(rootNode)
|
|
66
|
+
})
|
|
69
67
|
|
|
70
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
69
|
+
socket = new WebSocket(finalUrl)
|
|
70
|
+
instances.set(url, { socket, callbacks })
|
|
23
71
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
72
|
+
socket.onopen = () => {
|
|
73
|
+
reconnectCount = 0
|
|
74
|
+
startHeartbeat()
|
|
75
|
+
resolve(instance)
|
|
76
|
+
}
|
|
29
77
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
function traverse(node
|
|
50
|
-
|
|
47
|
+
const nodeMap = new Map() // 用于去重的Map
|
|
48
|
+
|
|
49
|
+
function traverse(node) {
|
|
51
50
|
if (nodeIds.includes(node[searchField]) && !node.hasOwnProperty(hasField)) {
|
|
52
|
-
|
|
51
|
+
if (!nodeMap.has(node[searchField])) {
|
|
52
|
+
nodeMap.set(node[searchField], node)
|
|
53
|
+
}
|
|
53
54
|
return true
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
node[hasField]
|
|
57
|
-
|
|
57
|
+
node[hasField]?.forEach(childNode => {
|
|
58
|
+
traverse(childNode)
|
|
58
59
|
})
|
|
59
|
-
|
|
60
|
+
|
|
60
61
|
return false
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
break
|
|
67
|
-
}
|
|
68
|
-
}
|
|
64
|
+
dataSource.forEach(rootNode => {
|
|
65
|
+
traverse(rootNode)
|
|
66
|
+
})
|
|
69
67
|
|
|
70
|
-
return
|
|
68
|
+
return Array.from(nodeMap.values()) // 返回去重后的数组
|
|
71
69
|
}
|
|
72
70
|
|
|
73
71
|
|
package/utils/Websocket.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
69
|
+
socket = new WebSocket(finalUrl)
|
|
70
|
+
instances.set(url, { socket, callbacks })
|
|
23
71
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
72
|
+
socket.onopen = () => {
|
|
73
|
+
reconnectCount = 0
|
|
74
|
+
startHeartbeat()
|
|
75
|
+
resolve(instance)
|
|
76
|
+
}
|
|
29
77
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|