@amirjalili1374/ui-kit 1.4.13 → 1.4.14

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/ui-kit.es.js CHANGED
@@ -17143,6 +17143,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
17143
17143
  ref(null);
17144
17144
  const filterDialog = ref(false);
17145
17145
  const filterModel = ref({});
17146
+ const filterOperatorModel = ref({});
17146
17147
  ref(null);
17147
17148
  const isLoadingMore = ref(false);
17148
17149
  const hasMore = ref(true);
@@ -17474,7 +17475,58 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
17474
17475
  });
17475
17476
  return model;
17476
17477
  });
17477
- const hasFilterComponent = computed(() => {
17478
+ const FILTER_OPERATOR_LABELS = {
17479
+ equals: "برابر با",
17480
+ notEquals: "مخالف با",
17481
+ contains: "شامل",
17482
+ doesNotContain: "شامل نباشد",
17483
+ in: "یکی از",
17484
+ specified: "خالی / غیر خالی",
17485
+ greaterThan: "بزرگتر از",
17486
+ lessThan: "کوچکتر از",
17487
+ greaterThanOrEqual: "بزرگتر یا مساوی",
17488
+ lessThanOrEqual: "کوچکتر یا مساوی"
17489
+ };
17490
+ const getHeaderFilterOperators = (header) => {
17491
+ const configured = header.filterOperators;
17492
+ const effective = configured && configured.length > 0 ? configured : ["equals", "contains", "in"];
17493
+ return effective.map((op) => ({
17494
+ value: op,
17495
+ label: FILTER_OPERATOR_LABELS[op] || op
17496
+ }));
17497
+ };
17498
+ const getDefaultFilterOperator = (header) => {
17499
+ const configured = header.defaultFilterOperator;
17500
+ return configured || "equals";
17501
+ };
17502
+ const hasFilterOperators = (header) => {
17503
+ const operators = header.filterOperators;
17504
+ return Array.isArray(operators) && operators.length > 0;
17505
+ };
17506
+ const buildFilterParams = () => {
17507
+ if (props.filterComponent) {
17508
+ return cleanFilterModel.value;
17509
+ }
17510
+ const base = {};
17511
+ Object.entries(cleanFilterModel.value).forEach(([key2, value2]) => {
17512
+ const header = props.headers.find((h2) => h2.key === key2);
17513
+ if (header && hasFilterOperators(header)) {
17514
+ const op = filterOperatorModel.value[key2] || getDefaultFilterOperator(header);
17515
+ const paramKey = `${key2}.${op}`;
17516
+ if (op === "in" && Array.isArray(value2)) {
17517
+ base[paramKey] = value2.join(",");
17518
+ } else if (op === "specified") {
17519
+ base[paramKey] = Boolean(value2);
17520
+ } else {
17521
+ base[paramKey] = value2;
17522
+ }
17523
+ } else {
17524
+ base[key2] = value2;
17525
+ }
17526
+ });
17527
+ return base;
17528
+ };
17529
+ computed(() => {
17478
17530
  return !!props.filterComponent;
17479
17531
  });
17480
17532
  const fetchData = async (queryParams) => {
@@ -17482,7 +17534,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
17482
17534
  loading.value = true;
17483
17535
  error.value = null;
17484
17536
  let params = {
17485
- ...cleanFilterModel.value,
17537
+ ...buildFilterParams(),
17486
17538
  ...props.queryParams
17487
17539
  };
17488
17540
  if (queryParams) {
@@ -18016,14 +18068,40 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18016
18068
  snackbar.value = true;
18017
18069
  }
18018
18070
  };
18071
+ const applyFilter = () => {
18072
+ currentPage.value = 1;
18073
+ debouncedFetchData();
18074
+ filterDialog.value = false;
18075
+ };
18076
+ const resetFilter = () => {
18077
+ filterModel.value = {};
18078
+ filterOperatorModel.value = {};
18079
+ currentPage.value = 1;
18080
+ debouncedFetchData();
18081
+ filterDialog.value = false;
18082
+ };
18019
18083
  const handleFilterApply = (filterData) => {
18020
18084
  filterModel.value = filterData;
18021
18085
  currentPage.value = 1;
18022
18086
  debouncedFetchData();
18023
18087
  filterDialog.value = false;
18024
18088
  };
18089
+ watch(
18090
+ () => filterDialog.value,
18091
+ (isOpen) => {
18092
+ if (!isOpen) return;
18093
+ formHeaders.value.forEach((header) => {
18094
+ if (hasFilterOperators(header)) {
18095
+ const key2 = resolveHeaderKey(header);
18096
+ if (!filterOperatorModel.value[key2]) {
18097
+ filterOperatorModel.value[key2] = getDefaultFilterOperator(header);
18098
+ }
18099
+ }
18100
+ });
18101
+ }
18102
+ );
18025
18103
  return (_ctx, _cache) => {
18026
- var _a;
18104
+ var _a, _b;
18027
18105
  return openBlock(), createElementBlock(Fragment, null, [
18028
18106
  props.title ? (openBlock(), createElementBlock("div", _hoisted_1$9, [
18029
18107
  createElementVNode("h3", _hoisted_2$5, toDisplayString(props.title), 1)
@@ -18040,7 +18118,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18040
18118
  ])]),
18041
18119
  _: 1
18042
18120
  })) : createCommentVNode("", true),
18043
- hasFilterComponent.value ? (openBlock(), createBlock(VBtn, {
18121
+ ((_b = props.actions) == null ? void 0 : _b.includes("filter")) ? (openBlock(), createBlock(VBtn, {
18044
18122
  key: 1,
18045
18123
  class: "me-2",
18046
18124
  onClick: _cache[1] || (_cache[1] = ($event) => filterDialog.value = true)
@@ -18103,7 +18181,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18103
18181
  _: 1
18104
18182
  })) : createCommentVNode("", true),
18105
18183
  props.bulkMode ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(validSelectedItems.value, (item) => {
18106
- var _a2, _b, _c;
18184
+ var _a2, _b2, _c;
18107
18185
  return openBlock(), createElementBlock(Fragment, {
18108
18186
  key: getUniqueValue(item)
18109
18187
  }, [
@@ -18120,7 +18198,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18120
18198
  ])]),
18121
18199
  _: 1
18122
18200
  }, 8, ["onClick"])) : createCommentVNode("", true),
18123
- ((_b = props.actions) == null ? void 0 : _b.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18201
+ ((_b2 = props.actions) == null ? void 0 : _b2.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18124
18202
  key: 1,
18125
18203
  color: "red",
18126
18204
  size: "small",
@@ -18361,7 +18439,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18361
18439
  onClick: ($event) => props.bulkMode && props.selectable && selectSingleItem(item)
18362
18440
  }, [
18363
18441
  (openBlock(true), createElementBlock(Fragment, null, renderList(columns, (column) => {
18364
- var _a2, _b, _c;
18442
+ var _a2, _b2, _c;
18365
18443
  return openBlock(), createElementBlock("td", {
18366
18444
  key: column.key || "unknown",
18367
18445
  style: normalizeStyle({
@@ -18400,7 +18478,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18400
18478
  ])]),
18401
18479
  _: 1
18402
18480
  }, 8, ["onClick"])) : createCommentVNode("", true),
18403
- ((_b = props.actions) == null ? void 0 : _b.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18481
+ ((_b2 = props.actions) == null ? void 0 : _b2.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18404
18482
  key: 1,
18405
18483
  color: "red",
18406
18484
  size: "small",
@@ -18591,7 +18669,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18591
18669
  onClick: ($event) => props.bulkMode && props.selectable && selectSingleItem(item)
18592
18670
  }, [
18593
18671
  (openBlock(true), createElementBlock(Fragment, null, renderList(columns, (column) => {
18594
- var _a2, _b, _c;
18672
+ var _a2, _b2, _c;
18595
18673
  return openBlock(), createElementBlock("td", {
18596
18674
  key: column.key || "unknown",
18597
18675
  style: normalizeStyle({
@@ -18630,7 +18708,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
18630
18708
  ])]),
18631
18709
  _: 1
18632
18710
  }, 8, ["onClick"])) : createCommentVNode("", true),
18633
- ((_b = props.actions) == null ? void 0 : _b.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18711
+ ((_b2 = props.actions) == null ? void 0 : _b2.includes("delete")) ? (openBlock(), createBlock(VBtn, {
18634
18712
  key: 1,
18635
18713
  color: "red",
18636
18714
  size: "small",
@@ -19074,9 +19152,9 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19074
19152
  default: withCtx(() => [
19075
19153
  createVNode(VCardTitle, null, {
19076
19154
  default: withCtx(() => {
19077
- var _a2, _b;
19155
+ var _a2, _b2;
19078
19156
  return [
19079
- createTextVNode(toDisplayString(((_b = (_a2 = props.customActions) == null ? void 0 : _a2.find((a) => a.component === customActionComponent.value)) == null ? void 0 : _b.title) || ""), 1)
19157
+ createTextVNode(toDisplayString(((_b2 = (_a2 = props.customActions) == null ? void 0 : _a2.find((a) => a.component === customActionComponent.value)) == null ? void 0 : _b2.title) || ""), 1)
19080
19158
  ];
19081
19159
  }),
19082
19160
  _: 1
@@ -19121,7 +19199,125 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19121
19199
  _cache[15] || (_cache[15] = ($event) => filterModel.value = $event)
19122
19200
  ],
19123
19201
  onApply: handleFilterApply
19124
- }, null, 40, ["modelValue"])) : createCommentVNode("", true)
19202
+ }, null, 40, ["modelValue"])) : (openBlock(), createBlock(VContainer, { key: 1 }, {
19203
+ default: withCtx(() => [
19204
+ createVNode(VRow, null, {
19205
+ default: withCtx(() => [
19206
+ (openBlock(true), createElementBlock(Fragment, null, renderList(formHeaders.value, (header) => {
19207
+ return openBlock(), createBlock(VCol, {
19208
+ key: resolveHeaderKey(header),
19209
+ cols: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4,
19210
+ md: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4
19211
+ }, {
19212
+ default: withCtx(() => [
19213
+ !header.hidden ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
19214
+ hasFilterOperators(header) ? (openBlock(), createBlock(VSelect, {
19215
+ key: 0,
19216
+ modelValue: filterOperatorModel.value[resolveHeaderKey(header)],
19217
+ "onUpdate:modelValue": ($event) => filterOperatorModel.value[resolveHeaderKey(header)] = $event,
19218
+ items: getHeaderFilterOperators(header),
19219
+ "item-title": "label",
19220
+ "item-value": "value",
19221
+ density: "compact",
19222
+ variant: "underlined",
19223
+ "hide-details": "",
19224
+ class: "mb-1"
19225
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])) : createCommentVNode("", true),
19226
+ isDateHeader(header) ? (openBlock(), createBlock(ShamsiDatePicker, {
19227
+ key: 1,
19228
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19229
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19230
+ label: resolveHeaderTitle(header),
19231
+ disabled: isHeaderDisabled(header)
19232
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : hasAutocomplete(header) ? (openBlock(), createBlock(VAutocomplete, {
19233
+ key: 2,
19234
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19235
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19236
+ label: resolveHeaderTitle(header),
19237
+ items: resolveAutocompleteItems(header, filterModel.value.value),
19238
+ "item-title": resolveAutocompleteItemTitle(header),
19239
+ "item-value": resolveAutocompleteItemValue(header),
19240
+ "return-object": resolveAutocompleteReturnObject(header),
19241
+ multiple: resolveAutocompleteMultiple(header),
19242
+ chips: resolveAutocompleteMultiple(header),
19243
+ "closable-chips": resolveAutocompleteMultiple(header),
19244
+ disabled: isHeaderDisabled(header),
19245
+ clearable: "",
19246
+ variant: "outlined"
19247
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "items", "item-title", "item-value", "return-object", "multiple", "chips", "closable-chips", "disabled"])) : isMoneyHeader(header) ? (openBlock(), createBlock(_sfc_main$i, {
19248
+ key: 3,
19249
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19250
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19251
+ label: resolveHeaderTitle(header),
19252
+ disabled: isHeaderDisabled(header)
19253
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : isTextareaHeader(header) ? (openBlock(), createBlock(VTextarea, {
19254
+ key: 4,
19255
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19256
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19257
+ label: resolveHeaderTitle(header),
19258
+ variant: "outlined",
19259
+ disabled: isHeaderDisabled(header),
19260
+ dir: header.dir,
19261
+ "auto-grow": "",
19262
+ rows: "3"
19263
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "dir"])) : isToggleHeader(header) ? (openBlock(), createBlock(ToggleSwitch, {
19264
+ key: 5,
19265
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19266
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19267
+ label: resolveHeaderTitle(header),
19268
+ type: "boolean",
19269
+ activeColor: "#3bd32a",
19270
+ inactiveColor: "#d32a2a",
19271
+ options: [
19272
+ { value: "true", label: "فعال", icon: unref(IconCheck) },
19273
+ { value: "false", label: "غیر فعال", icon: unref(IconSquareX) }
19274
+ ]
19275
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "options"])) : (openBlock(), createBlock(VTextField, {
19276
+ key: 6,
19277
+ modelValue: filterModel.value[resolveHeaderKey(header)],
19278
+ "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey(header)] = $event,
19279
+ label: resolveHeaderTitle(header),
19280
+ variant: "outlined",
19281
+ disabled: isHeaderDisabled(header),
19282
+ type: getFieldInputType(header),
19283
+ dir: header.dir
19284
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "type", "dir"]))
19285
+ ], 64)) : createCommentVNode("", true)
19286
+ ]),
19287
+ _: 2
19288
+ }, 1032, ["cols", "md"]);
19289
+ }), 128))
19290
+ ]),
19291
+ _: 1
19292
+ })
19293
+ ]),
19294
+ _: 1
19295
+ }))
19296
+ ]),
19297
+ _: 1
19298
+ }),
19299
+ createVNode(VCardActions, null, {
19300
+ default: withCtx(() => [
19301
+ createVNode(VSpacer),
19302
+ createVNode(VBtn, {
19303
+ color: "grey",
19304
+ variant: "tonal",
19305
+ onClick: resetFilter
19306
+ }, {
19307
+ default: withCtx(() => [..._cache[55] || (_cache[55] = [
19308
+ createTextVNode("حذف فیلترها", -1)
19309
+ ])]),
19310
+ _: 1
19311
+ }),
19312
+ createVNode(VBtn, {
19313
+ color: "primary",
19314
+ onClick: applyFilter
19315
+ }, {
19316
+ default: withCtx(() => [..._cache[56] || (_cache[56] = [
19317
+ createTextVNode("اعمال فیلتر", -1)
19318
+ ])]),
19319
+ _: 1
19320
+ })
19125
19321
  ]),
19126
19322
  _: 1
19127
19323
  })
@@ -19149,7 +19345,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19149
19345
  }, {
19150
19346
  default: withCtx(() => [
19151
19347
  createVNode(VIcon, null, {
19152
- default: withCtx(() => [..._cache[55] || (_cache[55] = [
19348
+ default: withCtx(() => [..._cache[57] || (_cache[57] = [
19153
19349
  createTextVNode("mdi-close", -1)
19154
19350
  ])]),
19155
19351
  _: 1
@@ -19182,12 +19378,12 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19182
19378
  }, {
19183
19379
  default: withCtx(() => [
19184
19380
  createVNode(VIcon, { start: "" }, {
19185
- default: withCtx(() => [..._cache[56] || (_cache[56] = [
19381
+ default: withCtx(() => [..._cache[58] || (_cache[58] = [
19186
19382
  createTextVNode("mdi-content-copy", -1)
19187
19383
  ])]),
19188
19384
  _: 1
19189
19385
  }),
19190
- _cache[57] || (_cache[57] = createTextVNode(" کپی متن ", -1))
19386
+ _cache[59] || (_cache[59] = createTextVNode(" کپی متن ", -1))
19191
19387
  ]),
19192
19388
  _: 1
19193
19389
  }),
@@ -19197,12 +19393,12 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19197
19393
  }, {
19198
19394
  default: withCtx(() => [
19199
19395
  createVNode(VIcon, { start: "" }, {
19200
- default: withCtx(() => [..._cache[58] || (_cache[58] = [
19396
+ default: withCtx(() => [..._cache[60] || (_cache[60] = [
19201
19397
  createTextVNode("mdi-content-copy", -1)
19202
19398
  ])]),
19203
19399
  _: 1
19204
19400
  }),
19205
- _cache[59] || (_cache[59] = createTextVNode(" کپی رکورد کامل ", -1))
19401
+ _cache[61] || (_cache[61] = createTextVNode(" کپی رکورد کامل ", -1))
19206
19402
  ]),
19207
19403
  _: 1
19208
19404
  }),
@@ -19210,7 +19406,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19210
19406
  color: "grey",
19211
19407
  onClick: _cache[19] || (_cache[19] = ($event) => textPreviewDialog.value = false)
19212
19408
  }, {
19213
- default: withCtx(() => [..._cache[60] || (_cache[60] = [
19409
+ default: withCtx(() => [..._cache[62] || (_cache[62] = [
19214
19410
  createTextVNode("بستن", -1)
19215
19411
  ])]),
19216
19412
  _: 1
@@ -19237,7 +19433,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
19237
19433
  variant: "text",
19238
19434
  onClick: _cache[21] || (_cache[21] = ($event) => snackbar.value = false)
19239
19435
  }, {
19240
- default: withCtx(() => [..._cache[61] || (_cache[61] = [
19436
+ default: withCtx(() => [..._cache[63] || (_cache[63] = [
19241
19437
  createTextVNode(" بستن ", -1)
19242
19438
  ])]),
19243
19439
  _: 1