el-crud-page 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -25,9 +25,6 @@ function _arrayLikeToArray(r, a) {
25
25
  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
26
26
  return n;
27
27
  }
28
- function _arrayWithHoles(r) {
29
- if (Array.isArray(r)) return r;
30
- }
31
28
  function _arrayWithoutHoles(r) {
32
29
  if (Array.isArray(r)) return _arrayLikeToArray(r);
33
30
  }
@@ -67,36 +64,6 @@ function _defineProperty(e, r, t) {
67
64
  function _iterableToArray(r) {
68
65
  if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
69
66
  }
70
- function _iterableToArrayLimit(r, l) {
71
- var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
72
- if (null != t) {
73
- var e,
74
- n,
75
- i,
76
- u,
77
- a = [],
78
- f = !0,
79
- o = !1;
80
- try {
81
- if (i = (t = t.call(r)).next, 0 === l) {
82
- if (Object(t) !== t) return;
83
- f = !1;
84
- } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
85
- } catch (r) {
86
- o = !0, n = r;
87
- } finally {
88
- try {
89
- if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
90
- } finally {
91
- if (o) throw n;
92
- }
93
- }
94
- return a;
95
- }
96
- }
97
- function _nonIterableRest() {
98
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
99
- }
100
67
  function _nonIterableSpread() {
101
68
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
102
69
  }
@@ -229,9 +196,6 @@ function _regeneratorDefine(e, r, n, t) {
229
196
  }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
230
197
  }, _regeneratorDefine(e, r, n, t);
231
198
  }
232
- function _slicedToArray(r, e) {
233
- return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
234
- }
235
199
  function _toConsumableArray(r) {
236
200
  return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
237
201
  }
