@fecp/vue 1.1.2 → 1.1.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/es/node_modules/.pnpm/@vueuse_shared@10.11.1_vue@3.5.13_typescript@5.7.3_/node_modules/@vueuse/shared/index.mjs +1 -1
- package/es/node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/form/src/hooks/use-form-common-props.mjs +1 -1
- package/es/node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/input/src/input.vue2.mjs +1 -1
- package/es/packages/vue/src/components/forms/form/Form.vue.mjs +117 -80
- package/es/packages/vue/src/components/forms/formItem/FormItem.vue.mjs +2 -2
- package/es/packages/vue/src/components/forms/text/Text.vue.mjs +2 -2
- package/es/packages/vue/src/components/forms/text/index.mjs +2 -2
- package/es/packages/vue/src/components/table/Table.vue.mjs +57 -2
- package/es/packages/vue/src/components/table/TableColumn.vue.mjs +10 -1
- package/es/packages/vue/src/components/table/TableFilter.vue.mjs +267 -0
- package/es/packages/vue/src/utils/datasource.mjs +18 -0
- package/es/packages/vue/src/utils/eventFlow/actionHandlers.mjs +19 -2
- package/es/packages/vue/src/utils/parseRouteParams.mjs +3 -2
- package/es/vue.css +125 -27
- package/lib/packages/vue/src/components/forms/form/Form.vue.js +116 -79
- package/lib/packages/vue/src/components/forms/text/Text.vue.js +2 -2
- package/lib/packages/vue/src/components/table/Table.vue.js +57 -2
- package/lib/packages/vue/src/components/table/TableColumn.vue.js +10 -1
- package/lib/packages/vue/src/components/table/TableFilter.vue.js +267 -0
- package/lib/packages/vue/src/utils/datasource.js +18 -0
- package/lib/packages/vue/src/utils/eventFlow/actionHandlers.js +19 -2
- package/lib/packages/vue/src/utils/parseRouteParams.js +3 -2
- package/lib/vue.css +125 -27
- package/package.json +1 -1
|
@@ -29,6 +29,7 @@ const index = require("../../../../../../node_modules/.pnpm/element-plus@2.13.2_
|
|
|
29
29
|
const index$3 = require("../../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/form/index.js");
|
|
30
30
|
const gridLayout_vue = require("../../../../../../node_modules/.pnpm/grid-layout-plus@1.1.1_vue@3.5.13_typescript@5.7.3_/node_modules/grid-layout-plus/es/components/grid-layout.vue.js");
|
|
31
31
|
const index$5 = require("../../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/message/index.js");
|
|
32
|
+
const _hoisted_1 = ["name", "value"];
|
|
32
33
|
const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
33
34
|
inheritAttrs: false
|
|
34
35
|
}, {
|
|
@@ -59,6 +60,7 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
59
60
|
const dataSourceOptions = vue.ref({});
|
|
60
61
|
const dictionaryOptions = vue.ref({});
|
|
61
62
|
const fieldsData = vue.ref({});
|
|
63
|
+
const hiddenFields = vue.ref({});
|
|
62
64
|
const pageEvents = usePageEvents.usePageEvents(() => ({
|
|
63
65
|
pageEventConfig: localConfig.value.pageEventConfig,
|
|
64
66
|
ctx,
|
|
@@ -84,6 +86,7 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
84
86
|
);
|
|
85
87
|
localConfig.value = option;
|
|
86
88
|
fieldsData.value = option.fieldsData.map((item) => item.component);
|
|
89
|
+
hiddenFields.value = option.hiddenFields || [];
|
|
87
90
|
initFormData();
|
|
88
91
|
await loadFieldDataSources();
|
|
89
92
|
loadEventFlow();
|
|
@@ -120,6 +123,13 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
120
123
|
}
|
|
121
124
|
});
|
|
122
125
|
}
|
|
126
|
+
if (hiddenFields.value && hiddenFields.value.length > 0) {
|
|
127
|
+
hiddenFields.value.forEach((field) => {
|
|
128
|
+
if (field.fieldName) {
|
|
129
|
+
data[field.fieldName] = field.value !== void 0 ? field.value : null;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
123
133
|
formData.value = data;
|
|
124
134
|
formRules.value = rules;
|
|
125
135
|
};
|
|
@@ -228,7 +238,7 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
228
238
|
getEventHandlers: createEventHandlers,
|
|
229
239
|
handleEvent: createHandleEvent
|
|
230
240
|
} = eventFlowHandler.useEventFlow({
|
|
231
|
-
fields: fieldsData.value,
|
|
241
|
+
fields: [...fieldsData.value, ...hiddenFields.value],
|
|
232
242
|
ctx,
|
|
233
243
|
dataSources: localConfig.value.dataSources,
|
|
234
244
|
components: {
|
|
@@ -278,36 +288,52 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
278
288
|
};
|
|
279
289
|
const getFormData = () => {
|
|
280
290
|
const result = { ...formData.value };
|
|
291
|
+
const processField = (field) => {
|
|
292
|
+
const fieldName = field.fieldName;
|
|
293
|
+
const fieldType = field.fieldType;
|
|
294
|
+
if (fieldName && (fieldType === "checkbox" || fieldType === "multipleSelection")) {
|
|
295
|
+
const value = result[fieldName];
|
|
296
|
+
if (Array.isArray(value)) {
|
|
297
|
+
result[fieldName] = value.join("|");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
281
301
|
if (localConfig.value.fieldsData) {
|
|
282
302
|
localConfig.value.fieldsData.forEach(({ component }) => {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
}
|
|
303
|
+
processField(component);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
if (hiddenFields.value && hiddenFields.value.length > 0) {
|
|
307
|
+
hiddenFields.value.forEach((field) => {
|
|
308
|
+
processField(field);
|
|
291
309
|
});
|
|
292
310
|
}
|
|
293
311
|
return result;
|
|
294
312
|
};
|
|
295
313
|
const setFormData = (data) => {
|
|
296
314
|
const processedData = { ...data };
|
|
315
|
+
const processField = (field) => {
|
|
316
|
+
const fieldName = field.fieldName;
|
|
317
|
+
const fieldType = field.fieldType;
|
|
318
|
+
if (fieldName && (fieldType === "checkbox" || fieldType === "multipleSelection")) {
|
|
319
|
+
const value = processedData[fieldName];
|
|
320
|
+
if (typeof value === "string" && value.includes("|")) {
|
|
321
|
+
processedData[fieldName] = value.split("|");
|
|
322
|
+
} else if (typeof value === "string" && value !== "") {
|
|
323
|
+
processedData[fieldName] = [value];
|
|
324
|
+
} else if (value === "" || value === null || value === void 0) {
|
|
325
|
+
processedData[fieldName] = [];
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
};
|
|
297
329
|
if (localConfig.value.fieldsData) {
|
|
298
330
|
localConfig.value.fieldsData.forEach(({ component }) => {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
} else if (typeof value === "string" && value !== "") {
|
|
306
|
-
processedData[fieldName] = [value];
|
|
307
|
-
} else if (value === "" || value === null || value === void 0) {
|
|
308
|
-
processedData[fieldName] = [];
|
|
309
|
-
}
|
|
310
|
-
}
|
|
331
|
+
processField(component);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
if (hiddenFields.value && hiddenFields.value.length > 0) {
|
|
335
|
+
hiddenFields.value.forEach((field) => {
|
|
336
|
+
processField(field);
|
|
311
337
|
});
|
|
312
338
|
}
|
|
313
339
|
Object.assign(formData.value, processedData);
|
|
@@ -325,64 +351,75 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
325
351
|
return (_ctx, _cache) => {
|
|
326
352
|
const _component_el_form = index$3.ElForm;
|
|
327
353
|
const _component_el_container = index.ElContainer;
|
|
328
|
-
return vue.openBlock(), vue.
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
vue.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
vue.
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
354
|
+
return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
|
|
355
|
+
vue.createVNode(_component_el_container, {
|
|
356
|
+
direction: "vertical",
|
|
357
|
+
style: { "height": "100%" }
|
|
358
|
+
}, {
|
|
359
|
+
default: vue.withCtx(() => [
|
|
360
|
+
!configLoading.value ? (vue.openBlock(), vue.createBlock(vue.unref(index$1.header), {
|
|
361
|
+
key: 0,
|
|
362
|
+
pageHeaderConfig: localConfig.value.pageHeaderConfig
|
|
363
|
+
}, null, 8, ["pageHeaderConfig"])) : vue.createCommentVNode("", true),
|
|
364
|
+
vue.createVNode(vue.unref(index$2.main), null, {
|
|
365
|
+
default: vue.withCtx(() => [
|
|
366
|
+
vue.createVNode(_component_el_form, {
|
|
367
|
+
ref_key: "formRef",
|
|
368
|
+
ref: formRef,
|
|
369
|
+
model: formData.value,
|
|
370
|
+
rules: formRules.value,
|
|
371
|
+
"label-position": localConfig.value.labelPosition,
|
|
372
|
+
style: { "padding": "18px" },
|
|
373
|
+
"validate-on-rule-change": false
|
|
374
|
+
}, {
|
|
375
|
+
default: vue.withCtx(() => [
|
|
376
|
+
!configLoading.value ? (vue.openBlock(), vue.createBlock(vue.unref(gridLayout_vue.default), {
|
|
377
|
+
key: 0,
|
|
378
|
+
ref: "gridLayout",
|
|
379
|
+
layout: localConfig.value.fieldsData,
|
|
380
|
+
"onUpdate:layout": _cache[0] || (_cache[0] = ($event) => localConfig.value.fieldsData = $event),
|
|
381
|
+
"row-height": localConfig.value.labelPosition == "top" ? 90 : 60,
|
|
382
|
+
margin: [0, 0],
|
|
383
|
+
"col-num": localConfig.value.columns,
|
|
384
|
+
"is-draggable": false,
|
|
385
|
+
"is-resizable": false
|
|
386
|
+
}, {
|
|
387
|
+
item: vue.withCtx(({ item: { component } }) => [
|
|
388
|
+
vue.createVNode(FormItem.default, {
|
|
389
|
+
modelValue: formData.value[component.fieldName],
|
|
390
|
+
"onUpdate:modelValue": ($event) => formData.value[component.fieldName] = $event,
|
|
391
|
+
config: component,
|
|
392
|
+
localConfig: localConfig.value,
|
|
393
|
+
error: getFieldError(component.fieldName),
|
|
394
|
+
formRef: formRef.value,
|
|
395
|
+
onChange: handleFieldChange
|
|
396
|
+
}, null, 8, ["modelValue", "onUpdate:modelValue", "config", "localConfig", "error", "formRef"])
|
|
397
|
+
]),
|
|
398
|
+
_: 1
|
|
399
|
+
}, 8, ["layout", "row-height", "col-num"])) : vue.createCommentVNode("", true),
|
|
400
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(hiddenFields.value, (field) => {
|
|
401
|
+
return vue.openBlock(), vue.createElementBlock("input", {
|
|
402
|
+
key: field.fieldName,
|
|
403
|
+
type: "hidden",
|
|
404
|
+
name: field.fieldName,
|
|
405
|
+
value: formData.value[field.fieldName]
|
|
406
|
+
}, null, 8, _hoisted_1);
|
|
407
|
+
}), 128))
|
|
408
|
+
]),
|
|
409
|
+
_: 1
|
|
410
|
+
}, 8, ["model", "rules", "label-position"])
|
|
411
|
+
]),
|
|
412
|
+
_: 1
|
|
413
|
+
}),
|
|
414
|
+
vue.createVNode(vue.unref(index$4.footer), {
|
|
415
|
+
pageFooterConfig: localConfig.value.pageFooterConfig,
|
|
416
|
+
onCustomButtonClick: handleCustomButtonClick
|
|
417
|
+
}, null, 8, ["pageFooterConfig"])
|
|
418
|
+
]),
|
|
419
|
+
_: 1
|
|
420
|
+
}),
|
|
421
|
+
vue.createTextVNode(" " + vue.toDisplayString(formData.value), 1)
|
|
422
|
+
], 64);
|
|
386
423
|
};
|
|
387
424
|
}
|
|
388
425
|
});
|
|
@@ -131,5 +131,5 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
133
|
});
|
|
134
|
-
const
|
|
135
|
-
exports.default =
|
|
134
|
+
const TextComponent = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-4b100f9c"]]);
|
|
135
|
+
exports.default = TextComponent;
|
|
@@ -9,6 +9,7 @@ const datasource = require("../../utils/datasource.js");
|
|
|
9
9
|
const Pagination = require("./Pagination.vue.js");
|
|
10
10
|
const CustomButtons = require("./CustomButtons.vue.js");
|
|
11
11
|
const TableColumn = require("./TableColumn.vue.js");
|
|
12
|
+
const TableFilter = require("./TableFilter.vue.js");
|
|
12
13
|
const getInstance = require("../../utils/getInstance.js");
|
|
13
14
|
;/* empty css */
|
|
14
15
|
;/* empty css */
|
|
@@ -139,7 +140,7 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
139
140
|
const fieldDataSources = /* @__PURE__ */ new Set();
|
|
140
141
|
const dictionaryKeys = /* @__PURE__ */ new Set();
|
|
141
142
|
for (const field of fields) {
|
|
142
|
-
if (field.fieldType === "select" && field.optionConfig) {
|
|
143
|
+
if ((field.fieldType === "select" || field.fieldType === "multipleSelection") && field.optionConfig) {
|
|
143
144
|
const { optionSource, dataSourceValue, dictionaryValue } = field.optionConfig;
|
|
144
145
|
if (optionSource === "dataSource" && dataSourceValue) {
|
|
145
146
|
fieldDataSources.add(dataSourceValue);
|
|
@@ -194,6 +195,42 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
194
195
|
console.error("Failed to load dictionary data:", error);
|
|
195
196
|
}
|
|
196
197
|
}
|
|
198
|
+
mergeOptionsToFields();
|
|
199
|
+
};
|
|
200
|
+
const mergeOptionsToFields = () => {
|
|
201
|
+
if (localConfig.value.fieldsData) {
|
|
202
|
+
localConfig.value.fieldsData.forEach((field) => {
|
|
203
|
+
if (!field.optionConfig) return;
|
|
204
|
+
const {
|
|
205
|
+
optionSource,
|
|
206
|
+
dataSourceValue,
|
|
207
|
+
dictionaryValue,
|
|
208
|
+
displayField,
|
|
209
|
+
valueField
|
|
210
|
+
} = field.optionConfig;
|
|
211
|
+
if (optionSource === "dataSource" && dataSourceOptions.value[dataSourceValue]) {
|
|
212
|
+
const rawOptions = dataSourceOptions.value[dataSourceValue];
|
|
213
|
+
const labelField = displayField || "label";
|
|
214
|
+
const keyField = valueField || "value";
|
|
215
|
+
field.optionConfig.options = rawOptions.map((item) => ({
|
|
216
|
+
label: item[labelField],
|
|
217
|
+
value: item[keyField],
|
|
218
|
+
disabled: item.disabled || false
|
|
219
|
+
}));
|
|
220
|
+
} else if (optionSource === "dictionary" && dictionaryOptions.value[dictionaryValue]) {
|
|
221
|
+
const rawOptions = dictionaryOptions.value[dictionaryValue];
|
|
222
|
+
const labelField = "optName";
|
|
223
|
+
const keyField = "optCode";
|
|
224
|
+
field.optionConfig.options = rawOptions.map((item) => ({
|
|
225
|
+
label: item[labelField],
|
|
226
|
+
value: item[keyField],
|
|
227
|
+
disabled: item.disabled || false
|
|
228
|
+
}));
|
|
229
|
+
} else if (optionSource === "custom") {
|
|
230
|
+
field.optionConfig.options = field.optionConfig.options || [];
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
197
234
|
};
|
|
198
235
|
const { handleEvent } = eventFlowHandler.useEventFlow({
|
|
199
236
|
fields: localConfig.value.fieldsData,
|
|
@@ -247,6 +284,18 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
247
284
|
const handleRadioChange = (checked) => {
|
|
248
285
|
emit("selection-change", [checked.row]);
|
|
249
286
|
};
|
|
287
|
+
const handleFilterSearch = (filters) => {
|
|
288
|
+
if (dataSourceManager.value) {
|
|
289
|
+
dataSourceManager.value.updateParams(filters);
|
|
290
|
+
dataSourceManager.value.fetch();
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
const handleFilterReset = () => {
|
|
294
|
+
if (dataSourceManager.value) {
|
|
295
|
+
dataSourceManager.value.clearParams();
|
|
296
|
+
dataSourceManager.value.fetch();
|
|
297
|
+
}
|
|
298
|
+
};
|
|
250
299
|
const refresh = (options = {}) => {
|
|
251
300
|
var _a;
|
|
252
301
|
const {
|
|
@@ -375,6 +424,12 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
375
424
|
ref: tableContainer,
|
|
376
425
|
class: "fec-table-container"
|
|
377
426
|
}, [
|
|
427
|
+
vue.createVNode(TableFilter.default, {
|
|
428
|
+
"query-config": localConfig.value.queryConfig,
|
|
429
|
+
"fields-data": localConfig.value.fieldsData,
|
|
430
|
+
onSearch: handleFilterSearch,
|
|
431
|
+
onReset: handleFilterReset
|
|
432
|
+
}, null, 8, ["query-config", "fields-data"]),
|
|
378
433
|
vue.createVNode(CustomButtons.default, {
|
|
379
434
|
"custom-btns": localConfig.value.customBtns,
|
|
380
435
|
onClick: handleCustomBtnClick
|
|
@@ -436,5 +491,5 @@ const _sfc_main = /* @__PURE__ */ Object.assign({
|
|
|
436
491
|
};
|
|
437
492
|
}
|
|
438
493
|
});
|
|
439
|
-
const _Table = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-
|
|
494
|
+
const _Table = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-d11bb28c"]]);
|
|
440
495
|
exports.default = _Table;
|
|
@@ -110,6 +110,7 @@ const _sfc_main = {
|
|
|
110
110
|
}
|
|
111
111
|
return value;
|
|
112
112
|
case "select":
|
|
113
|
+
case "multipleSelection":
|
|
113
114
|
if (field.optionConfig) {
|
|
114
115
|
let options = [];
|
|
115
116
|
let displayField = "label";
|
|
@@ -127,6 +128,14 @@ const _sfc_main = {
|
|
|
127
128
|
displayField = "optName";
|
|
128
129
|
valueField = "optCode";
|
|
129
130
|
}
|
|
131
|
+
if (typeof value === "string" && value.includes("|")) {
|
|
132
|
+
const values = value.split("|");
|
|
133
|
+
const displayValues = values.map((val) => {
|
|
134
|
+
const option2 = options.find((opt) => opt[valueField] == val);
|
|
135
|
+
return option2 ? option2[displayField] : val;
|
|
136
|
+
});
|
|
137
|
+
return displayValues.join(", ");
|
|
138
|
+
}
|
|
130
139
|
const option = options.find((opt) => opt[valueField] == value);
|
|
131
140
|
return option ? option[displayField] : value;
|
|
132
141
|
}
|
|
@@ -300,5 +309,5 @@ const _sfc_main = {
|
|
|
300
309
|
};
|
|
301
310
|
}
|
|
302
311
|
};
|
|
303
|
-
const TableColumn = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-
|
|
312
|
+
const TableColumn = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c7ca0774"]]);
|
|
304
313
|
exports.default = TableColumn;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
;/* empty css */
|
|
4
|
+
;/* empty css */
|
|
5
|
+
;/* empty css */
|
|
6
|
+
;/* empty css */
|
|
7
|
+
;/* empty css */
|
|
8
|
+
require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/theme-chalk/el-date-picker.css.js");
|
|
9
|
+
;/* empty css */
|
|
10
|
+
;/* empty css */
|
|
11
|
+
;/* empty css */
|
|
12
|
+
;/* empty css */
|
|
13
|
+
const vue = require("vue");
|
|
14
|
+
const index$3 = require("../../../../../node_modules/.pnpm/@element-plus_icons-vue@2.3.2_vue@3.5.13_typescript@5.7.3_/node_modules/@element-plus/icons-vue/dist/index.js");
|
|
15
|
+
const index$a = require("../forms/text/index.js");
|
|
16
|
+
const index$6 = require("../forms/select/index.js");
|
|
17
|
+
const index$7 = require("../forms/multipleSelection/index.js");
|
|
18
|
+
const index$9 = require("../forms/date/index.js");
|
|
19
|
+
const index$8 = require("../forms/number/index.js");
|
|
20
|
+
;/* empty css */
|
|
21
|
+
const _pluginVue_exportHelper = require("../../../../../_virtual/_plugin-vue_export-helper.js");
|
|
22
|
+
const index = require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/form/index.js");
|
|
23
|
+
const index$1 = require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/date-picker/index.js");
|
|
24
|
+
const index$2 = require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/button/index.js");
|
|
25
|
+
const index$4 = require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/divider/index.js");
|
|
26
|
+
const index$5 = require("../../../../../node_modules/.pnpm/element-plus@2.13.2_vue@3.5.13_typescript@5.7.3_/node_modules/element-plus/es/components/icon/index.js");
|
|
27
|
+
const _sfc_main = {
|
|
28
|
+
__name: "TableFilter",
|
|
29
|
+
props: {
|
|
30
|
+
queryConfig: {
|
|
31
|
+
type: Object,
|
|
32
|
+
default: () => ({})
|
|
33
|
+
},
|
|
34
|
+
fieldsData: {
|
|
35
|
+
type: Array,
|
|
36
|
+
default: () => []
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
emits: ["search", "reset"],
|
|
40
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
41
|
+
vue.useCssVars((_ctx) => ({
|
|
42
|
+
"50ac82f0": `${config.value.collapseRows * 90}px`
|
|
43
|
+
}));
|
|
44
|
+
const props = __props;
|
|
45
|
+
const emit = __emit;
|
|
46
|
+
const config = vue.computed(() => {
|
|
47
|
+
var _a, _b, _c, _d, _e;
|
|
48
|
+
return {
|
|
49
|
+
enabled: ((_a = props.queryConfig) == null ? void 0 : _a.enabled) ?? false,
|
|
50
|
+
mode: ((_b = props.queryConfig) == null ? void 0 : _b.mode) || "fixed",
|
|
51
|
+
columnCount: ((_c = props.queryConfig) == null ? void 0 : _c.columnCount) || 3,
|
|
52
|
+
collapseRows: ((_d = props.queryConfig) == null ? void 0 : _d.collapseRows) || 2,
|
|
53
|
+
filterFields: ((_e = props.queryConfig) == null ? void 0 : _e.filterFields) || []
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
const getFieldConfig = (fieldId) => {
|
|
57
|
+
return props.fieldsData.find((field) => field.id === fieldId) || {};
|
|
58
|
+
};
|
|
59
|
+
const completeFilterFields = vue.computed(() => {
|
|
60
|
+
return config.value.filterFields.map((filterField) => {
|
|
61
|
+
const fieldConfig = getFieldConfig(filterField.fieldId);
|
|
62
|
+
return {
|
|
63
|
+
...filterField,
|
|
64
|
+
...fieldConfig
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
const filterValues = vue.ref({});
|
|
69
|
+
const isCollapsed = vue.ref(true);
|
|
70
|
+
const shouldShowToggle = vue.computed(() => {
|
|
71
|
+
const fieldCount = completeFilterFields.value.length;
|
|
72
|
+
const maxVisibleFields = config.value.columnCount * config.value.collapseRows;
|
|
73
|
+
return fieldCount > maxVisibleFields;
|
|
74
|
+
});
|
|
75
|
+
const isSingleLine = vue.computed(() => {
|
|
76
|
+
if (isCollapsed.value) {
|
|
77
|
+
return config.value.collapseRows === 1;
|
|
78
|
+
} else {
|
|
79
|
+
const totalRows = Math.ceil(
|
|
80
|
+
completeFilterFields.value.length / config.value.columnCount
|
|
81
|
+
);
|
|
82
|
+
return totalRows === 1;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const getFilterComponent = (fieldType) => {
|
|
86
|
+
const componentMap = {
|
|
87
|
+
text: index$a.Text,
|
|
88
|
+
select: index$6.Select,
|
|
89
|
+
date: index$9.Date,
|
|
90
|
+
number: index$8.Number,
|
|
91
|
+
multipleSelection: index$7.MultipleSelection,
|
|
92
|
+
switch: index$6.Select
|
|
93
|
+
};
|
|
94
|
+
return componentMap[fieldType] || index$a.Text;
|
|
95
|
+
};
|
|
96
|
+
const getComponentConfig = (field) => {
|
|
97
|
+
return { ...field };
|
|
98
|
+
};
|
|
99
|
+
const getPlaceholder = (field, type = "default") => {
|
|
100
|
+
const placeholderMap = {
|
|
101
|
+
text: "请输入",
|
|
102
|
+
select: "请选择",
|
|
103
|
+
date: type === "start" ? "开始日期" : type === "end" ? "结束日期" : "请选择日期",
|
|
104
|
+
number: "请输入",
|
|
105
|
+
radio: "请选择",
|
|
106
|
+
checkbox: "请选择",
|
|
107
|
+
switch: "请选择"
|
|
108
|
+
};
|
|
109
|
+
if (field.fieldType === "date") {
|
|
110
|
+
return placeholderMap.date;
|
|
111
|
+
}
|
|
112
|
+
return `${placeholderMap[field.fieldType] || "请输入"}${field.label || ""}`;
|
|
113
|
+
};
|
|
114
|
+
const toggleCollapse = () => {
|
|
115
|
+
isCollapsed.value = !isCollapsed.value;
|
|
116
|
+
};
|
|
117
|
+
const handleSearch = () => {
|
|
118
|
+
const filters = {};
|
|
119
|
+
Object.keys(filterValues.value).forEach((key) => {
|
|
120
|
+
const value = filterValues.value[key];
|
|
121
|
+
if (value !== "" && value !== null && value !== void 0) {
|
|
122
|
+
const fieldConfig = completeFilterFields.value.find(
|
|
123
|
+
(field) => field.id == key
|
|
124
|
+
);
|
|
125
|
+
const fieldName = (fieldConfig == null ? void 0 : fieldConfig.fieldName) || key;
|
|
126
|
+
if (Array.isArray(value)) {
|
|
127
|
+
filters[fieldName] = value.join("|");
|
|
128
|
+
} else {
|
|
129
|
+
filters[fieldName] = value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
console.log("🚀 ~ handleSearch ~ filters:", filters);
|
|
134
|
+
emit("search", filters);
|
|
135
|
+
};
|
|
136
|
+
const handleReset = () => {
|
|
137
|
+
filterValues.value = {};
|
|
138
|
+
emit("reset");
|
|
139
|
+
};
|
|
140
|
+
vue.watch(
|
|
141
|
+
() => props.queryConfig,
|
|
142
|
+
() => {
|
|
143
|
+
filterValues.value = {};
|
|
144
|
+
isCollapsed.value = true;
|
|
145
|
+
},
|
|
146
|
+
{ deep: true }
|
|
147
|
+
);
|
|
148
|
+
__expose({
|
|
149
|
+
getFilterValues: () => filterValues.value,
|
|
150
|
+
setFilterValues: (values) => {
|
|
151
|
+
filterValues.value = { ...values };
|
|
152
|
+
},
|
|
153
|
+
reset: handleReset
|
|
154
|
+
});
|
|
155
|
+
return (_ctx, _cache) => {
|
|
156
|
+
const _component_el_date_picker = index$1.ElDatePicker;
|
|
157
|
+
const _component_el_form_item = index.ElFormItem;
|
|
158
|
+
const _component_el_button = index$2.ElButton;
|
|
159
|
+
const _component_el_form = index.ElForm;
|
|
160
|
+
const _component_el_icon = index$5.ElIcon;
|
|
161
|
+
const _component_el_divider = index$4.ElDivider;
|
|
162
|
+
return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
|
|
163
|
+
config.value.enabled ? (vue.openBlock(), vue.createBlock(_component_el_form, {
|
|
164
|
+
key: 0,
|
|
165
|
+
model: filterValues.value,
|
|
166
|
+
class: "fec-table-filter",
|
|
167
|
+
"label-width": "100px",
|
|
168
|
+
"label-position": "right",
|
|
169
|
+
style: vue.normalizeStyle({ "--column-count": config.value.columnCount })
|
|
170
|
+
}, {
|
|
171
|
+
default: vue.withCtx(() => [
|
|
172
|
+
vue.createElementVNode("div", {
|
|
173
|
+
class: vue.normalizeClass(["filter-fields", { "is-collapsed": isCollapsed.value }])
|
|
174
|
+
}, [
|
|
175
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(completeFilterFields.value, (field, index2) => {
|
|
176
|
+
return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", {
|
|
177
|
+
key: field.id,
|
|
178
|
+
class: "filter-field"
|
|
179
|
+
}, [
|
|
180
|
+
vue.createVNode(_component_el_form_item, {
|
|
181
|
+
label: field.label || "筛选条件"
|
|
182
|
+
}, {
|
|
183
|
+
default: vue.withCtx(() => [
|
|
184
|
+
field.fieldType !== "date" ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(getFilterComponent(field.fieldType)), vue.mergeProps({
|
|
185
|
+
key: 0,
|
|
186
|
+
modelValue: filterValues.value[field.fieldId],
|
|
187
|
+
"onUpdate:modelValue": ($event) => filterValues.value[field.fieldId] = $event,
|
|
188
|
+
config: { ...field, eventHandlers: {} },
|
|
189
|
+
ref_for: true
|
|
190
|
+
}, getComponentConfig(field), {
|
|
191
|
+
placeholder: getPlaceholder(field)
|
|
192
|
+
}), null, 16, ["modelValue", "onUpdate:modelValue", "config", "placeholder"])) : (vue.openBlock(), vue.createBlock(_component_el_date_picker, {
|
|
193
|
+
key: 1,
|
|
194
|
+
modelValue: filterValues.value[field.fieldId],
|
|
195
|
+
"onUpdate:modelValue": ($event) => filterValues.value[field.fieldId] = $event,
|
|
196
|
+
type: "daterange",
|
|
197
|
+
"start-placeholder": getPlaceholder(field, "start"),
|
|
198
|
+
"end-placeholder": getPlaceholder(field, "end"),
|
|
199
|
+
format: "YYYY-MM-DD",
|
|
200
|
+
"value-format": "YYYY-MM-DD",
|
|
201
|
+
clearable: "",
|
|
202
|
+
style: { "width": "100%" }
|
|
203
|
+
}, null, 8, ["modelValue", "onUpdate:modelValue", "start-placeholder", "end-placeholder"]))
|
|
204
|
+
]),
|
|
205
|
+
_: 2
|
|
206
|
+
}, 1032, ["label"])
|
|
207
|
+
])), [
|
|
208
|
+
[
|
|
209
|
+
vue.vShow,
|
|
210
|
+
!isCollapsed.value || index2 < config.value.columnCount * config.value.collapseRows
|
|
211
|
+
]
|
|
212
|
+
]);
|
|
213
|
+
}), 128))
|
|
214
|
+
], 2),
|
|
215
|
+
vue.createElementVNode("div", {
|
|
216
|
+
class: vue.normalizeClass(["filter-actions", { inline: isSingleLine.value }])
|
|
217
|
+
}, [
|
|
218
|
+
vue.createVNode(_component_el_button, {
|
|
219
|
+
type: "primary",
|
|
220
|
+
onClick: handleSearch,
|
|
221
|
+
icon: vue.unref(index$3.Search)
|
|
222
|
+
}, {
|
|
223
|
+
default: vue.withCtx(() => _cache[0] || (_cache[0] = [
|
|
224
|
+
vue.createTextVNode("搜索")
|
|
225
|
+
])),
|
|
226
|
+
_: 1
|
|
227
|
+
}, 8, ["icon"]),
|
|
228
|
+
vue.createVNode(_component_el_button, {
|
|
229
|
+
onClick: handleReset,
|
|
230
|
+
icon: vue.unref(index$3.Refresh)
|
|
231
|
+
}, {
|
|
232
|
+
default: vue.withCtx(() => _cache[1] || (_cache[1] = [
|
|
233
|
+
vue.createTextVNode("重置")
|
|
234
|
+
])),
|
|
235
|
+
_: 1
|
|
236
|
+
}, 8, ["icon"])
|
|
237
|
+
], 2)
|
|
238
|
+
]),
|
|
239
|
+
_: 1
|
|
240
|
+
}, 8, ["model", "style"])) : vue.createCommentVNode("", true),
|
|
241
|
+
shouldShowToggle.value ? (vue.openBlock(), vue.createBlock(_component_el_divider, {
|
|
242
|
+
key: 1,
|
|
243
|
+
"border-style": "dashed",
|
|
244
|
+
class: "filter-divider"
|
|
245
|
+
}, {
|
|
246
|
+
default: vue.withCtx(() => [
|
|
247
|
+
vue.createElementVNode("div", {
|
|
248
|
+
onClick: toggleCollapse,
|
|
249
|
+
class: "collapse-toggle"
|
|
250
|
+
}, [
|
|
251
|
+
vue.createElementVNode("span", null, vue.toDisplayString(isCollapsed.value ? "更多筛选项" : "收起"), 1),
|
|
252
|
+
vue.createVNode(_component_el_icon, { style: { "transform": "rotate(90deg)" } }, {
|
|
253
|
+
default: vue.withCtx(() => [
|
|
254
|
+
isCollapsed.value ? (vue.openBlock(), vue.createBlock(vue.unref(index$3.DArrowRight), { key: 0 })) : (vue.openBlock(), vue.createBlock(vue.unref(index$3.DArrowLeft), { key: 1 }))
|
|
255
|
+
]),
|
|
256
|
+
_: 1
|
|
257
|
+
})
|
|
258
|
+
])
|
|
259
|
+
]),
|
|
260
|
+
_: 1
|
|
261
|
+
})) : vue.createCommentVNode("", true)
|
|
262
|
+
], 64);
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const TableFilter = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-e94ef8a9"]]);
|
|
267
|
+
exports.default = TableFilter;
|