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,256 @@
|
|
|
1
|
+
import { isIranHoliday } from './chunk-W5256BJ4.js';
|
|
2
|
+
import { useERPTableTheme, useTranslations, toJalaliYmd, buildJalaliMonthGrid, jalaliMonthName, JALALI_WEEKDAY_LABELS_FA, sameJalaliDay, isDateInRange, useDateAdapter, addJalaliMonths, compareJalaliDay } from './chunk-QQMU44KJ.js';
|
|
3
|
+
import './chunk-SZ7BLAY3.js';
|
|
4
|
+
import './chunk-F4PYOYHR.js';
|
|
5
|
+
import './chunk-77UXAJII.js';
|
|
6
|
+
import './chunk-TN4MG6FY.js';
|
|
7
|
+
import { jalaliAdapter } from './chunk-GQEDLUMB.js';
|
|
8
|
+
import './chunk-MUQQKPWR.js';
|
|
9
|
+
import './chunk-AU3RDJYQ.js';
|
|
10
|
+
import { useState, useMemo, useId, useRef, useEffect } from 'react';
|
|
11
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
12
|
+
|
|
13
|
+
function JalaliCalendar({
|
|
14
|
+
mode = "single",
|
|
15
|
+
value = null,
|
|
16
|
+
range,
|
|
17
|
+
onSelect,
|
|
18
|
+
onRangeChange,
|
|
19
|
+
showHolidays = true,
|
|
20
|
+
className
|
|
21
|
+
}) {
|
|
22
|
+
const theme = useERPTableTheme();
|
|
23
|
+
const t = useTranslations();
|
|
24
|
+
const seed = value ?? range?.start ?? range?.end ?? /* @__PURE__ */ new Date();
|
|
25
|
+
const seedYmd = toJalaliYmd(seed);
|
|
26
|
+
const [view, setView] = useState({ jy: seedYmd.jy, jm: seedYmd.jm });
|
|
27
|
+
const [draftStart, setDraftStart] = useState(
|
|
28
|
+
range?.start ?? null
|
|
29
|
+
);
|
|
30
|
+
const cells = useMemo(
|
|
31
|
+
() => buildJalaliMonthGrid(view.jy, view.jm),
|
|
32
|
+
[view.jy, view.jm]
|
|
33
|
+
);
|
|
34
|
+
const effectiveRange = mode === "range" ? {
|
|
35
|
+
start: range?.start ?? draftStart,
|
|
36
|
+
end: range?.end ?? null
|
|
37
|
+
} : { start: value, end: value };
|
|
38
|
+
const go = (delta) => {
|
|
39
|
+
setView((v) => addJalaliMonths(v.jy, v.jm, delta));
|
|
40
|
+
};
|
|
41
|
+
const handleDayClick = (date) => {
|
|
42
|
+
if (mode === "single") {
|
|
43
|
+
onSelect?.(date);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!draftStart || range?.start && range?.end) {
|
|
47
|
+
setDraftStart(date);
|
|
48
|
+
onRangeChange?.({ start: date, end: null });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const start = draftStart;
|
|
52
|
+
const ordered = compareJalaliDay(start, date) <= 0 ? { start, end: date } : { start: date, end: start };
|
|
53
|
+
setDraftStart(null);
|
|
54
|
+
onRangeChange?.(ordered);
|
|
55
|
+
};
|
|
56
|
+
return /* @__PURE__ */ jsxs(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
className: `pdg-jalali-cal ${className ?? ""}`,
|
|
60
|
+
dir: "rtl",
|
|
61
|
+
role: "group",
|
|
62
|
+
"aria-label": t("date.calendar"),
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("div", { className: "pdg-jalali-cal__header", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(
|
|
66
|
+
"button",
|
|
67
|
+
{
|
|
68
|
+
type: "button",
|
|
69
|
+
className: "pdg-jalali-cal__nav",
|
|
70
|
+
"aria-label": t("date.nextMonth"),
|
|
71
|
+
onClick: () => go(1),
|
|
72
|
+
children: "\u2039"
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsxs("span", { className: "pdg-jalali-cal__title", children: [
|
|
76
|
+
jalaliMonthName(view.jm),
|
|
77
|
+
" ",
|
|
78
|
+
view.jy
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
"button",
|
|
82
|
+
{
|
|
83
|
+
type: "button",
|
|
84
|
+
className: "pdg-jalali-cal__nav",
|
|
85
|
+
"aria-label": t("date.prevMonth"),
|
|
86
|
+
onClick: () => go(-1),
|
|
87
|
+
children: "\u203A"
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsx("div", { className: "pdg-jalali-cal__weekdays", "aria-hidden": true, children: JALALI_WEEKDAY_LABELS_FA.map((d) => /* @__PURE__ */ jsx("span", { className: "pdg-jalali-cal__wd", children: d }, d)) }),
|
|
92
|
+
/* @__PURE__ */ jsx("div", { className: "pdg-jalali-cal__grid", role: "grid", children: cells.map((cell) => {
|
|
93
|
+
const selected = mode === "single" ? value != null && sameJalaliDay(cell.date, value) : Boolean(
|
|
94
|
+
effectiveRange.start && sameJalaliDay(cell.date, effectiveRange.start)
|
|
95
|
+
) || Boolean(
|
|
96
|
+
effectiveRange.end && sameJalaliDay(cell.date, effectiveRange.end)
|
|
97
|
+
);
|
|
98
|
+
const inRange = mode === "range" && isDateInRange(cell.date, effectiveRange);
|
|
99
|
+
const holiday = showHolidays && isIranHoliday(cell.date);
|
|
100
|
+
const today = sameJalaliDay(cell.date, /* @__PURE__ */ new Date());
|
|
101
|
+
return /* @__PURE__ */ jsx(
|
|
102
|
+
"button",
|
|
103
|
+
{
|
|
104
|
+
type: "button",
|
|
105
|
+
role: "gridcell",
|
|
106
|
+
className: [
|
|
107
|
+
"pdg-jalali-cal__day",
|
|
108
|
+
cell.inCurrentMonth ? "" : "is-outside",
|
|
109
|
+
selected ? "is-selected" : "",
|
|
110
|
+
inRange ? "is-in-range" : "",
|
|
111
|
+
holiday ? "is-holiday" : "",
|
|
112
|
+
today ? "is-today" : ""
|
|
113
|
+
].filter(Boolean).join(" "),
|
|
114
|
+
onClick: () => handleDayClick(cell.date),
|
|
115
|
+
style: selected ? {
|
|
116
|
+
background: theme.params.accentColor,
|
|
117
|
+
color: "var(--pdg-bg)"
|
|
118
|
+
} : inRange ? { background: theme.params.rowStripeColor } : void 0,
|
|
119
|
+
children: cell.ymd.jd
|
|
120
|
+
},
|
|
121
|
+
`${cell.ymd.jy}-${cell.ymd.jm}-${cell.ymd.jd}`
|
|
122
|
+
);
|
|
123
|
+
}) })
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
function parseValue(value, adapter) {
|
|
129
|
+
return adapter.parse(value);
|
|
130
|
+
}
|
|
131
|
+
function PersianRangeDatePicker(props) {
|
|
132
|
+
const theme = useERPTableTheme();
|
|
133
|
+
const t = useTranslations();
|
|
134
|
+
const hostAdapter = useDateAdapter();
|
|
135
|
+
const adapter = hostAdapter.id === "jalali" ? hostAdapter : jalaliAdapter;
|
|
136
|
+
const panelId = useId();
|
|
137
|
+
const rootRef = useRef(null);
|
|
138
|
+
const [open, setOpen] = useState(false);
|
|
139
|
+
const isRange = props.mode === "range";
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (!open) return;
|
|
142
|
+
const onDoc = (e) => {
|
|
143
|
+
if (!rootRef.current?.contains(e.target)) setOpen(false);
|
|
144
|
+
};
|
|
145
|
+
document.addEventListener("mousedown", onDoc);
|
|
146
|
+
return () => document.removeEventListener("mousedown", onDoc);
|
|
147
|
+
}, [open]);
|
|
148
|
+
if (isRange) {
|
|
149
|
+
const range = props.range ?? { start: null, end: null };
|
|
150
|
+
const label = range.start && range.end ? `${adapter.format(range.start)} \u2013 ${adapter.format(range.end)}` : range.start ? `${adapter.format(range.start)} \u2013 \u2026` : t("date.pickRange");
|
|
151
|
+
return /* @__PURE__ */ jsxs(
|
|
152
|
+
"div",
|
|
153
|
+
{
|
|
154
|
+
ref: rootRef,
|
|
155
|
+
className: `erp-table-date pdg-date-range ${props.className ?? ""}`,
|
|
156
|
+
children: [
|
|
157
|
+
/* @__PURE__ */ jsx(
|
|
158
|
+
"button",
|
|
159
|
+
{
|
|
160
|
+
type: "button",
|
|
161
|
+
className: "pdg-cell-editor pdg-date-range__trigger",
|
|
162
|
+
disabled: props.disabled,
|
|
163
|
+
"aria-expanded": open,
|
|
164
|
+
"aria-controls": panelId,
|
|
165
|
+
onClick: () => setOpen((v) => !v),
|
|
166
|
+
style: { accentColor: theme.params.accentColor },
|
|
167
|
+
children: label
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
open && !props.disabled ? /* @__PURE__ */ jsx("div", { id: panelId, className: "pdg-date-range__popover", role: "dialog", children: /* @__PURE__ */ jsx(
|
|
171
|
+
JalaliCalendar,
|
|
172
|
+
{
|
|
173
|
+
mode: "range",
|
|
174
|
+
range,
|
|
175
|
+
showHolidays: props.showHolidays !== false,
|
|
176
|
+
onRangeChange: (next) => {
|
|
177
|
+
props.onRangeChange?.(next);
|
|
178
|
+
if (next.start && next.end) setOpen(false);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
) }) : null
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
const value = props.value;
|
|
187
|
+
const onChange = props.onChange;
|
|
188
|
+
const disabled = props.disabled;
|
|
189
|
+
const parsed = parseValue(value, adapter);
|
|
190
|
+
const text = parsed ? adapter.format(parsed) : "";
|
|
191
|
+
return /* @__PURE__ */ jsxs(
|
|
192
|
+
"div",
|
|
193
|
+
{
|
|
194
|
+
ref: rootRef,
|
|
195
|
+
className: `erp-table-date pdg-date-range ${props.className ?? ""}`,
|
|
196
|
+
children: [
|
|
197
|
+
/* @__PURE__ */ jsx(
|
|
198
|
+
"button",
|
|
199
|
+
{
|
|
200
|
+
type: "button",
|
|
201
|
+
className: "pdg-cell-editor pdg-date-range__trigger",
|
|
202
|
+
disabled,
|
|
203
|
+
"aria-expanded": open,
|
|
204
|
+
"aria-controls": panelId,
|
|
205
|
+
onClick: () => setOpen((v) => !v),
|
|
206
|
+
style: { accentColor: theme.params.accentColor },
|
|
207
|
+
children: text || t("date.pickDate")
|
|
208
|
+
}
|
|
209
|
+
),
|
|
210
|
+
open && !disabled ? /* @__PURE__ */ jsxs("div", { id: panelId, className: "pdg-date-range__popover", role: "dialog", children: [
|
|
211
|
+
/* @__PURE__ */ jsx(
|
|
212
|
+
JalaliCalendar,
|
|
213
|
+
{
|
|
214
|
+
mode: "single",
|
|
215
|
+
value: parsed,
|
|
216
|
+
showHolidays: props.showHolidays !== false,
|
|
217
|
+
onSelect: (date) => {
|
|
218
|
+
onChange?.(date.getTime());
|
|
219
|
+
setOpen(false);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
),
|
|
223
|
+
/* @__PURE__ */ jsx("div", { className: "pdg-date-range__actions", children: /* @__PURE__ */ jsx(
|
|
224
|
+
"button",
|
|
225
|
+
{
|
|
226
|
+
type: "button",
|
|
227
|
+
className: "pdg-date-range__clear",
|
|
228
|
+
onClick: () => {
|
|
229
|
+
onChange?.("");
|
|
230
|
+
setOpen(false);
|
|
231
|
+
},
|
|
232
|
+
children: t("date.clear")
|
|
233
|
+
}
|
|
234
|
+
) })
|
|
235
|
+
] }) : null
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
function PersianRangeDateCell(ctx) {
|
|
241
|
+
const raw = ctx.value;
|
|
242
|
+
const value = raw == null || raw === "" ? void 0 : typeof raw === "number" ? raw : new Date(raw).valueOf();
|
|
243
|
+
return /* @__PURE__ */ jsx(
|
|
244
|
+
PersianRangeDatePicker,
|
|
245
|
+
{
|
|
246
|
+
className: ctx.meta.className,
|
|
247
|
+
disabled: ctx.isDeleted || !ctx.isEditable,
|
|
248
|
+
value,
|
|
249
|
+
onChange: (v) => ctx.dispatchChangeValue(v)
|
|
250
|
+
}
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export { JalaliCalendar, PersianRangeDateCell, PersianRangeDatePicker, PersianRangeDatePicker as default };
|
|
255
|
+
//# sourceMappingURL=date-picker-jalali.js.map
|
|
256
|
+
//# sourceMappingURL=date-picker-jalali.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../ui/date/JalaliCalendar.tsx","../ui/date/PersianRangeDatePicker.tsx"],"names":["useState","jsxs","jsx"],"mappings":"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","file":"date-picker-jalali.js","sourcesContent":["\"use client\";\r\n\r\nimport React, { useMemo, useState } from 'react';\r\n\r\nimport {\r\n JALALI_WEEKDAY_LABELS_FA,\r\n addJalaliMonths,\r\n buildJalaliMonthGrid,\r\n compareJalaliDay,\r\n isDateInRange,\r\n jalaliMonthName,\r\n sameJalaliDay,\r\n toJalaliYmd,\r\n type DateRangeValue,\r\n} from '../../infrastructure/date/jalaliCalendarModel';\r\nimport { isIranHoliday } from '../../infrastructure/finance/holidays';\r\nimport { useERPTableTheme, useTranslations } from '../host';\r\n\r\nexport type JalaliCalendarProps = {\r\n mode?: 'single' | 'range';\r\n value?: Date | null;\r\n range?: DateRangeValue;\r\n onSelect?: (date: Date) => void;\r\n onRangeChange?: (range: DateRangeValue) => void;\r\n showHolidays?: boolean;\r\n className?: string;\r\n};\r\n\r\n/**\r\n * Internal Jalali month calendar — no external peer (PR-140).\r\n */\r\nexport function JalaliCalendar({\r\n mode = 'single',\r\n value = null,\r\n range,\r\n onSelect,\r\n onRangeChange,\r\n showHolidays = true,\r\n className,\r\n}: JalaliCalendarProps) {\r\n const theme = useERPTableTheme();\r\n const t = useTranslations();\r\n const seed = value ?? range?.start ?? range?.end ?? new Date();\r\n const seedYmd = toJalaliYmd(seed);\r\n const [view, setView] = useState({ jy: seedYmd.jy, jm: seedYmd.jm });\r\n const [draftStart, setDraftStart] = useState<Date | null>(\r\n range?.start ?? null,\r\n );\r\n\r\n const cells = useMemo(\r\n () => buildJalaliMonthGrid(view.jy, view.jm),\r\n [view.jy, view.jm],\r\n );\r\n\r\n const effectiveRange: DateRangeValue =\r\n mode === 'range'\r\n ? {\r\n start: range?.start ?? draftStart,\r\n end: range?.end ?? null,\r\n }\r\n : { start: value, end: value };\r\n\r\n const go = (delta: number) => {\r\n setView((v) => addJalaliMonths(v.jy, v.jm, delta));\r\n };\r\n\r\n const handleDayClick = (date: Date) => {\r\n if (mode === 'single') {\r\n onSelect?.(date);\r\n return;\r\n }\r\n if (!draftStart || (range?.start && range?.end)) {\r\n setDraftStart(date);\r\n onRangeChange?.({ start: date, end: null });\r\n return;\r\n }\r\n const start = draftStart;\r\n const ordered =\r\n compareJalaliDay(start, date) <= 0\r\n ? { start, end: date }\r\n : { start: date, end: start };\r\n setDraftStart(null);\r\n onRangeChange?.(ordered);\r\n };\r\n\r\n return (\r\n <div\r\n className={`pdg-jalali-cal ${className ?? ''}`}\r\n dir=\"rtl\"\r\n role=\"group\"\r\n aria-label={t('date.calendar')}\r\n >\r\n <div className=\"pdg-jalali-cal__header\">\r\n <button\r\n type=\"button\"\r\n className=\"pdg-jalali-cal__nav\"\r\n aria-label={t('date.nextMonth')}\r\n onClick={() => go(1)}\r\n >\r\n ‹\r\n </button>\r\n <span className=\"pdg-jalali-cal__title\">\r\n {jalaliMonthName(view.jm)} {view.jy}\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"pdg-jalali-cal__nav\"\r\n aria-label={t('date.prevMonth')}\r\n onClick={() => go(-1)}\r\n >\r\n ›\r\n </button>\r\n </div>\r\n <div className=\"pdg-jalali-cal__weekdays\" aria-hidden>\r\n {JALALI_WEEKDAY_LABELS_FA.map((d) => (\r\n <span key={d} className=\"pdg-jalali-cal__wd\">\r\n {d}\r\n </span>\r\n ))}\r\n </div>\r\n <div className=\"pdg-jalali-cal__grid\" role=\"grid\">\r\n {cells.map((cell) => {\r\n const selected =\r\n mode === 'single'\r\n ? value != null && sameJalaliDay(cell.date, value)\r\n : Boolean(\r\n effectiveRange.start &&\r\n sameJalaliDay(cell.date, effectiveRange.start),\r\n ) ||\r\n Boolean(\r\n effectiveRange.end &&\r\n sameJalaliDay(cell.date, effectiveRange.end),\r\n );\r\n const inRange =\r\n mode === 'range' && isDateInRange(cell.date, effectiveRange);\r\n const holiday = showHolidays && isIranHoliday(cell.date);\r\n const today = sameJalaliDay(cell.date, new Date());\r\n\r\n return (\r\n <button\r\n key={`${cell.ymd.jy}-${cell.ymd.jm}-${cell.ymd.jd}`}\r\n type=\"button\"\r\n role=\"gridcell\"\r\n className={[\r\n 'pdg-jalali-cal__day',\r\n cell.inCurrentMonth ? '' : 'is-outside',\r\n selected ? 'is-selected' : '',\r\n inRange ? 'is-in-range' : '',\r\n holiday ? 'is-holiday' : '',\r\n today ? 'is-today' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => handleDayClick(cell.date)}\r\n style={\r\n selected\r\n ? {\r\n background: theme.params.accentColor,\r\n color: 'var(--pdg-bg)',\r\n }\r\n : inRange\r\n ? { background: theme.params.rowStripeColor }\r\n : undefined\r\n }\r\n >\r\n {cell.ymd.jd}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default JalaliCalendar;\r\n","/**\r\n * Internal Jalali date / range picker (PR-140).\r\n * Zero external calendar dependencies — uses `infrastructure/date` math.\r\n *\r\n * @example\r\n * ```tsx\r\n * import { PersianRangeDateCell } from 'persian-data-grid/date-picker-jalali';\r\n * <DataGrid components={{ date: PersianRangeDateCell }} />\r\n * ```\r\n */\r\n\r\n\"use client\";\r\n\r\nimport React, { useEffect, useId, useRef, useState } from 'react';\r\n\r\nimport { jalaliAdapter } from '../../infrastructure/date/jalaliAdapter';\r\nimport type { DateRangeValue } from '../../infrastructure/date/jalaliCalendarModel';\r\nimport type { CellRenderContext } from '../cellRenderer/cellRenderContext';\r\nimport { useDateAdapter, useERPTableTheme, useTranslations } from '../host';\r\nimport { JalaliCalendar } from './JalaliCalendar';\r\n\r\ntype SingleProps = {\r\n mode?: 'single';\r\n value?: unknown;\r\n onChange?: (value: unknown) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n showMask?: boolean;\r\n showHolidays?: boolean;\r\n};\r\n\r\ntype RangeProps = {\r\n mode: 'range';\r\n range?: DateRangeValue;\r\n onRangeChange?: (range: DateRangeValue) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n showHolidays?: boolean;\r\n};\r\n\r\nexport type PersianRangeDatePickerProps = SingleProps | RangeProps;\r\n\r\nfunction parseValue(\r\n value: unknown,\r\n adapter: typeof jalaliAdapter,\r\n): Date | null {\r\n return adapter.parse(value);\r\n}\r\n\r\n/**\r\n * Cell editor (single) or standalone range picker.\r\n */\r\nexport function PersianRangeDatePicker(props: PersianRangeDatePickerProps) {\r\n const theme = useERPTableTheme();\r\n const t = useTranslations();\r\n const hostAdapter = useDateAdapter();\r\n const adapter =\r\n hostAdapter.id === 'jalali' ? hostAdapter : jalaliAdapter;\r\n const panelId = useId();\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const [open, setOpen] = useState(false);\r\n\r\n const isRange = props.mode === 'range';\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n if (!rootRef.current?.contains(e.target as Node)) setOpen(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open]);\r\n\r\n if (isRange) {\r\n const range = props.range ?? { start: null, end: null };\r\n const label =\r\n range.start && range.end\r\n ? `${adapter.format(range.start)} – ${adapter.format(range.end)}`\r\n : range.start\r\n ? `${adapter.format(range.start)} – …`\r\n : t('date.pickRange');\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={`erp-table-date pdg-date-range ${props.className ?? ''}`}\r\n >\r\n <button\r\n type=\"button\"\r\n className=\"pdg-cell-editor pdg-date-range__trigger\"\r\n disabled={props.disabled}\r\n aria-expanded={open}\r\n aria-controls={panelId}\r\n onClick={() => setOpen((v) => !v)}\r\n style={{ accentColor: theme.params.accentColor }}\r\n >\r\n {label}\r\n </button>\r\n {open && !props.disabled ? (\r\n <div id={panelId} className=\"pdg-date-range__popover\" role=\"dialog\">\r\n <JalaliCalendar\r\n mode=\"range\"\r\n range={range}\r\n showHolidays={props.showHolidays !== false}\r\n onRangeChange={(next) => {\r\n props.onRangeChange?.(next);\r\n if (next.start && next.end) setOpen(false);\r\n }}\r\n />\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n\r\n const value = props.value;\r\n const onChange = props.onChange;\r\n const disabled = props.disabled;\r\n const parsed = parseValue(value, adapter);\r\n const text = parsed ? adapter.format(parsed) : '';\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={`erp-table-date pdg-date-range ${props.className ?? ''}`}\r\n >\r\n <button\r\n type=\"button\"\r\n className=\"pdg-cell-editor pdg-date-range__trigger\"\r\n disabled={disabled}\r\n aria-expanded={open}\r\n aria-controls={panelId}\r\n onClick={() => setOpen((v) => !v)}\r\n style={{ accentColor: theme.params.accentColor }}\r\n >\r\n {text || t('date.pickDate')}\r\n </button>\r\n {open && !disabled ? (\r\n <div id={panelId} className=\"pdg-date-range__popover\" role=\"dialog\">\r\n <JalaliCalendar\r\n mode=\"single\"\r\n value={parsed}\r\n showHolidays={props.showHolidays !== false}\r\n onSelect={(date) => {\r\n onChange?.(date.getTime());\r\n setOpen(false);\r\n }}\r\n />\r\n <div className=\"pdg-date-range__actions\">\r\n <button\r\n type=\"button\"\r\n className=\"pdg-date-range__clear\"\r\n onClick={() => {\r\n onChange?.('');\r\n setOpen(false);\r\n }}\r\n >\r\n {t('date.clear')}\r\n </button>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\n/** `components.date` adapter — receives {@link CellRenderContext}. */\r\nexport function PersianRangeDateCell(ctx: CellRenderContext) {\r\n const raw = ctx.value;\r\n const value =\r\n raw == null || raw === ''\r\n ? undefined\r\n : typeof raw === 'number'\r\n ? raw\r\n : new Date(raw as string).valueOf();\r\n\r\n return (\r\n <PersianRangeDatePicker\r\n className={ctx.meta.className}\r\n disabled={ctx.isDeleted || !ctx.isEditable}\r\n value={value}\r\n onChange={(v) => ctx.dispatchChangeValue(v)}\r\n />\r\n );\r\n}\r\n\r\nexport { JalaliCalendar } from './JalaliCalendar';\r\nexport type { JalaliCalendarProps } from './JalaliCalendar';\r\nexport type { DateRangeValue } from '../../infrastructure/date/jalaliCalendarModel';\r\n\r\nexport default PersianRangeDatePicker;\r\n"]}
|
package/dist/finance.cjs
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkWUMOSOEK_cjs = require('./chunk-WUMOSOEK.cjs');
|
|
4
|
+
var chunkJOICD47Q_cjs = require('./chunk-JOICD47Q.cjs');
|
|
5
|
+
var chunkKRJG3KMP_cjs = require('./chunk-KRJG3KMP.cjs');
|
|
6
|
+
require('./chunk-DFFP7SJ6.cjs');
|
|
7
|
+
|
|
8
|
+
// infrastructure/finance/numberToPersianWords.ts
|
|
9
|
+
var ONES = [
|
|
10
|
+
"",
|
|
11
|
+
"\u06CC\u06A9",
|
|
12
|
+
"\u062F\u0648",
|
|
13
|
+
"\u0633\u0647",
|
|
14
|
+
"\u0686\u0647\u0627\u0631",
|
|
15
|
+
"\u067E\u0646\u062C",
|
|
16
|
+
"\u0634\u0634",
|
|
17
|
+
"\u0647\u0641\u062A",
|
|
18
|
+
"\u0647\u0634\u062A",
|
|
19
|
+
"\u0646\u0647",
|
|
20
|
+
"\u062F\u0647",
|
|
21
|
+
"\u06CC\u0627\u0632\u062F\u0647",
|
|
22
|
+
"\u062F\u0648\u0627\u0632\u062F\u0647",
|
|
23
|
+
"\u0633\u06CC\u0632\u062F\u0647",
|
|
24
|
+
"\u0686\u0647\u0627\u0631\u062F\u0647",
|
|
25
|
+
"\u067E\u0627\u0646\u0632\u062F\u0647",
|
|
26
|
+
"\u0634\u0627\u0646\u0632\u062F\u0647",
|
|
27
|
+
"\u0647\u0641\u062F\u0647",
|
|
28
|
+
"\u0647\u062C\u062F\u0647",
|
|
29
|
+
"\u0646\u0648\u0632\u062F\u0647"
|
|
30
|
+
];
|
|
31
|
+
var TENS = [
|
|
32
|
+
"",
|
|
33
|
+
"",
|
|
34
|
+
"\u0628\u06CC\u0633\u062A",
|
|
35
|
+
"\u0633\u06CC",
|
|
36
|
+
"\u0686\u0647\u0644",
|
|
37
|
+
"\u067E\u0646\u062C\u0627\u0647",
|
|
38
|
+
"\u0634\u0635\u062A",
|
|
39
|
+
"\u0647\u0641\u062A\u0627\u062F",
|
|
40
|
+
"\u0647\u0634\u062A\u0627\u062F",
|
|
41
|
+
"\u0646\u0648\u062F"
|
|
42
|
+
];
|
|
43
|
+
var HUNDREDS = [
|
|
44
|
+
"",
|
|
45
|
+
"\u0635\u062F",
|
|
46
|
+
"\u062F\u0648\u06CC\u0633\u062A",
|
|
47
|
+
"\u0633\u06CC\u0635\u062F",
|
|
48
|
+
"\u0686\u0647\u0627\u0631\u0635\u062F",
|
|
49
|
+
"\u067E\u0627\u0646\u0635\u062F",
|
|
50
|
+
"\u0634\u0634\u0635\u062F",
|
|
51
|
+
"\u0647\u0641\u062A\u0635\u062F",
|
|
52
|
+
"\u0647\u0634\u062A\u0635\u062F",
|
|
53
|
+
"\u0646\u0647\u0635\u062F"
|
|
54
|
+
];
|
|
55
|
+
var SCALES = ["", "\u0647\u0632\u0627\u0631", "\u0645\u06CC\u0644\u06CC\u0648\u0646", "\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F", "\u062A\u0631\u06CC\u0644\u06CC\u0648\u0646"];
|
|
56
|
+
function joinAnd(parts) {
|
|
57
|
+
return parts.filter(Boolean).join(" \u0648 ");
|
|
58
|
+
}
|
|
59
|
+
function underThousand(n) {
|
|
60
|
+
if (n <= 0) return "";
|
|
61
|
+
if (n < 20) return ONES[n];
|
|
62
|
+
if (n < 100) {
|
|
63
|
+
const ten = Math.floor(n / 10);
|
|
64
|
+
const one = n % 10;
|
|
65
|
+
return joinAnd([TENS[ten], ONES[one]]);
|
|
66
|
+
}
|
|
67
|
+
const hundred = Math.floor(n / 100);
|
|
68
|
+
const rest = n % 100;
|
|
69
|
+
return joinAnd([HUNDREDS[hundred], underThousand(rest)]);
|
|
70
|
+
}
|
|
71
|
+
function numberToPersianWords(value, options = {}) {
|
|
72
|
+
let n;
|
|
73
|
+
if (typeof value === "bigint") {
|
|
74
|
+
n = value;
|
|
75
|
+
} else {
|
|
76
|
+
if (!Number.isFinite(value)) return "";
|
|
77
|
+
n = BigInt(Math.trunc(value));
|
|
78
|
+
}
|
|
79
|
+
const negative = n < 0n;
|
|
80
|
+
if (negative) n = -n;
|
|
81
|
+
let words;
|
|
82
|
+
if (n === 0n) {
|
|
83
|
+
words = "\u0635\u0641\u0631";
|
|
84
|
+
} else {
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let scale = 0;
|
|
87
|
+
let remaining = n;
|
|
88
|
+
while (remaining > 0n && scale < SCALES.length) {
|
|
89
|
+
const chunk = Number(remaining % 1000n);
|
|
90
|
+
remaining /= 1000n;
|
|
91
|
+
if (chunk > 0) {
|
|
92
|
+
const body = underThousand(chunk);
|
|
93
|
+
const scaleWord = SCALES[scale];
|
|
94
|
+
chunks.unshift(scaleWord ? `${body} ${scaleWord}` : body);
|
|
95
|
+
}
|
|
96
|
+
scale += 1;
|
|
97
|
+
}
|
|
98
|
+
if (remaining > 0n) {
|
|
99
|
+
words = n.toString();
|
|
100
|
+
} else {
|
|
101
|
+
words = joinAnd(chunks);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (negative) {
|
|
105
|
+
words = `${options.negativeWord ?? "\u0645\u0646\u0641\u06CC"} ${words}`;
|
|
106
|
+
}
|
|
107
|
+
if (options.currency === "rial") return `${words} \u0631\u06CC\u0627\u0644`;
|
|
108
|
+
if (options.currency === "toman") return `${words} \u062A\u0648\u0645\u0627\u0646`;
|
|
109
|
+
return words;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// infrastructure/finance/financialPeriods.ts
|
|
113
|
+
function utcDay(date) {
|
|
114
|
+
return new Date(
|
|
115
|
+
Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12)
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
function jalaliFinancialYear(date) {
|
|
119
|
+
return chunkKRJG3KMP_cjs.gregorianDateToJalali(utcDay(date)).jy;
|
|
120
|
+
}
|
|
121
|
+
function financialPeriodForYear(jalaliYear) {
|
|
122
|
+
const start = chunkKRJG3KMP_cjs.jalaliToGregorianDate(jalaliYear, 1, 1);
|
|
123
|
+
const lastDay = chunkKRJG3KMP_cjs.jalaliMonthLength(jalaliYear, 12);
|
|
124
|
+
const end = chunkKRJG3KMP_cjs.jalaliToGregorianDate(jalaliYear, 12, lastDay);
|
|
125
|
+
return {
|
|
126
|
+
id: `fy-${jalaliYear}`,
|
|
127
|
+
label: `\u0633\u0627\u0644 \u0645\u0627\u0644\u06CC ${jalaliYear}`,
|
|
128
|
+
jalaliYear,
|
|
129
|
+
start,
|
|
130
|
+
end
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function financialPeriodForDate(date) {
|
|
134
|
+
return financialPeriodForYear(jalaliFinancialYear(date));
|
|
135
|
+
}
|
|
136
|
+
function listFinancialPeriods(fromJalaliYear, toJalaliYear) {
|
|
137
|
+
const from = Math.min(fromJalaliYear, toJalaliYear);
|
|
138
|
+
const to = Math.max(fromJalaliYear, toJalaliYear);
|
|
139
|
+
const out = [];
|
|
140
|
+
for (let y = from; y <= to; y += 1) {
|
|
141
|
+
out.push(financialPeriodForYear(y));
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function isInFinancialPeriod(date, period) {
|
|
146
|
+
const t = utcDay(date).getTime();
|
|
147
|
+
return t >= period.start.getTime() && t <= period.end.getTime();
|
|
148
|
+
}
|
|
149
|
+
function financialMonths(jalaliYear) {
|
|
150
|
+
const months = [];
|
|
151
|
+
for (let m = 1; m <= 12; m += 1) {
|
|
152
|
+
months.push(chunkKRJG3KMP_cjs.jalaliToGregorianDate(jalaliYear, m, 1));
|
|
153
|
+
}
|
|
154
|
+
return months;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
Object.defineProperty(exports, "IRAN_FIXED_HOLIDAYS", {
|
|
158
|
+
enumerable: true,
|
|
159
|
+
get: function () { return chunkWUMOSOEK_cjs.IRAN_FIXED_HOLIDAYS; }
|
|
160
|
+
});
|
|
161
|
+
Object.defineProperty(exports, "holidayTitle", {
|
|
162
|
+
enumerable: true,
|
|
163
|
+
get: function () { return chunkWUMOSOEK_cjs.holidayTitle; }
|
|
164
|
+
});
|
|
165
|
+
Object.defineProperty(exports, "iranHolidaysForYear", {
|
|
166
|
+
enumerable: true,
|
|
167
|
+
get: function () { return chunkWUMOSOEK_cjs.iranHolidaysForYear; }
|
|
168
|
+
});
|
|
169
|
+
Object.defineProperty(exports, "isIranHoliday", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
get: function () { return chunkWUMOSOEK_cjs.isIranHoliday; }
|
|
172
|
+
});
|
|
173
|
+
Object.defineProperty(exports, "nextBusinessDay", {
|
|
174
|
+
enumerable: true,
|
|
175
|
+
get: function () { return chunkWUMOSOEK_cjs.nextBusinessDay; }
|
|
176
|
+
});
|
|
177
|
+
Object.defineProperty(exports, "RIALS_PER_TOMAN", {
|
|
178
|
+
enumerable: true,
|
|
179
|
+
get: function () { return chunkJOICD47Q_cjs.RIALS_PER_TOMAN; }
|
|
180
|
+
});
|
|
181
|
+
Object.defineProperty(exports, "convertCurrency", {
|
|
182
|
+
enumerable: true,
|
|
183
|
+
get: function () { return chunkJOICD47Q_cjs.convertCurrency; }
|
|
184
|
+
});
|
|
185
|
+
Object.defineProperty(exports, "formatPrice", {
|
|
186
|
+
enumerable: true,
|
|
187
|
+
get: function () { return chunkJOICD47Q_cjs.formatPrice; }
|
|
188
|
+
});
|
|
189
|
+
Object.defineProperty(exports, "rialToToman", {
|
|
190
|
+
enumerable: true,
|
|
191
|
+
get: function () { return chunkJOICD47Q_cjs.rialToToman; }
|
|
192
|
+
});
|
|
193
|
+
Object.defineProperty(exports, "tomanToRial", {
|
|
194
|
+
enumerable: true,
|
|
195
|
+
get: function () { return chunkJOICD47Q_cjs.tomanToRial; }
|
|
196
|
+
});
|
|
197
|
+
exports.financialMonths = financialMonths;
|
|
198
|
+
exports.financialPeriodForDate = financialPeriodForDate;
|
|
199
|
+
exports.financialPeriodForYear = financialPeriodForYear;
|
|
200
|
+
exports.isInFinancialPeriod = isInFinancialPeriod;
|
|
201
|
+
exports.jalaliFinancialYear = jalaliFinancialYear;
|
|
202
|
+
exports.listFinancialPeriods = listFinancialPeriods;
|
|
203
|
+
exports.numberToPersianWords = numberToPersianWords;
|
|
204
|
+
//# sourceMappingURL=finance.cjs.map
|
|
205
|
+
//# sourceMappingURL=finance.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../infrastructure/finance/numberToPersianWords.ts","../infrastructure/finance/financialPeriods.ts"],"names":["gregorianDateToJalali","jalaliToGregorianDate","jalaliMonthLength"],"mappings":"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","file":"finance.cjs","sourcesContent":["/**\r\n * Integer → Persian words for document printing (PR-140).\r\n * Covers non-negative integers up to 10^15 − 1 (تریلیون scale).\r\n */\r\n\r\nconst ONES = [\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 'دوازده',\r\n 'سیزده',\r\n 'چهارده',\r\n 'پانزده',\r\n 'شانزده',\r\n 'هفده',\r\n 'هجده',\r\n 'نوزده',\r\n];\r\n\r\nconst TENS = [\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\nconst HUNDREDS = [\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\nconst SCALES = ['', 'هزار', 'میلیون', 'میلیارد', 'تریلیون'] as const;\r\n\r\nfunction joinAnd(parts: string[]): string {\r\n return parts.filter(Boolean).join(' و ');\r\n}\r\n\r\nfunction underThousand(n: number): string {\r\n if (n <= 0) return '';\r\n if (n < 20) return ONES[n]!;\r\n if (n < 100) {\r\n const ten = Math.floor(n / 10);\r\n const one = n % 10;\r\n return joinAnd([TENS[ten]!, ONES[one]!]);\r\n }\r\n const hundred = Math.floor(n / 100);\r\n const rest = n % 100;\r\n return joinAnd([HUNDREDS[hundred]!, underThousand(rest)]);\r\n}\r\n\r\nexport type NumberToPersianWordsOptions = {\r\n /** Append currency word (`ریال` / `تومان`). */\r\n currency?: 'rial' | 'toman';\r\n /** Prefix for negative numbers. Default `منفی`. */\r\n negativeWord?: string;\r\n};\r\n\r\n/**\r\n * Convert an integer (or truncatable number) to Persian words.\r\n * Fractional parts are truncated toward zero.\r\n */\r\nexport function numberToPersianWords(\r\n value: number | bigint,\r\n options: NumberToPersianWordsOptions = {},\r\n): string {\r\n let n: bigint;\r\n if (typeof value === 'bigint') {\r\n n = value;\r\n } else {\r\n if (!Number.isFinite(value)) return '';\r\n n = BigInt(Math.trunc(value));\r\n }\r\n\r\n const negative = n < 0n;\r\n if (negative) n = -n;\r\n\r\n let words: string;\r\n if (n === 0n) {\r\n words = 'صفر';\r\n } else {\r\n const chunks: string[] = [];\r\n let scale = 0;\r\n let remaining = n;\r\n while (remaining > 0n && scale < SCALES.length) {\r\n const chunk = Number(remaining % 1000n);\r\n remaining /= 1000n;\r\n if (chunk > 0) {\r\n const body = underThousand(chunk);\r\n const scaleWord = SCALES[scale]!;\r\n chunks.unshift(scaleWord ? `${body} ${scaleWord}` : body);\r\n }\r\n scale += 1;\r\n }\r\n if (remaining > 0n) {\r\n // Beyond documented range — fall back to digit string\r\n words = n.toString();\r\n } else {\r\n words = joinAnd(chunks);\r\n }\r\n }\r\n\r\n if (negative) {\r\n words = `${options.negativeWord ?? 'منفی'} ${words}`;\r\n }\r\n\r\n if (options.currency === 'rial') return `${words} ریال`;\r\n if (options.currency === 'toman') return `${words} تومان`;\r\n return words;\r\n}\r\n","/**\r\n * Iranian financial (fiscal) periods on the Jalali calendar (PR-140).\r\n * Iranian FY = 1 Farvardin … 29/30 Esfand of the same Jalali year.\r\n */\r\n\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliMonthLength,\r\n jalaliToGregorianDate,\r\n} from '../date/jalaliMath';\r\n\r\nexport type FinancialPeriod = {\r\n /** e.g. `fy-1404` */\r\n id: string;\r\n /** e.g. `سال مالی ۱۴۰۴` */\r\n label: string;\r\n /** Jalali year of the period */\r\n jalaliYear: number;\r\n start: Date;\r\n end: Date;\r\n};\r\n\r\nfunction utcDay(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\r\n/** Jalali year that owns this civil date for Iranian FY purposes. */\r\nexport function jalaliFinancialYear(date: Date): number {\r\n return gregorianDateToJalali(utcDay(date)).jy;\r\n}\r\n\r\nexport function financialPeriodForYear(jalaliYear: number): FinancialPeriod {\r\n const start = jalaliToGregorianDate(jalaliYear, 1, 1);\r\n const lastDay = jalaliMonthLength(jalaliYear, 12);\r\n const end = jalaliToGregorianDate(jalaliYear, 12, lastDay);\r\n return {\r\n id: `fy-${jalaliYear}`,\r\n label: `سال مالی ${jalaliYear}`,\r\n jalaliYear,\r\n start,\r\n end,\r\n };\r\n}\r\n\r\nexport function financialPeriodForDate(date: Date): FinancialPeriod {\r\n return financialPeriodForYear(jalaliFinancialYear(date));\r\n}\r\n\r\nexport function listFinancialPeriods(\r\n fromJalaliYear: number,\r\n toJalaliYear: number,\r\n): FinancialPeriod[] {\r\n const from = Math.min(fromJalaliYear, toJalaliYear);\r\n const to = Math.max(fromJalaliYear, toJalaliYear);\r\n const out: FinancialPeriod[] = [];\r\n for (let y = from; y <= to; y += 1) {\r\n out.push(financialPeriodForYear(y));\r\n }\r\n return out;\r\n}\r\n\r\nexport function isInFinancialPeriod(\r\n date: Date,\r\n period: FinancialPeriod,\r\n): boolean {\r\n const t = utcDay(date).getTime();\r\n return t >= period.start.getTime() && t <= period.end.getTime();\r\n}\r\n\r\n/** Inclusive list of month starts (1 … 12) for a FY. */\r\nexport function financialMonths(jalaliYear: number): Date[] {\r\n const months: Date[] = [];\r\n for (let m = 1; m <= 12; m += 1) {\r\n months.push(jalaliToGregorianDate(jalaliYear, m, 1));\r\n }\r\n return months;\r\n}\r\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iranian money units (PR-140).
|
|
3
|
+
* Canonical storage is integer **rials** (same convention as `toMinorUnits`).
|
|
4
|
+
* 1 toman = 10 rials.
|
|
5
|
+
*/
|
|
6
|
+
type CurrencyUnit = 'rial' | 'toman';
|
|
7
|
+
declare const RIALS_PER_TOMAN = 10;
|
|
8
|
+
declare function rialToToman(rial: number): number;
|
|
9
|
+
declare function tomanToRial(toman: number): number;
|
|
10
|
+
declare function convertCurrency(amount: number, from: CurrencyUnit, to: CurrencyUnit): number;
|
|
11
|
+
type FormatPriceOptions = {
|
|
12
|
+
/** Unit of the numeric `amount` argument. Default `rial`. */
|
|
13
|
+
unit?: CurrencyUnit;
|
|
14
|
+
/** Unit shown in the label suffix. Defaults to `unit`. */
|
|
15
|
+
displayUnit?: CurrencyUnit;
|
|
16
|
+
/** Append unit label (`ریال` / `تومان`). Default true. */
|
|
17
|
+
withLabel?: boolean;
|
|
18
|
+
/** Use Persian digits via Intl. Default true. */
|
|
19
|
+
persianDigits?: boolean;
|
|
20
|
+
locale?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Format a money amount. Converts when `unit` ≠ `displayUnit`.
|
|
24
|
+
* Values are truncated to integers before conversion.
|
|
25
|
+
*/
|
|
26
|
+
declare function formatPrice(amount: number, options?: FormatPriceOptions): string;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Integer → Persian words for document printing (PR-140).
|
|
30
|
+
* Covers non-negative integers up to 10^15 − 1 (تریلیون scale).
|
|
31
|
+
*/
|
|
32
|
+
type NumberToPersianWordsOptions = {
|
|
33
|
+
/** Append currency word (`ریال` / `تومان`). */
|
|
34
|
+
currency?: 'rial' | 'toman';
|
|
35
|
+
/** Prefix for negative numbers. Default `منفی`. */
|
|
36
|
+
negativeWord?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Convert an integer (or truncatable number) to Persian words.
|
|
40
|
+
* Fractional parts are truncated toward zero.
|
|
41
|
+
*/
|
|
42
|
+
declare function numberToPersianWords(value: number | bigint, options?: NumberToPersianWordsOptions): string;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Iranian financial (fiscal) periods on the Jalali calendar (PR-140).
|
|
46
|
+
* Iranian FY = 1 Farvardin … 29/30 Esfand of the same Jalali year.
|
|
47
|
+
*/
|
|
48
|
+
type FinancialPeriod = {
|
|
49
|
+
/** e.g. `fy-1404` */
|
|
50
|
+
id: string;
|
|
51
|
+
/** e.g. `سال مالی ۱۴۰۴` */
|
|
52
|
+
label: string;
|
|
53
|
+
/** Jalali year of the period */
|
|
54
|
+
jalaliYear: number;
|
|
55
|
+
start: Date;
|
|
56
|
+
end: Date;
|
|
57
|
+
};
|
|
58
|
+
/** Jalali year that owns this civil date for Iranian FY purposes. */
|
|
59
|
+
declare function jalaliFinancialYear(date: Date): number;
|
|
60
|
+
declare function financialPeriodForYear(jalaliYear: number): FinancialPeriod;
|
|
61
|
+
declare function financialPeriodForDate(date: Date): FinancialPeriod;
|
|
62
|
+
declare function listFinancialPeriods(fromJalaliYear: number, toJalaliYear: number): FinancialPeriod[];
|
|
63
|
+
declare function isInFinancialPeriod(date: Date, period: FinancialPeriod): boolean;
|
|
64
|
+
/** Inclusive list of month starts (1 … 12) for a FY. */
|
|
65
|
+
declare function financialMonths(jalaliYear: number): Date[];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Iranian official holidays (Jalali fixed dates) (PR-140).
|
|
69
|
+
* Lunar/Islamic moveable holidays can be merged via `extra`.
|
|
70
|
+
*/
|
|
71
|
+
type IranHoliday = {
|
|
72
|
+
/** Jalali month 1–12 */
|
|
73
|
+
jm: number;
|
|
74
|
+
/** Jalali day */
|
|
75
|
+
jd: number;
|
|
76
|
+
title: string;
|
|
77
|
+
/** When set, holiday applies only to that Jalali year */
|
|
78
|
+
jy?: number;
|
|
79
|
+
};
|
|
80
|
+
/** Civil / solar fixed holidays observed every Jalali year. */
|
|
81
|
+
declare const IRAN_FIXED_HOLIDAYS: readonly IranHoliday[];
|
|
82
|
+
declare function iranHolidaysForYear(jalaliYear: number, extra?: readonly IranHoliday[]): Array<IranHoliday & {
|
|
83
|
+
date: Date;
|
|
84
|
+
}>;
|
|
85
|
+
declare function isIranHoliday(date: Date, extra?: readonly IranHoliday[]): boolean;
|
|
86
|
+
declare function holidayTitle(date: Date, extra?: readonly IranHoliday[]): string | null;
|
|
87
|
+
/** Skip Fridays (Iran weekend) and holidays; returns next open day. */
|
|
88
|
+
declare function nextBusinessDay(date: Date, extra?: readonly IranHoliday[]): Date;
|
|
89
|
+
|
|
90
|
+
export { type CurrencyUnit, type FinancialPeriod, type FormatPriceOptions, IRAN_FIXED_HOLIDAYS, type IranHoliday, type NumberToPersianWordsOptions, RIALS_PER_TOMAN, convertCurrency, financialMonths, financialPeriodForDate, financialPeriodForYear, formatPrice, holidayTitle, iranHolidaysForYear, isInFinancialPeriod, isIranHoliday, jalaliFinancialYear, listFinancialPeriods, nextBusinessDay, numberToPersianWords, rialToToman, tomanToRial };
|