@@ -1149,7 +1113,7 @@ TableColumn.components = {
1149
1113
  //
1150
1114
  //
1151
1115
 
1152
- var script$5 = {
1116
+ var script$4 = {
1153
1117
  name: "CrudTable",
1154
1118
  components: {
1155
1119
  CrudTableColumn: TableColumn
@@ -1383,7 +1347,7 @@ function addStyle(id, css) {
1383
1347
  }
1384
1348
 
1385
1349
  /* script */
1386
- var __vue_script__$5 = script$5;
1350
+ var __vue_script__$4 = script$4;
1387
1351
 
1388
1352
  /* template */
1389
1353
  var __vue_render__$4 = function __vue_render__() {
@@ -1396,8 +1360,9 @@ var __vue_render__$4 = function __vue_render__() {
1396
1360
  attrs: {
1397
1361
  data: _vm.data
1398
1362
  }
1399
- }, "el-table", _vm.combinedProps, false), _vm.combinedEvents), _vm._l(_vm.columns, function (column) {
1363
+ }, "el-table", _vm.combinedProps, false), _vm.combinedEvents), _vm._l(_vm.columns, function (column, index) {
1400
1364
  return !column["v-hasPermi"] || !column["v-hasPermi"].length || _vm.$auth.hasPermiOr(column["v-hasPermi"] || []) ? _c("crud-table-column", {
1365
+ key: "" + (column.key || "column_" + index),
1401
1366
  attrs: {
1402
1367
  indexMethod: function indexMethod(index) {
1403
1368
  return _vm.baseIndex + 1 + index;
@@ -1414,35 +1379,35 @@ var __vue_staticRenderFns__$4 = [];
1414
1379
  __vue_render__$4._withStripped = true;
1415
1380
 
1416
1381
  /* style */
1417
- var __vue_inject_styles__$5 = function __vue_inject_styles__(inject) {
1382
+ var __vue_inject_styles__$4 = function __vue_inject_styles__(inject) {
1418
1383
  if (!inject) return;
1419
- inject("data-v-eea78022_0", {
1420
- source: ".crud-table[data-v-eea78022] .el-table__body-wrapper .el-table__cell .cell:empty::after {\n content: \"/\";\n color: #c0c4cc;\n}\n\n/*# sourceMappingURL=table.vue.map */",
1384
+ inject("data-v-8bcd2094_0", {
1385
+ source: ".crud-table[data-v-8bcd2094] .el-table__body-wrapper .el-table__cell .cell:empty::after {\n content: \"/\";\n color: #c0c4cc;\n}\n\n/*# sourceMappingURL=table.vue.map */",
1421
1386
  map: {
1422
1387
  "version": 3,
1423
1388
  "sources": ["/Users/tonwe/git/el-crud-page/src/table.vue", "table.vue"],
1424
1389
  "names": [],
1425
1390
  "mappings": "AAsJA;EACA,YAAA;EACA,cAAA;ACrJA;;AAEA,oCAAoC",
1426
1391
  "file": "table.vue",
1427
- "sourcesContent": ["<!-- crud table 组件 -->\n<template>\n <el-table :data=\"data\" class=\"crud-table\" ref=\"table\" v-bind=\"combinedProps\" v-on=\"combinedEvents\">\n <crud-table-column v-for=\"column in columns\" :indexMethod=\"(index)=>( baseIndex + 1 + index )\"\n v-if=\"!column[`v-hasPermi`] || !column[`v-hasPermi`].length || $auth.hasPermiOr(column[`v-hasPermi`] || [])\"\n :column=\"column\" @action=\"onRowAction\">\n </crud-table-column>\n </el-table>\n</template>\n<script>\n\n\n/**\n * CRUD table组件\n */\n\nimport CrudTableColumn from \"./tableColumn.js\";\n\nexport default {\n name: \"CrudTable\",\n components: {\n CrudTableColumn\n },\n inject: [\"crud\"],\n props: {\n columns: {\n type: Array,\n default: () => []\n },\n on: {\n type: Object,\n default: () => {\n return {};\n }\n },\n data: {\n type: Array,\n default: () => {\n return [];\n }\n }\n },\n data() {\n return {\n emit: {},\n defaultProps: {\n stripe: true,\n size: \"mini\",\n }\n };\n },\n computed: {\n // 将外部传入的 props 与 crud 内部样式合并\n combinedProps() {\n return Object.assign({}, this.defaultProps, this.$attrs);\n },\n // 将各事件处理函数合并,包括 emit 与 on 上的回调\n combinedEvents() {\n return Object.assign(\n {},\n {\n \"selection-change\": this.onSelectionChange,\n \"sort-change\": this.onSortChange,\n \"row-contextmenu\": this.onRowContextMenu\n },\n this.emit,\n this.on\n );\n },\n baseIndex(){\n if( this.crud?.pagination ){\n return (this.crud?.pagination?.pageNum-1) * this.crud?.pagination?.pageSize;\n }else{\n return 0;\n }\n }\n },\n mounted() {\n this.bindEmits();\n this.bindMethods();\n },\n methods: {\n // 绑定 el-table 回调\n bindEmits() {\n const emits = [\n \"select\",\n \"select-all\",\n \"cell-mouse-enter\",\n \"cell-mouse-leave\",\n \"cell-click\",\n \"cell-dblclick\",\n \"row-click\",\n \"row-contextmenu\",\n \"row-dblclick\",\n \"header-click\",\n \"header-contextmenu\",\n \"filter-change\",\n \"current-change\",\n \"header-dragend\",\n \"expand-change\"\n ];\n\n emits.forEach((name) => {\n this.emit[name] = (...args) => {\n this.$emit(name, ...args);\n };\n });\n },\n\n // 绑定 el-table 事件\n bindMethods() {\n const methods = [\n \"clearSelection\",\n \"toggleRowSelection\",\n \"toggleAllSelection\",\n \"toggleRowExpansion\",\n \"setCurrentRow\",\n \"clearSort\",\n \"clearFilter\",\n \"doLayout\",\n \"sort\"\n ];\n\n methods.forEach((n) => {\n this[n] = this.$refs[\"table\"][n];\n });\n },\n onSelectionChange(selection) {\n this.$emit(\"selection-change\", selection);\n },\n onSortChange({ prop, order }) {\n this.$emit(\"sort-change\", { prop, order });\n },\n onRowContextMenu(row, column, event) {\n this.$emit(\"row-contextmenu\", row, column, event);\n },\n onRowAction(action, scope) {\n this.$emit(\"row-action\", action, scope);\n this.$emit(`row-${action}`, scope);\n }\n }\n\n}\n</script>\n\n<style scoped lang=\"scss\">\n.crud-table {\n &::v-deep {\n .el-table__body-wrapper {\n .el-table__cell {\n .cell:empty::after {\n content: '/';\n color: #c0c4cc;\n }\n }\n }\n }\n}\n</style>\n", ".crud-table::v-deep .el-table__body-wrapper .el-table__cell .cell:empty::after {\n content: \"/\";\n color: #c0c4cc;\n}\n\n/*# sourceMappingURL=table.vue.map */"]
1392
+ "sourcesContent": ["<!-- crud table 组件 -->\n<template>\n <el-table :data=\"data\" class=\"crud-table\" ref=\"table\" v-bind=\"combinedProps\" v-on=\"combinedEvents\">\n <crud-table-column v-for=\"(column,index) in columns\" :key=\"`${ column.key || ('column_'+index) }`\" :indexMethod=\"(index)=>( baseIndex + 1 + index )\"\n v-if=\"!column[`v-hasPermi`] || !column[`v-hasPermi`].length || $auth.hasPermiOr(column[`v-hasPermi`] || [])\"\n :column=\"column\" @action=\"onRowAction\">\n </crud-table-column>\n </el-table>\n</template>\n<script>\n\n\n/**\n * CRUD table组件\n */\n\nimport CrudTableColumn from \"./tableColumn.js\";\n\nexport default {\n name: \"CrudTable\",\n components: {\n CrudTableColumn\n },\n inject: [\"crud\"],\n props: {\n columns: {\n type: Array,\n default: () => []\n },\n on: {\n type: Object,\n default: () => {\n return {};\n }\n },\n data: {\n type: Array,\n default: () => {\n return [];\n }\n }\n },\n data() {\n return {\n emit: {},\n defaultProps: {\n stripe: true,\n size: \"mini\",\n }\n };\n },\n computed: {\n // 将外部传入的 props 与 crud 内部样式合并\n combinedProps() {\n return Object.assign({}, this.defaultProps, this.$attrs);\n },\n // 将各事件处理函数合并,包括 emit 与 on 上的回调\n combinedEvents() {\n return Object.assign(\n {},\n {\n \"selection-change\": this.onSelectionChange,\n \"sort-change\": this.onSortChange,\n \"row-contextmenu\": this.onRowContextMenu\n },\n this.emit,\n this.on\n );\n },\n baseIndex(){\n if( this.crud?.pagination ){\n return (this.crud?.pagination?.pageNum-1) * this.crud?.pagination?.pageSize;\n }else{\n return 0;\n }\n }\n },\n mounted() {\n this.bindEmits();\n this.bindMethods();\n },\n methods: {\n // 绑定 el-table 回调\n bindEmits() {\n const emits = [\n \"select\",\n \"select-all\",\n \"cell-mouse-enter\",\n \"cell-mouse-leave\",\n \"cell-click\",\n \"cell-dblclick\",\n \"row-click\",\n \"row-contextmenu\",\n \"row-dblclick\",\n \"header-click\",\n \"header-contextmenu\",\n \"filter-change\",\n \"current-change\",\n \"header-dragend\",\n \"expand-change\"\n ];\n\n emits.forEach((name) => {\n this.emit[name] = (...args) => {\n this.$emit(name, ...args);\n };\n });\n },\n\n // 绑定 el-table 事件\n bindMethods() {\n const methods = [\n \"clearSelection\",\n \"toggleRowSelection\",\n \"toggleAllSelection\",\n \"toggleRowExpansion\",\n \"setCurrentRow\",\n \"clearSort\",\n \"clearFilter\",\n \"doLayout\",\n \"sort\"\n ];\n\n methods.forEach((n) => {\n this[n] = this.$refs[\"table\"][n];\n });\n },\n onSelectionChange(selection) {\n this.$emit(\"selection-change\", selection);\n },\n onSortChange({ prop, order }) {\n this.$emit(\"sort-change\", { prop, order });\n },\n onRowContextMenu(row, column, event) {\n this.$emit(\"row-contextmenu\", row, column, event);\n },\n onRowAction(action, scope) {\n this.$emit(\"row-action\", action, scope);\n this.$emit(`row-${action}`, scope);\n }\n }\n\n}\n</script>\n\n<style scoped lang=\"scss\">\n.crud-table {\n &::v-deep {\n .el-table__body-wrapper {\n .el-table__cell {\n .cell:empty::after {\n content: '/';\n color: #c0c4cc;\n }\n }\n }\n }\n}\n</style>\n", ".crud-table::v-deep .el-table__body-wrapper .el-table__cell .cell:empty::after {\n content: \"/\";\n color: #c0c4cc;\n}\n\n/*# sourceMappingURL=table.vue.map */"]
1428
1393
  },
1429
1394
  media: undefined
1430
1395
  });
1431
1396
  };
1432
1397
  /* scoped */
1433
- var __vue_scope_id__$5 = "data-v-eea78022";
1398
+ var __vue_scope_id__$4 = "data-v-8bcd2094";
1434
1399
  /* module identifier */
1435
- var __vue_module_identifier__$5 = undefined;
1400
+ var __vue_module_identifier__$4 = undefined;
1436
1401
  /* functional template */
1437
- var __vue_is_functional_template__$5 = false;
1402
+ var __vue_is_functional_template__$4 = false;
1438
1403
  /* style inject SSR */
1439
1404
 
1440
1405
  /* style inject shadow dom */
1441
1406
 
1442
- var __vue_component__$5 = /*#__PURE__*/normalizeComponent({
1407
+ var __vue_component__$4 = /*#__PURE__*/normalizeComponent({
1443
1408
  render: __vue_render__$4,
1444
1409
  staticRenderFns: __vue_staticRenderFns__$4
1445
- }, __vue_inject_styles__$5, __vue_script__$5, __vue_scope_id__$5, __vue_is_functional_template__$5, __vue_module_identifier__$5, false, createInjector, undefined, undefined);
1410
+ }, __vue_inject_styles__$4, __vue_script__$4, __vue_scope_id__$4, __vue_is_functional_template__$4, __vue_module_identifier__$4, false, createInjector, undefined, undefined);
1446
1411
 
1447
1412
  //
1448
1413
  //
@@ -1478,7 +1443,7 @@ var __vue_component__$5 = /*#__PURE__*/normalizeComponent({
1478
1443
  //
1479
1444
  //
1480
1445
 
1481
- var script$4 = {
1446
+ var script$3 = {
1482
1447
  name: "RightToolbar",
1483
1448
  inject: ["crud"],
1484
1449
  data: function data() {
@@ -1584,7 +1549,7 @@ var script$4 = {
1584
1549
  };
1585
1550
 
1586
1551
  /* script */
1587
- var __vue_script__$4 = script$4;
1552
+ var __vue_script__$3 = script$3;
1588
1553
 
1589
1554
  /* template */
1590
1555
  var __vue_render__$3 = function __vue_render__() {
@@ -1715,7 +1680,7 @@ var __vue_staticRenderFns__$3 = [];
1715
1680
  __vue_render__$3._withStripped = true;
1716
1681
 
1717
1682
  /* style */
1718
- var __vue_inject_styles__$4 = function __vue_inject_styles__(inject) {
1683
+ var __vue_inject_styles__$3 = function __vue_inject_styles__(inject) {
1719
1684
  if (!inject) return;
1720
1685
  inject("data-v-d5778a5c_0", {
1721
1686
  source: "[data-v-d5778a5c] .el-transfer__button {\n border-radius: 50%;\n padding: 12px;\n display: block;\n margin-left: 0px;\n}\n[data-v-d5778a5c] .el-transfer__button:first-child {\n margin-bottom: 10px;\n}\n.drag-item[data-v-d5778a5c] {\n padding: 8px;\n cursor: move;\n border-bottom: 1px solid #ebeef5;\n display: flex;\n align-items: center;\n}\n.drag-item[data-v-d5778a5c]:hover {\n background-color: #f5f7fa;\n}\n.drag-handle[data-v-d5778a5c] {\n color: #909399;\n}\n.drag-handle[data-v-d5778a5c]:hover {\n color: #409eff;\n}\n\n/*# sourceMappingURL=rightToolbar.vue.map */",
@@ -1731,21 +1696,21 @@ var __vue_inject_styles__$4 = function __vue_inject_styles__(inject) {
1731
1696
  });
1732
1697
  };
1733
1698
  /* scoped */
1734
- var __vue_scope_id__$4 = "data-v-d5778a5c";
1699
+ var __vue_scope_id__$3 = "data-v-d5778a5c";
1735
1700
  /* module identifier */
1736
- var __vue_module_identifier__$4 = undefined;
1701
+ var __vue_module_identifier__$3 = undefined;
1737
1702
  /* functional template */
1738
- var __vue_is_functional_template__$4 = false;
1703
+ var __vue_is_functional_template__$3 = false;
1739
1704
  /* style inject SSR */
1740
1705
 
1741
1706
  /* style inject shadow dom */
1742
1707
 
1743
- var __vue_component__$4 = /*#__PURE__*/normalizeComponent({
1708
+ var __vue_component__$3 = /*#__PURE__*/normalizeComponent({
1744
1709
  render: __vue_render__$3,
1745
1710
  staticRenderFns: __vue_staticRenderFns__$3
1746
- }, __vue_inject_styles__$4, __vue_script__$4, __vue_scope_id__$4, __vue_is_functional_template__$4, __vue_module_identifier__$4, false, createInjector, undefined, undefined);
1711
+ }, __vue_inject_styles__$3, __vue_script__$3, __vue_scope_id__$3, __vue_is_functional_template__$3, __vue_module_identifier__$3, false, createInjector, undefined, undefined);
1747
1712
 
1748
- var script$3 = {
1713
+ var script$2 = {
1749
1714
  props: {
1750
1715
  // queryParams: {
1751
1716
  // type: Object,
@@ -1961,7 +1926,7 @@ var script$3 = {
1961
1926
  };
1962
1927
 
1963
1928
  /* script */
1964
- var __vue_script__$3 = script$3;
1929
+ var __vue_script__$2 = script$2;
1965
1930
 
1966
1931
  /* template */
1967
1932
  var __vue_render__$2 = function __vue_render__() {
@@ -2011,7 +1976,7 @@ var __vue_render__$2 = function __vue_render__() {
2011
1976
  if (!$event.type.indexOf("key") && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
2012
1977
  return null;
2013
1978
  }
2014
- return _vm.handleQuery.apply(null, arguments);
1979
+ return _vm.handleQuery($event);
2015
1980
  }
2016
1981
  },
2017
1982
  model: {
@@ -2128,7 +2093,7 @@ var __vue_staticRenderFns__$2 = [];
2128
2093
  __vue_render__$2._withStripped = true;
2129
2094
 
2130
2095
  /* style */
2131
- var __vue_inject_styles__$3 = function __vue_inject_styles__(inject) {
2096
+ var __vue_inject_styles__$2 = function __vue_inject_styles__(inject) {
2132
2097
  if (!inject) return;
2133
2098
  inject("data-v-ba1b80d0_0", {
2134
2099
  source: ".container-main[data-v-ba1b80d0] {\n background-color: #fff;\n}\n.el-crud-query[data-v-ba1b80d0] {\n overflow: hidden;\n padding: 10px;\n}\n.el-crud-query .el-crud-query-form[data-v-ba1b80d0] {\n margin-bottom: -10px;\n}\n.el-crud-query .el-crud-query-form[data-v-ba1b80d0] .el-form-item--mini.el-form-item, .el-crud-query .el-crud-query-form[data-v-ba1b80d0] .el-form-item--small.el-form-item {\n margin-bottom: 10px;\n}\n\n/*# sourceMappingURL=queryForm.vue.map */",
@@ -2144,19 +2109,19 @@ var __vue_inject_styles__$3 = function __vue_inject_styles__(inject) {
2144
2109
  });
2145
2110
  };
2146
2111
  /* scoped */
2147
- var __vue_scope_id__$3 = "data-v-ba1b80d0";
2112
+ var __vue_scope_id__$2 = "data-v-ba1b80d0";
2148
2113
  /* module identifier */
2149
- var __vue_module_identifier__$3 = undefined;
2114
+ var __vue_module_identifier__$2 = undefined;
2150
2115
  /* functional template */
2151
- var __vue_is_functional_template__$3 = false;
2116
+ var __vue_is_functional_template__$2 = false;
2152
2117
  /* style inject SSR */
2153
2118
 
2154
2119
  /* style inject shadow dom */
2155
2120
 
2156
- var __vue_component__$3 = /*#__PURE__*/normalizeComponent({
2121
+ var __vue_component__$2 = /*#__PURE__*/normalizeComponent({
2157
2122
  render: __vue_render__$2,
2158
2123
  staticRenderFns: __vue_staticRenderFns__$2
2159
- }, __vue_inject_styles__$3, __vue_script__$3, __vue_scope_id__$3, __vue_is_functional_template__$3, __vue_module_identifier__$3, false, createInjector, undefined, undefined);
2124
+ }, __vue_inject_styles__$2, __vue_script__$2, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, createInjector, undefined, undefined);
2160
2125
 
2161
2126
  //
2162
2127
  //
@@ -2176,7 +2141,7 @@ var __vue_component__$3 = /*#__PURE__*/normalizeComponent({
2176
2141
  //
2177
2142
  //
2178
2143
 
2179
- var script$2 = {
2144
+ var script$1 = {
2180
2145
  name: 'Pagination',
2181
2146
  props: {
2182
2147
  total: {
@@ -2266,7 +2231,7 @@ var script$2 = {
2266
2231
  };
2267
2232
 
2268
2233
  /* script */
2269
- var __vue_script__$2 = script$2;
2234
+ var __vue_script__$1 = script$1;
2270
2235
 
2271
2236
  /* template */
2272
2237
  var __vue_render__$1 = function __vue_render__() {
@@ -2310,7 +2275,7 @@ var __vue_staticRenderFns__$1 = [];
2310
2275
  __vue_render__$1._withStripped = true;
2311
2276
 
2312
2277
  /* style */
2313
- var __vue_inject_styles__$2 = function __vue_inject_styles__(inject) {
2278
+ var __vue_inject_styles__$1 = function __vue_inject_styles__(inject) {
2314
2279
  if (!inject) return;
2315
2280
  inject("data-v-7ec7699b_0", {
2316
2281
  source: "\n.pagination-container[data-v-7ec7699b] {\n background: #fff;\n padding: 32px 16px;\n}\n.pagination-container.hidden[data-v-7ec7699b] {\n display: none;\n}\n",
@@ -2326,26 +2291,26 @@ var __vue_inject_styles__$2 = function __vue_inject_styles__(inject) {
2326
2291
  });
2327
2292
  };
2328
2293
  /* scoped */
2329
- var __vue_scope_id__$2 = "data-v-7ec7699b";
2294
+ var __vue_scope_id__$1 = "data-v-7ec7699b";
2330
2295
  /* module identifier */
2331
- var __vue_module_identifier__$2 = undefined;
2296
+ var __vue_module_identifier__$1 = undefined;
2332
2297
  /* functional template */
2333
- var __vue_is_functional_template__$2 = false;
2298
+ var __vue_is_functional_template__$1 = false;
2334
2299
  /* style inject SSR */
2335
2300
 
2336
2301
  /* style inject shadow dom */
2337
2302
 
2338
- var __vue_component__$2 = /*#__PURE__*/normalizeComponent({
2303
+ var __vue_component__$1 = /*#__PURE__*/normalizeComponent({
2339
2304
  render: __vue_render__$1,
2340
2305
  staticRenderFns: __vue_staticRenderFns__$1
2341
- }, __vue_inject_styles__$2, __vue_script__$2, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, createInjector, undefined, undefined);
2306
+ }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, createInjector, undefined, undefined);
2342
2307
 
2343
- var script$1 = {
2308
+ var script = {
2344
2309
  components: {
2345
- CrudTable: __vue_component__$5,
2346
- RightToolbar: __vue_component__$4,
2347
- QueryForm: __vue_component__$3,
2348
- Pagination: __vue_component__$2
2310
+ CrudTable: __vue_component__$4,
2311
+ RightToolbar: __vue_component__$3,
2312
+ QueryForm: __vue_component__$2,
2313
+ Pagination: __vue_component__$1
2349
2314
  },
2350
2315
  name: 'Crud',
2351
2316
  provide: function provide() {
@@ -2656,7 +2621,7 @@ var script$1 = {
2656
2621
  };
2657
2622
 
2658
2623
  /* script */
2659
- var __vue_script__$1 = script$1;
2624
+ var __vue_script__ = script;
2660
2625
 
2661
2626
  /* template */
2662
2627
  var __vue_render__ = function __vue_render__() {
@@ -2665,26 +2630,24 @@ var __vue_render__ = function __vue_render__() {
2665
2630
  var _c = _vm._self._c || _h;
2666
2631
  return _c("div", {
2667
2632
  staticClass: "el-crud"
2668
- }, [_vm._t("query", function () {
2669
- return [_vm.queryItems && _vm.queryItems.length ? _c("query-form", {
2670
- directives: [{
2671
- name: "show",
2672
- rawName: "v-show",
2673
- value: _vm.showSearch,
2674
- expression: "showSearch"
2675
- }],
2676
- attrs: {
2677
- queryItems: _vm.queryItems,
2678
- lineClamp: _vm.queryLineClamp,
2679
- "label-width": _vm.queryLabelWidth,
2680
- "input-width": _vm.queryInputWidth,
2681
- inline: _vm.queryInline
2682
- },
2683
- on: {
2684
- queryTable: _vm.handleQuery
2685
- }
2686
- }) : _vm._e()];
2687
- }, {
2633
+ }, [_vm._t("query", [_vm.queryItems && _vm.queryItems.length ? _c("query-form", {
2634
+ directives: [{
2635
+ name: "show",
2636
+ rawName: "v-show",
2637
+ value: _vm.showSearch,
2638
+ expression: "showSearch"
2639
+ }],
2640
+ attrs: {
2641
+ queryItems: _vm.queryItems,
2642
+ lineClamp: _vm.queryLineClamp,
2643
+ "label-width": _vm.queryLabelWidth,
2644
+ "input-width": _vm.queryInputWidth,
2645
+ inline: _vm.queryInline
2646
+ },
2647
+ on: {
2648
+ queryTable: _vm.handleQuery
2649
+ }
2650
+ }) : _vm._e()], {
2688
2651
  queryItems: _vm.queryItems,
2689
2652
  lineClamp: _vm.queryLineClamp,
2690
2653
  labelWidth: _vm.queryLabelWidth,
@@ -2695,114 +2658,105 @@ var __vue_render__ = function __vue_render__() {
2695
2658
  "class": {
2696
2659
  pt5: _vm.tabPanes.length > 0
2697
2660
  }
2698
- }, [_vm._t("tabQuery", function () {
2699
- return [_vm.tabPanes.length > 0 ? _c("el-tabs", {
2700
- staticClass: "top-tab-query",
2661
+ }, [_vm._t("tabQuery", [_vm.tabPanes.length > 0 ? _c("el-tabs", {
2662
+ staticClass: "top-tab-query",
2663
+ attrs: {
2664
+ value: _vm.tabQuery.tabKey
2665
+ },
2666
+ on: {
2667
+ "tab-click": _vm.handleTabClick
2668
+ }
2669
+ }, _vm._l(_vm.tabPanes, function (item) {
2670
+ return _c("el-tab-pane", {
2671
+ key: item.name,
2701
2672
  attrs: {
2702
- value: _vm.tabQuery.tabKey
2703
- },
2704
- on: {
2705
- "tab-click": _vm.handleTabClick
2673
+ label: item.label,
2674
+ name: item.name
2706
2675
  }
2707
- }, _vm._l(_vm.tabPanes, function (item) {
2708
- return _c("el-tab-pane", {
2709
- key: item.name,
2710
- attrs: {
2711
- label: item.label,
2712
- name: item.name
2713
- }
2714
- });
2715
- }), 1) : _vm._e()];
2716
- }), _vm._v(" "), _c("div", {
2676
+ });
2677
+ }), 1) : _vm._e()]), _vm._v(" "), _c("div", {
2717
2678
  staticClass: "flex justify-between el-crud-toolbar"
2718
- }, [_vm._t("buttons", function () {
2719
- return [_c("div", _vm._l(_vm.actionButtons, function (item) {
2720
- return _c("el-button", {
2721
- attrs: {
2722
- size: item.size,
2723
- plain: item.plain,
2724
- disabled: item.disabled,
2725
- type: item.type,
2726
- icon: item.icon
2727
- },
2728
- on: {
2729
- click: function click($event) {
2730
- return _vm.handleButtonClick(item);
2731
- }
2732
- }
2733
- }, [_vm._v(_vm._s(item.text))]);
2734
- }), 1)];
2735
- }, {
2736
- selections: _vm.selections
2737
- }), _vm._v(" "), _vm._t("toolbar", function () {
2738
- return [_c("right-toolbar", {
2679
+ }, [_vm._t("buttons", [_c("div", _vm._l(_vm.actionButtons, function (item, index) {
2680
+ return _c("el-button", {
2681
+ key: "" + (item.key || "action-btn-" + index),
2739
2682
  attrs: {
2740
- showSearch: _vm.showSearch,
2741
- columns: _vm.columns,
2742
- search: !!(_vm.queryItems && _vm.queryItems.length)
2683
+ size: item.size,
2684
+ plain: item.plain,
2685
+ disabled: item.disabled,
2686
+ type: item.type,
2687
+ icon: item.icon
2743
2688
  },
2744
2689
  on: {
2745
- "update:showSearch": function updateShowSearch($event) {
2746
- _vm.showSearch = $event;
2747
- },
2748
- "update:show-search": function updateShowSearch($event) {
2749
- _vm.showSearch = $event;
2750
- },
2751
- queryTable: _vm.refresh
2690
+ click: function click($event) {
2691
+ return _vm.handleButtonClick(item);
2692
+ }
2752
2693
  }
2753
- })];
2754
- }, {
2694
+ }, [_vm._v(_vm._s(item.text))]);
2695
+ }), 1)], {
2696
+ selections: _vm.selections
2697
+ }), _vm._v(" "), _vm._t("toolbar", [_c("right-toolbar", {
2698
+ attrs: {
2699
+ showSearch: _vm.showSearch,
2700
+ columns: _vm.columns,
2701
+ search: !!(_vm.queryItems && _vm.queryItems.length)
2702
+ },
2703
+ on: {
2704
+ "update:showSearch": function updateShowSearch($event) {
2705
+ _vm.showSearch = $event;
2706
+ },
2707
+ "update:show-search": function updateShowSearch($event) {
2708
+ _vm.showSearch = $event;
2709
+ },
2710
+ queryTable: _vm.refresh
2711
+ }
2712
+ })], {
2755
2713
  columns: _vm.columns,
2756
2714
  showSearch: _vm.showSearch
2757
- })], 2), _vm._v(" "), _vm._t("default", function () {
2758
- return [_c("crud-table", {
2759
- directives: [{
2760
- name: "loading",
2761
- rawName: "v-loading",
2762
- value: _vm.listLoading,
2763
- expression: "listLoading"
2764
- }],
2765
- attrs: {
2766
- size: "mini",
2767
- highlightCol: _vm.highlightCol,
2768
- resizable: _vm.resizable,
2769
- border: _vm.border,
2770
- columns: _vm.columns,
2771
- data: _vm.data,
2772
- "default-sort": _vm.defaultSort
2773
- },
2774
- on: {
2775
- "selection-change": _vm.handleSelectionChange,
2776
- "row-action": _vm.handleRowAction,
2777
- "sort-change": _vm.handleSortChange
2778
- }
2779
- })];
2780
- }, {
2715
+ })], 2), _vm._v(" "), _vm._t("default", [_c("crud-table", {
2716
+ directives: [{
2717
+ name: "loading",
2718
+ rawName: "v-loading",
2719
+ value: _vm.listLoading,
2720
+ expression: "listLoading"
2721
+ }],
2722
+ attrs: {
2723
+ size: "mini",
2724
+ highlightCol: _vm.highlightCol,
2725
+ resizable: _vm.resizable,
2726
+ border: _vm.border,
2727
+ columns: _vm.columns,
2728
+ data: _vm.data,
2729
+ "default-sort": _vm.defaultSort
2730
+ },
2731
+ on: {
2732
+ "selection-change": _vm.handleSelectionChange,
2733
+ "row-action": _vm.handleRowAction,
2734
+ "sort-change": _vm.handleSortChange
2735
+ }
2736
+ })], {
2781
2737
  data: _vm.data
2782
- }), _vm._v(" "), _vm._t("pagination", function () {
2783
- return [_c("pagination", {
2784
- directives: [{
2785
- name: "show",
2786
- rawName: "v-show",
2787
- value: _vm.total > 0,
2788
- expression: "total > 0"
2789
- }],
2790
- attrs: {
2791
- total: _vm.total,
2792
- page: _vm.pagination.pageNum,
2793
- limit: _vm.pagination.pageSize
2738
+ }), _vm._v(" "), _vm._t("pagination", [_c("pagination", {
2739
+ directives: [{
2740
+ name: "show",
2741
+ rawName: "v-show",
2742
+ value: _vm.total > 0,
2743
+ expression: "total > 0"
2744
+ }],
2745
+ attrs: {
2746
+ total: _vm.total,
2747
+ page: _vm.pagination.pageNum,
2748
+ limit: _vm.pagination.pageSize
2749
+ },
2750
+ on: {
2751
+ "update:page": function updatePage($event) {
2752
+ return _vm.$set(_vm.pagination, "pageNum", $event);
2794
2753
  },
2795
- on: {
2796
- "update:page": function updatePage($event) {
2797
- return _vm.$set(_vm.pagination, "pageNum", $event);
2798
- },
2799
- "update:limit": function updateLimit($event) {
2800
- return _vm.$set(_vm.pagination, "pageSize", $event);
2801
- },
2802
- pagination: _vm.refresh
2803
- }
2804
- })];
2805
- }, {
2754
+ "update:limit": function updateLimit($event) {
2755
+ return _vm.$set(_vm.pagination, "pageSize", $event);
2756
+ },
2757
+ pagination: _vm.refresh
2758
+ }
2759
+ })], {
2806
2760
  total: _vm.total,
2807
2761
  pagination: _vm.pagination
2808
2762
  })], 2)], 2);
@@ -2811,803 +2765,39 @@ var __vue_staticRenderFns__ = [];
2811
2765
  __vue_render__._withStripped = true;
2812
2766
 
2813
2767
  /* style */
2814
- var __vue_inject_styles__$1 = function __vue_inject_styles__(inject) {
2768
+ var __vue_inject_styles__ = function __vue_inject_styles__(inject) {
2815
2769
  if (!inject) return;
2816
- inject("data-v-7449f835_0", {
2817
- source: ".top-tab-query[data-v-7449f835] {\n margin-bottom: 10px;\n}\n.top-tab-query[data-v-7449f835] .el-tabs__header {\n margin: 0;\n}\n\n/*# sourceMappingURL=index.vue.map */",
2770
+ inject("data-v-35906918_0", {
2771
+ source: ".top-tab-query[data-v-35906918] {\n margin-bottom: 10px;\n}\n.top-tab-query[data-v-35906918] .el-tabs__header {\n margin: 0;\n}\n\n/*# sourceMappingURL=index.vue.map */",
2818
2772
  map: {
2819
2773
  "version": 3,
2820
2774
  "sources": ["/Users/tonwe/git/el-crud-page/src/index.vue", "index.vue"],
2821
2775
  "names": [],
2822
2776
  "mappings": "AA2UA;EACA,mBAAA;AC1UA;AD6UA;EACA,SAAA;AC3UA;;AAEA,oCAAoC",
2823
2777
  "file": "index.vue",
2824
- "sourcesContent": ["<!-- crud组件 主要用于子组件的上下文传递 -->\n<!-- \n 搜索组件配置 queryItems 可配置\n 搜索及重置事件 queryTable \n \n 切换组件配置 tabPanes 可配置\n 切换参数 tabQuery \n \n 按钮组件配置 buttons 可配置\n 右侧工具条\n 表格列配置 columns 可配置\n 表格数据\n 分页数据\n -->\n<template>\n\n <div class=\"el-crud\">\n <!-- 搜索过滤插槽 -->\n <slot name=\"query\" :queryItems=\"queryItems\" :lineClamp=\"queryLineClamp\" :labelWidth=\"queryLabelWidth\"\n :inputWidth=\"queryInputWidth\" :inline=\"queryInline\">\n <query-form v-show=\"showSearch\" v-if=\"queryItems && queryItems.length\" :queryItems=\"queryItems\"\n :lineClamp=\"queryLineClamp\" :label-width=\"queryLabelWidth\" :input-width=\"queryInputWidth\" :inline=\"queryInline\"\n @queryTable=\"handleQuery\" />\n </slot>\n <div class=\"container-main\" :class=\"{ pt5: tabPanes.length > 0 }\">\n <slot name=\"tabQuery\">\n <el-tabs class=\"top-tab-query\" v-if=\"tabPanes.length > 0\" :value=\"tabQuery.tabKey\"\n @tab-click=\"handleTabClick\">\n <el-tab-pane :label=\"item.label\" :name=\"item.name\" v-for=\"item in tabPanes\"\n :key=\"item.name\"></el-tab-pane>\n </el-tabs>\n </slot>\n <!-- 工具条插槽 -->\n <div class=\"flex justify-between el-crud-toolbar\">\n <slot name=\"buttons\" :selections=\"selections\">\n <div>\n <el-button :size=\"item.size\" @click=\"handleButtonClick(item)\" v-for=\"item in actionButtons\"\n :plain=\"item.plain\" :disabled=\"item.disabled\" :type=\"item.type\" :icon=\"item.icon\">{{\n item.text\n }}</el-button>\n </div>\n </slot>\n <slot name=\"toolbar\" :columns=\"columns\" :showSearch=\"showSearch\">\n <right-toolbar :showSearch.sync=\"showSearch\" @queryTable=\"refresh\" :columns=\"columns\"\n :search=\"!!(queryItems && queryItems.length)\"></right-toolbar>\n </slot>\n </div>\n <!-- 默认插槽 并传 data -->\n <slot :data=\"data\">\n <crud-table v-loading=\"listLoading\" size=\"mini\" @selection-change=\"handleSelectionChange\"\n :highlightCol=\"highlightCol\" :resizable=\"resizable\" :border=\"border\" :columns=\"columns\" :data=\"data\"\n @row-action=\"handleRowAction\" @sort-change=\"handleSortChange\"\n :default-sort=\"defaultSort\"></crud-table>\n </slot>\n <!-- 分页插槽 并传 total queryParams -->\n <slot name=\"pagination\" :total=\"total\" :pagination=\"pagination\">\n <pagination v-show=\"total > 0\" :total=\"total\" :page.sync=\"pagination.pageNum\"\n :limit.sync=\"pagination.pageSize\" @pagination=\"refresh\" />\n </slot>\n </div>\n\n </div>\n\n</template>\n\n\n<script>\nimport CrudTable from \"./table.vue\";\nimport RightToolbar from \"./rightToolbar.vue\";\nimport QueryForm from \"./queryForm.vue\";\nimport Pagination from \"./pagination.vue\"\nimport { toLine } from \"./utils\";\n\nexport default {\n components: {\n CrudTable, RightToolbar, QueryForm, Pagination\n },\n name: 'Crud',\n provide() {\n return {\n crud: this\n };\n },\n props: {\n queryParamsMethod: {\n type: Function\n },\n columns: {\n type: Array,\n default: () => []\n },\n queryItems: {\n type: Array,\n default: () => []\n },\n queryLineClamp: {\n type: Number,\n default: 1\n },\n queryLabelWidth: {\n type: Number,\n default: 80\n },\n queryInputWidth: {\n type: Number,\n default: 210\n },\n queryInline: {\n type: Boolean,\n default: true\n },\n buttons: {\n type: Array | Function,\n default: () => []\n },\n tabPanes: {\n type: Array,\n default: () => []\n },\n defaultSort: {\n type: Object,\n default: () => {\n return {\n prop: undefined,\n order: undefined\n }\n }\n },\n highlightCol: {\n type: Boolean,\n default: false\n },\n resizable: {\n type: Boolean,\n default: false\n },\n border: {\n type: Boolean,\n default: false\n }\n },\n watch: {\n tabPanes: {\n handler(val) {\n if (val.length) {\n\n this.tabQuery.tabKey = val[0].name\n }\n },\n deep: true,\n immediate: true\n },\n \"tabQuery.tabKey\": {\n handler(val) {\n this.$emit(\"tabChange\", val);\n },\n\n }\n },\n computed: {\n actionButtons() {\n let buts = this.buttons;\n if (typeof buts === 'function') {\n return buts(this.selections);\n } else if (buts?.length) {\n return buts\n }\n return []\n }\n },\n data() {\n return {\n listLoading: false,\n showSearch: true,\n selections: [],\n data: [],\n service: { // 增删改查导出\n add: null,\n update: null,\n delete: null,\n page: null,\n info: null,\n list: null,\n export: null,\n }, // 服务\n queryParams: {\n // pageNum: 1,\n // pageSize: 10\n }, // 查询参数\n\n tabQuery: {\n tabKey: undefined\n }, // 参数\n filterParams: {}, // 过滤参数\n pagination: {\n pageNum: 1,\n pageSize: 10\n },\n orderParams: {\n orderByRowName: undefined,\n orderByRule: undefined\n },\n total: 0,\n\n }\n },\n created() {\n },\n methods: {\n handleTabClick(tab) {\n this.tabQuery.tabKey = tab.name\n this.refresh()\n },\n handleSelectionChange(e) {\n this.selections = e\n },\n handleQuery(query) {\n this.queryParams = query;\n this.refresh()\n },\n handleButtonClick(item) {\n this.$emit(\"action\", item.action, this.selections);\n },\n handleRowAction(action, scope) {\n this.$emit(\"row-action\", action, scope);\n if (action === 'delete' && this.service.delete) {\n this.delete(scope)\n }\n },\n handleSortChange(column) {\n this.orderParams.orderByRowName = toLine(column.prop);\n if (column.order == \"descending\") {\n this.orderParams.orderByRule = \"desc\";\n } else if (column.order == \"ascending\") {\n this.orderParams.orderByRule = \"asc\";\n } else {\n this.orderParams.orderByRule = undefined;\n this.orderParams.orderByRowName = undefined;\n }\n this.refresh();\n },\n // 服务\n setService(service) {\n this.service = Object.assign(this.service, service);\n },\n // 设置列\n setColumns(columns) {\n this.columns = columns;\n },\n // 设置数据\n setData(data) {\n // this.crud.data = data;\n },\n // 获得查询参数\n async getParams() {\n const defaultSort = this.defaultSort;\n let orderParams = this.orderParams;\n\n if (!orderParams?.orderByRowName && defaultSort?.prop) {\n const orderByRowName = toLine(defaultSort.prop);\n let orderByRule = defaultSort.order;\n\n if (defaultSort.order == \"descending\") {\n orderByRule = \"desc\";\n } else if (defaultSort.order == \"ascending\") {\n orderByRule = \"asc\";\n }\n\n orderParams = {\n orderByRowName,\n orderByRule\n }\n }\n\n let params = { ...this.queryParams, ...this.pagination, ...this.tabQuery, ...orderParams }\n\n\n\n if (this.queryParamsMethod) {\n return await this.queryParamsMethod(params);\n }\n return params;\n },\n // 刷新列表数据\n async refresh() {\n this.listLoading = true;\n try {\n const queryParams = await this.getParams();\n const { code, rows, total } = await this.service.page(queryParams);\n if (code === 200) {\n this.data = rows;\n this.total = total;\n }\n\n } catch (error) {\n console.log(error);\n }\n this.listLoading = false;\n },\n // 删除\n async delete({ row }) {\n try {\n let id = row?.id;\n await this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n })\n const { code } = await this.service.delete(id);\n if (code === 200) {\n this.refresh();\n this.$message({\n type: 'success',\n message: '操作成功!'\n });\n }\n } catch (error) {\n console.log(error);\n\n }\n\n\n }\n\n }\n\n}\n\n</script>\n\n<style scoped lang=\"scss\">\n.top-tab-query {\n margin-bottom: 10px;\n\n &::v-deep {\n .el-tabs__header {\n margin: 0;\n }\n }\n}\n</style>", ".top-tab-query {\n margin-bottom: 10px;\n}\n.top-tab-query::v-deep .el-tabs__header {\n margin: 0;\n}\n\n/*# sourceMappingURL=index.vue.map */"]
2778
+ "sourcesContent": ["<!-- crud组件 主要用于子组件的上下文传递 -->\n<!-- \n 搜索组件配置 queryItems 可配置\n 搜索及重置事件 queryTable \n \n 切换组件配置 tabPanes 可配置\n 切换参数 tabQuery \n \n 按钮组件配置 buttons 可配置\n 右侧工具条\n 表格列配置 columns 可配置\n 表格数据\n 分页数据\n -->\n<template>\n\n <div class=\"el-crud\">\n <!-- 搜索过滤插槽 -->\n <slot name=\"query\" :queryItems=\"queryItems\" :lineClamp=\"queryLineClamp\" :labelWidth=\"queryLabelWidth\"\n :inputWidth=\"queryInputWidth\" :inline=\"queryInline\">\n <query-form v-show=\"showSearch\" v-if=\"queryItems && queryItems.length\" :queryItems=\"queryItems\"\n :lineClamp=\"queryLineClamp\" :label-width=\"queryLabelWidth\" :input-width=\"queryInputWidth\" :inline=\"queryInline\"\n @queryTable=\"handleQuery\" />\n </slot>\n <div class=\"container-main\" :class=\"{ pt5: tabPanes.length > 0 }\">\n <slot name=\"tabQuery\">\n <el-tabs class=\"top-tab-query\" v-if=\"tabPanes.length > 0\" :value=\"tabQuery.tabKey\"\n @tab-click=\"handleTabClick\">\n <el-tab-pane :label=\"item.label\" :name=\"item.name\" v-for=\"item in tabPanes\"\n :key=\"item.name\"></el-tab-pane>\n </el-tabs>\n </slot>\n <!-- 工具条插槽 -->\n <div class=\"flex justify-between el-crud-toolbar\">\n <slot name=\"buttons\" :selections=\"selections\">\n <div>\n <el-button :size=\"item.size\" @click=\"handleButtonClick(item)\" v-for=\"(item,index) in actionButtons\" :key=\"`${item.key || ('action-btn-'+index)}`\"\n :plain=\"item.plain\" :disabled=\"item.disabled\" :type=\"item.type\" :icon=\"item.icon\">{{\n item.text\n }}</el-button>\n </div>\n </slot>\n <slot name=\"toolbar\" :columns=\"columns\" :showSearch=\"showSearch\">\n <right-toolbar :showSearch.sync=\"showSearch\" @queryTable=\"refresh\" :columns=\"columns\"\n :search=\"!!(queryItems && queryItems.length)\"></right-toolbar>\n </slot>\n </div>\n <!-- 默认插槽 并传 data -->\n <slot :data=\"data\">\n <crud-table v-loading=\"listLoading\" size=\"mini\" @selection-change=\"handleSelectionChange\"\n :highlightCol=\"highlightCol\" :resizable=\"resizable\" :border=\"border\" :columns=\"columns\" :data=\"data\"\n @row-action=\"handleRowAction\" @sort-change=\"handleSortChange\"\n :default-sort=\"defaultSort\"></crud-table>\n </slot>\n <!-- 分页插槽 并传 total queryParams -->\n <slot name=\"pagination\" :total=\"total\" :pagination=\"pagination\">\n <pagination v-show=\"total > 0\" :total=\"total\" :page.sync=\"pagination.pageNum\"\n :limit.sync=\"pagination.pageSize\" @pagination=\"refresh\" />\n </slot>\n </div>\n\n </div>\n\n</template>\n\n\n<script>\nimport CrudTable from \"./table.vue\";\nimport RightToolbar from \"./rightToolbar.vue\";\nimport QueryForm from \"./queryForm.vue\";\nimport Pagination from \"./pagination.vue\"\nimport { toLine } from \"./utils\";\n\nexport default {\n components: {\n CrudTable, RightToolbar, QueryForm, Pagination\n },\n name: 'Crud',\n provide() {\n return {\n crud: this\n };\n },\n props: {\n queryParamsMethod: {\n type: Function\n },\n columns: {\n type: Array,\n default: () => []\n },\n queryItems: {\n type: Array,\n default: () => []\n },\n queryLineClamp: {\n type: Number,\n default: 1\n },\n queryLabelWidth: {\n type: Number,\n default: 80\n },\n queryInputWidth: {\n type: Number,\n default: 210\n },\n queryInline: {\n type: Boolean,\n default: true\n },\n buttons: {\n type: Array | Function,\n default: () => []\n },\n tabPanes: {\n type: Array,\n default: () => []\n },\n defaultSort: {\n type: Object,\n default: () => {\n return {\n prop: undefined,\n order: undefined\n }\n }\n },\n highlightCol: {\n type: Boolean,\n default: false\n },\n resizable: {\n type: Boolean,\n default: false\n },\n border: {\n type: Boolean,\n default: false\n }\n },\n watch: {\n tabPanes: {\n handler(val) {\n if (val.length) {\n\n this.tabQuery.tabKey = val[0].name\n }\n },\n deep: true,\n immediate: true\n },\n \"tabQuery.tabKey\": {\n handler(val) {\n this.$emit(\"tabChange\", val);\n },\n\n }\n },\n computed: {\n actionButtons() {\n let buts = this.buttons;\n if (typeof buts === 'function') {\n return buts(this.selections);\n } else if (buts?.length) {\n return buts\n }\n return []\n }\n },\n data() {\n return {\n listLoading: false,\n showSearch: true,\n selections: [],\n data: [],\n service: { // 增删改查导出\n add: null,\n update: null,\n delete: null,\n page: null,\n info: null,\n list: null,\n export: null,\n }, // 服务\n queryParams: {\n // pageNum: 1,\n // pageSize: 10\n }, // 查询参数\n\n tabQuery: {\n tabKey: undefined\n }, // 参数\n filterParams: {}, // 过滤参数\n pagination: {\n pageNum: 1,\n pageSize: 10\n },\n orderParams: {\n orderByRowName: undefined,\n orderByRule: undefined\n },\n total: 0,\n\n }\n },\n created() {\n },\n methods: {\n handleTabClick(tab) {\n this.tabQuery.tabKey = tab.name\n this.refresh()\n },\n handleSelectionChange(e) {\n this.selections = e\n },\n handleQuery(query) {\n this.queryParams = query;\n this.refresh()\n },\n handleButtonClick(item) {\n this.$emit(\"action\", item.action, this.selections);\n },\n handleRowAction(action, scope) {\n this.$emit(\"row-action\", action, scope);\n if (action === 'delete' && this.service.delete) {\n this.delete(scope)\n }\n },\n handleSortChange(column) {\n this.orderParams.orderByRowName = toLine(column.prop);\n if (column.order == \"descending\") {\n this.orderParams.orderByRule = \"desc\";\n } else if (column.order == \"ascending\") {\n this.orderParams.orderByRule = \"asc\";\n } else {\n this.orderParams.orderByRule = undefined;\n this.orderParams.orderByRowName = undefined;\n }\n this.refresh();\n },\n // 服务\n setService(service) {\n this.service = Object.assign(this.service, service);\n },\n // 设置列\n setColumns(columns) {\n this.columns = columns;\n },\n // 设置数据\n setData(data) {\n // this.crud.data = data;\n },\n // 获得查询参数\n async getParams() {\n const defaultSort = this.defaultSort;\n let orderParams = this.orderParams;\n\n if (!orderParams?.orderByRowName && defaultSort?.prop) {\n const orderByRowName = toLine(defaultSort.prop);\n let orderByRule = defaultSort.order;\n\n if (defaultSort.order == \"descending\") {\n orderByRule = \"desc\";\n } else if (defaultSort.order == \"ascending\") {\n orderByRule = \"asc\";\n }\n\n orderParams = {\n orderByRowName,\n orderByRule\n }\n }\n\n let params = { ...this.queryParams, ...this.pagination, ...this.tabQuery, ...orderParams }\n\n\n\n if (this.queryParamsMethod) {\n return await this.queryParamsMethod(params);\n }\n return params;\n },\n // 刷新列表数据\n async refresh() {\n this.listLoading = true;\n try {\n const queryParams = await this.getParams();\n const { code, rows, total } = await this.service.page(queryParams);\n if (code === 200) {\n this.data = rows;\n this.total = total;\n }\n\n } catch (error) {\n console.log(error);\n }\n this.listLoading = false;\n },\n // 删除\n async delete({ row }) {\n try {\n let id = row?.id;\n await this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n })\n const { code } = await this.service.delete(id);\n if (code === 200) {\n this.refresh();\n this.$message({\n type: 'success',\n message: '操作成功!'\n });\n }\n } catch (error) {\n console.log(error);\n\n }\n\n\n }\n\n }\n\n}\n\n</script>\n\n<style scoped lang=\"scss\">\n.top-tab-query {\n margin-bottom: 10px;\n\n &::v-deep {\n .el-tabs__header {\n margin: 0;\n }\n }\n}\n</style>", ".top-tab-query {\n margin-bottom: 10px;\n}\n.top-tab-query::v-deep .el-tabs__header {\n margin: 0;\n}\n\n/*# sourceMappingURL=index.vue.map */"]
2825
2779
  },
2826
2780
  media: undefined
2827
2781
  });
2828
2782
  };
2829
2783
  /* scoped */
2830
- var __vue_scope_id__$1 = "data-v-7449f835";
2784
+ var __vue_scope_id__ = "data-v-35906918";
2831
2785
  /* module identifier */
2832
- var __vue_module_identifier__$1 = undefined;
2786
+ var __vue_module_identifier__ = undefined;
2833
2787
  /* functional template */
2834
- var __vue_is_functional_template__$1 = false;
2788
+ var __vue_is_functional_template__ = false;
2835
2789
  /* style inject SSR */
2836
2790
 
2837
2791
  /* style inject shadow dom */
2838
2792
 
2839
- var __vue_component__$1 = /*#__PURE__*/normalizeComponent({
2793
+ var __vue_component__ = /*#__PURE__*/normalizeComponent({
2840
2794
  render: __vue_render__,
2841
2795
  staticRenderFns: __vue_staticRenderFns__
2842
- }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, createInjector, undefined, undefined);
2843
-
2844
- function getDefaultExportFromCjs (x) {
2845
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
2846
- }
2847
-
2848
- function _extends(){return _extends=Object.assign?Object.assign.bind():function(a){for(var b,c=1;c<arguments.length;c++)for(var d in b=arguments[c],b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]);return a},_extends.apply(this,arguments)}var normalMerge=["attrs","props","domProps"],toArrayMerge=["class","style","directives"],functionalMerge=["on","nativeOn"],mergeJsxProps=function(a){return a.reduce(function(c,a){for(var b in a)if(!c[b])c[b]=a[b];else if(-1!==normalMerge.indexOf(b))c[b]=_extends({},c[b],a[b]);else if(-1!==toArrayMerge.indexOf(b)){var d=c[b]instanceof Array?c[b]:[c[b]],e=a[b]instanceof Array?a[b]:[a[b]];c[b]=[].concat(d,e);}else if(-1!==functionalMerge.indexOf(b)){for(var f in a[b])if(c[b][f]){var g=c[b][f]instanceof Array?c[b][f]:[c[b][f]],h=a[b][f]instanceof Array?a[b][f]:[a[b][f]];c[b][f]=[].concat(g,h);}else c[b][f]=a[b][f];}else if("hook"===b)for(var i in a[b])c[b][i]=c[b][i]?mergeFn(c[b][i],a[b][i]):a[b][i];else c[b]=a[b];return c},{})},mergeFn=function(a,b){return function(){a&&a.apply(this,arguments),b&&b.apply(this,arguments);}};var helper=mergeJsxProps;
2849
-
2850
- var _mergeJSXProps7 = /*@__PURE__*/getDefaultExportFromCjs(helper);
2851
-
2852
- var format = {
2853
- number: function number(value) {
2854
- var result;
2855
- if (isArray(value)) {
2856
- result = value.map(Number).map(function (item) {
2857
- return isNaN(item) ? undefined : item;
2858
- });
2859
- } else {
2860
- result = Number(value);
2861
- if (isNaN(result)) {
2862
- result = undefined;
2863
- }
2864
- }
2865
- return result;
2866
- },
2867
- string: function string(value) {
2868
- return isArray(value) ? value.map(String) : String(value);
2869
- },
2870
- split: function split(value) {
2871
- return isString(value) ? value.split(",").filter(Boolean) : value;
2872
- },
2873
- join: function join(value) {
2874
- return isArray(value) ? value.join(",") : value;
2875
- },
2876
- "boolean": function boolean(value) {
2877
- return Boolean(value);
2878
- },
2879
- booleanNumber: function booleanNumber(value) {
2880
- return Boolean(value) ? 1 : 0;
2881
- },
2882
- datetimerange: function datetimerange(value, form, method) {
2883
- if (method == "bind") {
2884
- return [form.startTime, form.endTime];
2885
- } else {
2886
- var _ref = value || [],
2887
- _ref2 = _slicedToArray(_ref, 2),
2888
- startTime = _ref2[0],
2889
- endTime = _ref2[1];
2890
- form.startTime = startTime;
2891
- form.endTime = endTime;
2892
- return undefined;
2893
- }
2894
- },
2895
- splitJoin: function splitJoin(value, _, method) {
2896
- if (method == "bind") {
2897
- return isString(value) ? value.split(",").filter(Boolean) : value;
2898
- } else {
2899
- return isArray(value) ? value.join(",") : value;
2900
- }
2901
- }
2902
- };
2903
- function parse(method, _ref3) {
2904
- var value = _ref3.value,
2905
- pipe = _ref3.pipe,
2906
- form = _ref3.form;
2907
- if (!pipe) {
2908
- return value;
2909
- }
2910
- var pipes = [];
2911
- if (isString(pipe)) {
2912
- if (format[pipe]) {
2913
- pipes = [pipe];
2914
- } else {
2915
- console.error("".concat(pipe, " is not found."));
2916
- return value;
2917
- }
2918
- } else if (isArray(pipe)) {
2919
- pipes = pipe;
2920
- } else if (isObject(pipe)) {
2921
- pipes = isArray(pipe[method]) ? pipe[method] : [pipe[method]];
2922
- } else if (isFunction(pipe)) {
2923
- pipes = [pipe];
2924
- } else {
2925
- console.error("Hook data error!");
2926
- return value;
2927
- }
2928
- var d = value;
2929
- pipes.forEach(function (e) {
2930
- if (isString(e)) {
2931
- d = format[e](d, form, method);
2932
- } else if (isFunction(e)) {
2933
- d = e(d, form);
2934
- }
2935
- });
2936
- return d;
2937
- }
2938
- var valueHook = {
2939
- bind: function bind(value, pipe, form) {
2940
- return parse("bind", {
2941
- value: value,
2942
- pipe: pipe,
2943
- form: form
2944
- });
2945
- },
2946
- submit: function submit(value, pipe, form) {
2947
- return parse("submit", {
2948
- value: value,
2949
- pipe: pipe,
2950
- form: form
2951
- });
2952
- }
2953
- };
2954
-
2955
- // type FormItems = { // 表单项配置
2956
- // label: string; // 标签
2957
- // prop: string; // 字段名
2958
-
2959
- // options?: { value: string; label: string; disabled?: boolean }[] || ()=>[]; // 字典数据
2960
- // rules?: any[]; // 验证规则
2961
-
2962
- // children?: FormItems[];
2963
- // hidden?: boolean; // 是否隐藏
2964
- // help?: string; // 帮助信息
2965
-
2966
- // span?: number; // 栅格占据的列数
2967
- // labelWidth?: string; // formitem 标签宽度
2968
-
2969
- // component?: VNode;
2970
- // };
2971
- // type VNodeFunction = ({ scope,h }) => VNode | ({ scope,h }) =><div>{ scope }</div> | <div />;
2972
-
2973
- // type VNodeObject = {
2974
- // name?: string | Component; // 组件名 | 组件引用
2975
- // options?: any[]; // 选项
2976
- // attrs?: any; // 属性
2977
- // on?: any; // 事件
2978
- // props?: any; // 属性
2979
- // [key: string]: any;
2980
- // };
2981
- // type VNode = string | VNodeFunction | VNodeObject;
2982
-
2983
- var script = {
2984
- props: {
2985
- // 表单配置项,可以从外部传入
2986
- formItems: {
2987
- type: Array,
2988
- "default": function _default() {
2989
- return [];
2990
- }
2991
- },
2992
- // 初始表单数据
2993
- initialFormData: {
2994
- type: Object,
2995
- "default": function _default() {
2996
- return {};
2997
- }
2998
- },
2999
- // 按钮配置
3000
- buttons: {
3001
- type: Object,
3002
- "default": function _default() {
3003
- return {
3004
- submit: {
3005
- show: true,
3006
- text: '提交',
3007
- type: 'primary',
3008
- loading: false
3009
- },
3010
- cancel: {
3011
- show: true,
3012
- text: '取消',
3013
- type: 'default'
3014
- }
3015
- };
3016
- }
3017
- },
3018
- // 按钮位置
3019
- buttonPosition: {
3020
- type: String,
3021
- "default": 'right',
3022
- // center, left, right
3023
- validator: function validator(value) {
3024
- return ['center', 'left', 'right'].includes(value);
3025
- }
3026
- },
3027
- // 是否显示按钮区域
3028
- showButtons: {
3029
- type: Boolean,
3030
- "default": true
3031
- },
3032
- readonly: {
3033
- type: Boolean
3034
- },
3035
- labelWidth: {
3036
- type: String,
3037
- "default": '80px'
3038
- },
3039
- column: {
3040
- type: Number,
3041
- "default": 2
3042
- },
3043
- gutter: {
3044
- type: Number,
3045
- "default": 10
3046
- },
3047
- size: {
3048
- type: String,
3049
- "default": 'small'
3050
- }
3051
- // value: {
3052
- // type: Object,
3053
- // default: () => ({})
3054
- // },
3055
- },
3056
- data: function data() {
3057
- return {
3058
- form: {},
3059
- // 如果没有传入formItems,则使用默认配置
3060
- items: [],
3061
- activeName: 'first',
3062
- submitLoading: false
3063
- };
3064
- },
3065
- computed: {
3066
- // 从items中提取所有字段的规则
3067
- formRules: function formRules() {
3068
- var rules = {};
3069
-
3070
- // 递归提取规则函数
3071
- var _extractRules = function extractRules(nodes) {
3072
- if (!nodes || !nodes.length) return;
3073
- nodes.forEach(function (node) {
3074
- // 如果节点有children,递归处理
3075
- if (node.children && node.children.length) {
3076
- _extractRules(node.children);
3077
- }
3078
-
3079
- // 如果是表单字段且有规则,添加到规则对象
3080
- if (node.prop && node.rules) {
3081
- rules[node.prop] = node.rules;
3082
- }
3083
- });
3084
- };
3085
-
3086
- // 对所有配置项提取规则
3087
- _extractRules(this.items);
3088
- return rules;
3089
- },
3090
- // 按钮区域样式
3091
- buttonAreaStyle: function buttonAreaStyle() {
3092
- return {
3093
- textAlign: this.buttonPosition,
3094
- marginTop: '20px'
3095
- };
3096
- },
3097
- // label宽度
3098
- labelStyle: function labelStyle() {
3099
- return {
3100
- width: this.labelWidth,
3101
- textAlign: 'center'
3102
- };
3103
- }
3104
- },
3105
- watch: {
3106
- // 监听外部传入的表单数据变化
3107
- initialFormData: {
3108
- handler: function handler(val) {
3109
- this.form = JSON.parse(JSON.stringify(val));
3110
- },
3111
- immediate: true,
3112
- deep: true
3113
- },
3114
- // 监听外部传入的表单配置变化
3115
- formItems: {
3116
- handler: function handler(val) {
3117
- if (val && val.length) {
3118
- this.items = val;
3119
- }
3120
- },
3121
- immediate: true,
3122
- deep: true
3123
- },
3124
- // 监听外部传入的value变化
3125
- // value: {
3126
- // handler(val) {
3127
- // this.form = JSON.parse(JSON.stringify(val)) || {};
3128
- // },
3129
- // immediate: true,
3130
- // deep: true
3131
- // },
3132
- // v-model绑定的值变化时,更新表单数据
3133
- form: {
3134
- handler: function handler(val) {
3135
- this.$emit('input', val);
3136
- },
3137
- deep: true
3138
- }
3139
- },
3140
- methods: {
3141
- // 处理表单输入事件
3142
- handleInput: function handleInput(prop, value) {
3143
- this.$set(this.form, prop, value);
3144
- // 触发change事件,将变更通知给父组件
3145
- this.$emit('field-change', {
3146
- prop: prop,
3147
- value: value,
3148
- form: this.form
3149
- });
3150
- },
3151
- // 递归渲染函数 - 根据节点类型渲染不同内容
3152
- renderNode: function renderNode(node, index) {
3153
- // 如果是只读模式,使用只读渲染函数
3154
- if (this.readonly) {
3155
- return this.renderReadOnlyNode(node, index);
3156
- }
3157
-
3158
- // 如果是输入字段(没有type或没有children,则视为字段)
3159
- if (!node.type || !node.children && node.prop) {
3160
- return this.renderField(node, index);
3161
- }
3162
-
3163
- // 根据节点类型渲染
3164
- switch (node.type) {
3165
- case 'tab':
3166
- return this.renderTab(node, index);
3167
- case 'group':
3168
- return this.renderGroup(node, index);
3169
- default:
3170
- // 默认当作字段渲染
3171
- return this.renderField(node, index);
3172
- }
3173
- },
3174
- // 只读模式 - 递归渲染函数
3175
- renderReadOnlyNode: function renderReadOnlyNode(node, index) {
3176
- if (!node.type || !node.children && node.prop) {
3177
- return this.renderReadOnlyField(node, index);
3178
- }
3179
- switch (node.type) {
3180
- case 'tab':
3181
- return this.renderReadOnlyTab(node, index);
3182
- case 'group':
3183
- return this.renderReadOnlyGroup(node, index);
3184
- default:
3185
- return this.renderReadOnlyField(node, index);
3186
- }
3187
- },
3188
- // 只读模式 - 渲染标签页
3189
- renderReadOnlyTab: function renderReadOnlyTab(tab, index) {
3190
- var h = this.$createElement;
3191
- return h("el-tab-pane", _mergeJSXProps7([{
3192
- "key": tab.name || index,
3193
- "attrs": {
3194
- "label": tab.label,
3195
- "name": tab.name || index
3196
- }
3197
- }, tab.props]), [this.renderReadOnlyChildren(tab.children)]);
3198
- },
3199
- // 只读模式 - 渲染分组
3200
- renderReadOnlyGroup: function renderReadOnlyGroup(group, index) {
3201
- var h = this.$createElement;
3202
- return h("div", _mergeJSXProps7([{
3203
- "class": ['el-form-group', group.className],
3204
- "key": index
3205
- }, group.props]), [h("el-descriptions", {
3206
- "attrs": {
3207
- "title": group.title,
3208
- "border": true,
3209
- "column": this.column,
3210
- "size": this.size,
3211
- "labelStyle": this.labelStyle
3212
- }
3213
- }, [this.renderReadOnlyDescriptionItems(group.children)])]);
3214
- },
3215
- // 只读模式 - 渲染字段
3216
- renderReadOnlyField: function renderReadOnlyField(field, index) {
3217
- var h = this.$createElement;
3218
- // 如果字段被配置为隐藏,则不渲染
3219
- if (field.hidden) {
3220
- return null;
3221
- }
3222
-
3223
- // 获取字段值
3224
- var value = this.form[field.prop];
3225
-
3226
- // 处理显示值
3227
- var displayValue = value;
3228
-
3229
- // 处理不同类型的字段显示值
3230
- if (field.options && Array.isArray(field.options)) {
3231
- var option = field.options.find(function (opt) {
3232
- return opt.value === value;
3233
- });
3234
- if (option) {
3235
- displayValue = option.label;
3236
- }
3237
- }
3238
-
3239
- // 如果处于顶层(不在group内),则需要包装在el-descriptions中
3240
- if (!field._inGroup) {
3241
- return h("el-col", {
3242
- "attrs": {
3243
- "span": 24 / this.column || field.span || 12
3244
- },
3245
- "key": field.prop || index
3246
- }, [h("el-descriptions", {
3247
- "attrs": {
3248
- "labelStyle": this.labelStyle,
3249
- "border": true,
3250
- "column": this.column,
3251
- "size": this.size
3252
- }
3253
- }, [h("el-descriptions-item", {
3254
- "attrs": {
3255
- "label": field.label || ''
3256
- }
3257
- }, [displayValue || '-'])])]);
3258
- }
3259
- // 在group内部的字段直接返回
3260
- return h("el-descriptions-item", {
3261
- "attrs": {
3262
- "label": field.label || ''
3263
- }
3264
- }, [displayValue || '-']);
3265
- },
3266
- // 只读模式 - 渲染描述项
3267
- renderReadOnlyDescriptionItems: function renderReadOnlyDescriptionItems(children) {
3268
- var _this = this;
3269
- if (!children || !children.length) {
3270
- return null;
3271
- }
3272
- return children.map(function (child) {
3273
- // 标记字段在group内部
3274
- child._inGroup = true;
3275
- return _this.renderReadOnlyField(child);
3276
- });
3277
- },
3278
- // 只读模式 - 渲染子节点
3279
- renderReadOnlyChildren: function renderReadOnlyChildren(children) {
3280
- var _this2 = this;
3281
- var h = this.$createElement;
3282
- // 如果没有子节点,返回空
3283
- if (!children || !children.length) {
3284
- return null;
3285
- }
3286
-
3287
- // 检查第一个子节点类型,判断是否需要包装
3288
- var firstChild = children[0];
3289
-
3290
- // 如果第一个子节点是group,不需要额外包装
3291
- if (firstChild.type === 'group') {
3292
- return children.map(function (child, index) {
3293
- return _this2.renderReadOnlyNode(child, index);
3294
- });
3295
- }
3296
-
3297
- // 如果子节点不是输入字段,也不是分组,则直接渲染
3298
- if (firstChild.type && firstChild.type !== 'group' && !firstChild.prop) {
3299
- return children.map(function (child, index) {
3300
- return _this2.renderReadOnlyNode(child, index);
3301
- });
3302
- }
3303
-
3304
- // 如果是普通字段(非group),则包装在el-descriptions中
3305
- return h("el-descriptions", {
3306
- "attrs": {
3307
- "border": true,
3308
- "column": this.column,
3309
- "size": this.size,
3310
- "labelStyle": this.labelStyle
3311
- }
3312
- }, [children.map(function (child, index) {
3313
- child._inGroup = true;
3314
- return _this2.renderReadOnlyNode(child, index);
3315
- })]);
3316
- },
3317
- // 渲染标签页
3318
- renderTab: function renderTab(tab, index) {
3319
- var h = this.$createElement;
3320
- return h("el-tab-pane", _mergeJSXProps7([{
3321
- "key": tab.name || index,
3322
- "attrs": {
3323
- "label": tab.label,
3324
- "name": tab.name || index
3325
- }
3326
- }, tab.props]), [this.renderChildren(tab.children)]);
3327
- },
3328
- // 渲染分组
3329
- renderGroup: function renderGroup(group, index) {
3330
- var h = this.$createElement;
3331
- return h("div", _mergeJSXProps7([{
3332
- "class": ['el-form-group', group.className],
3333
- "key": index
3334
- }, group.props]), [group.title && h("div", {
3335
- "class": "el-form-group__title"
3336
- }, [group.title]), h("div", [this.renderChildren(group.children)])]);
3337
- },
3338
- // 渲染各种表单控件
3339
- renderFormControl: function renderFormControl(field) {
3340
- var _field$hook;
3341
- var component = field.component;
3342
- if (isString(field.component)) {
3343
- component = {
3344
- name: field.component,
3345
- attrs: {
3346
- placeholder: field.placeholder || "\u8BF7\u8F93\u5165".concat(field.label),
3347
- clearable: typeof field.clearable !== 'undefined' ? field.clearable : true
3348
- }
3349
- };
3350
- }
3351
- if (!isFunction(field.component)) {
3352
- if (field.component === 'el-select') {
3353
- component.attrs = _objectSpread2(_objectSpread2({}, component.attrs), {}, {
3354
- placeholder: field.placeholder || "\u8BF7\u9009\u62E9".concat(field.label),
3355
- filterable: true
3356
- });
3357
- }
3358
- }
3359
- if ((_field$hook = field.hook) !== null && _field$hook !== void 0 && (_field$hook = _field$hook.bind) !== null && _field$hook !== void 0 && _field$hook.length) {
3360
- var _field$hook2;
3361
- var value = valueHook.bind(this.form[field.prop], (_field$hook2 = field.hook) === null || _field$hook2 === void 0 ? void 0 : _field$hook2.bind, this.form);
3362
- this.$set(this.form, field.prop, value);
3363
- }
3364
- // component 渲染 { prop: this.column.prop, scope: scope }
3365
- return renderNode.call(this, component, {
3366
- prop: field.prop,
3367
- scope: this.form
3368
- });
3369
- },
3370
- // 渲染字段
3371
- renderField: function renderField(field, index) {
3372
- var h = this.$createElement;
3373
- // 如果字段被配置为隐藏,则不渲染
3374
- if (field.hidden) {
3375
- return null;
3376
- }
3377
- return h("el-col", {
3378
- "attrs": {
3379
- "span": 24 / this.column || field.span || 12
3380
- },
3381
- "key": field.prop || index
3382
- }, [h("el-form-item", _mergeJSXProps7([{
3383
- "attrs": {
3384
- "label": field.label,
3385
- "prop": field.prop,
3386
- "rules": field.rules,
3387
- "labelWidth": field.labelWidth || this.labelWidth
3388
- }
3389
- }, field.formItemProps]), [this.renderFormControl(field), field.help && h("div", {
3390
- "class": "form-item-help"
3391
- }, [field.help])])]);
3392
- },
3393
- // 渲染子节点
3394
- renderChildren: function renderChildren(children) {
3395
- var h = this.$createElement;
3396
- // 如果没有子节点,返回空
3397
- if (!children || !children.length) {
3398
- return null;
3399
- }
3400
-
3401
- // 检查第一个子节点类型,判断是否需要包装
3402
- var firstChild = children[0];
3403
-
3404
- // 如果第一个子节点是group,不需要额外包装
3405
- if (firstChild.type === 'group') {
3406
- return children.map(this.renderNode);
3407
- }
3408
-
3409
- // 如果子节点不是输入字段,也不是分组,则直接渲染
3410
- if (firstChild.type && firstChild.type !== 'group' && !firstChild.prop) {
3411
- return children.map(this.renderNode);
3412
- }
3413
-
3414
- // 其他情况(子节点是输入字段)包装在row中
3415
- return h("el-row", {
3416
- "attrs": {
3417
- "gutter": this.gutter
3418
- }
3419
- }, [children.map(this.renderNode)]);
3420
- },
3421
- // 判断是否有标签页
3422
- hasTabs: function hasTabs() {
3423
- return this.items && this.items.some(function (item) {
3424
- return item.type === 'tab';
3425
- });
3426
- },
3427
- // 渲染按钮区域
3428
- renderButtons: function renderButtons() {
3429
- var h = this.$createElement;
3430
- if (!this.showButtons || this.readonly) return null;
3431
- return h("div", {
3432
- "class": "form-button-area",
3433
- "style": this.buttonAreaStyle
3434
- }, [this.buttons.cancel && this.buttons.cancel.show && h("el-button", _mergeJSXProps7([{
3435
- "on": {
3436
- "click": this.handleCancel
3437
- },
3438
- "attrs": {
3439
- "type": this.buttons.cancel.type
3440
- }
3441
- }, this.buttons.cancel.props]), [this.buttons.cancel.text]), this.buttons.submit && this.buttons.submit.show && h("el-button", _mergeJSXProps7([{
3442
- "on": {
3443
- "click": this.handleSubmit
3444
- },
3445
- "attrs": {
3446
- "type": this.buttons.submit.type,
3447
- "loading": this.submitLoading || this.buttons.submit.loading
3448
- }
3449
- }, this.buttons.submit.props]), [this.buttons.submit.text])]);
3450
- },
3451
- // 处理提交
3452
- handleSubmit: function handleSubmit() {
3453
- var _this3 = this;
3454
- return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
3455
- var formData, _t;
3456
- return _regenerator().w(function (_context) {
3457
- while (1) switch (_context.p = _context.n) {
3458
- case 0:
3459
- _context.p = 0;
3460
- _this3.submitLoading = true;
3461
- // 表单验证
3462
- _context.n = 1;
3463
- return _this3.validate();
3464
- case 1:
3465
- formData = _context.v;
3466
- // 发出提交事件
3467
- _this3.$emit('submit', formData);
3468
-
3469
- // return formData;
3470
- _context.n = 3;
3471
- break;
3472
- case 2:
3473
- _context.p = 2;
3474
- _t = _context.v;
3475
- _this3.$emit('submit-error', _t);
3476
- return _context.a(2, Promise.reject(_t));
3477
- case 3:
3478
- _this3.submitLoading = false;
3479
- case 4:
3480
- return _context.a(2);
3481
- }
3482
- }, _callee, null, [[0, 2]]);
3483
- }))();
3484
- },
3485
- // 处理取消
3486
- handleCancel: function handleCancel() {
3487
- this.$emit('cancel');
3488
- },
3489
- // 表单验证方法
3490
- validate: function validate() {
3491
- var _this4 = this;
3492
- return new Promise(function (resolve, reject) {
3493
- _this4.$refs.form.validate(function (valid) {
3494
- if (valid) {
3495
- resolve(_this4.form);
3496
- } else {
3497
- reject(new Error('表单验证失败'));
3498
- }
3499
- });
3500
- });
3501
- },
3502
- // 重置表单
3503
- resetForm: function resetForm() {
3504
- this.form = JSON.parse(JSON.stringify(this.initialFormData)) || {};
3505
- this.$refs.form.resetFields();
3506
- this.$emit('form-reset', this.form);
3507
- },
3508
- // 获取表单数据
3509
- getFormData: function getFormData() {
3510
- return this.form;
3511
- }
3512
- },
3513
- render: function render() {
3514
- var _this5 = this;
3515
- var h = arguments[0];
3516
- if (this.readonly) {
3517
- // 只读模式渲染
3518
- return h("div", {
3519
- "class": "dynamic-form-container readonly"
3520
- }, [this.hasTabs() ? // 渲染标签页结构
3521
- h("el-tabs", {
3522
- "directives": [{
3523
- name: "on",
3524
- value: this.$listeners
3525
- }],
3526
- "model": {
3527
- value: _this5.activeName,
3528
- callback: function callback($$v) {
3529
- _this5.activeName = $$v;
3530
- }
3531
- }
3532
- }, [this.items.map(function (item, index) {
3533
- return _this5.renderReadOnlyNode(item, index);
3534
- })]) :
3535
- // 非标签页结构,直接渲染
3536
- this.renderReadOnlyChildren(this.items)]);
3537
- }
3538
- var formProps = _objectSpread2({
3539
- model: this.form,
3540
- rules: this.formRules
3541
- }, this.$attrs);
3542
- // 如果没有配置项,渲染空表单
3543
- if (!this.items || !this.items.length) {
3544
- return h("div", {
3545
- "class": "dynamic-form-container"
3546
- }, [h("el-form", {
3547
- "ref": "form",
3548
- "props": _objectSpread2({}, formProps)
3549
- })]);
3550
- }
3551
- return h("div", {
3552
- "class": "dynamic-form-container"
3553
- }, [h("el-form", {
3554
- "ref": "form",
3555
- "props": _objectSpread2({}, formProps)
3556
- }, [this.hasTabs() ? // 渲染标签页结构
3557
- h("el-tabs", {
3558
- "directives": [{
3559
- name: "on",
3560
- value: this.$listeners
3561
- }],
3562
- "model": {
3563
- value: _this5.activeName,
3564
- callback: function callback($$v) {
3565
- _this5.activeName = $$v;
3566
- }
3567
- }
3568
- }, [this.items.map(this.renderNode)]) :
3569
- // 非标签页结构,直接渲染
3570
- this.renderChildren(this.items), this.renderButtons()])]);
3571
- }
3572
- };
3573
-
3574
- /* script */
3575
- var __vue_script__ = script;
3576
-
3577
- /* template */
3578
-
3579
- /* style */
3580
- var __vue_inject_styles__ = function __vue_inject_styles__(inject) {
3581
- if (!inject) return;
3582
- inject("data-v-ef86d32c_0", {
3583
- source: "@charset \"UTF-8\";\n.dynamic-form-container[data-v-ef86d32c] {\n padding: 20px;\n}\n.dynamic-form-container .el-form .el-form-item[data-v-ef86d32c] .el-input,\n.dynamic-form-container .el-form .el-form-item[data-v-ef86d32c] .el-select {\n width: 100%;\n}\n.dynamic-form-container .el-form .el-form-item[data-v-ef86d32c] .el-input__inner {\n width: 100%;\n}\n.el-form-group[data-v-ef86d32c] {\n margin-bottom: 20px;\n /* padding: 15px; */\n border-bottom: 1px solid #ebeef5;\n}\n.el-form-group__title[data-v-ef86d32c] {\n font-weight: bold;\n margin-bottom: 15px;\n font-size: 14px;\n color: #606266;\n}\n.form-button-area[data-v-ef86d32c] {\n padding-top: 10px;\n border-top: 1px solid #ebeef5;\n}\n.form-button-area .el-button + .el-button[data-v-ef86d32c] {\n margin-left: 10px;\n}\n\n/* 只读模式样式 */\n.dynamic-form-container.readonly .el-descriptions__body[data-v-ef86d32c] {\n background-color: #fafafa;\n}\n.dynamic-form-container.readonly .el-descriptions-item__label[data-v-ef86d32c] {\n font-weight: bold;\n}\n.dynamic-form-container.readonly .el-descriptions-item__content[data-v-ef86d32c] {\n word-break: break-all;\n}\n\n/*# sourceMappingURL=form.vue.map */",
3584
- map: {
3585
- "version": 3,
3586
- "sources": ["form.vue", "/Users/tonwe/git/el-crud-page/src/form.vue"],
3587
- "names": [],
3588
- "mappings": "AAAA,gBAAgB;ACqlBhB;EACA,aAAA;ADnlBA;AC2lBA;;EAEA,WAAA;ADzlBA;AC2lBA;EACA,WAAA;ADzlBA;AComBA;EACA,mBAAA;EACA,mBAAA;EACA,gCAAA;ADjmBA;AComBA;EACA,iBAAA;EACA,mBAAA;EACA,eAAA;EACA,cAAA;ADjmBA;AComBA;EACA,iBAAA;EACA,6BAAA;ADjmBA;AComBA;EACA,iBAAA;ADjmBA;;AComBA,WAAA;AAEA;EACA,yBAAA;ADlmBA;ACqmBA;EACA,iBAAA;ADnmBA;ACsmBA;EACA,qBAAA;ADpmBA;;AAEA,mCAAmC",
3589
- "file": "form.vue",
3590
- "sourcesContent": ["@charset \"UTF-8\";\n.dynamic-form-container {\n padding: 20px;\n}\n.dynamic-form-container .el-form .el-form-item::v-deep .el-input,\n.dynamic-form-container .el-form .el-form-item::v-deep .el-select {\n width: 100%;\n}\n.dynamic-form-container .el-form .el-form-item::v-deep .el-input__inner {\n width: 100%;\n}\n\n.el-form-group {\n margin-bottom: 20px;\n /* padding: 15px; */\n border-bottom: 1px solid #ebeef5;\n}\n\n.el-form-group__title {\n font-weight: bold;\n margin-bottom: 15px;\n font-size: 14px;\n color: #606266;\n}\n\n.form-button-area {\n padding-top: 10px;\n border-top: 1px solid #ebeef5;\n}\n\n.form-button-area .el-button + .el-button {\n margin-left: 10px;\n}\n\n/* 只读模式样式 */\n.dynamic-form-container.readonly .el-descriptions__body {\n background-color: #fafafa;\n}\n.dynamic-form-container.readonly .el-descriptions-item__label {\n font-weight: bold;\n}\n.dynamic-form-container.readonly .el-descriptions-item__content {\n word-break: break-all;\n}\n\n/*# sourceMappingURL=form.vue.map */", "<script lang=\"jsx\">\nimport { renderNode } from \"./utils/vnode\"\nimport { isObject, isString ,isFunction} from \"./utils/index\"\nimport valueHook from \"./utils/value-hook\"\n\n// type FormItems = { // 表单项配置\n// label: string; // 标签\n// prop: string; // 字段名\n\n// options?: { value: string; label: string; disabled?: boolean }[] || ()=>[]; // 字典数据\n// rules?: any[]; // 验证规则\n\n// children?: FormItems[];\n// hidden?: boolean; // 是否隐藏\n// help?: string; // 帮助信息\n\n// span?: number; // 栅格占据的列数\n// labelWidth?: string; // formitem 标签宽度 \n\n// component?: VNode;\n// };\n// type VNodeFunction = ({ scope,h }) => VNode | ({ scope,h }) =><div>{ scope }</div> | <div />;\n\n// type VNodeObject = { \n// name?: string | Component; // 组件名 | 组件引用\n// options?: any[]; // 选项\n// attrs?: any; // 属性\n// on?: any; // 事件\n// props?: any; // 属性\n// [key: string]: any;\n// };\n// type VNode = string | VNodeFunction | VNodeObject;\n\n\nexport default {\n props: {\n // 表单配置项,可以从外部传入\n formItems: {\n type: Array,\n default: () => []\n },\n // 初始表单数据\n initialFormData: {\n type: Object,\n default: () => ({})\n },\n // 按钮配置\n buttons: {\n type: Object,\n default: () => ({\n submit: {\n show: true,\n text: '提交',\n type: 'primary',\n loading: false\n },\n cancel: {\n show: true,\n text: '取消',\n type: 'default'\n }\n })\n },\n // 按钮位置\n buttonPosition: {\n type: String,\n default: 'right', // center, left, right\n validator: value => ['center', 'left', 'right'].includes(value)\n },\n // 是否显示按钮区域\n showButtons: {\n type: Boolean,\n default: true\n },\n readonly: {\n type: Boolean\n },\n labelWidth: {\n type: String,\n default: '80px'\n },\n column: {\n type: Number,\n default: 2\n },\n gutter: {\n type: Number,\n default: 10\n },\n size: {\n type: String,\n default: 'small'\n },\n // value: {\n // type: Object,\n // default: () => ({})\n // },\n\n\n },\n\n data() {\n return {\n form: {},\n // 如果没有传入formItems,则使用默认配置\n items: [],\n activeName: 'first',\n submitLoading: false\n\n }\n },\n\n computed: {\n // 从items中提取所有字段的规则\n formRules() {\n const rules = {};\n\n // 递归提取规则函数\n const extractRules = (nodes) => {\n if (!nodes || !nodes.length) return;\n\n nodes.forEach(node => {\n // 如果节点有children,递归处理\n if (node.children && node.children.length) {\n extractRules(node.children);\n }\n\n // 如果是表单字段且有规则,添加到规则对象\n if (node.prop && node.rules) {\n rules[node.prop] = node.rules;\n }\n });\n };\n\n // 对所有配置项提取规则\n extractRules(this.items);\n\n return rules;\n },\n // 按钮区域样式\n buttonAreaStyle() {\n return {\n textAlign: this.buttonPosition,\n marginTop: '20px'\n };\n },\n // label宽度\n labelStyle() {\n return {\n width: this.labelWidth,\n textAlign: 'center'\n };\n },\n\n\n },\n\n watch: {\n // 监听外部传入的表单数据变化\n initialFormData: {\n handler(val) {\n this.form = JSON.parse(JSON.stringify(val));\n },\n immediate: true,\n deep: true\n },\n // 监听外部传入的表单配置变化\n formItems: {\n handler(val) {\n if (val && val.length) {\n this.items = val;\n }\n },\n immediate: true,\n deep: true\n },\n // 监听外部传入的value变化\n // value: {\n // handler(val) {\n // this.form = JSON.parse(JSON.stringify(val)) || {};\n // },\n // immediate: true,\n // deep: true\n // },\n // v-model绑定的值变化时,更新表单数据\n form: {\n handler(val) {\n this.$emit('input', val);\n },\n deep: true\n }\n },\n\n methods: {\n // 处理表单输入事件\n handleInput(prop, value) {\n this.$set(this.form, prop, value);\n // 触发change事件,将变更通知给父组件\n this.$emit('field-change', { prop, value, form: this.form });\n },\n\n // 递归渲染函数 - 根据节点类型渲染不同内容\n renderNode(node, index) {\n // 如果是只读模式,使用只读渲染函数\n if (this.readonly) {\n return this.renderReadOnlyNode(node, index);\n }\n\n // 如果是输入字段(没有type或没有children,则视为字段)\n if (!node.type || (!node.children && node.prop)) {\n return this.renderField(node, index);\n }\n\n // 根据节点类型渲染\n switch (node.type) {\n case 'tab':\n return this.renderTab(node, index);\n case 'group':\n return this.renderGroup(node, index);\n default:\n // 默认当作字段渲染\n return this.renderField(node, index);\n }\n },\n\n // 只读模式 - 递归渲染函数\n renderReadOnlyNode(node, index) {\n if (!node.type || (!node.children && node.prop)) {\n return this.renderReadOnlyField(node, index);\n }\n switch (node.type) {\n case 'tab':\n return this.renderReadOnlyTab(node, index);\n case 'group':\n return this.renderReadOnlyGroup(node, index);\n default:\n return this.renderReadOnlyField(node, index);\n }\n },\n\n // 只读模式 - 渲染标签页\n renderReadOnlyTab(tab, index) {\n return (\n <el-tab-pane\n key={tab.name || index}\n label={tab.label}\n name={tab.name || index}\n {...tab.props}\n >\n {this.renderReadOnlyChildren(tab.children)}\n </el-tab-pane>\n );\n },\n\n // 只读模式 - 渲染分组\n renderReadOnlyGroup(group, index) {\n return (\n <div class={['el-form-group', group.className]} key={index} {...group.props}>\n <el-descriptions\n title={group.title}\n border\n column={this.column}\n size={this.size}\n labelStyle={this.labelStyle}\n >\n {this.renderReadOnlyDescriptionItems(group.children)}\n </el-descriptions>\n </div>\n );\n },\n\n // 只读模式 - 渲染字段\n renderReadOnlyField(field, index) {\n // 如果字段被配置为隐藏,则不渲染\n if (field.hidden) {\n return null;\n }\n\n // 获取字段值\n const value = this.form[field.prop];\n\n // 处理显示值\n let displayValue = value;\n\n // 处理不同类型的字段显示值\n if (field.options && Array.isArray(field.options)) {\n const option = field.options.find(opt => opt.value === value);\n if (option) {\n displayValue = option.label;\n }\n }\n\n // 如果处于顶层(不在group内),则需要包装在el-descriptions中\n if (!field._inGroup) {\n return (\n <el-col span={24 / this.column || field.span || 12} key={field.prop || index}>\n <el-descriptions labelStyle={this.labelStyle} border column={this.column} size={this.size}>\n <el-descriptions-item label={field.label || ''}>\n {displayValue || '-'}\n </el-descriptions-item>\n </el-descriptions>\n </el-col>\n );\n }\n // 在group内部的字段直接返回\n return (\n <el-descriptions-item label={field.label || ''}>\n {displayValue || '-'}\n </el-descriptions-item>\n );\n },\n\n // 只读模式 - 渲染描述项\n renderReadOnlyDescriptionItems(children) {\n if (!children || !children.length) {\n return null;\n }\n\n return children.map(child => {\n // 标记字段在group内部\n child._inGroup = true;\n return this.renderReadOnlyField(child);\n });\n },\n\n // 只读模式 - 渲染子节点\n renderReadOnlyChildren(children) {\n // 如果没有子节点,返回空\n if (!children || !children.length) {\n return null;\n }\n\n // 检查第一个子节点类型,判断是否需要包装\n const firstChild = children[0];\n\n // 如果第一个子节点是group,不需要额外包装\n if (firstChild.type === 'group') {\n return children.map((child, index) => this.renderReadOnlyNode(child, index));\n }\n\n // 如果子节点不是输入字段,也不是分组,则直接渲染\n if (firstChild.type && firstChild.type !== 'group' && !firstChild.prop) {\n return children.map((child, index) => this.renderReadOnlyNode(child, index));\n }\n\n // 如果是普通字段(非group),则包装在el-descriptions中\n return (\n <el-descriptions border column={this.column} size={this.size} labelStyle={this.labelStyle}>\n {children.map((child, index) => {\n child._inGroup = true;\n return this.renderReadOnlyNode(child, index);\n })}\n </el-descriptions>\n );\n },\n\n // 渲染标签页\n renderTab(tab, index) {\n return (\n <el-tab-pane\n key={tab.name || index}\n label={tab.label}\n name={tab.name || index}\n {...tab.props}\n >\n {this.renderChildren(tab.children)}\n </el-tab-pane>\n );\n },\n\n // 渲染分组\n renderGroup(group, index) {\n return (\n <div class={['el-form-group', group.className]} key={index} {...group.props}>\n {group.title && <div class=\"el-form-group__title\">{group.title}</div>}\n <div>\n {this.renderChildren(group.children)}\n </div>\n </div>\n );\n },\n\n // 渲染各种表单控件\n renderFormControl(field) {\n let component = field.component;\n if (isString(field.component)) {\n component = {\n name: field.component,\n attrs: {\n placeholder: field.placeholder || `请输入${field.label}`,\n clearable: typeof field.clearable !== 'undefined' ? field.clearable : true,\n }\n }\n }\n if ( !isFunction(field.component)) {\n if (field.component === 'el-select') {\n component.attrs = {\n ...component.attrs,\n placeholder: field.placeholder || `请选择${field.label}`,\n filterable: true,\n\n }\n } \n }\n\n if( field.hook?.bind?.length ){\n let value = valueHook.bind(this.form[ field.prop ], field.hook?.bind , this.form)\n this.$set(this.form, field.prop, value)\n }\n // component 渲染 { prop: this.column.prop, scope: scope }\n return renderNode.call(this, component, {\n prop: field.prop,\n scope: this.form\n });\n\n },\n\n // 渲染字段\n renderField(field, index) {\n // 如果字段被配置为隐藏,则不渲染\n if (field.hidden) {\n return null;\n }\n return (\n <el-col span={24 / this.column || field.span || 12} key={field.prop || index}>\n <el-form-item\n label={field.label}\n prop={field.prop}\n rules={field.rules} // 直接使用字段自身的规则\n labelWidth={field.labelWidth || this.labelWidth}\n {...field.formItemProps}\n >\n {this.renderFormControl(field)}\n {field.help && <div class=\"form-item-help\">{field.help}</div>}\n </el-form-item>\n </el-col>\n );\n },\n\n // 渲染子节点\n renderChildren(children) {\n // 如果没有子节点,返回空\n if (!children || !children.length) {\n return null;\n }\n\n // 检查第一个子节点类型,判断是否需要包装\n const firstChild = children[0];\n\n // 如果第一个子节点是group,不需要额外包装\n if (firstChild.type === 'group') {\n return children.map(this.renderNode);\n }\n\n // 如果子节点不是输入字段,也不是分组,则直接渲染\n if (firstChild.type && firstChild.type !== 'group' && !firstChild.prop) {\n return children.map(this.renderNode);\n }\n\n // 其他情况(子节点是输入字段)包装在row中\n return <el-row gutter={this.gutter}>{children.map(this.renderNode)}</el-row>;\n },\n\n // 判断是否有标签页\n hasTabs() {\n return this.items && this.items.some(item => item.type === 'tab');\n },\n\n // 渲染按钮区域\n renderButtons() {\n if (!this.showButtons || this.readonly) return null;\n\n return (\n <div class=\"form-button-area\" style={this.buttonAreaStyle}>\n {this.buttons.cancel && this.buttons.cancel.show && (\n <el-button\n onClick={this.handleCancel}\n type={this.buttons.cancel.type}\n {...this.buttons.cancel.props}\n >\n {this.buttons.cancel.text}\n </el-button>\n )}\n {this.buttons.submit && this.buttons.submit.show && (\n <el-button\n onClick={this.handleSubmit}\n type={this.buttons.submit.type}\n loading={this.submitLoading || (this.buttons.submit.loading)}\n {...this.buttons.submit.props}\n >\n {this.buttons.submit.text}\n </el-button>\n )}\n </div>\n );\n },\n\n // 处理提交\n async handleSubmit() {\n try {\n this.submitLoading = true;\n // 表单验证\n const formData = await this.validate();\n // 发出提交事件\n this.$emit('submit', formData);\n\n // return formData;\n } catch (error) {\n this.$emit('submit-error', error);\n return Promise.reject(error);\n }\n this.submitLoading = false;\n },\n\n // 处理取消\n handleCancel() {\n this.$emit('cancel');\n },\n\n // 表单验证方法\n validate() {\n return new Promise((resolve, reject) => {\n this.$refs.form.validate(valid => {\n if (valid) {\n resolve(this.form);\n } else {\n reject(new Error('表单验证失败'));\n }\n });\n });\n },\n\n // 重置表单\n resetForm() {\n this.form = JSON.parse(JSON.stringify(this.initialFormData)) || {};\n this.$refs.form.resetFields();\n this.$emit('form-reset', this.form);\n },\n\n // 获取表单数据\n getFormData() {\n return this.form;\n }\n },\n\n render() {\n\n if (this.readonly) {\n // 只读模式渲染\n return (\n <div class=\"dynamic-form-container readonly\">\n {this.hasTabs() ? (\n // 渲染标签页结构\n <el-tabs v-on={this.$listeners} v-model={this.activeName}>\n {this.items.map((item, index) => this.renderReadOnlyNode(item, index))}\n </el-tabs>\n ) : (\n // 非标签页结构,直接渲染\n this.renderReadOnlyChildren(this.items)\n )}\n </div>\n );\n }\n\n const formProps = {\n model: this.form,\n rules: this.formRules,\n ...this.$attrs\n };\n // 如果没有配置项,渲染空表单\n if (!this.items || !this.items.length) {\n return <div class=\"dynamic-form-container\"><el-form ref=\"form\" {...{ props: formProps }}></el-form></div>;\n }\n\n return (\n <div class=\"dynamic-form-container\">\n <el-form ref=\"form\" {...{ props: formProps }}>\n {this.hasTabs() ? (\n // 渲染标签页结构\n <el-tabs v-on={this.$listeners} v-model={this.activeName}>\n {this.items.map(this.renderNode)}\n </el-tabs>\n ) : (\n // 非标签页结构,直接渲染\n this.renderChildren(this.items)\n )}\n\n {/* 渲染按钮区域 */}\n {this.renderButtons()}\n </el-form>\n </div>\n );\n }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.dynamic-form-container {\n padding: 20px;\n\n .el-form{\n \n\n .el-form-item {\n \n &::v-deep{\n .el-input,\n .el-select{\n width: 100%;\n }\n .el-input__inner {\n width: 100%;\n }\n }\n\n }\n\n \n\n }\n}\n\n.el-form-group {\n margin-bottom: 20px;\n /* padding: 15px; */\n border-bottom: 1px solid #ebeef5;\n}\n\n.el-form-group__title {\n font-weight: bold;\n margin-bottom: 15px;\n font-size: 14px;\n color: #606266;\n}\n\n.form-button-area {\n padding-top: 10px;\n border-top: 1px solid #ebeef5;\n}\n\n.form-button-area .el-button+.el-button {\n margin-left: 10px;\n}\n\n/* 只读模式样式 */\n.dynamic-form-container.readonly {\n .el-descriptions__body {\n background-color: #fafafa;\n }\n\n .el-descriptions-item__label {\n font-weight: bold;\n }\n\n .el-descriptions-item__content {\n word-break: break-all;\n }\n}\n</style>\n"]
3591
- },
3592
- media: undefined
3593
- });
3594
- };
3595
- /* scoped */
3596
- var __vue_scope_id__ = "data-v-ef86d32c";
3597
- /* module identifier */
3598
- var __vue_module_identifier__ = undefined;
3599
- /* functional template */
3600
- var __vue_is_functional_template__ = undefined;
3601
- /* style inject SSR */
3602
-
3603
- /* style inject shadow dom */
3604
-
3605
- var __vue_component__ = /*#__PURE__*/normalizeComponent({}, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, createInjector, undefined, undefined);
2796
+ }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, createInjector, undefined, undefined);
3606
2797
 
3607
2798
  ___$insertStylesToHeader(".el-crud .flex {\n display: flex;\n}\n.el-crud .inline-flex {\n display: inline-flex;\n}\n.el-crud .hidden {\n display: none;\n}\n.el-crud .block {\n display: block;\n}\n.el-crud .inline-block {\n display: inline-block;\n}\n.el-crud .flex-row {\n flex-direction: row;\n}\n.el-crud .flex-row-reverse {\n flex-direction: row-reverse;\n}\n.el-crud .flex-col {\n flex-direction: column;\n}\n.el-crud .flex-col-reverse {\n flex-direction: column-reverse;\n}\n.el-crud .flex-wrap {\n flex-wrap: wrap;\n}\n.el-crud .flex-nowrap {\n flex-wrap: nowrap;\n}\n.el-crud .flex-wrap-reverse {\n flex-wrap: wrap-reverse;\n}\n.el-crud .justify-start {\n justify-content: flex-start;\n}\n.el-crud .justify-end {\n justify-content: flex-end;\n}\n.el-crud .justify-center {\n justify-content: center;\n}\n.el-crud .justify-between {\n justify-content: space-between;\n}\n.el-crud .justify-around {\n justify-content: space-around;\n}\n.el-crud .justify-evenly {\n justify-content: space-evenly;\n}\n.el-crud .items-start {\n align-items: flex-start;\n}\n.el-crud .items-end {\n align-items: flex-end;\n}\n.el-crud .items-center {\n align-items: center;\n}\n.el-crud .items-baseline {\n align-items: baseline;\n}\n.el-crud .items-stretch {\n align-items: stretch;\n}\n.el-crud .content-start {\n align-content: flex-start;\n}\n.el-crud .content-end {\n align-content: flex-end;\n}\n.el-crud .content-center {\n align-content: center;\n}\n.el-crud .content-between {\n align-content: space-between;\n}\n.el-crud .content-around {\n align-content: space-around;\n}\n.el-crud .content-evenly {\n align-content: space-evenly;\n}\n.el-crud .self-auto {\n align-self: auto;\n}\n.el-crud .self-start {\n align-self: flex-start;\n}\n.el-crud .self-end {\n align-self: flex-end;\n}\n.el-crud .self-center {\n align-self: center;\n}\n.el-crud .self-stretch {\n align-self: stretch;\n}\n.el-crud .flex-1 {\n flex: 1 1 0%;\n}\n.el-crud .flex-auto {\n flex: 1 1 auto;\n}\n.el-crud .flex-initial {\n flex: 0 1 auto;\n}\n.el-crud .flex-none {\n flex: none;\n}\n.el-crud .grow {\n flex-grow: 1;\n}\n.el-crud .grow-0 {\n flex-grow: 0;\n}\n.el-crud .shrink {\n flex-shrink: 1;\n}\n.el-crud .shrink-0 {\n flex-shrink: 0;\n}\n.el-crud .w-full {\n width: 100%;\n}\n.el-crud .w-auto {\n width: auto;\n}\n.el-crud .h-full {\n height: 100%;\n}\n.el-crud .h-auto {\n height: auto;\n}\n.el-crud .h-screen {\n height: 100vh;\n}\n.el-crud .m-0 {\n margin: 0;\n}\n.el-crud .m-auto {\n margin: auto;\n}\n.el-crud .mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n.el-crud .my-auto {\n margin-top: auto;\n margin-bottom: auto;\n}\n.el-crud .text-left {\n text-align: left;\n}\n.el-crud .text-center {\n text-align: center;\n}\n.el-crud .text-right {\n text-align: right;\n}\n.el-crud .text-justify {\n text-align: justify;\n}\n.el-crud .font-normal {\n font-weight: 400;\n}\n.el-crud .font-medium {\n font-weight: 500;\n}\n.el-crud .font-semibold {\n font-weight: 600;\n}\n.el-crud .font-bold {\n font-weight: 700;\n}\n.el-crud .overflow-hidden {\n overflow: hidden;\n}\n.el-crud .overflow-auto {\n overflow: auto;\n}\n.el-crud .overflow-scroll {\n overflow: scroll;\n}\n.el-crud .overflow-x-auto {\n overflow-x: auto;\n}\n.el-crud .overflow-y-auto {\n overflow-y: auto;\n}\n.el-crud .relative {\n position: relative;\n}\n.el-crud .absolute {\n position: absolute;\n}\n.el-crud .fixed {\n position: fixed;\n}\n.el-crud .sticky {\n position: sticky;\n}\n.el-crud .cursor-pointer {\n cursor: pointer;\n}\n.el-crud .cursor-not-allowed {\n cursor: not-allowed;\n}\n.el-crud-toolbar {\n margin-top: 10px;\n}\n.el-crud .crud-table {\n margin-top: 10px;\n}\n\n/*# sourceMappingURL=output.css.map */");
3608
2799
 
3609
- exports.Crud = __vue_component__$1;
3610
- exports.CrudForm = __vue_component__;
3611
- exports.CrudTable = __vue_component__$5;
3612
- exports.QueryForm = __vue_component__$3;
2800
+ exports.Crud = __vue_component__;
2801
+ exports.CrudTable = __vue_component__$4;
2802
+ exports.QueryForm = __vue_component__$2;
3613
2803
  //# sourceMappingURL=index.js.map