@amirjalili1374/ui-kit 1.8.0 → 1.9.0-beta.0

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.
Files changed (32) hide show
  1. package/dist/components/shared/data-table-v2/CustomDataTableV2.vue.d.ts.map +1 -1
  2. package/dist/components/shared/data-table-v2/exportToExcel.d.ts +10 -0
  3. package/dist/components/shared/data-table-v2/exportToExcel.d.ts.map +1 -0
  4. package/dist/types/models/person.d.ts +13 -0
  5. package/dist/types/models/person.d.ts.map +1 -0
  6. package/dist/types/models/userInfo.d.ts +29 -0
  7. package/dist/types/models/userInfo.d.ts.map +1 -0
  8. package/dist/ui-kit.cjs.js +1 -1
  9. package/dist/ui-kit.cjs.js.map +1 -1
  10. package/dist/ui-kit.es.js +241 -317
  11. package/dist/ui-kit.es.js.map +1 -1
  12. package/dist/utils/greetingUtils.d.ts +4 -28
  13. package/dist/utils/greetingUtils.d.ts.map +1 -1
  14. package/package.json +1 -1
  15. package/dist/components/shared/data-table-v2/components/DataTableCellContent.vue.d.ts +0 -11
  16. package/dist/components/shared/data-table-v2/components/DataTableCellContent.vue.d.ts.map +0 -1
  17. package/dist/components/shared/data-table-v2/composables/useDataTableCellDisplay.d.ts +0 -28
  18. package/dist/components/shared/data-table-v2/composables/useDataTableCellDisplay.d.ts.map +0 -1
  19. package/dist/components/shared/data-table-v2/composables/useDataTableDownload.d.ts +0 -6
  20. package/dist/components/shared/data-table-v2/composables/useDataTableDownload.d.ts.map +0 -1
  21. package/dist/components/shared/data-table-v2/composables/useDataTableExport.d.ts +0 -9
  22. package/dist/components/shared/data-table-v2/composables/useDataTableExport.d.ts.map +0 -1
  23. package/dist/components/shared/data-table-v2/composables/useDataTableFetch.d.ts +0 -31
  24. package/dist/components/shared/data-table-v2/composables/useDataTableFetch.d.ts.map +0 -1
  25. package/dist/components/shared/data-table-v2/composables/useDataTableFilters.d.ts +0 -22
  26. package/dist/components/shared/data-table-v2/composables/useDataTableFilters.d.ts.map +0 -1
  27. package/dist/components/shared/data-table-v2/composables/useDataTableHeaders.d.ts +0 -138
  28. package/dist/components/shared/data-table-v2/composables/useDataTableHeaders.d.ts.map +0 -1
  29. package/dist/components/shared/data-table-v2/composables/useDataTableSelectionBridge.d.ts +0 -41
  30. package/dist/components/shared/data-table-v2/composables/useDataTableSelectionBridge.d.ts.map +0 -1
  31. package/dist/components/shared/data-table-v2/context.d.ts +0 -4
  32. package/dist/components/shared/data-table-v2/context.d.ts.map +0 -1
package/dist/ui-kit.es.js CHANGED
@@ -15416,6 +15416,122 @@ function computeActionColumnWidth(props) {
15416
15416
  totalWidth += 32;
15417
15417
  return Math.max(totalWidth, 200);
15418
15418
  }
