el-crud-page 1.0.1 → 1.0.3
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.esm.js +161 -970
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +163 -973
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +163 -973
- package/dist/index.umd.js.map +1 -1
- package/package.json +7 -9
- package/src/index.js +1 -2
- package/src/index.vue +1 -1
- package/src/style.scss +1 -3
- package/src/table.vue +1 -1
- package/src/form.vue +0 -659
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$
|
|
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__$
|
|
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__$
|
|
1382
|
+
var __vue_inject_styles__$4 = function __vue_inject_styles__(inject) {
|
|
1418
1383
|
if (!inject) return;
|
|
1419
|
-
inject("data-v-
|
|
1420
|
-
source: ".crud-table[data-v-
|
|
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__$
|
|
1398
|
+
var __vue_scope_id__$4 = "data-v-8bcd2094";
|
|
1434
1399
|
/* module identifier */
|
|
1435
|
-
var __vue_module_identifier__$
|
|
1400
|
+
var __vue_module_identifier__$4 = undefined;
|
|
1436
1401
|
/* functional template */
|
|
1437
|
-
var __vue_is_functional_template__$
|
|
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__$
|
|
1407
|
+
var __vue_component__$4 = /*#__PURE__*/normalizeComponent({
|
|
1443
1408
|
render: __vue_render__$4,
|
|
1444
1409
|
staticRenderFns: __vue_staticRenderFns__$4
|
|
1445
|
-
}, __vue_inject_styles__$
|
|
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$
|
|
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__$
|
|
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__$
|
|
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__$
|
|
1699
|
+
var __vue_scope_id__$3 = "data-v-d5778a5c";
|
|
1735
1700
|
/* module identifier */
|
|
1736
|
-
var __vue_module_identifier__$
|
|
1701
|
+
var __vue_module_identifier__$3 = undefined;
|
|
1737
1702
|
/* functional template */
|
|
1738
|
-
var __vue_is_functional_template__$
|
|
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__$
|
|
1708
|
+
var __vue_component__$3 = /*#__PURE__*/normalizeComponent({
|
|
1744
1709
|
render: __vue_render__$3,
|
|
1745
1710
|
staticRenderFns: __vue_staticRenderFns__$3
|
|
1746
|
-
}, __vue_inject_styles__$
|
|
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$
|
|
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__$
|
|
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
|
|
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__$
|
|
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__$
|
|
2112
|
+
var __vue_scope_id__$2 = "data-v-ba1b80d0";
|
|
2148
2113
|
/* module identifier */
|
|
2149
|
-
var __vue_module_identifier__$
|
|
2114
|
+
var __vue_module_identifier__$2 = undefined;
|
|
2150
2115
|
/* functional template */
|
|
2151
|
-
var __vue_is_functional_template__$
|
|
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__$
|
|
2121
|
+
var __vue_component__$2 = /*#__PURE__*/normalizeComponent({
|
|
2157
2122
|
render: __vue_render__$2,
|
|
2158
2123
|
staticRenderFns: __vue_staticRenderFns__$2
|
|
2159
|
-
}, __vue_inject_styles__$
|
|
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$
|
|
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__$
|
|
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__$
|
|
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__$
|
|
2294
|
+
var __vue_scope_id__$1 = "data-v-7ec7699b";
|
|
2330
2295
|
/* module identifier */
|
|
2331
|
-
var __vue_module_identifier__$
|
|
2296
|
+
var __vue_module_identifier__$1 = undefined;
|
|
2332
2297
|
/* functional template */
|
|
2333
|
-
var __vue_is_functional_template__$
|
|
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__$
|
|
2303
|
+
var __vue_component__$1 = /*#__PURE__*/normalizeComponent({
|
|
2339
2304
|
render: __vue_render__$1,
|
|
2340
2305
|
staticRenderFns: __vue_staticRenderFns__$1
|
|
2341
|
-
}, __vue_inject_styles__$
|
|
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
|
|
2308
|
+
var script = {
|
|
2344
2309
|
components: {
|
|
2345
|
-
CrudTable: __vue_component__$
|
|
2346
|
-
RightToolbar: __vue_component__$
|
|
2347
|
-
QueryForm: __vue_component__$
|
|
2348
|
-
Pagination: __vue_component__$
|
|
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__
|
|
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",
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
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",
|
|
2699
|
-
|
|
2700
|
-
|
|
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
|
-
|
|
2703
|
-
|
|
2704
|
-
on: {
|
|
2705
|
-
"tab-click": _vm.handleTabClick
|
|
2673
|
+
label: item.label,
|
|
2674
|
+
name: item.name
|
|
2706
2675
|
}
|
|
2707
|
-
}
|
|
2708
|
-
|
|
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
|
|
2720
|
-
|
|
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
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
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
|
-
|
|
2746
|
-
_vm.
|
|
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",
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
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",
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
|
|
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
|
-
|
|
2796
|
-
"
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
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__
|
|
2768
|
+
var __vue_inject_styles__ = function __vue_inject_styles__(inject) {
|
|
2815
2769
|
if (!inject) return;
|
|
2816
|
-
inject("data-v-
|
|
2817
|
-
source: ".top-tab-query[data-v-
|
|
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__
|
|
2784
|
+
var __vue_scope_id__ = "data-v-35906918";
|
|
2831
2785
|
/* module identifier */
|
|
2832
|
-
var __vue_module_identifier__
|
|
2786
|
+
var __vue_module_identifier__ = undefined;
|
|
2833
2787
|
/* functional template */
|
|
2834
|
-
var __vue_is_functional_template__
|
|
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__
|
|
2793
|
+
var __vue_component__ = /*#__PURE__*/normalizeComponent({
|
|
2840
2794
|
render: __vue_render__,
|
|
2841
2795
|
staticRenderFns: __vue_staticRenderFns__
|
|
2842
|
-
}, __vue_inject_styles__
|
|
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
|
-
___$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
|
|
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 .crud-table {\n margin-top: 10px;\n}\n\n/*# sourceMappingURL=output.css.map */");
|
|
3608
2799
|
|
|
3609
|
-
exports.Crud = __vue_component__
|
|
3610
|
-
exports.
|
|
3611
|
-
exports.
|
|
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
|