persian-data-grid 0.6.0 → 0.7.1

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/{ERPTableGroupRow-PSAPAHGL.js → ERPTableGroupRow-E5Q6FYDS.js} +4 -4
  3. package/dist/{ERPTableGroupRow-PSAPAHGL.js.map → ERPTableGroupRow-E5Q6FYDS.js.map} +1 -1
  4. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs → ERPTableGroupRow-F2IPDYL5.cjs} +9 -9
  5. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs.map → ERPTableGroupRow-F2IPDYL5.cjs.map} +1 -1
  6. package/dist/{GridPlugin-CJCaYnlw.d.ts → GridPlugin-Bewn0X51.d.ts} +1 -1
  7. package/dist/{GridPlugin-oxhq8AsM.d.cts → GridPlugin-DewWufGZ.d.cts} +1 -1
  8. package/dist/{GridSession-Bc7UIawO.d.ts → GridSession-CeIfVFck.d.ts} +142 -9
  9. package/dist/{GridSession-B-9lLcoB.d.cts → GridSession-CmQn2RnL.d.cts} +142 -9
  10. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  11. package/dist/{GridSyncService-TAPAHABV.cjs.map → GridSyncService-3JQLEY65.cjs.map} +1 -1
  12. package/dist/GridSyncService-GECXGEKL.js +3 -0
  13. package/dist/{GridSyncService-KTLB4KP3.js.map → GridSyncService-GECXGEKL.js.map} +1 -1
  14. package/dist/{PdfRenderer-CBg7hWNS.d.cts → PdfRenderer-B9FJaCo_.d.cts} +1 -1
  15. package/dist/{PdfRenderer-1HFh6UeR.d.ts → PdfRenderer-bN7ca_Aj.d.ts} +1 -1
  16. package/dist/{UITableController-DU8RopUM.d.ts → UITableController-C71LXBiX.d.ts} +48 -2
  17. package/dist/{UITableController-Cuwq481K.d.cts → UITableController-CIwnHIw8.d.cts} +48 -2
  18. package/dist/{VazirmatnPdfRenderer-BCMpC1zy.d.cts → VazirmatnPdfRenderer-CpCqA-Wh.d.cts} +2 -2
  19. package/dist/{VazirmatnPdfRenderer-Dz_G-m3c.d.ts → VazirmatnPdfRenderer-D46smncn.d.ts} +2 -2
  20. package/dist/adapters/arian-erp.cjs +16 -4
  21. package/dist/adapters/arian-erp.cjs.map +1 -1
  22. package/dist/adapters/arian-erp.d.cts +3 -1
  23. package/dist/adapters/arian-erp.d.ts +3 -1
  24. package/dist/adapters/arian-erp.js +11 -3
  25. package/dist/adapters/arian-erp.js.map +1 -1
  26. package/dist/{applyImportedRows-BO6yxoAN.d.cts → applyImportedRows-C2fWYoPy.d.cts} +3 -3
  27. package/dist/{applyImportedRows-D4zVY8uD.d.ts → applyImportedRows-Cqh_N_0k.d.ts} +3 -3
  28. package/dist/{applyRowVisibilityHandler-LXCOGESZ.cjs → applyRowVisibilityHandler-Q64ZFC7A.cjs} +7 -6
  29. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  30. package/dist/{applyRowVisibilityHandler-KS6TMCBN.js → applyRowVisibilityHandler-ZLZXQEGY.js} +6 -5
  31. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.map +1 -0
  32. package/dist/callbackRemoteApi-BYLjmSI6.d.ts +51 -0
  33. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  34. package/dist/{cellRenderContext-DB7V_mlu.d.ts → cellRenderContext-BaNh4qn_.d.ts} +2 -2
  35. package/dist/{cellRenderContext-DG5BOlxK.d.cts → cellRenderContext-DvngkptV.d.cts} +2 -2
  36. package/dist/{chunk-HTNJT2QU.js → chunk-27ALJSZP.js} +617 -104
  37. package/dist/chunk-27ALJSZP.js.map +1 -0
  38. package/dist/{chunk-KUBVDIF7.cjs → chunk-3HP3HQCW.cjs} +52 -17
  39. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  40. package/dist/{chunk-DXRCYW42.cjs → chunk-52LFOPXD.cjs} +43 -23
  41. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  42. package/dist/{chunk-VVGYRZ7S.cjs → chunk-72IVAOTK.cjs} +4 -4
  43. package/dist/{chunk-VVGYRZ7S.cjs.map → chunk-72IVAOTK.cjs.map} +1 -1
  44. package/dist/{chunk-LJ7LMEXO.js → chunk-7GWV5HGO.js} +3 -3
  45. package/dist/{chunk-LJ7LMEXO.js.map → chunk-7GWV5HGO.js.map} +1 -1
  46. package/dist/{chunk-RM6ZWNT3.js → chunk-7T6AWRPU.js} +43 -23
  47. package/dist/chunk-7T6AWRPU.js.map +1 -0
  48. package/dist/{chunk-PXCHPZTP.cjs → chunk-CMQ4VLCW.cjs} +8 -7
  49. package/dist/{chunk-EHHHC5JV.js.map → chunk-CMQ4VLCW.cjs.map} +1 -1
  50. package/dist/chunk-E2J533UH.cjs +53 -0
  51. package/dist/chunk-E2J533UH.cjs.map +1 -0
  52. package/dist/chunk-F6EMC75A.cjs +34 -0
  53. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  54. package/dist/chunk-GKE33FOJ.js +32 -0
  55. package/dist/chunk-GKE33FOJ.js.map +1 -0
  56. package/dist/{chunk-QQMU44KJ.js → chunk-HLOHWFOA.js} +52 -19
  57. package/dist/chunk-HLOHWFOA.js.map +1 -0
  58. package/dist/{chunk-633KP74Z.js → chunk-KCNTKYUY.js} +19 -2
  59. package/dist/chunk-KCNTKYUY.js.map +1 -0
  60. package/dist/{chunk-BLYVOV3G.cjs → chunk-LY27YAXE.cjs} +19 -2
  61. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  62. package/dist/{chunk-EHHHC5JV.js → chunk-NB5GCGHL.js} +5 -4
  63. package/dist/chunk-NB5GCGHL.js.map +1 -0
  64. package/dist/{chunk-6XBXZPBW.js → chunk-NQUVAJQA.js} +3 -3
  65. package/dist/{chunk-6XBXZPBW.js.map → chunk-NQUVAJQA.js.map} +1 -1
  66. package/dist/chunk-SVO62ZV2.js +50 -0
  67. package/dist/chunk-SVO62ZV2.js.map +1 -0
  68. package/dist/{chunk-MU3RY46O.js → chunk-VBAZ77Q4.js} +3 -3
  69. package/dist/{chunk-MU3RY46O.js.map → chunk-VBAZ77Q4.js.map} +1 -1
  70. package/dist/{chunk-H2LESGMX.cjs → chunk-VSAFQTW5.cjs} +4 -4
  71. package/dist/{chunk-H2LESGMX.cjs.map → chunk-VSAFQTW5.cjs.map} +1 -1
  72. package/dist/{chunk-2BJCRYOS.cjs → chunk-VYJQ2HTA.cjs} +5 -5
  73. package/dist/{chunk-2BJCRYOS.cjs.map → chunk-VYJQ2HTA.cjs.map} +1 -1
  74. package/dist/{chunk-IIISFUW4.cjs → chunk-WTHTVKVI.cjs} +621 -108
  75. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  76. package/dist/{createEngineGridQuery-Mt1hc33m.d.ts → createEngineGridQuery-BBkud5oE.d.ts} +61 -6
  77. package/dist/{createEngineGridQuery-Dmq3i5v3.d.cts → createEngineGridQuery-D-fgO_jg.d.cts} +61 -6
  78. package/dist/date-picker-jalali.cjs +17 -17
  79. package/dist/date-picker-jalali.d.cts +3 -3
  80. package/dist/date-picker-jalali.d.ts +3 -3
  81. package/dist/date-picker-jalali.js +1 -1
  82. package/dist/headless.cjs +102 -102
  83. package/dist/headless.d.cts +13 -9
  84. package/dist/headless.d.ts +13 -9
  85. package/dist/headless.js +4 -4
  86. package/dist/index.cjs +440 -382
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +34 -14
  89. package/dist/index.d.ts +34 -14
  90. package/dist/index.js +200 -143
  91. package/dist/index.js.map +1 -1
  92. package/dist/plugins/csv.cjs +3 -3
  93. package/dist/plugins/csv.d.cts +2 -2
  94. package/dist/plugins/csv.d.ts +2 -2
  95. package/dist/plugins/csv.js +2 -2
  96. package/dist/plugins/excel.cjs +11 -11
  97. package/dist/plugins/excel.d.cts +4 -4
  98. package/dist/plugins/excel.d.ts +4 -4
  99. package/dist/plugins/excel.js +3 -3
  100. package/dist/plugins/pdf/fonts/vazirmatn.cjs +6 -6
  101. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +4 -4
  102. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +4 -4
  103. package/dist/plugins/pdf/fonts/vazirmatn.js +3 -3
  104. package/dist/plugins/pdf.cjs +5 -5
  105. package/dist/plugins/pdf.d.cts +5 -5
  106. package/dist/plugins/pdf.d.ts +5 -5
  107. package/dist/plugins/pdf.js +2 -2
  108. package/dist/presence.d.cts +3 -3
  109. package/dist/presence.d.ts +3 -3
  110. package/dist/sync.cjs +2 -2
  111. package/dist/sync.d.cts +3 -3
  112. package/dist/sync.d.ts +3 -3
  113. package/dist/sync.js +1 -1
  114. package/package.json +3 -3
  115. package/dist/GridSyncService-KTLB4KP3.js +0 -3
  116. package/dist/GridSyncService-TAPAHABV.cjs +0 -12
  117. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +0 -1
  118. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +0 -1
  119. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +0 -30
  120. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +0 -30
  121. package/dist/chunk-633KP74Z.js.map +0 -1
  122. package/dist/chunk-ASPTRYRD.cjs +0 -21
  123. package/dist/chunk-ASPTRYRD.cjs.map +0 -1
  124. package/dist/chunk-BHDRUZH5.cjs +0 -33
  125. package/dist/chunk-BHDRUZH5.cjs.map +0 -1
  126. package/dist/chunk-BLYVOV3G.cjs.map +0 -1
  127. package/dist/chunk-DXRCYW42.cjs.map +0 -1
  128. package/dist/chunk-HTNJT2QU.js.map +0 -1
  129. package/dist/chunk-IIISFUW4.cjs.map +0 -1
  130. package/dist/chunk-KUBVDIF7.cjs.map +0 -1
  131. package/dist/chunk-KYAOSBQN.js +0 -31
  132. package/dist/chunk-KYAOSBQN.js.map +0 -1
  133. package/dist/chunk-PXCHPZTP.cjs.map +0 -1
  134. package/dist/chunk-QQMU44KJ.js.map +0 -1
  135. package/dist/chunk-RM6ZWNT3.js.map +0 -1
  136. package/dist/chunk-Y6W5V2CI.js +0 -19
  137. package/dist/chunk-Y6W5V2CI.js.map +0 -1