15419
+ async function exportTableToExcel(allHeaders, sourceItems, exportFileName) {
15420
+ if (!sourceItems.length) return;
15421
+ const XLSXmod = await import("xlsx");
15422
+ const XLSX = XLSXmod.default ?? XLSXmod;
15423
+ const headers = allHeaders.filter((h2) => h2.key && h2.title);
15424
+ const now = /* @__PURE__ */ new Date();
15425
+ const exportDate = now.toLocaleDateString("fa-IR") + " " + now.toLocaleTimeString("fa-IR", { hour: "2-digit", minute: "2-digit" });
15426
+ const title = exportFileName || "گزارش";
15427
+ const moneyTotals = {};
15428
+ const rows = sourceItems.map((item) => {
15429
+ const row = {};
15430
+ headers.forEach((h2) => {
15431
+ var _a;
15432
+ let value = h2.nestedKey ? (_a = item[h2.key]) == null ? void 0 : _a[h2.nestedKey] : item[h2.key];
15433
+ if (h2.type === "money") {
15434
+ const num = Number(value);
15435
+ value = !isNaN(num) ? num : 0;
15436
+ moneyTotals[h2.title] = (moneyTotals[h2.title] || 0) + value;
15437
+ }
15438
+ if (typeof value === "boolean") value = value ? "بله" : "خیر";
15439
+ row[h2.title] = value ?? "";
15440
+ });
15441
+ return row;
15442
+ });
15443
+ const totalRow = {};
15444
+ headers.forEach((h2, i) => {
15445
+ if (h2.type === "money") totalRow[h2.title] = moneyTotals[h2.title] || 0;
15446
+ else if (i === 0) totalRow[h2.title] = "جمع کل";
15447
+ else totalRow[h2.title] = "";
15448
+ });
15449
+ rows.push(totalRow);
15450
+ const ws = XLSX.utils.json_to_sheet(rows, { origin: "A4" });
15451
+ const range = XLSX.utils.decode_range(ws["!ref"]);
15452
+ ws["!freeze"] = { xSplit: 0, ySplit: 3 };
15453
+ ws["!autofilter"] = {
15454
+ ref: XLSX.utils.encode_range({
15455
+ s: { r: 3, c: 0 },
15456
+ e: range.e
15457
+ })
15458
+ };
15459
+ ws["!cols"] = headers.map((h2) => {
15460
+ let max = h2.title.length;
15461
+ rows.forEach((r) => {
15462
+ const len = String(r[h2.title] ?? "").length;
15463
+ if (len > max) max = len;
15464
+ });
15465
+ return { wch: max + 4 };
15466
+ });
15467
+ XLSX.utils.sheet_add_aoa(ws, [[title], [`تاریخ چاپ: ${exportDate}`], []], { origin: "A1" });
15468
+ ws["!merges"] = [
15469
+ {
15470
+ s: { r: 0, c: 0 },
15471
+ e: { r: 0, c: headers.length - 1 }
15472
+ }
15473
+ ];
15474
+ ws["A1"].s = {
15475
+ font: { bold: true, sz: 16, name: "B Nazanin" },
15476
+ alignment: { horizontal: "center", vertical: "center" }
15477
+ };
15478
+ ws["A2"].s = {
15479
+ font: { name: "B Nazanin", sz: 12 },
15480
+ alignment: { horizontal: "left" }
15481
+ };
15482
+ const headerStyle = {
15483
+ font: { bold: true, name: "B Nazanin" },
15484
+ alignment: { horizontal: "center", vertical: "center" },
15485
+ fill: { fgColor: { rgb: "D9D9D9" } },
15486
+ border: {
15487
+ top: { style: "thin" },
15488
+ bottom: { style: "thin" },
15489
+ left: { style: "thin" },
15490
+ right: { style: "thin" }
15491
+ }
15492
+ };
15493
+ const zebraFill = { fgColor: { rgb: "F7F7F7" } };
15494
+ headers.forEach((h2, c) => {
15495
+ const headerCell = XLSX.utils.encode_cell({ r: 3, c });
15496
+ if (ws[headerCell]) ws[headerCell].s = headerStyle;
15497
+ for (let r = 4; r <= rows.length + 3; r++) {
15498
+ const addr = XLSX.utils.encode_cell({ r, c });
15499
+ const cell = ws[addr];
15500
+ if (!cell) continue;
15501
+ const isTotalRow = r === rows.length + 3;
15502
+ const zebra = r % 2 === 0;
15503
+ cell.s = {
15504
+ font: { name: "B Nazanin" },
15505
+ alignment: {
15506
+ horizontal: h2.type === "money" ? "center" : "right",
15507
+ vertical: "center"
15508
+ },
15509
+ border: {
15510
+ top: { style: "thin" },
15511
+ bottom: { style: "thin" },
15512
+ left: { style: "thin" },
15513
+ right: { style: "thin" }
15514
+ },
15515
+ fill: zebra && !isTotalRow ? zebraFill : void 0
15516
+ };
15517
+ if (h2.type === "money" && typeof cell.v === "number") {
15518
+ cell.z = "#,##0;[Red]-#,##0";
15519
+ }
15520
+ if (isTotalRow) {
15521
+ cell.s.font = { bold: true, name: "B Nazanin" };
15522
+ cell.s.fill = { fgColor: { rgb: "EFEFEF" } };
15523
+ }
15524
+ }
15525
+ });
15526
+ const wb = XLSX.utils.book_new();
15527
+ wb.Workbook = {
15528
+ Views: [{ RTL: true }]
15529
+ };
15530
+ XLSX.utils.book_append_sheet(wb, ws, "Report");
15531
+ const dateForFile = now.toLocaleDateString("fa-IR").replaceAll("/", "-");
15532
+ const fileName = `${title}_${dateForFile}.xlsx`;
15533
+ XLSX.writeFile(wb, fileName);
15534
+ }
15419
15535
  const VAlertTitle = createSimpleFunctional("v-alert-title");
15420
15536
  const makeIconSizeProps = propsFactory({
15421
15537
  iconSize: [Number, String],
@@ -18770,8 +18886,9 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
18770
18886
  if (!hasAnyActions.value) return base;
18771
18887
  return [...base, { title: "عملیات", key: "actions", sortable: false, width: computeActionColumnWidth(props) }];
18772
18888
  };
18773
- const groupedHeaders = computed(() => buildTableHeaders());
18774
- const normalHeaders = computed(() => buildTableHeaders());
18889
+ const tableHeaders = computed(() => buildTableHeaders());
18890
+ const groupedHeaders = tableHeaders;
18891
+ const normalHeaders = tableHeaders;
18775
18892
  const hasAutocomplete2 = (header) => {
18776
18893
  return Boolean(header.autocompleteItems);
18777
18894
  };
@@ -18815,57 +18932,9 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
18815
18932
  return void 0;
18816
18933
  }
18817
18934
  };
18818
- const resolveAutocompleteItemTitle2 = (header) => {
18819
- return header.autocompleteItemTitle ?? "title";
18820
- };
18821
- const resolveAutocompleteItemValue2 = (header) => {
18822
- return header.autocompleteItemValue ?? "value";
18823
- };
18824
- const resolveAutocompleteReturnObject2 = (header) => {
18825
- const value = header.autocompleteReturnObject;
18826
- return value !== false;
18827
- };
18828
- const resolveAutocompleteMultiple2 = (header) => {
18829
- return header.autocompleteMultiple === true;
18830
- };
18831
18935
  const formHeaders = computed(() => {
18832
18936
  return props.headers.filter((header) => !header.excludeFromForm);
18833
18937
  });
