persian-data-grid 0.5.0 → 0.6.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.
- package/OFL.txt +93 -0
- package/README.md +179 -22
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
- package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
- package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
- package/dist/GridPresenceService-GEH6535Q.js +3 -0
- package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
- package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
- package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
- package/dist/GridSyncService-KTLB4KP3.js +3 -0
- package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
- package/dist/GridSyncService-TAPAHABV.cjs +12 -0
- package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
- package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
- package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
- package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
- package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
- package/dist/SelectImpl-NM4O4IGW.js +447 -0
- package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
- package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
- package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
- package/dist/UITableController-Cuwq481K.d.cts +632 -0
- package/dist/UITableController-DU8RopUM.d.ts +632 -0
- package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +77 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +60 -0
- package/dist/adapters/arian-erp.d.ts +60 -0
- package/dist/adapters/arian-erp.js +71 -0
- package/dist/adapters/arian-erp.js.map +1 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
- package/dist/appendAtEnd-TJEABLGD.js +33 -0
- package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
- package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
- package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
- package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
- package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
- package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
- package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
- package/dist/chunk-2BJCRYOS.cjs +936 -0
- package/dist/chunk-2BJCRYOS.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-5ALMNLUR.cjs +1408 -0
- package/dist/chunk-5ALMNLUR.cjs.map +1 -0
- package/dist/chunk-5HKVMPBD.js +937 -0
- package/dist/chunk-5HKVMPBD.js.map +1 -0
- package/dist/chunk-633KP74Z.js +189 -0
- package/dist/chunk-633KP74Z.js.map +1 -0
- package/dist/chunk-6XBXZPBW.js +298 -0
- package/dist/chunk-6XBXZPBW.js.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-ASPTRYRD.cjs +21 -0
- package/dist/chunk-ASPTRYRD.cjs.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-BHDRUZH5.cjs +33 -0
- package/dist/chunk-BHDRUZH5.cjs.map +1 -0
- package/dist/chunk-BLYVOV3G.cjs +191 -0
- package/dist/chunk-BLYVOV3G.cjs.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-DXRCYW42.cjs +568 -0
- package/dist/chunk-DXRCYW42.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-EHHHC5JV.js +832 -0
- package/dist/chunk-EHHHC5JV.js.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-H2LESGMX.cjs +319 -0
- package/dist/chunk-H2LESGMX.cjs.map +1 -0
- package/dist/chunk-HTNJT2QU.js +11674 -0
- package/dist/chunk-HTNJT2QU.js.map +1 -0
- package/dist/chunk-IIISFUW4.cjs +11786 -0
- package/dist/chunk-IIISFUW4.cjs.map +1 -0
- package/dist/chunk-IMPCRWYP.cjs +251 -0
- package/dist/chunk-IMPCRWYP.cjs.map +1 -0
- package/dist/chunk-IPPIXOVQ.js +317 -0
- package/dist/chunk-IPPIXOVQ.js.map +1 -0
- package/dist/chunk-J4XJ4UBC.js +1404 -0
- package/dist/chunk-J4XJ4UBC.js.map +1 -0
- package/dist/chunk-J7CPPFXT.cjs +89 -0
- package/dist/chunk-J7CPPFXT.cjs.map +1 -0
- package/dist/chunk-JOICD47Q.cjs +41 -0
- package/dist/chunk-JOICD47Q.cjs.map +1 -0
- package/dist/chunk-KHMG6EI2.js +13 -0
- package/dist/chunk-KHMG6EI2.js.map +1 -0
- package/dist/chunk-KMRURD5J.cjs +15 -0
- package/dist/chunk-KMRURD5J.cjs.map +1 -0
- package/dist/chunk-KRJG3KMP.cjs +174 -0
- package/dist/chunk-KRJG3KMP.cjs.map +1 -0
- package/dist/chunk-KUBVDIF7.cjs +653 -0
- package/dist/chunk-KUBVDIF7.cjs.map +1 -0
- package/dist/chunk-KYAOSBQN.js +31 -0
- package/dist/chunk-KYAOSBQN.js.map +1 -0
- package/dist/chunk-LJ7LMEXO.js +36 -0
- package/dist/chunk-LJ7LMEXO.js.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
- package/dist/chunk-MU3RY46O.js +932 -0
- package/dist/chunk-MU3RY46O.js.map +1 -0
- package/dist/chunk-MUQQKPWR.js +84 -0
- package/dist/chunk-MUQQKPWR.js.map +1 -0
- package/dist/chunk-N7SJTINL.cjs +4 -0
- package/dist/chunk-N7SJTINL.cjs.map +1 -0
- package/dist/chunk-NTV2UUAJ.cjs +149 -0
- package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
- package/dist/chunk-PJQWHF6T.js +31 -0
- package/dist/chunk-PJQWHF6T.js.map +1 -0
- package/dist/chunk-PQY54EL5.js +248 -0
- package/dist/chunk-PQY54EL5.js.map +1 -0
- package/dist/chunk-PXCHPZTP.cjs +839 -0
- package/dist/chunk-PXCHPZTP.cjs.map +1 -0
- package/dist/chunk-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
- package/dist/chunk-QQMU44KJ.js +612 -0
- package/dist/chunk-QQMU44KJ.js.map +1 -0
- package/dist/chunk-QZN7R2WP.cjs +114 -0
- package/dist/chunk-QZN7R2WP.cjs.map +1 -0
- package/dist/chunk-RKVSJU46.js +35 -0
- package/dist/chunk-RKVSJU46.js.map +1 -0
- package/dist/chunk-RM6ZWNT3.js +561 -0
- package/dist/chunk-RM6ZWNT3.js.map +1 -0
- package/dist/chunk-SX4VQXAA.cjs +114 -0
- package/dist/chunk-SX4VQXAA.cjs.map +1 -0
- package/dist/chunk-SZ7BLAY3.js +92 -0
- package/dist/chunk-SZ7BLAY3.js.map +1 -0
- package/dist/chunk-TN4MG6FY.js +112 -0
- package/dist/chunk-TN4MG6FY.js.map +1 -0
- package/dist/chunk-UC7PHDM6.cjs +331 -0
- package/dist/chunk-UC7PHDM6.cjs.map +1 -0
- package/dist/chunk-UXVLYUUW.js +108 -0
- package/dist/chunk-UXVLYUUW.js.map +1 -0
- package/dist/chunk-VVGYRZ7S.cjs +38 -0
- package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WUMOSOEK.cjs +62 -0
- package/dist/chunk-WUMOSOEK.cjs.map +1 -0
- package/dist/chunk-XLRE2J25.js +140 -0
- package/dist/chunk-XLRE2J25.js.map +1 -0
- package/dist/chunk-Y6W5V2CI.js +19 -0
- package/dist/chunk-Y6W5V2CI.js.map +1 -0
- package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
- package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
- package/dist/date-picker-jalali.cjs +263 -0
- package/dist/date-picker-jalali.cjs.map +1 -0
- package/dist/date-picker-jalali.d.cts +62 -0
- package/dist/date-picker-jalali.d.ts +62 -0
- package/dist/date-picker-jalali.js +256 -0
- package/dist/date-picker-jalali.js.map +1 -0
- package/dist/finance.cjs +205 -0
- package/dist/finance.cjs.map +1 -0
- package/dist/finance.d.cts +90 -0
- package/dist/finance.d.ts +90 -0
- package/dist/finance.js +157 -0
- package/dist/finance.js.map +1 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
- package/dist/foldedColumn-TFURUKFG.js +64 -0
- package/dist/foldedColumn-TFURUKFG.js.map +1 -0
- package/dist/headless.cjs +729 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.cts +504 -0
- package/dist/headless.d.ts +504 -0
- package/dist/headless.js +226 -0
- package/dist/headless.js.map +1 -0
- package/dist/index-DN8M8Jkq.d.cts +14 -0
- package/dist/index-DmzL-F_o.d.ts +14 -0
- package/dist/index.cjs +8002 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +437 -2305
- package/dist/index.d.ts +437 -2305
- package/dist/index.js +7244 -11083
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.cjs +12 -0
- package/dist/locales/ar.cjs.map +1 -0
- package/dist/locales/ar.d.cts +6 -0
- package/dist/locales/ar.d.ts +6 -0
- package/dist/locales/ar.js +3 -0
- package/dist/locales/ar.js.map +1 -0
- package/dist/locales/en.cjs +12 -0
- package/dist/locales/en.cjs.map +1 -0
- package/dist/locales/en.d.cts +6 -0
- package/dist/locales/en.d.ts +6 -0
- package/dist/locales/en.js +3 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/fa.cjs +12 -0
- package/dist/locales/fa.cjs.map +1 -0
- package/dist/locales/fa.d.cts +6 -0
- package/dist/locales/fa.d.ts +6 -0
- package/dist/locales/fa.js +3 -0
- package/dist/locales/fa.js.map +1 -0
- package/dist/locales/index.cjs +51 -0
- package/dist/locales/index.cjs.map +1 -0
- package/dist/locales/index.d.cts +5 -0
- package/dist/locales/index.d.ts +5 -0
- package/dist/locales/index.js +6 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
- package/dist/memoryRecords-OJTGXLRH.js +47 -0
- package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
- package/dist/pagedKit-MFGAJFSK.cjs +134 -0
- package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
- package/dist/pagedKit-WYWY4LRV.js +127 -0
- package/dist/pagedKit-WYWY4LRV.js.map +1 -0
- package/dist/pagedSearch-HCPJW7VM.js +38 -0
- package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
- package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
- package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
- package/dist/plugins/csv.cjs +124 -0
- package/dist/plugins/csv.cjs.map +1 -0
- package/dist/plugins/csv.d.cts +44 -0
- package/dist/plugins/csv.d.ts +44 -0
- package/dist/plugins/csv.js +120 -0
- package/dist/plugins/csv.js.map +1 -0
- package/dist/plugins/excel.cjs +52 -0
- package/dist/plugins/excel.cjs.map +1 -0
- package/dist/plugins/excel.d.cts +14 -0
- package/dist/plugins/excel.d.ts +14 -0
- package/dist/plugins/excel.js +7 -0
- package/dist/plugins/excel.js.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
- package/dist/plugins/pdf.cjs +24 -0
- package/dist/plugins/pdf.cjs.map +1 -0
- package/dist/plugins/pdf.d.cts +21 -0
- package/dist/plugins/pdf.d.ts +21 -0
- package/dist/plugins/pdf.js +7 -0
- package/dist/plugins/pdf.js.map +1 -0
- package/dist/presence.cjs +56 -0
- package/dist/presence.cjs.map +1 -0
- package/dist/presence.d.cts +17 -0
- package/dist/presence.d.ts +17 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
- package/dist/styles.css +1440 -0
- package/dist/sync.cjs +148 -0
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +17 -0
- package/dist/sync.d.ts +17 -0
- package/dist/sync.js +146 -0
- package/dist/sync.js.map +1 -0
- package/dist/types-D__47BKv.d.cts +23 -0
- package/dist/types-D__47BKv.d.ts +23 -0
- package/package.json +184 -28
|
@@ -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":["useEffect","useState"],"mappings":"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","file":"chunk-QQMU44KJ.js","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 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,\r\n onToast,\r\n theme = themeErp,\r\n themeToggle = true,\r\n themeLocked = false,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n}: ERPTableHostValue & { children: ReactNode }) {\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\nexport function useTranslations() {\r\n const { locale, messages } = useERPTableHost();\r\n return (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}\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, useState } from 'react';\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\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 } = useERPTableHost();\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\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 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 } 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, 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 } = useERPTableHost();\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\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 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 } finally {\r\n setIsFetching(false);\r\n }\r\n },\r\n [remoteApi],\r\n );\r\n\r\n return [trigger, { data, isFetching }] 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"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ui/locales/en.ts
|
|
4
|
+
var enMessages = {
|
|
5
|
+
"general.addNewRow": "Add row",
|
|
6
|
+
"general.copy": "Copy",
|
|
7
|
+
"general.cut": "Cut",
|
|
8
|
+
"general.paste": "Paste",
|
|
9
|
+
"general.delete": "Delete",
|
|
10
|
+
"general.chooseFromList": "Choose from list",
|
|
11
|
+
"general.toggle": "Select all",
|
|
12
|
+
"general.exportToExcel": "Export to Excel",
|
|
13
|
+
"general.exportToExcelSuccess": "Excel export succeeded",
|
|
14
|
+
"general.exportToExcelError": "Excel export failed",
|
|
15
|
+
"general.exportToPdf": "Export to PDF",
|
|
16
|
+
"general.exportToPdfSuccess": "PDF export succeeded",
|
|
17
|
+
"general.exportToPdfError": "PDF export failed",
|
|
18
|
+
"general.importFromExcel": "Import from Excel",
|
|
19
|
+
"general.importFromExcelSuccess": "Excel import succeeded",
|
|
20
|
+
"general.importFromExcelError": "Excel import failed",
|
|
21
|
+
"general.selected": "Selected",
|
|
22
|
+
"general.search": "Search",
|
|
23
|
+
"general.selectField": "Select",
|
|
24
|
+
"general.selectPlaceholder": "Select",
|
|
25
|
+
"general.choice": "Choose column",
|
|
26
|
+
"general.prev": "Previous",
|
|
27
|
+
"general.next": "Next",
|
|
28
|
+
"general.noData": "No data",
|
|
29
|
+
"general.loading": "Loading\u2026",
|
|
30
|
+
"general.footerTotal": "Total",
|
|
31
|
+
"general.footerAvg": "Average",
|
|
32
|
+
"general.replicateRow": "Duplicate row",
|
|
33
|
+
"general.edit": "Edit",
|
|
34
|
+
"general.rowEdit": "Edit row",
|
|
35
|
+
"general.row": "Row",
|
|
36
|
+
"general.selectRow": "Select row",
|
|
37
|
+
"general.save": "Save",
|
|
38
|
+
"general.notActive": "Inactive",
|
|
39
|
+
"general.add": "Add",
|
|
40
|
+
"general.themeDark": "Dark theme",
|
|
41
|
+
"general.themeLight": "Light theme",
|
|
42
|
+
"general.toolbar": "Toolbar",
|
|
43
|
+
"general.filter": "Filter",
|
|
44
|
+
"general.filterApply": "Apply",
|
|
45
|
+
"general.filterClear": "Clear",
|
|
46
|
+
"general.filterActive": "Filter active",
|
|
47
|
+
"general.rowsIn": "rows in",
|
|
48
|
+
"general.page": "pages",
|
|
49
|
+
"general.validationInRow": "In row",
|
|
50
|
+
"general.validationInColumn": "in column",
|
|
51
|
+
"general.loadMore": "Show more ({visible} of {total})",
|
|
52
|
+
"general.searchFound": "{count} matches found",
|
|
53
|
+
"general.searchNotFound": "No matches",
|
|
54
|
+
"general.searchPosition": "{current} of {total}",
|
|
55
|
+
"columnMenu.open": "Column menu",
|
|
56
|
+
"columnMenu.sortAsc": "Sort ascending",
|
|
57
|
+
"columnMenu.sortDesc": "Sort descending",
|
|
58
|
+
"columnMenu.sortNone": "Clear sort",
|
|
59
|
+
"columnMenu.filter": "Filter\u2026",
|
|
60
|
+
"columnMenu.hideColumn": "Hide column",
|
|
61
|
+
"columnMenu.pinStart": "Pin left",
|
|
62
|
+
"columnMenu.pinEnd": "Pin right",
|
|
63
|
+
"columnMenu.pinNone": "Unpin",
|
|
64
|
+
"columnMenu.autoSize": "Auto-size column",
|
|
65
|
+
"columnMenu.columnsPanel": "Configure columns",
|
|
66
|
+
"a11y.sortedAsc": "Sorted by {column} ascending",
|
|
67
|
+
"a11y.sortedDesc": "Sorted by {column} descending",
|
|
68
|
+
"a11y.sortCleared": "Sort cleared",
|
|
69
|
+
"a11y.filterResult": "{visible} of {total} rows after filter",
|
|
70
|
+
"a11y.filterCleared": "Filter cleared",
|
|
71
|
+
"a11y.rowsSelected": "{count} rows selected",
|
|
72
|
+
"a11y.selectionCleared": "Selection cleared",
|
|
73
|
+
"a11y.validationError": "Validation error: {message}",
|
|
74
|
+
"a11y.validationGeneric": "Validation error",
|
|
75
|
+
"history.title": "History",
|
|
76
|
+
"history.empty": "No history yet. Edit a cell to append events.",
|
|
77
|
+
"history.severity": "Severity",
|
|
78
|
+
"history.category": "Category",
|
|
79
|
+
"history.filterAll": "All",
|
|
80
|
+
"history.severity.info": "Info",
|
|
81
|
+
"history.severity.warning": "Warning",
|
|
82
|
+
"history.severity.error": "Error",
|
|
83
|
+
"history.category.data": "Data",
|
|
84
|
+
"history.category.structure": "Structure",
|
|
85
|
+
"history.category.view": "View",
|
|
86
|
+
"history.category.system": "System",
|
|
87
|
+
"history.restore": "Restore previous value",
|
|
88
|
+
"offline.online": "Online",
|
|
89
|
+
"offline.offline": "Offline",
|
|
90
|
+
"offline.pendingCount": "{count} unsaved changes",
|
|
91
|
+
"offline.pendingEmpty": "All changes saved locally",
|
|
92
|
+
"sync.policy": "Conflict policy",
|
|
93
|
+
"sync.policy.lastWriteWins": "Last write wins",
|
|
94
|
+
"sync.policy.serverWins": "Server wins",
|
|
95
|
+
"sync.policy.manual": "Manual",
|
|
96
|
+
"sync.now": "Sync now",
|
|
97
|
+
"sync.syncing": "Syncing\u2026",
|
|
98
|
+
"sync.unavailable": "Sync transport not configured",
|
|
99
|
+
"sync.result": "Pushed {pushed}, pulled {pulled}, conflicts {conflicts}",
|
|
100
|
+
"sync.local": "Local",
|
|
101
|
+
"sync.remote": "Remote",
|
|
102
|
+
"sync.keepLocal": "Keep local",
|
|
103
|
+
"sync.keepRemote": "Keep remote",
|
|
104
|
+
"date.pickDate": "Pick a date",
|
|
105
|
+
"date.pickRange": "Pick a range",
|
|
106
|
+
"date.clear": "Clear",
|
|
107
|
+
"date.calendar": "Jalali calendar",
|
|
108
|
+
"date.prevMonth": "Previous month",
|
|
109
|
+
"date.nextMonth": "Next month"
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
exports.enMessages = enMessages;
|
|
113
|
+
//# sourceMappingURL=chunk-QZN7R2WP.cjs.map
|
|
114
|
+
//# sourceMappingURL=chunk-QZN7R2WP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../ui/locales/en.ts"],"names":[],"mappings":"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","file":"chunk-QZN7R2WP.cjs","sourcesContent":["import type { ERPTableMessages } from './types';\r\n\r\n/** English (en) message pack (PR-127). */\r\nexport const enMessages: ERPTableMessages = {\r\n 'general.addNewRow': 'Add row',\r\n 'general.copy': 'Copy',\r\n 'general.cut': 'Cut',\r\n 'general.paste': 'Paste',\r\n 'general.delete': 'Delete',\r\n 'general.chooseFromList': 'Choose from list',\r\n 'general.toggle': 'Select all',\r\n 'general.exportToExcel': 'Export to Excel',\r\n 'general.exportToExcelSuccess': 'Excel export succeeded',\r\n 'general.exportToExcelError': 'Excel export failed',\r\n 'general.exportToPdf': 'Export to PDF',\r\n 'general.exportToPdfSuccess': 'PDF export succeeded',\r\n 'general.exportToPdfError': 'PDF export failed',\r\n 'general.importFromExcel': 'Import from Excel',\r\n 'general.importFromExcelSuccess': 'Excel import succeeded',\r\n 'general.importFromExcelError': 'Excel import failed',\r\n 'general.selected': 'Selected',\r\n 'general.search': 'Search',\r\n 'general.selectField': 'Select',\r\n 'general.selectPlaceholder': 'Select',\r\n 'general.choice': 'Choose column',\r\n 'general.prev': 'Previous',\r\n 'general.next': 'Next',\r\n 'general.noData': 'No data',\r\n 'general.loading': 'Loading…',\r\n 'general.footerTotal': 'Total',\r\n 'general.footerAvg': 'Average',\r\n 'general.replicateRow': 'Duplicate row',\r\n 'general.edit': 'Edit',\r\n 'general.rowEdit': 'Edit row',\r\n 'general.row': 'Row',\r\n 'general.selectRow': 'Select row',\r\n 'general.save': 'Save',\r\n 'general.notActive': 'Inactive',\r\n 'general.add': 'Add',\r\n 'general.themeDark': 'Dark theme',\r\n 'general.themeLight': 'Light theme',\r\n 'general.toolbar': 'Toolbar',\r\n 'general.filter': 'Filter',\r\n 'general.filterApply': 'Apply',\r\n 'general.filterClear': 'Clear',\r\n 'general.filterActive': 'Filter active',\r\n 'general.rowsIn': 'rows in',\r\n 'general.page': 'pages',\r\n 'general.validationInRow': 'In row',\r\n 'general.validationInColumn': 'in column',\r\n 'general.loadMore': 'Show more ({visible} of {total})',\r\n 'general.searchFound': '{count} matches found',\r\n 'general.searchNotFound': 'No matches',\r\n 'general.searchPosition': '{current} of {total}',\r\n 'columnMenu.open': 'Column menu',\r\n 'columnMenu.sortAsc': 'Sort ascending',\r\n 'columnMenu.sortDesc': 'Sort descending',\r\n 'columnMenu.sortNone': 'Clear sort',\r\n 'columnMenu.filter': 'Filter…',\r\n 'columnMenu.hideColumn': 'Hide column',\r\n 'columnMenu.pinStart': 'Pin left',\r\n 'columnMenu.pinEnd': 'Pin right',\r\n 'columnMenu.pinNone': 'Unpin',\r\n 'columnMenu.autoSize': 'Auto-size column',\r\n 'columnMenu.columnsPanel': 'Configure columns',\r\n 'a11y.sortedAsc': 'Sorted by {column} ascending',\r\n 'a11y.sortedDesc': 'Sorted by {column} descending',\r\n 'a11y.sortCleared': 'Sort cleared',\r\n 'a11y.filterResult': '{visible} of {total} rows after filter',\r\n 'a11y.filterCleared': 'Filter cleared',\r\n 'a11y.rowsSelected': '{count} rows selected',\r\n 'a11y.selectionCleared': 'Selection cleared',\r\n 'a11y.validationError': 'Validation error: {message}',\r\n 'a11y.validationGeneric': 'Validation error',\r\n 'history.title': 'History',\r\n 'history.empty': 'No history yet. Edit a cell to append events.',\r\n 'history.severity': 'Severity',\r\n 'history.category': 'Category',\r\n 'history.filterAll': 'All',\r\n 'history.severity.info': 'Info',\r\n 'history.severity.warning': 'Warning',\r\n 'history.severity.error': 'Error',\r\n 'history.category.data': 'Data',\r\n 'history.category.structure': 'Structure',\r\n 'history.category.view': 'View',\r\n 'history.category.system': 'System',\r\n 'history.restore': 'Restore previous value',\r\n 'offline.online': 'Online',\r\n 'offline.offline': 'Offline',\r\n 'offline.pendingCount': '{count} unsaved changes',\r\n 'offline.pendingEmpty': 'All changes saved locally',\r\n 'sync.policy': 'Conflict policy',\r\n 'sync.policy.lastWriteWins': 'Last write wins',\r\n 'sync.policy.serverWins': 'Server wins',\r\n 'sync.policy.manual': 'Manual',\r\n 'sync.now': 'Sync now',\r\n 'sync.syncing': 'Syncing…',\r\n 'sync.unavailable': 'Sync transport not configured',\r\n 'sync.result': 'Pushed {pushed}, pulled {pulled}, conflicts {conflicts}',\r\n 'sync.local': 'Local',\r\n 'sync.remote': 'Remote',\r\n 'sync.keepLocal': 'Keep local',\r\n 'sync.keepRemote': 'Keep remote',\r\n 'date.pickDate': 'Pick a date',\r\n 'date.pickRange': 'Pick a range',\r\n 'date.clear': 'Clear',\r\n 'date.calendar': 'Jalali calendar',\r\n 'date.prevMonth': 'Previous month',\r\n 'date.nextMonth': 'Next month',\r\n};\r\n\r\nexport default enMessages;\r\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// infrastructure/finance/currency.ts
|
|
2
|
+
var RIALS_PER_TOMAN = 10;
|
|
3
|
+
function rialToToman(rial) {
|
|
4
|
+
if (!Number.isFinite(rial)) return NaN;
|
|
5
|
+
return Math.trunc(rial) / RIALS_PER_TOMAN;
|
|
6
|
+
}
|
|
7
|
+
function tomanToRial(toman) {
|
|
8
|
+
if (!Number.isFinite(toman)) return NaN;
|
|
9
|
+
return Math.trunc(toman) * RIALS_PER_TOMAN;
|
|
10
|
+
}
|
|
11
|
+
function convertCurrency(amount, from, to) {
|
|
12
|
+
if (!Number.isFinite(amount)) return NaN;
|
|
13
|
+
if (from === to) return Math.trunc(amount);
|
|
14
|
+
if (from === "rial" && to === "toman") return rialToToman(amount);
|
|
15
|
+
return tomanToRial(amount);
|
|
16
|
+
}
|
|
17
|
+
function formatPrice(amount, options = {}) {
|
|
18
|
+
if (!Number.isFinite(amount)) return "";
|
|
19
|
+
const unit = options.unit ?? "rial";
|
|
20
|
+
const displayUnit = options.displayUnit ?? unit;
|
|
21
|
+
const converted = convertCurrency(amount, unit, displayUnit);
|
|
22
|
+
if (!Number.isFinite(converted)) return "";
|
|
23
|
+
const locale = options.locale ?? (options.persianDigits === false ? "en-US" : "fa-IR");
|
|
24
|
+
const formatted = new Intl.NumberFormat(locale, {
|
|
25
|
+
useGrouping: true,
|
|
26
|
+
maximumFractionDigits: displayUnit === "toman" ? 1 : 0
|
|
27
|
+
}).format(converted);
|
|
28
|
+
if (options.withLabel === false) return formatted;
|
|
29
|
+
const label = displayUnit === "toman" ? "\u062A\u0648\u0645\u0627\u0646" : "\u0631\u06CC\u0627\u0644";
|
|
30
|
+
return `${formatted} ${label}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { RIALS_PER_TOMAN, convertCurrency, formatPrice, rialToToman, tomanToRial };
|
|
34
|
+
//# sourceMappingURL=chunk-RKVSJU46.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-RKVSJU46.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../infrastructure/finance/currency.ts"],"names":[],"mappings":";AAQO,IAAM,eAAA,GAAkB;AAExB,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,GAAA;AACnC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,eAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,GAAA;AACpC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,eAAA;AAC7B;AAEO,SAAS,eAAA,CACd,MAAA,EACA,IAAA,EACA,EAAA,EACQ;AACR,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,GAAA;AACrC,EAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AACzC,EAAA,IAAI,SAAS,MAAA,IAAU,EAAA,KAAO,OAAA,EAAS,OAAO,YAAY,MAAM,CAAA;AAChE,EAAA,OAAO,YAAY,MAAM,CAAA;AAC3B;AAkBO,SAAS,WAAA,CACd,MAAA,EACA,OAAA,GAA8B,EAAC,EACvB;AACR,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,EAAA;AACrC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAM,WAAW,CAAA;AAC3D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,aAAA,KAAkB,QAAQ,OAAA,GAAU,OAAA,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,IAC9C,WAAA,EAAa,IAAA;AAAA,IACb,qBAAA,EAAuB,WAAA,KAAgB,OAAA,GAAU,CAAA,GAAI;AAAA,GACtD,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AAEnB,EAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,KAAA,EAAO,OAAO,SAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,WAAA,KAAgB,OAAA,GAAU,gCAAA,GAAU,0BAAA;AAClD,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC9B","file":"chunk-RKVSJU46.js","sourcesContent":["/**\r\n * Iranian money units (PR-140).\r\n * Canonical storage is integer **rials** (same convention as `toMinorUnits`).\r\n * 1 toman = 10 rials.\r\n */\r\n\r\nexport type CurrencyUnit = 'rial' | 'toman';\r\n\r\nexport const RIALS_PER_TOMAN = 10;\r\n\r\nexport function rialToToman(rial: number): number {\r\n if (!Number.isFinite(rial)) return NaN;\r\n return Math.trunc(rial) / RIALS_PER_TOMAN;\r\n}\r\n\r\nexport function tomanToRial(toman: number): number {\r\n if (!Number.isFinite(toman)) return NaN;\r\n return Math.trunc(toman) * RIALS_PER_TOMAN;\r\n}\r\n\r\nexport function convertCurrency(\r\n amount: number,\r\n from: CurrencyUnit,\r\n to: CurrencyUnit,\r\n): number {\r\n if (!Number.isFinite(amount)) return NaN;\r\n if (from === to) return Math.trunc(amount);\r\n if (from === 'rial' && to === 'toman') return rialToToman(amount);\r\n return tomanToRial(amount);\r\n}\r\n\r\nexport type FormatPriceOptions = {\r\n /** Unit of the numeric `amount` argument. Default `rial`. */\r\n unit?: CurrencyUnit;\r\n /** Unit shown in the label suffix. Defaults to `unit`. */\r\n displayUnit?: CurrencyUnit;\r\n /** Append unit label (`ریال` / `تومان`). Default true. */\r\n withLabel?: boolean;\r\n /** Use Persian digits via Intl. Default true. */\r\n persianDigits?: boolean;\r\n locale?: string;\r\n};\r\n\r\n/**\r\n * Format a money amount. Converts when `unit` ≠ `displayUnit`.\r\n * Values are truncated to integers before conversion.\r\n */\r\nexport function formatPrice(\r\n amount: number,\r\n options: FormatPriceOptions = {},\r\n): string {\r\n if (!Number.isFinite(amount)) return '';\r\n const unit = options.unit ?? 'rial';\r\n const displayUnit = options.displayUnit ?? unit;\r\n const converted = convertCurrency(amount, unit, displayUnit);\r\n if (!Number.isFinite(converted)) return '';\r\n\r\n const locale = options.locale ?? (options.persianDigits === false ? 'en-US' : 'fa-IR');\r\n const formatted = new Intl.NumberFormat(locale, {\r\n useGrouping: true,\r\n maximumFractionDigits: displayUnit === 'toman' ? 1 : 0,\r\n }).format(converted);\r\n\r\n if (options.withLabel === false) return formatted;\r\n const label = displayUnit === 'toman' ? 'تومان' : 'ریال';\r\n return `${formatted} ${label}`;\r\n}\r\n"]}
|