@@ -324,18 +324,26 @@ function ERPTableHostProvider({
324
324
  numberingSystem,
325
325
  dateAdapter,
326
326
  remoteApi,
327
- messages,
328
- onToast,
327
+ messages: messagesProp,
328
+ onToast: onToastProp,
329
329
  theme = themeErp,
330
330
  themeToggle = true,
331
331
  themeLocked = false,
332
332
  onToggleTheme,
333
- components,
334
- filterComponents,
335
- columnMenuItems,
336
- onColumnMenuAction,
337
- useDependOn
333
+ components: componentsProp,
334
+ filterComponents: filterComponentsProp,
335
+ columnMenuItems: columnMenuItemsProp,
336
+ onColumnMenuAction: onColumnMenuActionProp,
337
+ useDependOn: useDependOnProp
338
338
  }) {
339
+ const outer = react.useContext(ERPTableHostContext);
340
+ const messages = messagesProp ?? outer.messages;
341
+ const onToast = onToastProp ?? outer.onToast;
342
+ const components = componentsProp ?? outer.components;
343
+ const filterComponents = filterComponentsProp ?? outer.filterComponents;
344
+ const columnMenuItems = columnMenuItemsProp ?? outer.columnMenuItems;
345
+ const onColumnMenuAction = onColumnMenuActionProp ?? outer.onColumnMenuAction;
346
+ const useDependOn = useDependOnProp ?? outer.useDependOn;
339
347
  const value = react.useMemo(
340
348
  () => ({
341
349
  locale,
@@ -391,10 +399,13 @@ function useThemePortalStyle(extra) {
391
399
  }
392
400
  function useTranslations() {
393
401
  const { locale, messages } = useERPTableHost();
394
- return (key, vars) => {
395
- const raw = translate(key, locale, messages);
396
- return vars ? formatMessage(raw, vars) : raw;
397
- };
402
+ return react.useCallback(
403
+ (key, vars) => {
404
+ const raw = translate(key, locale, messages);
405
+ return vars ? formatMessage(raw, vars) : raw;
406
+ },
407
+ [locale, messages]
408
+ );
398
409
  }
399
410
  function useLocale() {
400
411
  return useERPTableHost().locale;
@@ -507,16 +518,27 @@ function useMediaQuery(query) {
507
518
  }, [media]);
508
519
  return { match };
509
520
  }
521
+ function useLatest(value) {
522
+ const ref = react.useRef(value);
523
+ ref.current = value;
524
+ return ref;
525
+ }
526
+ function errorMessage(error) {
527
+ return error instanceof Error ? error.message : "Remote request failed";
528
+ }
510
529
  function useRemoteQuery(args) {
511
- const { remoteApi } = useERPTableHost();
530
+ const { remoteApi, onToast } = useERPTableHost();
531
+ const toastRef = useLatest(onToast);
512
532
  const [data, setData] = react.useState(null);
513
533
  const [isFetching, setIsFetching] = react.useState(false);
534
+ const [error, setError] = react.useState(null);
514
535
  const refetch = react.useCallback(async () => {
515
536
  if (!args.url || args.skip || !remoteApi) {
516
537
  setData(null);
517
538
  return;
518
539
  }
519
540
  setIsFetching(true);
541
+ setError(null);
520
542
  try {
521
543
  const response = await remoteApi.request({
522
544
  endpoint: args.url,
@@ -524,6 +546,10 @@ function useRemoteQuery(args) {
524
546
  method: "POST"
525
547
  });
526
548
  setData(response ?? null);
549
+ } catch (e) {
550
+ setData(null);
551
+ setError(e);
552
+ toastRef.current?.("error", errorMessage(e), e);
527
553
  } finally {
528
554
  setIsFetching(false);
529
555
  }
@@ -531,12 +557,14 @@ function useRemoteQuery(args) {
531
557
  react.useEffect(() => {
532
558
  void refetch();
533
559
  }, [refetch]);
534
- return { data, isFetching, refetch };
560
+ return { data, isFetching, error, refetch };
535
561
  }
536
562
  function useLazyRemote() {
537
- const { remoteApi } = useERPTableHost();
563
+ const { remoteApi, onToast } = useERPTableHost();
564
+ const toastRef = useLatest(onToast);
538
565
  const [data, setData] = react.useState(null);
539
566
  const [isFetching, setIsFetching] = react.useState(false);
567
+ const [error, setError] = react.useState(null);
540
568
  const trigger = react.useCallback(
541
569
  async (args) => {
542
570
  if (!args.url || !remoteApi) {
@@ -544,16 +572,21 @@ function useLazyRemote() {
544
572
  return;
545
573
  }
546
574
  setIsFetching(true);
575
+ setError(null);
547
576
  try {
548
577
  const response = await remoteApi.request({ endpoint: args.url, params: args.body, method: "POST" });
549
578
  setData(response ?? null);
579
+ } catch (e) {
580
+ setData(null);
581
+ setError(e);
582
+ toastRef.current?.("error", errorMessage(e), e);
550
583
  } finally {
551
584
  setIsFetching(false);
552
585
  }
553
586
  },
554
587
  [remoteApi]
555
588
  );
556
- return [trigger, { data, isFetching }];
589
+ return [trigger, { data, isFetching, error }];
557
590
  }
558
591
 
559
592
  // ui/host/toast.ts
@@ -620,6 +653,8 @@ exports.bindGridHostEvents = bindGridHostEvents;
620
653
  exports.buildDependencyBody = buildDependencyBody;
621
654
  exports.buildJalaliMonthGrid = buildJalaliMonthGrid;
622
655
  exports.compareJalaliDay = compareJalaliDay;
656
+ exports.getDependFieldName = getDependFieldName;
657
+ exports.getStaticDependValue = getStaticDependValue;
623
658
  exports.gregorianAdapter = gregorianAdapter;
624
659
  exports.hasDependValue = hasDependValue;
625
660
  exports.isDateInRange = isDateInRange;
@@ -649,5 +684,5 @@ exports.useRemoteQuery = useRemoteQuery;
649
684
  exports.useStaticDependOn = useStaticDependOn;
650
685
  exports.useThemePortalStyle = useThemePortalStyle;
651
686
  exports.useTranslations = useTranslations;
652
- //# sourceMappingURL=chunk-KUBVDIF7.cjs.map
653
- //# sourceMappingURL=chunk-KUBVDIF7.cjs.map
687
+ //# sourceMappingURL=chunk-3HP3HQCW.cjs.map
688
+ //# sourceMappingURL=chunk-3HP3HQCW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/date/gregorianAdapter.ts","../infrastructure/date/jalaliCalendarModel.ts","../ui/theme/GridTheme.ts","../ui/theme/resolveActiveTheme.ts","../ui/theme/applyCssVars.ts","../ui/host/messages.ts","../ui/host/ERPTableHost.tsx","../ui/host/dependOn.ts","../ui/host/bindGridHostEvents.ts","../ui/host/useMediaQuery.ts","../ui/host/useRemoteQuery.ts","../ui/host/toast.ts","../ui/host/useGridHostEvents.ts"],"names":["normalizeDigits","pad2","gregorianDateToJalali","jalaliToGregorianDate","jalaliMonthLength","getLocalePack","jalaliAdapter","createContext","useContext","useMemo","resolveDirection","useEffect","jsx","useCallback","subscribeCatalogHostEvents","useState","useRef"],"mappings":"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","file":"chunk-3HP3HQCW.cjs","sourcesContent":["import type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport { normalizeDigits } from '../../engine/dataOps/sortModel';\r\nimport { pad2 } from './jalaliMath';\r\n\r\nconst ISO_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\nconst SLASH_RE = /^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/;\r\n\r\nfunction utcDay(y: number, m: number, d: number): Date {\r\n return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));\r\n}\r\n\r\nfunction asUtcDay(date: Date): Date {\r\n return utcDay(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());\r\n}\r\n\r\n/** Gregorian calendar adapter (PR-128 / D21). */\r\nexport const gregorianAdapter: DateAdapter = {\r\n id: 'gregory',\r\n\r\n parse(input: unknown): Date | null {\r\n if (input == null || input === '') return null;\r\n if (input instanceof Date && !Number.isNaN(input.getTime())) {\r\n return asUtcDay(input);\r\n }\r\n if (typeof input === 'number' && Number.isFinite(input)) {\r\n const d = new Date(input);\r\n return Number.isNaN(d.getTime()) ? null : asUtcDay(d);\r\n }\r\n const text = normalizeDigits(String(input).trim());\r\n const iso = ISO_RE.exec(text);\r\n if (iso) {\r\n return utcDay(Number(iso[1]), Number(iso[2]), Number(iso[3]));\r\n }\r\n const slash = SLASH_RE.exec(text);\r\n if (slash) {\r\n return utcDay(Number(slash[1]), Number(slash[2]), Number(slash[3]));\r\n }\r\n const fallback = new Date(text);\r\n return Number.isNaN(fallback.getTime()) ? null : asUtcDay(fallback);\r\n },\r\n\r\n format(date: Date): string {\r\n const d = asUtcDay(date);\r\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\r\n },\r\n\r\n addDays(date: Date, days: number): Date {\r\n const next = asUtcDay(date);\r\n next.setUTCDate(next.getUTCDate() + days);\r\n return next;\r\n },\r\n\r\n startOfMonth(date: Date): Date {\r\n const d = asUtcDay(date);\r\n return utcDay(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);\r\n },\r\n\r\n compare(a: Date, b: Date): number {\r\n return asUtcDay(a).getTime() - asUtcDay(b).getTime();\r\n },\r\n};\r\n","/**\r\n * Pure Jalali month-grid helpers for the internal picker (PR-140).\r\n */\r\n\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliMonthLength,\r\n jalaliToGregorianDate,\r\n} from './jalaliMath';\r\n\r\nexport type JalaliYmd = { jy: number; jm: number; jd: number };\r\n\r\nexport type CalendarCell = {\r\n ymd: JalaliYmd;\r\n date: Date;\r\n inCurrentMonth: boolean;\r\n /** 0 = Saturday … 6 = Friday (Jalali week starts Saturday). */\r\n weekday: number;\r\n};\r\n\r\nconst MONTH_NAMES_FA = [\r\n 'فروردین',\r\n 'اردیبهشت',\r\n 'خرداد',\r\n 'تیر',\r\n 'مرداد',\r\n 'شهریور',\r\n 'مهر',\r\n 'آبان',\r\n 'آذر',\r\n 'دی',\r\n 'بهمن',\r\n 'اسفند',\r\n] as const;\r\n\r\nexport const JALALI_WEEKDAY_LABELS_FA = [\r\n 'ش',\r\n 'ی',\r\n 'د',\r\n 'س',\r\n 'چ',\r\n 'پ',\r\n 'ج',\r\n] as const;\r\n\r\nexport function jalaliMonthName(jm: number): string {\r\n return MONTH_NAMES_FA[jm - 1] ?? String(jm);\r\n}\r\n\r\nexport function toJalaliYmd(date: Date): JalaliYmd {\r\n return gregorianDateToJalali(utcNoon(date));\r\n}\r\n\r\nexport function fromJalaliYmd(ymd: JalaliYmd): Date {\r\n return jalaliToGregorianDate(ymd.jy, ymd.jm, ymd.jd);\r\n}\r\n\r\nexport function sameJalaliDay(a: Date, b: Date): boolean {\r\n const x = toJalaliYmd(a);\r\n const y = toJalaliYmd(b);\r\n return x.jy === y.jy && x.jm === y.jm && x.jd === y.jd;\r\n}\r\n\r\nexport function compareJalaliDay(a: Date, b: Date): number {\r\n return utcNoon(a).getTime() - utcNoon(b).getTime();\r\n}\r\n\r\nexport function addJalaliMonths(\r\n jy: number,\r\n jm: number,\r\n delta: number,\r\n): { jy: number; jm: number } {\r\n const idx = jy * 12 + (jm - 1) + delta;\r\n return {\r\n jy: Math.floor(idx / 12),\r\n jm: (idx % 12) + 1,\r\n };\r\n}\r\n\r\n/**\r\n * 6×7 grid of days for a Jalali month. Week starts Saturday.\r\n * Leading/trailing cells may belong to adjacent months (`inCurrentMonth: false`).\r\n */\r\nexport function buildJalaliMonthGrid(jy: number, jm: number): CalendarCell[] {\r\n const first = jalaliToGregorianDate(jy, jm, 1);\r\n const jsDow = first.getUTCDay();\r\n const jalaliWeekStart = (jsDow + 1) % 7;\r\n const daysInMonth = jalaliMonthLength(jy, jm);\r\n const cells: CalendarCell[] = [];\r\n\r\n for (let i = 0; i < 42; i += 1) {\r\n const offset = i - jalaliWeekStart;\r\n let cellJy = jy;\r\n let cellJm = jm;\r\n let cellJd: number;\r\n let inCurrentMonth = true;\r\n\r\n if (offset < 0) {\r\n const prev = addJalaliMonths(jy, jm, -1);\r\n cellJy = prev.jy;\r\n cellJm = prev.jm;\r\n cellJd = jalaliMonthLength(cellJy, cellJm) + offset + 1;\r\n inCurrentMonth = false;\r\n } else if (offset >= daysInMonth) {\r\n const next = addJalaliMonths(jy, jm, 1);\r\n cellJy = next.jy;\r\n cellJm = next.jm;\r\n cellJd = offset - daysInMonth + 1;\r\n inCurrentMonth = false;\r\n } else {\r\n cellJd = offset + 1;\r\n }\r\n\r\n const date = jalaliToGregorianDate(cellJy, cellJm, cellJd);\r\n cells.push({\r\n ymd: { jy: cellJy, jm: cellJm, jd: cellJd },\r\n date,\r\n inCurrentMonth,\r\n weekday: i % 7,\r\n });\r\n }\r\n return cells;\r\n}\r\n\r\nexport type DateRangeValue = {\r\n start: Date | null;\r\n end: Date | null;\r\n};\r\n\r\nexport function isDateInRange(date: Date, range: DateRangeValue): boolean {\r\n if (!range.start) return false;\r\n if (!range.end) return sameJalaliDay(date, range.start);\r\n const t = utcNoon(date).getTime();\r\n const a = utcNoon(range.start).getTime();\r\n const b = utcNoon(range.end).getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n}\r\n\r\nfunction utcNoon(date: Date): Date {\r\n return new Date(\r\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12),\r\n );\r\n}\r\n","export type ThemeParams = {\r\n backgroundColor: string;\r\n foregroundColor: string;\r\n accentColor: string;\r\n headerBackgroundColor: string;\r\n rowStripeColor: string;\r\n rowSelectedColor: string;\r\n borderColor: string;\r\n dangerColor: string;\r\n searchMatchColor: string;\r\n fontFamily: string;\r\n rowHeight: number;\r\n cellFontSize: number;\r\n borderRadius: string;\r\n};\r\n\r\nexport type ThemeCssVars = Record<string, string>;\r\n\r\n/** `--erp-*` mirrors `--pdg-*` for one version (PR-87 / D13). */\r\nfunction aliasErpTokens(vars: ThemeCssVars): ThemeCssVars {\r\n const out: ThemeCssVars = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (key.startsWith('--pdg-')) {\r\n out[`--erp-${key.slice('--pdg-'.length)}`] = value;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport class GridTheme {\r\n constructor(\r\n readonly params: ThemeParams,\r\n readonly extraCssVars: ThemeCssVars = {},\r\n ) {}\r\n\r\n withParams(partial: Partial<ThemeParams>): GridTheme {\r\n return new GridTheme({ ...this.params, ...partial }, this.extraCssVars);\r\n }\r\n\r\n withExtraCssVars(extra: ThemeCssVars): GridTheme {\r\n return new GridTheme(this.params, { ...this.extraCssVars, ...extra });\r\n }\r\n\r\n toCssVars(): ThemeCssVars {\r\n const p = this.params;\r\n const roles: ThemeCssVars = {\r\n '--pdg-bg': p.backgroundColor,\r\n '--pdg-fg': p.foregroundColor,\r\n '--pdg-accent': p.accentColor,\r\n '--pdg-header-bg': p.headerBackgroundColor,\r\n '--pdg-row-stripe': p.rowStripeColor,\r\n '--pdg-row-selected': p.rowSelectedColor,\r\n '--pdg-border': p.borderColor,\r\n '--pdg-danger': p.dangerColor,\r\n '--pdg-search-match': p.searchMatchColor,\r\n '--pdg-font': p.fontFamily,\r\n '--pdg-row-height': `${p.rowHeight}px`,\r\n '--pdg-font-size': `${p.cellFontSize}px`,\r\n '--pdg-radius': p.borderRadius,\r\n };\r\n return {\r\n ...roles,\r\n ...aliasErpTokens(roles),\r\n ...this.extraCssVars,\r\n ...aliasErpTokens(this.extraCssVars),\r\n };\r\n }\r\n}\r\n\r\n/** Default grid chrome — same computed colors as the CSS palette aliases. */\r\nexport const themeDefault = new GridTheme({\r\n backgroundColor: '#fff',\r\n foregroundColor: '#292929',\r\n accentColor: '#0658b0',\r\n headerBackgroundColor: '#f4f4f4',\r\n rowStripeColor: '#ddecfd',\r\n rowSelectedColor: '#dbeafe',\r\n borderColor: '#ececec',\r\n dangerColor: '#dc2626',\r\n searchMatchColor: '#facc15',\r\n fontFamily: 'IRANSans, Tahoma, sans-serif',\r\n rowHeight: 40,\r\n cellFontSize: 12,\r\n borderRadius: '0.25rem',\r\n});\r\n\r\n/** @deprecated Use {@link themeDefault}. Removed in 1.0.0. */\r\nexport const themeErp = themeDefault;\r\n\r\n/** Dark chrome. Palette extras keep leftover gray utilities readable. */\r\nconst DARK_PALETTE_VARS: ThemeCssVars = {\r\n '--pdg-main-white': '#171717',\r\n '--pdg-main-black': '#f4f4f4',\r\n '--pdg-gray-3': '#262626',\r\n '--pdg-gray-5': '#404040',\r\n '--pdg-gray-6': '#525252',\r\n '--pdg-gray-7': '#a3a3a3',\r\n '--pdg-gray-8': '#d4d4d4',\r\n '--pdg-gray-85': '#d4d4d4',\r\n '--pdg-gray-9': '#e5e5e5',\r\n '--pdg-gray-10': '#f5f5f5',\r\n '--pdg-gray-11': '#fafafa',\r\n '--pdg-black-6': '#f4f4f4',\r\n '--pdg-blue-6': '#60a5fa',\r\n '--pdg-blue-11': '#1e3a5f',\r\n '--pdg-blue-100': '#1e3a8a',\r\n '--pdg-red-100': '#7f1d1d',\r\n '--pdg-red-300': '#fca5a5',\r\n '--pdg-red-600': '#f87171',\r\n '--pdg-yellow-200': '#854d0e',\r\n '--pdg-yellow-400': '#eab308',\r\n '--pdg-zinc-200': '#3f3f46',\r\n '--pdg-neutral-500': '#a3a3a3',\r\n '--pdg-gray-100': '#27272a',\r\n '--pdg-scrollbar': '#525252',\r\n '--pdg-overlay': 'rgba(0, 0, 0, 0.55)',\r\n};\r\n\r\nexport const themeDark = themeDefault\r\n .withParams({\r\n backgroundColor: '#171717',\r\n foregroundColor: '#f4f4f4',\r\n accentColor: '#60a5fa',\r\n headerBackgroundColor: '#262626',\r\n rowStripeColor: '#1e3a5f',\r\n rowSelectedColor: '#1e3a8a',\r\n borderColor: '#404040',\r\n dangerColor: '#f87171',\r\n searchMatchColor: '#eab308',\r\n })\r\n .withExtraCssVars(DARK_PALETTE_VARS);\r\n\r\n/** @deprecated Use {@link themeDark}. Removed in 1.0.0. */\r\nexport const themeErpDark = themeDark;\r\n","import {\r\n GridTheme,\r\n type ThemeParams,\r\n themeErp,\r\n themeErpDark,\r\n} from './GridTheme';\r\n\r\nexport function themeParamsEqual(a: ThemeParams, b: ThemeParams): boolean {\r\n return (\r\n a.backgroundColor === b.backgroundColor &&\r\n a.foregroundColor === b.foregroundColor &&\r\n a.accentColor === b.accentColor &&\r\n a.headerBackgroundColor === b.headerBackgroundColor &&\r\n a.rowStripeColor === b.rowStripeColor &&\r\n a.rowSelectedColor === b.rowSelectedColor &&\r\n a.borderColor === b.borderColor &&\r\n a.dangerColor === b.dangerColor &&\r\n a.searchMatchColor === b.searchMatchColor &&\r\n a.fontFamily === b.fontFamily &&\r\n a.rowHeight === b.rowHeight &&\r\n a.cellFontSize === b.cellFontSize &&\r\n a.borderRadius === b.borderRadius\r\n );\r\n}\r\n\r\nexport function isStockLightTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErp.params);\r\n}\r\n\r\nexport function isStockDarkTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErpDark.params);\r\n}\r\n\r\n/** Built-in light/dark. Any `withParams` change locks the product toggle. */\r\nexport function isStockTheme(theme: GridTheme): boolean {\r\n return isStockLightTheme(theme) || isStockDarkTheme(theme);\r\n}\r\n\r\nexport function resolveActiveTheme(input: {\r\n requested?: GridTheme;\r\n preferDark: boolean;\r\n}): { theme: GridTheme; locked: boolean } {\r\n const requested = input.requested ?? themeErp;\r\n const locked = !isStockTheme(requested);\r\n if (locked) return { theme: requested, locked: true };\r\n return {\r\n theme: input.preferDark ? themeErpDark : themeErp,\r\n locked: false,\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { GridTheme, ThemeCssVars } from './GridTheme';\r\nimport { themeErp } from './GridTheme';\r\n\r\nlet lastVars: ThemeCssVars = themeErp.toCssVars();\r\n\r\nexport function rememberThemeVars(vars: ThemeCssVars): void {\r\n lastVars = vars;\r\n}\r\n\r\nexport function getRememberedThemeVars(): ThemeCssVars {\r\n return lastVars;\r\n}\r\n\r\nexport function themeToStyle(\r\n theme: GridTheme,\r\n extra?: CSSProperties,\r\n): CSSProperties {\r\n return { ...theme.toCssVars(), ...extra } as CSSProperties;\r\n}\r\n\r\n/** Copy last (or given) theme vars onto an imperative DOM node (toasts). */\r\nexport function assignThemeVars(\r\n el: HTMLElement,\r\n vars: ThemeCssVars = lastVars,\r\n): void {\r\n for (const [key, value] of Object.entries(vars)) {\r\n el.style.setProperty(key, value);\r\n }\r\n}\r\n","import {\r\n getLocalePack,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n} from '../locales';\r\n\r\nexport type { ERPTableLocale, ERPTableMessages } from '../locales';\r\nexport {\r\n arMessages,\r\n enMessages,\r\n faMessages,\r\n formatLocaleDate,\r\n formatLocaleNumber,\r\n getLocalePack,\r\n LOCALE_META,\r\n LOCALE_PACKS,\r\n resolveDirection,\r\n resolveLocaleMeta,\r\n} from '../locales';\r\nexport type { LocaleMeta, NumberingSystem } from '../locales';\r\n\r\n/** @deprecated Prefer `faMessages` from `persian-data-grid/locales/fa`. */\r\nexport const FA_MESSAGES: ERPTableMessages = getLocalePack('fa');\r\n/** @deprecated Prefer `enMessages` from `persian-data-grid/locales/en`. */\r\nexport const EN_MESSAGES: ERPTableMessages = getLocalePack('en');\r\n/** Arabic pack alias (PR-127). */\r\nexport const AR_MESSAGES: ERPTableMessages = getLocalePack('ar');\r\n\r\nexport function translate(\r\n key: string,\r\n locale: ERPTableLocale,\r\n overrides?: Partial<ERPTableMessages>,\r\n): string {\r\n const pack = getLocalePack(locale);\r\n return overrides?.[key] ?? pack[key] ?? key;\r\n}\r\n\r\n/** Replace `{name}` tokens in a message template (PR-125). */\r\nexport function formatMessage(\r\n template: string,\r\n vars: Record<string, string | number>,\r\n): string {\r\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\r\n const value = vars[name];\r\n return value == null ? `{${name}}` : String(value);\r\n });\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from 'react';\r\n\r\nimport type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport type { UseDependOnHook } from './dependOn';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport type { ColumnMenuItemsConfig } from '../../engine/dataOps/columnMenu';\r\nimport {\r\n gregorianAdapter,\r\n jalaliAdapter,\r\n} from '../../infrastructure/date';\r\nimport type { CellComponentMap } from '../cellRenderer/cellRegistry';\r\nimport type { ColumnMenuActionEvent } from '../desktop/ColumnMenuPopover';\r\nimport type { FilterComponentMap } from '../filters';\r\nimport {\r\n GridTheme,\r\n rememberThemeVars,\r\n themeErp,\r\n themeToStyle,\r\n} from '../theme';\r\nimport {\r\n formatMessage,\r\n resolveDirection,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n type NumberingSystem,\r\n translate,\r\n} from './messages';\r\n\r\nexport type ERPTableToastKind = 'success' | 'error';\r\n\r\nexport type ERPTableHostValue = {\r\n locale: ERPTableLocale;\r\n direction: 'rtl' | 'ltr';\r\n /** Intl digit system (PR-127). Default from locale meta. */\r\n numberingSystem?: NumberingSystem;\r\n /**\r\n * Calendar port (PR-128 / D21). Default: `jalaliAdapter` for `fa`,\r\n * otherwise `gregorianAdapter`.\r\n */\r\n dateAdapter?: DateAdapter;\r\n remoteApi?: RemoteApi;\r\n messages?: Partial<ERPTableMessages>;\r\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\r\n theme?: GridTheme;\r\n themeToggle?: boolean;\r\n themeLocked?: boolean;\r\n onToggleTheme?: () => void;\r\n components?: CellComponentMap;\r\n /** Custom column filter UIs (PR-95). Keys match `ColumnDef.filter`. */\r\n filterComponents?: FilterComponentMap;\r\n /** Column header menu items (PR-114). */\r\n columnMenuItems?: ColumnMenuItemsConfig;\r\n /** Custom column menu action handler (PR-114). */\r\n onColumnMenuAction?: (event: ColumnMenuActionEvent) => void;\r\n /**\r\n * Resolves `dependOn` values for remote lists (e.g. from the form that owns\r\n * the grid — Redux, React context, …). Default: static item values.\r\n */\r\n useDependOn?: UseDependOnHook;\r\n};\r\n\r\nfunction defaultDateAdapter(locale: ERPTableLocale): DateAdapter {\r\n return locale === 'fa' ? jalaliAdapter : gregorianAdapter;\r\n}\r\n\r\nconst ERPTableHostContext = createContext<ERPTableHostValue>({\r\n locale: 'fa',\r\n direction: 'rtl',\r\n dateAdapter: jalaliAdapter,\r\n theme: themeErp,\r\n themeToggle: true,\r\n themeLocked: false,\r\n});\r\n\r\nexport function ERPTableHostProvider({\r\n children,\r\n locale = 'fa',\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages: messagesProp,\r\n onToast: onToastProp,\r\n theme = themeErp,\r\n themeToggle = true,\r\n themeLocked = false,\r\n onToggleTheme,\r\n components: componentsProp,\r\n filterComponents: filterComponentsProp,\r\n columnMenuItems: columnMenuItemsProp,\r\n onColumnMenuAction: onColumnMenuActionProp,\r\n useDependOn: useDependOnProp,\r\n}: ERPTableHostValue & { children: ReactNode }) {\r\n // Host-injection fields fall back to an outer provider (the host app wraps\r\n // the grid); explicit props always win.\r\n const outer = useContext(ERPTableHostContext);\r\n const messages = messagesProp ?? outer.messages;\r\n const onToast = onToastProp ?? outer.onToast;\r\n const components = componentsProp ?? outer.components;\r\n const filterComponents = filterComponentsProp ?? outer.filterComponents;\r\n const columnMenuItems = columnMenuItemsProp ?? outer.columnMenuItems;\r\n const onColumnMenuAction = onColumnMenuActionProp ?? outer.onColumnMenuAction;\r\n const useDependOn = useDependOnProp ?? outer.useDependOn;\r\n const value = useMemo<ERPTableHostValue>(\r\n () => ({\r\n locale,\r\n direction: resolveDirection(locale, direction),\r\n numberingSystem,\r\n dateAdapter: dateAdapter ?? defaultDateAdapter(locale),\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n }),\r\n [\r\n locale,\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n rememberThemeVars(theme.toCssVars());\r\n }, [theme]);\r\n\r\n return (\r\n <ERPTableHostContext.Provider value={value}>\r\n {children}\r\n </ERPTableHostContext.Provider>\r\n );\r\n}\r\n\r\nexport function useERPTableHost(): ERPTableHostValue {\r\n return useContext(ERPTableHostContext);\r\n}\r\n\r\nexport function useERPTableTheme(): GridTheme {\r\n return useERPTableHost().theme ?? themeErp;\r\n}\r\n\r\n/** Merge theme CSS vars into a portal node that mounts on `document.body`. */\r\nexport function useThemePortalStyle(extra?: CSSProperties): CSSProperties {\r\n const theme = useERPTableTheme();\r\n return themeToStyle(theme, extra);\r\n}\r\n\r\n/** Stable per locale / messages — safe as an effect dependency. */\r\nexport function useTranslations() {\r\n const { locale, messages } = useERPTableHost();\r\n return useCallback(\r\n (key: string, vars?: Record<string, string | number>) => {\r\n const raw = translate(key, locale, messages);\r\n return vars ? formatMessage(raw, vars) : raw;\r\n },\r\n [locale, messages],\r\n );\r\n}\r\n\r\nexport function useLocale(): ERPTableLocale {\r\n return useERPTableHost().locale;\r\n}\r\n\r\nexport function useNumberingSystem(): NumberingSystem | undefined {\r\n return useERPTableHost().numberingSystem;\r\n}\r\n\r\nexport function useDateAdapter(): DateAdapter {\r\n return useERPTableHost().dateAdapter ?? jalaliAdapter;\r\n}\r\n\r\nexport function useDirection(): 'rtl' | 'ltr' {\r\n return useERPTableHost().direction;\r\n}\r\n","\"use client\";\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\n/** One dependency: a named sibling field and (optionally) its current value. */\r\nexport type DependOnItem =\r\n | string\r\n | { fieldName: string; value?: unknown };\r\nexport type DependOn = DependOnItem | DependOnItem[];\r\n\r\nexport type DependValueResolver = (item: DependOnItem) => unknown;\r\n\r\nexport type UseDependOnOptions = {\r\n /**\r\n * Ask the host to resolve dependency values (e.g. from the form that owns\r\n * the grid). When false/omitted, the `value` carried by each item is used.\r\n */\r\n enabled?: boolean;\r\n /** Send `value.value` when a resolved value is an option-like object. */\r\n unwrapObjectValue?: boolean;\r\n};\r\n\r\nexport type UseDependOnResult = {\r\n /** `{ [fieldName]: value }` to merge into a remote request body. */\r\n dependencyBody: Record<string, unknown>;\r\n /** Every dependency has a value (true when there is no dependOn). */\r\n isReady: boolean;\r\n /** Stable string that changes when the dependencies change. */\r\n dependencyKey: string;\r\n};\r\n\r\n/**\r\n * Host-injectable dependency resolver. The arianERP host implements this on\r\n * top of Redux page data; the default implementation reads the static values\r\n * carried by the `dependOn` items.\r\n */\r\nexport type UseDependOnHook = (\r\n dependOn?: DependOn | null,\r\n options?: UseDependOnOptions,\r\n) => UseDependOnResult;\r\n\r\nconst toList = (dependOn?: DependOn | null): DependOnItem[] =>\r\n !dependOn ? [] : Array.isArray(dependOn) ? dependOn : [dependOn];\r\n\r\nexport const getDependFieldName = (item: DependOnItem): string =>\r\n typeof item === 'string' ? item : item.fieldName;\r\n\r\n/** The value carried by the item itself; a bare field name carries none. */\r\nexport const getStaticDependValue: DependValueResolver = (item) =>\r\n typeof item === 'object' ? item.value : undefined;\r\n\r\n/** True when every dependency resolves to a non-null value (or there are none). */\r\nexport const hasDependValue = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): boolean => toList(dependOn).every((item) => resolve(item) != null);\r\n\r\n/** Builds the `{ [fieldName]: value }` part of a request body. */\r\nexport const buildDependencyBody = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): Record<string, unknown> =>\r\n Object.fromEntries(\r\n toList(dependOn).map((item) => [getDependFieldName(item), resolve(item)]),\r\n );\r\n\r\n/** Default `UseDependOnHook`: static values carried by the items. */\r\nexport const useStaticDependOn: UseDependOnHook = (dependOn, options) => {\r\n const unwrap = (value: unknown) =>\r\n options?.unwrapObjectValue &&\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n 'value' in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n const resolve: DependValueResolver = (item) => unwrap(getStaticDependValue(item));\r\n return {\r\n isReady: hasDependValue(dependOn, resolve),\r\n dependencyBody: buildDependencyBody(dependOn, resolve),\r\n dependencyKey: JSON.stringify(dependOn ?? null),\r\n };\r\n};\r\n\r\n/** Resolve dependency values through the host hook, falling back to static. */\r\nexport const useHostDependOn: UseDependOnHook = (dependOn, options) => {\r\n const host = useERPTableHost();\r\n const hook = host.useDependOn ?? useStaticDependOn;\r\n return hook(dependOn, options);\r\n};\r\n","import type { EventStore } from '../../application/ports/EventStore';\r\nimport {\r\n subscribeCatalogHostEvents,\r\n type CatalogHostEventHandlers,\r\n type CellFocusedEvent,\r\n type SelectionChangedEvent,\r\n} from '../../application/events/hostGridEvents';\r\nimport type { GridApi } from '../../infrastructure/ui/createGridApi';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\nexport type GridReadyEvent<TRow = unknown> = {\r\n api: GridApi<TRow>;\r\n};\r\n\r\nexport type GridHostEventHandlers<TRow = unknown> = CatalogHostEventHandlers<TRow> & {\r\n onSelectionChanged?: (event: SelectionChangedEvent<TRow>) => void;\r\n onCellFocused?: (event: CellFocusedEvent) => void;\r\n onGridReady?: (event: GridReadyEvent<TRow>) => void;\r\n};\r\n\r\nfunction selectedKeysEqual(\r\n a: Record<number, boolean> | null | undefined,\r\n b: Record<number, boolean> | null | undefined,\r\n): boolean {\r\n const left = Object.keys(a ?? {});\r\n const right = Object.keys(b ?? {});\r\n if (left.length !== right.length) return false;\r\n return left.every((key) => {\r\n const id = Number(key);\r\n return Boolean(a?.[id]) === Boolean(b?.[id]);\r\n });\r\n}\r\n\r\nfunction activeCellEqual(\r\n a: { rowId?: number; columnId?: string } | null | undefined,\r\n b: { rowId?: number; columnId?: string } | null | undefined,\r\n): boolean {\r\n return a?.rowId === b?.rowId && a?.columnId === b?.columnId;\r\n}\r\n\r\nfunction selectedRowIds(\r\n selected: Record<number, boolean> | null | undefined,\r\n): number[] {\r\n return Object.keys(selected ?? {})\r\n .map(Number)\r\n .filter((id) => Number.isFinite(id) && Boolean(selected?.[id]));\r\n}\r\n\r\n/**\r\n * Subscribe to EVENT_CATALOG (`EventStore`) plus the existing view store\r\n * (selection / focus). One unsubscribe. Not a second event bus.\r\n */\r\nexport function bindGridHostEvents<TRow = unknown>(\r\n input: {\r\n eventStore: EventStore;\r\n controller: UITableController;\r\n tableKey: string;\r\n handlers: GridHostEventHandlers<TRow>;\r\n },\r\n): () => void {\r\n const { eventStore, controller, tableKey, handlers } = input;\r\n\r\n const unsubCatalog = subscribeCatalogHostEvents(\r\n eventStore,\r\n {\r\n tableId: tableKey,\r\n getRowData: (rowId) =>\r\n controller.getAllRows()?.find((row) => row.id.value === rowId)?.data as\r\n | TRow\r\n | undefined,\r\n getAllRowData: () =>\r\n (controller.getAllRows() ?? [])\r\n .map((row) => row.data)\r\n .filter((data): data is TRow => data !== undefined),\r\n },\r\n handlers,\r\n );\r\n\r\n const unsubSelection = controller.subscribeSelected(\r\n () => controller.getSelectedRows(),\r\n (selected) => {\r\n const ids = selectedRowIds(selected);\r\n const rows = controller.getAllRows() ?? [];\r\n const selectedRows = ids\r\n .map((id) => rows.find((row) => row.id.value === id)?.data)\r\n .filter((data): data is TRow => data !== undefined);\r\n handlers.onSelectionChanged?.({\r\n selectedRowIds: ids,\r\n selectedRows,\r\n });\r\n },\r\n selectedKeysEqual,\r\n );\r\n\r\n const unsubFocus = controller.subscribeSelected(\r\n () => controller.getActiveCell(),\r\n (cell) => {\r\n handlers.onCellFocused?.({\r\n rowId: cell?.rowId ?? null,\r\n colId: cell?.columnId ?? null,\r\n });\r\n },\r\n activeCellEqual,\r\n );\r\n\r\n return () => {\r\n unsubCatalog();\r\n unsubSelection();\r\n unsubFocus();\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst QUERIES: Record<string, string> = {\r\n XLUP: '(min-width: 1024px)',\r\n XXLUP: '(min-width: 1366px)',\r\n};\r\n\r\nexport function useMediaQuery(query: string): { match: boolean | null } {\r\n const media = QUERIES[query] ?? query;\r\n const [match, setMatch] = useState<boolean | null>(() => {\r\n if (typeof window === 'undefined') return null;\r\n return window.matchMedia(media).matches;\r\n });\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(media);\r\n const onChange = () => setMatch(mql.matches);\r\n onChange();\r\n mql.addEventListener('change', onChange);\r\n return () => mql.removeEventListener('change', onChange);\r\n }, [media]);\r\n\r\n return { match };\r\n}\r\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\n/** Latest `onToast` without making callers' callbacks/effects depend on its identity. */\r\nfunction useLatest<T>(value: T) {\r\n const ref = useRef(value);\r\n ref.current = value;\r\n return ref;\r\n}\r\n\r\nfunction errorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : 'Remote request failed';\r\n}\r\n\r\ntype UseRemoteQueryArgs = {\r\n url?: string;\r\n body?: Record<string, unknown>;\r\n skip?: boolean;\r\n noCache?: boolean;\r\n};\r\n\r\nexport function useRemoteQuery<T = unknown>(args: UseRemoteQueryArgs) {\r\n const { remoteApi, onToast } = useERPTableHost();\r\n const toastRef = useLatest(onToast);\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n const [error, setError] = useState<unknown>(null);\r\n\r\n const refetch = useCallback(async () => {\r\n if (!args.url || args.skip || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n setError(null);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({\r\n endpoint: args.url,\r\n params: args.body,\r\n method: 'POST',\r\n });\r\n setData(response ?? null);\r\n } catch (e) {\r\n // Never let a backend failure escape from an effect as an unhandled rejection.\r\n setData(null);\r\n setError(e);\r\n toastRef.current?.('error', errorMessage(e), e);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n }, [args.url, args.skip, args.noCache, JSON.stringify(args.body ?? {}), remoteApi]);\r\n\r\n useEffect(() => {\r\n void refetch();\r\n }, [refetch]);\r\n\r\n return { data, isFetching, error, refetch };\r\n}\r\n\r\n/**\r\n * Imperative counterpart of {@link useRemoteQuery} (RTK `useGet…Mutation`\r\n * style): nothing is fetched until `trigger` is called, and body/url changes\r\n * never refetch on their own.\r\n */\r\nexport function useLazyRemote<T = unknown>() {\r\n const { remoteApi, onToast } = useERPTableHost();\r\n const toastRef = useLatest(onToast);\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n const [error, setError] = useState<unknown>(null);\r\n\r\n const trigger = useCallback(\r\n async (args: { url?: string; body?: Record<string, unknown> }) => {\r\n if (!args.url || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n setError(null);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({ endpoint: args.url, params: args.body, method: 'POST' });\r\n setData(response ?? null);\r\n } catch (e) {\r\n // Resolves (never rejects): failures surface via `error` and `onToast`.\r\n setData(null);\r\n setError(e);\r\n toastRef.current?.('error', errorMessage(e), e);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n },\r\n [remoteApi],\r\n );\r\n\r\n return [trigger, { data, isFetching, error }] as const;\r\n}\r\n","import { assignThemeVars } from '../theme';\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\nexport function showSuccessToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('success', text);\r\n}\r\n\r\nexport function showErrorToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('error', text);\r\n}\r\n\r\nfunction emitToast(kind: 'success' | 'error', message: string): void {\r\n if (typeof document === 'undefined') return;\r\n const existing = document.querySelector('.erp-table-toast');\r\n existing?.remove();\r\n const el = document.createElement('div');\r\n el.className = `erp-table-toast is-${kind}`;\r\n el.textContent = message;\r\n assignThemeVars(el);\r\n document.body.appendChild(el);\r\n window.setTimeout(() => el.remove(), 2800);\r\n}\r\n\r\n/** Host can wrap this if it wants toasts routed through its own UI. */\r\nexport function useHostToast() {\r\n const host = useERPTableHost();\r\n return {\r\n success: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('success', message, detail);\r\n else showSuccessToast(message, detail);\r\n },\r\n error: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('error', message, detail);\r\n else showErrorToast(message, detail);\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport {\r\n bindGridHostEvents,\r\n type GridHostEventHandlers,\r\n} from './bindGridHostEvents';\r\n\r\nexport type UseGridHostEventsInput<TRow = unknown> = GridHostEventHandlers<TRow> & {\r\n ready: boolean;\r\n controller: UITableController | null;\r\n eventStore: EventStore | null;\r\n tableKey: string;\r\n};\r\n\r\n/**\r\n * ERPTable wiring for PR-85. Handlers are read from a ref so EventStore\r\n * subscribeAll is not torn down when the host passes inline lambdas.\r\n */\r\nexport function useGridHostEvents<TRow = unknown>(\r\n input: UseGridHostEventsInput<TRow>,\r\n): void {\r\n const handlersRef = useRef<GridHostEventHandlers<TRow>>(input);\r\n handlersRef.current = input;\r\n\r\n useEffect(() => {\r\n if (!input.ready || !input.controller || !input.eventStore) return;\r\n return bindGridHostEvents<TRow>({\r\n eventStore: input.eventStore,\r\n controller: input.controller,\r\n tableKey: input.tableKey,\r\n handlers: {\r\n onCellValueChanged: (event) =>\r\n handlersRef.current.onCellValueChanged?.(event),\r\n onRowValueChanged: (event) =>\r\n handlersRef.current.onRowValueChanged?.(event),\r\n onRowDataUpdated: (event) =>\r\n handlersRef.current.onRowDataUpdated?.(event),\r\n onSelectionChanged: (event) =>\r\n handlersRef.current.onSelectionChanged?.(event),\r\n onCellFocused: (event) => handlersRef.current.onCellFocused?.(event),\r\n },\r\n });\r\n }, [input.ready, input.controller, input.eventStore, input.tableKey]);\r\n}\r\n"]}
@@ -25,7 +25,7 @@ function logError(audit, error, context) {
25
25
  });
26
26
  }
27
27
  }
28
- async function applyRemoteVisibilityRules(dynamic, input) {
28
+ async function applyRemoteVisibilityRules(dynamic, input, audit) {
29
29
  const {
30
30
  table,
31
31
  rowId,
@@ -34,34 +34,41 @@ async function applyRemoteVisibilityRules(dynamic, input) {
34
34
  clearDependents = true
35
35
  } = input;
36
36
  const meta = dynamic?.columnMeta;
37
- if (!meta) return;
37
+ if (!meta) return true;
38
38
  const colKey = `${table.getActiveCollectionName() ?? "default"}_${changedColumnId.value}`;
39
39
  const changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);
40
40
  const resolveOn = changedMeta?.resolveOn;
41
- if (!resolveOn) return;
42
- if (resolveOn.fieldName !== changedColumnId.value) return;
41
+ if (!resolveOn) return true;
42
+ if (resolveOn.fieldName !== changedColumnId.value) return true;
43
43
  const row = table.getRows().find((r) => r.id.value === rowId.value);
44
- if (!row) return;
44
+ if (!row) return true;
45
45
  const rowValues = {};
46
46
  for (const [colId, cell] of row.getCells().entries()) {
47
47
  rowValues[colId] = cell.getValue();
48
48
  }
49
- if (newValue == null || newValue === "") return;
49
+ if (newValue == null || newValue === "") return true;
50
50
  const params = typeof resolveOn.buildParams === "function" ? resolveOn.buildParams(rowValues) : { value: newValue };
51
- const response = await dynamic.remoteApi.request({
52
- endpoint: resolveOn.endpoint,
53
- params,
54
- method: "POST"
55
- });
56
- resolveOn.getResponse?.(response, row);
57
- const flags = resolveOn.mapFlags?.(response) ?? {};
51
+ let response;
52
+ let failed = false;
53
+ try {
54
+ response = await dynamic.remoteApi.request({
55
+ endpoint: resolveOn.endpoint,
56
+ params,
57
+ method: "POST"
58
+ });
59
+ } catch (error) {
60
+ failed = true;
61
+ if (audit) logError(audit, error, `resolveOn[${resolveOn.endpoint}]`);
62
+ }
63
+ if (!failed) resolveOn.getResponse?.(response, row);
64
+ const flags = failed ? {} : resolveOn.mapFlags?.(response) ?? {};
58
65
  const toShow = [];
59
66
  const visibilityCondition = {};
60
67
  const activeCollection = table.getActiveCollectionName() ?? "default";
61
68
  meta.forEach((colCfg) => {
62
69
  if ((colCfg.fieldCollection ?? "default") !== activeCollection) return;
63
70
  const v = colCfg.visibility;
64
- if (v?.kind === "whenRemoteFlag" && v.sourceFieldName === changedColumnId.value) {
71
+ if (!failed && v?.kind === "whenRemoteFlag" && v.sourceFieldName === changedColumnId.value) {
65
72
  const colId = new chunkNTV2UUAJ_cjs.ColumnId(colCfg.fieldName);
66
73
  const schema = table.getColumnSchema(colId);
67
74
  const flagValue = flags[v.flag] ?? false;
@@ -80,7 +87,8 @@ async function applyRemoteVisibilityRules(dynamic, input) {
80
87
  if (toShow.length > 0) {
81
88
  table.addColumns(toShow);
82
89
  }
83
- row.setVisibilityCondition(visibilityCondition);
90
+ if (!failed) row.setVisibilityCondition(visibilityCondition);
91
+ return !failed;
84
92
  }
85
93
  var ChangeCellValueHandler = class {
86
94
  constructor(repo, audit, permissionPolicy, dynamic) {
@@ -169,7 +177,7 @@ var ChangeCellValueHandler = class {
169
177
  }
170
178
  /* ── helpers ─────────────────────────────────────────────────────── */
171
179
  applyRemoteVisibilityRules(input) {
172
- return applyRemoteVisibilityRules(this.dynamic, input);
180
+ return applyRemoteVisibilityRules(this.dynamic, input, this.audit);
173
181
  }
174
182
  async applyComputedColumns(input) {
175
183
  const { table, rowId, changedColumnId, remoteApi } = input;
@@ -206,8 +214,14 @@ var ChangeCellValueHandler = class {
206
214
  const targetColId = new chunkNTV2UUAJ_cjs.ColumnId(targetField);
207
215
  const schema = table.getColumnSchema(targetColId);
208
216
  if (!schema || !colCfg.computed) continue;
209
- const rawValue = colCfg.computed.compute(rowValues, remoteApi);
210
- const newValue = rawValue instanceof Promise ? await rawValue : rawValue;
217
+ let newValue;
218
+ try {
219
+ const rawValue = colCfg.computed.compute(rowValues, remoteApi);
220
+ newValue = rawValue instanceof Promise ? await rawValue : rawValue;
221
+ } catch (error) {
222
+ logError(this.audit, error, `computed[${targetField}]`);
223
+ continue;
224
+ }
211
225
  const validated = this.validateCellValue(schema.fieldType, newValue);
212
226
  if (validated.value instanceof Promise) {
213
227
  throw new Error(
@@ -445,7 +459,7 @@ var ApplyDynamicProjectionHandler = class {
445
459
  }
446
460
  /* ── helpers (identical to ChangeCellValueHandler) ───────────────── */
447
461
  applyRemoteVisibilityRules(input) {
448
- return applyRemoteVisibilityRules(this.dynamic, input);
462
+ return applyRemoteVisibilityRules(this.dynamic, input, this.audit);
449
463
  }
450
464
  async applyComputedColumns(input) {
451
465
  const { table, rowId, changedColumnId, remoteApi } = input;
@@ -480,8 +494,14 @@ var ApplyDynamicProjectionHandler = class {
480
494
  const targetColId = new chunkNTV2UUAJ_cjs.ColumnId(targetField);
481
495
  const schema = table.getColumnSchema(targetColId);
482
496
  if (!schema || !colCfg.computed) continue;
483
- const rawValue = colCfg.computed.compute(rowValues, remoteApi);
484
- const newValue = rawValue instanceof Promise ? await rawValue : rawValue;
497
+ let newValue;
498
+ try {
499
+ const rawValue = colCfg.computed.compute(rowValues, remoteApi);
500
+ newValue = rawValue instanceof Promise ? await rawValue : rawValue;
501
+ } catch (error) {
502
+ logError(this.audit, error, `computed[${targetField}]`);
503
+ continue;
504
+ }
485
505
  const validated = this.validateCellValue(schema.fieldType, newValue);
486
506
  if (validated.value instanceof Promise) {
487
507
  throw new Error(`Computed column "${targetField}" returned a Promise after validation`);
@@ -564,5 +584,5 @@ exports.ChangeCellValueHandler = ChangeCellValueHandler;
564
584
  exports.SaveDescriptionHandler = SaveDescriptionHandler;
565
585
  exports.applyRemoteVisibilityRules = applyRemoteVisibilityRules;
566
586
  exports.logError = logError;
567
- //# sourceMappingURL=chunk-DXRCYW42.cjs.map
568
- //# sourceMappingURL=chunk-DXRCYW42.cjs.map
587
+ //# sourceMappingURL=chunk-52LFOPXD.cjs.map
588
+ //# sourceMappingURL=chunk-52LFOPXD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../application/handlers/cellCommandsHandler.ts"],"names":["DomainError","ColumnId","RowId"],"mappings":"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","file":"chunk-52LFOPXD.cjs","sourcesContent":["// application/handlers/cellCommandsHandler.ts\r\n\r\nimport {\r\n ColumnSchema,\r\n FieldType,\r\n} from '../../bootstrap/type';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ColumnId,\r\n RowId,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport {\r\n ApplyDynamicProjectionCommand,\r\n ChangeCellDisplayValueCommand,\r\n ChangeCellValueCommand,\r\n SaveDescriptionCommand,\r\n} from '../commands';\r\nimport { TableEvent } from '../events';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { RemoteApi } from '../ports/RemoteApi';\r\nimport { TableRepository } from '../ports/TableRepository';\r\n\r\nexport type DynamicConfig = {\r\n columnMeta: Map<string, ColumnSchema>;\r\n remoteApi: RemoteApi;\r\n};\r\n\r\n/* ─── shared helper ──────────────────────────────────────────────── */\r\n\r\nexport function logError(audit: AuditLogger, error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n } else if (error instanceof Error) {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n } else {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error, context },\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellValueHandler\r\n ====================================================== */\r\n\r\n/**\r\n * Remote visibility (`resolveOn`) projection shared by the cell-change, dynamic\r\n * re-projection and row-activation handlers.\r\n */\r\nexport async function applyRemoteVisibilityRules(\r\ndynamic: DynamicConfig | undefined,\r\ninput: {\r\ntable: Table;\r\nrowId: RowId;\r\nchangedColumnId: ColumnId;\r\nnewValue: unknown;\r\n/** When false (e.g. row activate / re-project), keep existing dependent cell values. */\r\nclearDependents?: boolean;\r\n},\r\n audit?: AuditLogger,\r\n): Promise<boolean> {\r\nconst {\r\n table,\r\n rowId,\r\n changedColumnId,\r\n newValue,\r\n clearDependents = true,\r\n} = input;\r\n\r\nconst meta = dynamic?.columnMeta;\r\nif (!meta) return true;\r\nconst colKey = `${table.getActiveCollectionName() ?? 'default'}_${changedColumnId.value}`;\r\nconst changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);\r\nconst resolveOn = changedMeta?.resolveOn;\r\nif (!resolveOn) return true;\r\nif (resolveOn.fieldName !== changedColumnId.value) return true;\r\n\r\nconst row = table.getRows().find(r => r.id.value === rowId.value);\r\nif (!row) return true;\r\n\r\nconst rowValues: Record<string, unknown> = {};\r\nfor (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n}\r\nif (newValue == null || newValue === '') return true;\r\nconst params =\r\n typeof resolveOn.buildParams === 'function'\r\n ? resolveOn.buildParams(rowValues)\r\n : { value: newValue };\r\nlet response: unknown;\r\nlet failed = false;\r\ntry {\r\n response = await dynamic!.remoteApi.request({\r\n endpoint: resolveOn.endpoint,\r\n params,\r\n method: 'POST',\r\n });\r\n} catch (error) {\r\n // Backend failure must never abort the cell edit: keep the current\r\n // visibility flags, still clear stale dependents, and report.\r\n failed = true;\r\n if (audit) logError(audit, error, `resolveOn[${resolveOn.endpoint}]`);\r\n}\r\n\r\nif (!failed) resolveOn.getResponse?.(response, row);\r\nconst flags: Record<string, boolean> = failed\r\n ? {}\r\n : (resolveOn.mapFlags?.(response) ?? {});\r\n\r\nconst toShow: ColumnSchema[] = [];\r\nconst visibilityCondition: Record<string, boolean> = {};\r\nconst activeCollection = table.getActiveCollectionName() ?? 'default';\r\n\r\nmeta.forEach(colCfg => {\r\n // Collection guard — same rationale as applyDynamicProjection: configs of\r\n // other collections must not react to this collection's cell changes.\r\n if ((colCfg.fieldCollection ?? 'default') !== activeCollection) return;\r\n const v = colCfg.visibility;\r\n\r\n if (\r\n !failed &&\r\n v?.kind === 'whenRemoteFlag' &&\r\n v.sourceFieldName === changedColumnId.value\r\n ) {\r\n const colId = new ColumnId(colCfg.fieldName);\r\n const schema = table.getColumnSchema(colId);\r\n const flagValue = flags[v.flag] ?? false;\r\n\r\n // کلید visibilityCondition باید fieldName باشد چون UI (cellRenderer /\r\n // moveActiveCell / isInitiallyHidden) با col.fieldName چک می‌کند.\r\n visibilityCondition[colCfg.fieldName] = flagValue;\r\n\r\n if (flagValue && schema) {\r\n toShow.push({ ...schema, hidden: false });\r\n }\r\n }\r\n\r\n const dependency = colCfg.dynamicSource?.dependsOn;\r\n if (\r\n clearDependents &&\r\n dependency &&\r\n dependency.includes(changedColumnId.value) &&\r\n !Object.hasOwn(visibilityCondition, colCfg.fieldName) &&\r\n colCfg.visibility?.kind !== 'whenTableType' &&\r\n colCfg.visibility?.kind !== 'whenCollection'\r\n ) {\r\n const cell = row.getCell(colCfg.fieldName);\r\n cell?.changeValue(null);\r\n cell?.changeDisplay(null);\r\n }\r\n});\r\n\r\nif (toShow.length > 0) {\r\n table.addColumns(toShow);\r\n}\r\n\r\nif (!failed) row.setVisibilityCondition(visibilityCondition);\r\nreturn !failed;\r\n}\r\n\r\nexport class ChangeCellValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n /* 1. schema existence */\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 2. editable policy */\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 3. permission policy */\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 4. type validation */\r\n const validated = this.validateCellValue(schema.fieldType, command.newValue);\r\n /* 5. domain mutation */\r\n const domainEvent = table.changeCell(rowId, columnId, validated.value);\r\n // Keep existing display unless a dedicated display-change command updates it.\r\n // Writing the raw value here wipes select labels (e.g. account title).\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 6. application-level side effects */\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n newValue: command.newValue,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n validatedValue: command.newValue,\r\n });\r\n }\r\n\r\n /* 7. RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === rowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n /* 8. persist */\r\n await this.repo.save(command.store, table);\r\n\r\n /* 9. output event */\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n previousValue: domainEvent.previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers ─────────────────────────────────────────────────────── */\r\n\r\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\r\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) {\r\n throw new Error('Computed cycle detected');\r\n }\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n let newValue: unknown;\r\n try {\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n } catch (error) {\r\n // A failing remote lookup inside `compute` must not discard the edit:\r\n // keep the target's current value and report.\r\n logError(this.audit, error, `computed[${targetField}]`);\r\n continue;\r\n }\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(\r\n `Computed column \"${targetField}\" returned a Promise after validation`,\r\n );\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) {\r\n return { ok: true as const, value };\r\n }\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n const activeCollection = table.getActiveCollectionName() ?? 'default';\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n // Collection guard: a column config may only be projected onto the table\r\n // when it belongs to the ACTIVE collection. Twin configs of other\r\n // collections must never leak their dynamicSource/visibility into this\r\n // collection's column map — a value in one tab must not unhide/reconfigure\r\n // the same-named column in other tabs.\r\n if ((colMeta.fieldCollection ?? 'default') !== activeCollection) return;\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellDisplayValueHandler\r\n ====================================================== */\r\n\r\nexport class ChangeCellDisplayValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellDisplayValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n const domainEvent = table.changeDisplay(rowId, columnId, command.newValue);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_DISPLAY_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n };\r\n this.audit.log({ type: 'CELL_DISPLAY_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellDisplayValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n SaveDescriptionHandler\r\n ====================================================== */\r\n\r\nexport class SaveDescriptionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: SaveDescriptionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const domainEvent = table.saveDescription(rowId, command.flag);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, flag: command.flag },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'ROW_DESCRIPTION_SAVED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n description: command.flag,\r\n };\r\n this.audit.log({ type: 'INFORMATION', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `SaveDescriptionHandler[${command.tableKey}:${command.rowId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ApplyDynamicProjectionHandler\r\n ====================================================== */\r\n\r\nexport class ApplyDynamicProjectionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ApplyDynamicProjectionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const { store, tableKey, rowId, columnId } = command;\r\n const table = await this.repo.getById(store, tableKey);\r\n\r\n try {\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n throw new DomainError('ROW_NOT_FOUND', `Row ${rowId} not found`, { rowId });\r\n }\r\n\r\n const cell = row.getCell(columnId);\r\n if (!cell) {\r\n throw new DomainError('CELL_NOT_FOUND', `Cell ${columnId} not found`, { columnId });\r\n }\r\n\r\n const colValue = cell.getValue();\r\n const previousValue = colValue;\r\n const newRowId = new RowId(rowId);\r\n const newColumnId = new ColumnId(columnId);\r\n\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n newValue: colValue,\r\n clearDependents: false,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n validatedValue: colValue,\r\n });\r\n }\r\n\r\n /* RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === newRowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n await this.repo.save(store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: tableKey,\r\n rowId: newRowId.value,\r\n columnId: newColumnId.value,\r\n newValue: colValue,\r\n previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ApplyDynamicProjectionHandler[${tableKey}:${rowId}:${columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers (identical to ChangeCellValueHandler) ───────────────── */\r\n\r\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\r\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) throw new Error('Computed cycle detected');\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n let newValue: unknown;\r\n try {\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n } catch (error) {\r\n // A failing remote lookup inside `compute` must not discard the edit:\r\n // keep the target's current value and report.\r\n logError(this.audit, error, `computed[${targetField}]`);\r\n continue;\r\n }\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(`Computed column \"${targetField}\" returned a Promise after validation`);\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) return { ok: true as const, value };\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n const activeCollection = table.getActiveCollectionName() ?? 'default';\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n // Collection guard: a column config may only be projected onto the table\r\n // when it belongs to the ACTIVE collection. Twin configs of other\r\n // collections must never leak their dynamicSource/visibility into this\r\n // collection's column map — a value in one tab must not unhide/reconfigure\r\n // the same-named column in other tabs.\r\n if ((colMeta.fieldCollection ?? 'default') !== activeCollection) return;\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkBHDRUZH5_cjs = require('./chunk-BHDRUZH5.cjs');
3
+ var chunkF6EMC75A_cjs = require('./chunk-F6EMC75A.cjs');
4
4
 
5
5
  // packages/plugins/excel/src/buildExportTable.ts
6
6
  var EMPTY_PLACEHOLDERS = /* @__PURE__ */ new Set(["\u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F", "select", "Select"]);
@@ -10,7 +10,7 @@ function cellText(source, column) {
10
10
  if (!cell) return "";
11
11
  const raw = hasMeaningfulValue(cell.display) ? cell.display : cell.value;
12
12
  if (!hasMeaningfulValue(raw)) return "";
13
- const text = chunkBHDRUZH5_cjs.formatExportValue(raw, column.fieldType).trim();
13
+ const text = chunkF6EMC75A_cjs.formatExportValue(raw, column.fieldType).trim();
14
14
  if (!text || EMPTY_PLACEHOLDERS.has(text)) return "";
15
15
  return text;
16
16
  }
@@ -34,5 +34,5 @@ function buildExportTable(source) {
34
34
  }
35
35
 
36
36
  exports.buildExportTable = buildExportTable;
37
- //# sourceMappingURL=chunk-VVGYRZ7S.cjs.map
38
- //# sourceMappingURL=chunk-VVGYRZ7S.cjs.map
37
+ //# sourceMappingURL=chunk-72IVAOTK.cjs.map
38
+ //# sourceMappingURL=chunk-72IVAOTK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/plugins/excel/src/buildExportTable.ts"],"names":["formatExportValue"],"mappings":";;;;;AAMA,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,+DAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAYtE,IAAM,qBAAqB,CAAC,KAAA,KAC1B,UAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAErD,SAAS,QAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA;AACnE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG,OAAO,EAAA;AAErC,EAAA,MAAM,OAAOA,mCAAA,CAAkB,GAAA,EAAK,MAAA,CAAO,SAAS,EAAE,IAAA,EAAK;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,kBAAA,CAAmB,GAAA,CAAI,IAAI,GAAG,OAAO,EAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,MAAA,KAC7C,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,KAAM,EAAE;AAAA,GACxD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACnC,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,OAAA,EAAS,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE;AAAA,KAC/B,CAAE,CAAA;AAAA,IACF,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,QACrB,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,GAAG,CAAC;AAAA,KACjD;AAAA,IACA,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IACrD,aAAA,EAAe,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KAC9B,OAAO,IAAI,YAAA,KAAiB,QAAA,GAAW,IAAI,YAAA,GAAe;AAAA;AAC5D,GACF;AACF","file":"chunk-VVGYRZ7S.cjs","sourcesContent":["import type {\r\n ExportColumnDef,\r\n ExportSource,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nexport type ExportTable = {\r\n columns: Array<{ fieldName: string; caption: string }>;\r\n /** Parallel to columns; already stringified cell text */\r\n rows: string[][];\r\n /** Parallel to rows (PR-122). Absent ⇒ all leaf. */\r\n rowKinds?: Array<'group' | 'leaf' | 'total'>;\r\n /** Excel outlineLevel per data row (PR-122). */\r\n outlineLevels?: number[];\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellText(\r\n source: ExportSource['rows'][number],\r\n column: ExportColumnDef,\r\n): string {\r\n const cell = source.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = hasMeaningfulValue(cell.display) ? cell.display : cell.value;\r\n if (!hasMeaningfulValue(raw)) return '';\r\n\r\n const text = formatExportValue(raw, column.fieldType).trim();\r\n if (!text || EMPTY_PLACEHOLDERS.has(text)) return '';\r\n return text;\r\n}\r\n\r\n/**\r\n * Builds a dense string matrix from ExportSource (plugin query port).\r\n */\r\nexport function buildExportTable(source: ExportSource): ExportTable {\r\n const columnsWithData = source.columns.filter((column) =>\r\n source.rows.some((row) => cellText(row, column) !== ''),\r\n );\r\n\r\n return {\r\n columns: columnsWithData.map((c) => ({\r\n fieldName: c.fieldName,\r\n caption: c.fieldCaption ?? c.fieldName,\r\n })),\r\n rows: source.rows.map((row) =>\r\n columnsWithData.map((col) => cellText(row, col)),\r\n ),\r\n rowKinds: source.rows.map((row) => row.kind ?? 'leaf'),\r\n outlineLevels: source.rows.map((row) =>\r\n typeof row.outlineLevel === 'number' ? row.outlineLevel : 0,\r\n ),\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../packages/plugins/excel/src/buildExportTable.ts"],"names":["formatExportValue"],"mappings":";;;;;AAMA,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,+DAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAYtE,IAAM,qBAAqB,CAAC,KAAA,KAC1B,UAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAErD,SAAS,QAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA;AACnE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG,OAAO,EAAA;AAErC,EAAA,MAAM,OAAOA,mCAAA,CAAkB,GAAA,EAAK,MAAA,CAAO,SAAS,EAAE,IAAA,EAAK;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,kBAAA,CAAmB,GAAA,CAAI,IAAI,GAAG,OAAO,EAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,MAAA,KAC7C,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,KAAM,EAAE;AAAA,GACxD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACnC,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,OAAA,EAAS,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE;AAAA,KAC/B,CAAE,CAAA;AAAA,IACF,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,QACrB,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,GAAG,CAAC;AAAA,KACjD;AAAA,IACA,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IACrD,aAAA,EAAe,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KAC9B,OAAO,IAAI,YAAA,KAAiB,QAAA,GAAW,IAAI,YAAA,GAAe;AAAA;AAC5D,GACF;AACF","file":"chunk-72IVAOTK.cjs","sourcesContent":["import type {\r\n ExportColumnDef,\r\n ExportSource,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nexport type ExportTable = {\r\n columns: Array<{ fieldName: string; caption: string }>;\r\n /** Parallel to columns; already stringified cell text */\r\n rows: string[][];\r\n /** Parallel to rows (PR-122). Absent ⇒ all leaf. */\r\n rowKinds?: Array<'group' | 'leaf' | 'total'>;\r\n /** Excel outlineLevel per data row (PR-122). */\r\n outlineLevels?: number[];\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellText(\r\n source: ExportSource['rows'][number],\r\n column: ExportColumnDef,\r\n): string {\r\n const cell = source.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = hasMeaningfulValue(cell.display) ? cell.display : cell.value;\r\n if (!hasMeaningfulValue(raw)) return '';\r\n\r\n const text = formatExportValue(raw, column.fieldType).trim();\r\n if (!text || EMPTY_PLACEHOLDERS.has(text)) return '';\r\n return text;\r\n}\r\n\r\n/**\r\n * Builds a dense string matrix from ExportSource (plugin query port).\r\n */\r\nexport function buildExportTable(source: ExportSource): ExportTable {\r\n const columnsWithData = source.columns.filter((column) =>\r\n source.rows.some((row) => cellText(row, column) !== ''),\r\n );\r\n\r\n return {\r\n columns: columnsWithData.map((c) => ({\r\n fieldName: c.fieldName,\r\n caption: c.fieldCaption ?? c.fieldName,\r\n })),\r\n rows: source.rows.map((row) =>\r\n columnsWithData.map((col) => cellText(row, col)),\r\n ),\r\n rowKinds: source.rows.map((row) => row.kind ?? 'leaf'),\r\n outlineLevels: source.rows.map((row) =>\r\n typeof row.outlineLevel === 'number' ? row.outlineLevel : 0,\r\n ),\r\n };\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import { formatExportValue } from './chunk-KYAOSBQN.js';
1
+ import { formatExportValue } from './chunk-GKE33FOJ.js';
2
2
 
3
3
  // packages/plugins/excel/src/buildExportTable.ts
4
4
  var EMPTY_PLACEHOLDERS = /* @__PURE__ */ new Set(["\u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F", "select", "Select"]);
@@ -32,5 +32,5 @@ function buildExportTable(source) {
32
32
  }
33
33
 
34
34
  export { buildExportTable };
35
- //# sourceMappingURL=chunk-LJ7LMEXO.js.map
36
- //# sourceMappingURL=chunk-LJ7LMEXO.js.map
35
+ //# sourceMappingURL=chunk-7GWV5HGO.js.map
36
+ //# sourceMappingURL=chunk-7GWV5HGO.js.map