18834
- const getHeaderType2 = (header) => {
18835
- if (header.type) {
18836
- return header.type.toLowerCase();
18837
- }
18838
- if (header.isDate) return "date";
18839
- if (header.textarea) return "textarea";
18840
- if (header.toggleSwitch) return "toggle";
18841
- return void 0;
18842
- };
18843
- const isDateHeader2 = (header) => {
18844
- const type = getHeaderType2(header);
18845
- return type === "date";
18846
- };
18847
- const isMoneyHeader2 = (header) => {
18848
- const type = getHeaderType2(header);
18849
- return type === "money";
18850
- };
18851
- const isTextareaHeader2 = (header) => {
18852
- const type = getHeaderType2(header);
18853
- return type === "textarea";
18854
- };
18855
- const isToggleHeader2 = (header) => {
18856
- const type = getHeaderType2(header);
18857
- return type === "toggle" || type === "toggleswitch";
18858
- };
18859
- const getFieldInputType2 = (header) => {
18860
- const type = getHeaderType2(header);
18861
- if (type && !["date", "textarea", "money", "toggle", "toggleswitch", "autocomplete"].includes(type)) {
18862
- return type;
18863
- }
18864
- return void 0;
18865
- };
18866
- const resolveHeaderKey2 = (header) => header.key;
18867
- const resolveHeaderTitle2 = (header) => header.title;
18868
- const isHeaderDisabled2 = (header) => header.editable === false;
18869
18938
  const getUniqueValue = (item) => {
18870
18939
  if (typeof props.uniqueKey === "function") {
18871
18940
  return props.uniqueKey(item);
@@ -18925,120 +18994,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
18925
18994
  };
18926
18995
  const handleExportClientSide = async () => {
18927
18996
  const sourceItems = (props.items && props.items.length ? props.items : items.value) ?? [];
18928
- if (!sourceItems.length) return;
18929
- const XLSXmod = await import("xlsx");
18930
- const XLSX = XLSXmod.default ?? XLSXmod;
18931
- const headers = props.headers.filter((h2) => h2.key && h2.title);
18932
- const now = /* @__PURE__ */ new Date();
18933
- const exportDate = now.toLocaleDateString("fa-IR") + " " + now.toLocaleTimeString("fa-IR", { hour: "2-digit", minute: "2-digit" });
18934
- const title = props.exportFileName || "گزارش";
18935
- const moneyTotals = {};
18936
- const rows = sourceItems.map((item) => {
18937
- const row = {};
18938
- headers.forEach((h2) => {
18939
- var _a;
18940
- let value = h2.nestedKey ? (_a = item[h2.key]) == null ? void 0 : _a[h2.nestedKey] : item[h2.key];
18941
- if (h2.type === "money") {
18942
- const num = Number(value);
18943
- value = !isNaN(num) ? num : 0;
18944
- moneyTotals[h2.title] = (moneyTotals[h2.title] || 0) + value;
18945
- }
18946
- if (typeof value === "boolean") value = value ? "بله" : "خیر";
18947
- row[h2.title] = value ?? "";
18948
- });
18949
- return row;
18950
- });
18951
- const totalRow = {};
18952
- headers.forEach((h2, i) => {
18953
- if (h2.type === "money") totalRow[h2.title] = moneyTotals[h2.title] || 0;
18954
- else if (i === 0) totalRow[h2.title] = "جمع کل";
18955
- else totalRow[h2.title] = "";
18956
- });
18957
- rows.push(totalRow);
18958
- const ws = XLSX.utils.json_to_sheet(rows, { origin: "A4" });
18959
- const range = XLSX.utils.decode_range(ws["!ref"]);
18960
- ws["!freeze"] = { xSplit: 0, ySplit: 3 };
18961
- ws["!autofilter"] = {
18962
- ref: XLSX.utils.encode_range({
18963
- s: { r: 3, c: 0 },
18964
- e: range.e
18965
- })
18966
- };
18967
- ws["!cols"] = headers.map((h2) => {
18968
- let max = h2.title.length;
18969
- rows.forEach((r) => {
18970
- const len = String(r[h2.title] ?? "").length;
18971
- if (len > max) max = len;
18972
- });
18973
- return { wch: max + 4 };
18974
- });
18975
- XLSX.utils.sheet_add_aoa(ws, [[title], [`تاریخ چاپ: ${exportDate}`], []], { origin: "A1" });
18976
- ws["!merges"] = [
18977
- {
18978
- s: { r: 0, c: 0 },
18979
- e: { r: 0, c: headers.length - 1 }
18980
- }
18981
- ];
18982
- ws["A1"].s = {
18983
- font: { bold: true, sz: 16, name: "B Nazanin" },
18984
- alignment: { horizontal: "center", vertical: "center" }
18985
- };
18986
- ws["A2"].s = {
18987
- font: { name: "B Nazanin", sz: 12 },
18988
- alignment: { horizontal: "left" }
18989
- };
18990
- const headerStyle = {
18991
- font: { bold: true, name: "B Nazanin" },
18992
- alignment: { horizontal: "center", vertical: "center" },
18993
- fill: { fgColor: { rgb: "D9D9D9" } },
18994
- border: {
18995
- top: { style: "thin" },
18996
- bottom: { style: "thin" },
18997
- left: { style: "thin" },
18998
- right: { style: "thin" }
18999
- }
19000
- };
19001
- const zebraFill = { fgColor: { rgb: "F7F7F7" } };
19002
- headers.forEach((h2, c) => {
19003
- const headerCell = XLSX.utils.encode_cell({ r: 3, c });
19004
- if (ws[headerCell]) ws[headerCell].s = headerStyle;
19005
- for (let r = 4; r <= rows.length + 3; r++) {
19006
- const addr = XLSX.utils.encode_cell({ r, c });
19007
- const cell = ws[addr];
19008
- if (!cell) continue;
19009
- const isTotalRow = r === rows.length + 3;
19010
- const zebra = r % 2 === 0;
19011
- cell.s = {
19012
- font: { name: "B Nazanin" },
19013
- alignment: {
19014
- horizontal: h2.type === "money" ? "center" : "right",
19015
- vertical: "center"
19016
- },
19017
- border: {
19018
- top: { style: "thin" },
19019
- bottom: { style: "thin" },
19020
- left: { style: "thin" },
19021
- right: { style: "thin" }
19022
- },
19023
- fill: zebra && !isTotalRow ? zebraFill : void 0
19024
- };
19025
- if (h2.type === "money" && typeof cell.v === "number") {
19026
- cell.z = "#,##0;[Red]-#,##0";
19027
- }
19028
- if (isTotalRow) {
19029
- cell.s.font = { bold: true, name: "B Nazanin" };
19030
- cell.s.fill = { fgColor: { rgb: "EFEFEF" } };
19031
- }
19032
- }
19033
- });
19034
- const wb = XLSX.utils.book_new();
19035
- wb.Workbook = {
19036
- Views: [{ RTL: true }]
19037
- };
19038
- XLSX.utils.book_append_sheet(wb, ws, "Report");
19039
- const dateForFile = now.toLocaleDateString("fa-IR").replaceAll("/", "-");
19040
- const fileName = `${title}_${dateForFile}.xlsx`;
19041
- XLSX.writeFile(wb, fileName);
18997
+ await exportTableToExcel(props.headers, sourceItems, props.exportFileName);
19042
18998
  };
19043
18999
  const handleExport = async () => {
19044
19000
  var _a, _b, _c;
@@ -19206,7 +19162,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19206
19162
  items.value = serverData.map((item) => {
19207
19163
  const newItem = { ...item };
19208
19164
  props.headers.forEach((header) => {
19209
- if (isDateHeader2(header) && newItem[header.key]) {
19165
+ if (isDateHeader(header) && newItem[header.key]) {
19210
19166
  try {
19211
19167
  newItem[header.key] = DateConverter.toShamsi(newItem[header.key]);
19212
19168
  } catch (e) {
@@ -19323,7 +19279,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19323
19279
  const formattedItems = newItems.map((item) => {
19324
19280
  const newItem = { ...item };
19325
19281
  props.headers.forEach((header) => {
19326
- if (isDateHeader2(header) && newItem[header.key]) {
19282
+ if (isDateHeader(header) && newItem[header.key]) {
19327
19283
  try {
19328
19284
  newItem[header.key] = DateConverter.toShamsi(newItem[header.key]);
19329
19285
  } catch (error2) {
@@ -19375,7 +19331,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19375
19331
  if (!isEditing.value) {
19376
19332
  const defaultContext = { ...editedItem.value };
19377
19333
  for (const header of props.headers) {
19378
- if (isToggleHeader2(header) && editedItem.value[header.key] === void 0) {
19334
+ if (isToggleHeader(header) && editedItem.value[header.key] === void 0) {
19379
19335
  editedItem.value[header.key] = false;
19380
19336
  defaultContext[header.key] = false;
19381
19337
  continue;
@@ -19395,7 +19351,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19395
19351
  if (!hasAutocomplete2(header)) return;
19396
19352
  const enhancedHeader = header;
19397
19353
  const currentValue = formModel.value[header.key];
19398
- const valueKey = resolveAutocompleteItemValue2(header);
19354
+ const valueKey = resolveAutocompleteItemValue(header);
19399
19355
  if (enhancedHeader.autocompleteReturnObject === false) {
19400
19356
  if (Array.isArray(currentValue)) {
19401
19357
  formModel.value[header.key] = currentValue.map((item2) => item2 && typeof item2 === "object" ? item2[valueKey] ?? null : item2);
@@ -19407,7 +19363,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19407
19363
  if (isEditing.value) {
19408
19364
  try {
19409
19365
  props.headers.forEach((header) => {
19410
- if (isDateHeader2(header)) {
19366
+ if (isDateHeader(header)) {
19411
19367
  const v = formModel.value[header.key];
19412
19368
  if (typeof v === "string" && v.includes("/")) {
19413
19369
  formModel.value[header.key] = DateConverter.toGregorian(v);
@@ -19455,7 +19411,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19455
19411
  }
19456
19412
  });
19457
19413
  props.headers.forEach((header) => {
19458
- if (isDateHeader2(header) && dataToSave[header.key]) {
19414
+ if (isDateHeader(header) && dataToSave[header.key]) {
19459
19415
  try {
19460
19416
  const raw = dataToSave[header.key];
19461
19417
  if (typeof raw === "string") {
@@ -19487,7 +19443,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19487
19443
  if (hasAutocomplete2(header)) {
19488
19444
  const enhancedHeader = header;
19489
19445
  const currentValue = dataToSave[header.key];
19490
- const valueKey = resolveAutocompleteItemValue2(header);
19446
+ const valueKey = resolveAutocompleteItemValue(header);
19491
19447
  if (enhancedHeader.autocompleteMultiple && Array.isArray(currentValue)) {
19492
19448
  const autocompleteItems = resolveAutocompleteItems2(header, dataToSave);
19493
19449
  const processedArray = currentValue.map((item) => {
@@ -19525,7 +19481,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19525
19481
  dataToSave[header.key] = null;
19526
19482
  } else if (enhancedHeader.autocompleteReturnObject !== false && typeof currentValue === "object") {
19527
19483
  const autocompleteItems = resolveAutocompleteItems2(header, dataToSave);
19528
- const valueKey2 = resolveAutocompleteItemValue2(header);
19484
+ const valueKey2 = resolveAutocompleteItemValue(header);
19529
19485
  const itemValue = valueKey2 && currentValue[valueKey2];
19530
19486
  if (itemValue !== null && itemValue !== void 0) {
19531
19487
  const fullItem = autocompleteItems.find((autocompleteItem) => {
@@ -19870,7 +19826,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
19870
19826
  filterModel.value = { ...filterModel.value };
19871
19827
  formHeaders.value.forEach((header) => {
19872
19828
  if (hasFilterOperators(header)) {
19873
- const key = resolveHeaderKey2(header);
19829
+ const key = resolveHeaderKey(header);
19874
19830
  if (!filterOperatorModel.value[key]) {
19875
19831
  filterOperatorModel.value[key] = getDefaultFilterOperator(header);
19876
19832
  }
@@ -20266,7 +20222,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
20266
20222
  role: "region"
20267
20223
  }, [
20268
20224
  createVNode(VDataTable, {
20269
- headers: groupedHeaders.value,
20225
+ headers: unref(groupedHeaders),
20270
20226
  items: group.items,
20271
20227
  "items-per-page": itemsPerPage.value,
20272
20228
  "hide-default-footer": "",
@@ -20490,7 +20446,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
20490
20446
  ], 4)
20491
20447
  ])) : (openBlock(), createBlock(VDataTable, {
20492
20448
  key: 1,
20493
- headers: normalHeaders.value,
20449
+ headers: unref(normalHeaders),
20494
20450
  items: items.value,
20495
20451
  "items-per-page": itemsPerPage.value,
20496
20452
  "hide-default-footer": "",
@@ -20755,57 +20711,57 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
20755
20711
  default: withCtx(() => [
20756
20712
  (openBlock(true), createElementBlock(Fragment, null, renderList(formHeaders.value, (header) => {
20757
20713
  return openBlock(), createBlock(VCol, {
20758
- key: resolveHeaderKey2(header),
20714
+ key: unref(resolveHeaderKey)(header),
20759
20715
  cols: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4,
20760
20716
  md: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4
20761
20717
  }, {
20762
20718
  default: withCtx(() => [
20763
20719
  !header.hidden ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
20764
- isDateHeader2(header) ? (openBlock(), createBlock(ShamsiDatePicker, {
20720
+ unref(isDateHeader)(header) ? (openBlock(), createBlock(ShamsiDatePicker, {
20765
20721
  key: 0,
20766
- modelValue: formModel.value[resolveHeaderKey2(header)],
20767
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20768
- label: resolveHeaderTitle2(header),
20769
- disabled: isHeaderDisabled2(header),
20722
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20723
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20724
+ label: unref(resolveHeaderTitle)(header),
20725
+ disabled: unref(isHeaderDisabled)(header),
20770
20726
  mode: header.dateMode || "single"
20771
20727
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "mode"])) : hasAutocomplete2(header) ? (openBlock(), createBlock(VAutocomplete, {
20772
20728
  key: 1,
20773
- modelValue: formModel.value[resolveHeaderKey2(header)],
20774
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20775
- label: resolveHeaderTitle2(header),
20729
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20730
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20731
+ label: unref(resolveHeaderTitle)(header),
20776
20732
  items: resolveAutocompleteItems2(header, formModel.value.value),
20777
- "item-title": resolveAutocompleteItemTitle2(header),
20778
- "item-value": resolveAutocompleteItemValue2(header),
20779
- "return-object": resolveAutocompleteReturnObject2(header),
20780
- multiple: resolveAutocompleteMultiple2(header),
20781
- chips: resolveAutocompleteMultiple2(header),
20782
- "closable-chips": resolveAutocompleteMultiple2(header),
20783
- disabled: isHeaderDisabled2(header),
20733
+ "item-title": unref(resolveAutocompleteItemTitle)(header),
20734
+ "item-value": unref(resolveAutocompleteItemValue)(header),
20735
+ "return-object": unref(resolveAutocompleteReturnObject)(header),
20736
+ multiple: unref(resolveAutocompleteMultiple)(header),
20737
+ chips: unref(resolveAutocompleteMultiple)(header),
20738
+ "closable-chips": unref(resolveAutocompleteMultiple)(header),
20739
+ disabled: unref(isHeaderDisabled)(header),
20784
20740
  clearable: "",
20785
20741
  variant: "outlined",
20786
20742
  attach: "",
20787
20743
  "menu-props": { zIndex: 2e4 }
20788
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "items", "item-title", "item-value", "return-object", "multiple", "chips", "closable-chips", "disabled"])) : isMoneyHeader2(header) ? (openBlock(), createBlock(_sfc_main$i, {
20744
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "items", "item-title", "item-value", "return-object", "multiple", "chips", "closable-chips", "disabled"])) : unref(isMoneyHeader)(header) ? (openBlock(), createBlock(_sfc_main$i, {
20789
20745
  key: 2,
20790
- modelValue: formModel.value[resolveHeaderKey2(header)],
20791
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20792
- label: resolveHeaderTitle2(header),
20793
- disabled: isHeaderDisabled2(header)
20794
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : isTextareaHeader2(header) ? (openBlock(), createBlock(VTextarea, {
20746
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20747
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20748
+ label: unref(resolveHeaderTitle)(header),
20749
+ disabled: unref(isHeaderDisabled)(header)
20750
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : unref(isTextareaHeader)(header) ? (openBlock(), createBlock(VTextarea, {
20795
20751
  key: 3,
20796
- modelValue: formModel.value[resolveHeaderKey2(header)],
20797
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20798
- label: resolveHeaderTitle2(header),
20752
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20753
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20754
+ label: unref(resolveHeaderTitle)(header),
20799
20755
  variant: "outlined",
20800
- disabled: isHeaderDisabled2(header),
20756
+ disabled: unref(isHeaderDisabled)(header),
20801
20757
  dir: header.dir,
20802
20758
  "auto-grow": "",
20803
20759
  rows: "3"
20804
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "dir"])) : isToggleHeader2(header) ? (openBlock(), createBlock(ToggleSwitch, {
20760
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "dir"])) : unref(isToggleHeader)(header) ? (openBlock(), createBlock(ToggleSwitch, {
20805
20761
  key: 4,
20806
- modelValue: formModel.value[resolveHeaderKey2(header)],
20807
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20808
- label: resolveHeaderTitle2(header),
20762
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20763
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20764
+ label: unref(resolveHeaderTitle)(header),
20809
20765
  type: "boolean",
20810
20766
  activeColor: "#3bd32a",
20811
20767
  inactiveColor: "#d32a2a",
@@ -20815,12 +20771,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
20815
20771
  ]
20816
20772
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "options"])) : (openBlock(), createBlock(VTextField, {
20817
20773
  key: 5,
20818
- modelValue: formModel.value[resolveHeaderKey2(header)],
20819
- "onUpdate:modelValue": ($event) => formModel.value[resolveHeaderKey2(header)] = $event,
20820
- label: resolveHeaderTitle2(header),
20774
+ modelValue: formModel.value[unref(resolveHeaderKey)(header)],
20775
+ "onUpdate:modelValue": ($event) => formModel.value[unref(resolveHeaderKey)(header)] = $event,
20776
+ label: unref(resolveHeaderTitle)(header),
20821
20777
  variant: "outlined",
20822
- disabled: isHeaderDisabled2(header),
20823
- type: getFieldInputType2(header),
20778
+ disabled: unref(isHeaderDisabled)(header),
20779
+ type: unref(getFieldInputType)(header),
20824
20780
  dir: header.dir
20825
20781
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "type", "dir"]))
20826
20782
  ], 64)) : createCommentVNode("", true)
@@ -21051,7 +21007,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
21051
21007
  default: withCtx(() => [
21052
21008
  (openBlock(true), createElementBlock(Fragment, null, renderList(formHeaders.value, (header) => {
21053
21009
  return openBlock(), createBlock(VCol, {
21054
- key: resolveHeaderKey2(header),
21010
+ key: unref(resolveHeaderKey)(header),
21055
21011
  cols: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4,
21056
21012
  md: header.cols ? typeof header.cols === "number" ? header.cols : Number(header.cols) : 4
21057
21013
  }, {
@@ -21059,8 +21015,8 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
21059
21015
  !header.hidden ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
21060
21016
  hasFilterOperators(header) ? (openBlock(), createBlock(VSelect, {
21061
21017
  key: 0,
21062
- modelValue: filterOperatorModel.value[resolveHeaderKey2(header)],
21063
- "onUpdate:modelValue": ($event) => filterOperatorModel.value[resolveHeaderKey2(header)] = $event,
21018
+ modelValue: filterOperatorModel.value[unref(resolveHeaderKey)(header)],
21019
+ "onUpdate:modelValue": ($event) => filterOperatorModel.value[unref(resolveHeaderKey)(header)] = $event,
21064
21020
  items: getHeaderFilterOperators(header),
21065
21021
  "item-title": "label",
21066
21022
  "item-value": "value",
@@ -21070,50 +21026,50 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
21070
21026
  class: "mb-1",
21071
21027
  "menu-props": { zIndex: 2e4 }
21072
21028
  }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])) : createCommentVNode("", true),
21073
- isDateHeader2(header) ? (openBlock(), createBlock(ShamsiDatePicker, {
21029
+ unref(isDateHeader)(header) ? (openBlock(), createBlock(ShamsiDatePicker, {
21074
21030
  key: 1,
21075
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21076
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21077
- label: resolveHeaderTitle2(header),
21078
- disabled: isHeaderDisabled2(header),
21031
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21032
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21033
+ label: unref(resolveHeaderTitle)(header),
21034
+ disabled: unref(isHeaderDisabled)(header),
21079
21035
  mode: header.dateMode || "single"
21080
21036
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "mode"])) : hasAutocomplete2(header) ? (openBlock(), createBlock(VAutocomplete, {
21081
21037
  key: 2,
21082
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21083
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21084
- label: resolveHeaderTitle2(header),
21038
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21039
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21040
+ label: unref(resolveHeaderTitle)(header),
21085
21041
  items: resolveAutocompleteItems2(header, filterModel.value.value),
21086
- "item-title": resolveAutocompleteItemTitle2(header),
21087
- "item-value": resolveAutocompleteItemValue2(header),
21088
- "return-object": resolveAutocompleteReturnObject2(header),
21089
- multiple: resolveAutocompleteMultiple2(header),
21090
- chips: resolveAutocompleteMultiple2(header),
21091
- "closable-chips": resolveAutocompleteMultiple2(header),
21092
- disabled: isHeaderDisabled2(header),
21042
+ "item-title": unref(resolveAutocompleteItemTitle)(header),
21043
+ "item-value": unref(resolveAutocompleteItemValue)(header),
21044
+ "return-object": unref(resolveAutocompleteReturnObject)(header),
21045
+ multiple: unref(resolveAutocompleteMultiple)(header),
21046
+ chips: unref(resolveAutocompleteMultiple)(header),
21047
+ "closable-chips": unref(resolveAutocompleteMultiple)(header),
21048
+ disabled: unref(isHeaderDisabled)(header),
21093
21049
  clearable: "",
21094
21050
  variant: "outlined",
21095
21051
  "menu-props": { zIndex: 2e4 }
21096
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "items", "item-title", "item-value", "return-object", "multiple", "chips", "closable-chips", "disabled"])) : isMoneyHeader2(header) ? (openBlock(), createBlock(_sfc_main$i, {
21052
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "items", "item-title", "item-value", "return-object", "multiple", "chips", "closable-chips", "disabled"])) : unref(isMoneyHeader)(header) ? (openBlock(), createBlock(_sfc_main$i, {
21097
21053
  key: 3,
21098
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21099
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21100
- label: resolveHeaderTitle2(header),
21101
- disabled: isHeaderDisabled2(header)
21102
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : isTextareaHeader2(header) ? (openBlock(), createBlock(VTextarea, {
21054
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21055
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21056
+ label: unref(resolveHeaderTitle)(header),
21057
+ disabled: unref(isHeaderDisabled)(header)
21058
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled"])) : unref(isTextareaHeader)(header) ? (openBlock(), createBlock(VTextarea, {
21103
21059
  key: 4,
21104
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21105
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21106
- label: resolveHeaderTitle2(header),
21060
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21061
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21062
+ label: unref(resolveHeaderTitle)(header),
21107
21063
  variant: "outlined",
21108
- disabled: isHeaderDisabled2(header),
21064
+ disabled: unref(isHeaderDisabled)(header),
21109
21065
  dir: header.dir,
21110
21066
  "auto-grow": "",
21111
21067
  rows: "3"
21112
- }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "dir"])) : isToggleHeader2(header) ? (openBlock(), createBlock(ToggleSwitch, {
21068
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "dir"])) : unref(isToggleHeader)(header) ? (openBlock(), createBlock(ToggleSwitch, {
21113
21069
  key: 5,
21114
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21115
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21116
- label: resolveHeaderTitle2(header),
21070
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21071
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21072
+ label: unref(resolveHeaderTitle)(header),
21117
21073
  type: "boolean",
21118
21074
  activeColor: "#3bd32a",
21119
21075
  inactiveColor: "#d32a2a",
@@ -21123,12 +21079,12 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
21123
21079
  ]
21124
21080
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "options"])) : (openBlock(), createBlock(VTextField, {
21125
21081
  key: 6,
21126
- modelValue: filterModel.value[resolveHeaderKey2(header)],
21127
- "onUpdate:modelValue": ($event) => filterModel.value[resolveHeaderKey2(header)] = $event,
21128
- label: resolveHeaderTitle2(header),
21082
+ modelValue: filterModel.value[unref(resolveHeaderKey)(header)],
21083
+ "onUpdate:modelValue": ($event) => filterModel.value[unref(resolveHeaderKey)(header)] = $event,
21084
+ label: unref(resolveHeaderTitle)(header),
21129
21085
  variant: "outlined",
21130
- disabled: isHeaderDisabled2(header),
21131
- type: getFieldInputType2(header),
21086
+ disabled: unref(isHeaderDisabled)(header),
21087
+ type: unref(getFieldInputType)(header),
21132
21088
  dir: header.dir
21133
21089
  }, null, 8, ["modelValue", "onUpdate:modelValue", "label", "disabled", "type", "dir"]))
21134
21090
  ], 64)) : createCommentVNode("", true)
@@ -24433,89 +24389,57 @@ const DigitLimit = {
24433
24389
  }
24434
24390
  }
24435
24391
  };
24392
+ const TIME_PERIODS = [
24393
+ { period: "morning", minHour: 5, maxHour: 12 },
24394
+ { period: "noon", minHour: 12, maxHour: 17 },
24395
+ { period: "afternoon", minHour: 17, maxHour: 20 },
24396
+ { period: "evening", minHour: 20, maxHour: 29 }
24397
+ ];
24398
+ const PERIOD_TEXT = {
24399
+ morning: { greeting: "صبح بخیر", label: "صبح" },
24400
+ noon: { greeting: "ظهر بخیر", label: "ظهر" },
24401
+ afternoon: { greeting: "عصر بخیر", label: "عصر" },
24402
+ evening: { greeting: "شب بخیر", label: "شب" }
24403
+ };
24404
+ function toDate(value) {
24405
+ return value ? new Date(value) : /* @__PURE__ */ new Date();
24406
+ }
24407
+ function getPeriod(hour) {
24408
+ var _a;
24409
+ return ((_a = TIME_PERIODS.find(({ minHour, maxHour }) => hour >= minHour && hour < maxHour)) == null ? void 0 : _a.period) ?? "evening";
24410
+ }
24436
24411
  class GreetingUtils {
24437
- /**
24438
- * Get greeting based on time of day
24439
- * @param serverTime - Server time in ISO string or Date object
24440
- * @returns Appropriate greeting in Persian
24441
- */
24442
24412
  static getGreeting(serverTime) {
24443
- const time = serverTime ? new Date(serverTime) : /* @__PURE__ */ new Date();
24444
- const hour = time.getHours();
24445
- if (hour >= 5 && hour < 12) {
24446
- return "صبح بخیر";
24447
- } else if (hour >= 12 && hour < 17) {
24448
- return "ظهر بخیر";
24449
- } else if (hour >= 17 && hour < 20) {
24450
- return "عصر بخیر";
24451
- } else {
24452
- return "شب بخیر";
24453
- }
24413
+ const hour = toDate(serverTime).getHours();
24414
+ return PERIOD_TEXT[getPeriod(hour)].greeting;
24415
+ }
24416
+ static getTimePeriod(serverTime) {
24417
+ const hour = toDate(serverTime).getHours();
24418
+ return PERIOD_TEXT[getPeriod(hour)].label;
24454
24419
  }
24455
- /**
24456
- * Get greeting with user name
24457
- * @param serverTime - Server time in ISO string or Date object
24458
- * @param userName - User's name
24459
- * @returns Greeting with user name
24460
- */
24461
24420
  static getGreetingWithName(serverTime, userName) {
24462
- const greeting = this.getGreeting(serverTime);
24463
- const name = userName || "کاربر";
24464
- return `${greeting} ${name}`;
24421
+ return `${GreetingUtils.getGreeting(serverTime)} ${userName ?? "کاربر"}`;
24465
24422
  }
24466
- /**
24467
- * Get greeting with time information
24468
- * @param serverTime - Server time in ISO string or Date object
24469
- * @returns Greeting with time period
24470
- */
24471
24423
  static getGreetingWithTime(serverTime) {
24472
- const time = serverTime ? new Date(serverTime) : /* @__PURE__ */ new Date();
24473
- const hour = time.getHours();
24474
- const minute = time.getMinutes();
24475
- const greeting = this.getGreeting(serverTime);
24476
- const timeString = `${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}`;
24477
- return `${greeting} - ساعت ${timeString}`;
24478
- }
24479
- /**
24480
- * Get time period description
24481
- * @param serverTime - Server time in ISO string or Date object
24482
- * @returns Time period description in Persian
24483
- */
24484
- static getTimePeriod(serverTime) {
24485
- const time = serverTime ? new Date(serverTime) : /* @__PURE__ */ new Date();
24486
- const hour = time.getHours();
24487
- if (hour >= 5 && hour < 12) {
24488
- return "صبح";
24489
- } else if (hour >= 12 && hour < 17) {
24490
- return "ظهر";
24491
- } else if (hour >= 17 && hour < 20) {
24492
- return "عصر";
24493
- } else {
24494
- return "شب";
24495
- }
24424
+ const date = toDate(serverTime);
24425
+ const hh = String(date.getHours()).padStart(2, "0");
24426
+ const mm = String(date.getMinutes()).padStart(2, "0");
24427
+ return `${GreetingUtils.getGreeting(serverTime)} - ساعت ${hh}:${mm}`;
24496
24428
  }
24497
- /**
24498
- * Get full greeting with date and time
24499
- * @param serverTime - Server time in ISO string or Date object
24500
- * @param userName - User's name
24501
- * @returns Full greeting with date and time
24502
- */
24503
24429
  static getFullGreeting(serverTime, userName) {
24504
- const time = serverTime ? new Date(serverTime) : /* @__PURE__ */ new Date();
24505
- const greeting = this.getGreeting(serverTime);
24506
- const name = userName || "کاربر";
24507
- const dateOptions = {
24430
+ const date = toDate(serverTime);
24431
+ const persianDate = date.toLocaleDateString("fa-IR", {
24508
24432
  weekday: "long",
24509
24433
  year: "numeric",
24510
24434
  month: "long",
24511
24435
  day: "numeric"
24512
- };
24513
- const persianDate = time.toLocaleDateString("fa-IR", dateOptions);
24514
- const timeString = time.toLocaleTimeString("fa-IR", {
24515
- hour: "2-digit",
24516
- minute: "2-digit"
24517
24436
  });
24518
- return `${greeting} ${name} - ${persianDate} - ساعت ${timeString}`;
24437
+ const persianTime = date.toLocaleTimeString("fa-IR", { hour: "2-digit", minute: "2-digit" });
24438
+ return `${GreetingUtils.getGreeting(serverTime)} ${userName ?? "کاربر"} - ${persianDate} - ساعت ${persianTime}`;
24439
+ }
24440
+ /** Convenience: build greeting from a full UserInfoResponse. */
24441
+ static fromUserInfo(userInfo) {
24442
+ return GreetingUtils.getGreetingWithName(userInfo.authTime, userInfo.fullName);
24519
24443
  }
24520
24444
  }
24521
24445
  class NationalCodeValidator {