persian-data-grid 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +1 -1
  2. package/dist/{ERPTableGroupRow-PSAPAHGL.js → ERPTableGroupRow-E5Q6FYDS.js} +4 -4
  3. package/dist/{ERPTableGroupRow-PSAPAHGL.js.map → ERPTableGroupRow-E5Q6FYDS.js.map} +1 -1
  4. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs → ERPTableGroupRow-F2IPDYL5.cjs} +9 -9
  5. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs.map → ERPTableGroupRow-F2IPDYL5.cjs.map} +1 -1
  6. package/dist/{GridPlugin-CJCaYnlw.d.ts → GridPlugin-Bewn0X51.d.ts} +1 -1
  7. package/dist/{GridPlugin-oxhq8AsM.d.cts → GridPlugin-DewWufGZ.d.cts} +1 -1
  8. package/dist/{GridSession-Bc7UIawO.d.ts → GridSession-CeIfVFck.d.ts} +142 -9
  9. package/dist/{GridSession-B-9lLcoB.d.cts → GridSession-CmQn2RnL.d.cts} +142 -9
  10. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  11. package/dist/{GridSyncService-TAPAHABV.cjs.map → GridSyncService-3JQLEY65.cjs.map} +1 -1
  12. package/dist/GridSyncService-GECXGEKL.js +3 -0
  13. package/dist/{GridSyncService-KTLB4KP3.js.map → GridSyncService-GECXGEKL.js.map} +1 -1
  14. package/dist/{PdfRenderer-CBg7hWNS.d.cts → PdfRenderer-B9FJaCo_.d.cts} +1 -1
  15. package/dist/{PdfRenderer-1HFh6UeR.d.ts → PdfRenderer-bN7ca_Aj.d.ts} +1 -1
  16. package/dist/{UITableController-DU8RopUM.d.ts → UITableController-C71LXBiX.d.ts} +48 -2
  17. package/dist/{UITableController-Cuwq481K.d.cts → UITableController-CIwnHIw8.d.cts} +48 -2
  18. package/dist/{VazirmatnPdfRenderer-BCMpC1zy.d.cts → VazirmatnPdfRenderer-CpCqA-Wh.d.cts} +2 -2
  19. package/dist/{VazirmatnPdfRenderer-Dz_G-m3c.d.ts → VazirmatnPdfRenderer-D46smncn.d.ts} +2 -2
  20. package/dist/adapters/arian-erp.cjs +16 -4
  21. package/dist/adapters/arian-erp.cjs.map +1 -1
  22. package/dist/adapters/arian-erp.d.cts +3 -1
  23. package/dist/adapters/arian-erp.d.ts +3 -1
  24. package/dist/adapters/arian-erp.js +11 -3
  25. package/dist/adapters/arian-erp.js.map +1 -1
  26. package/dist/{applyImportedRows-BO6yxoAN.d.cts → applyImportedRows-C2fWYoPy.d.cts} +3 -3
  27. package/dist/{applyImportedRows-D4zVY8uD.d.ts → applyImportedRows-Cqh_N_0k.d.ts} +3 -3
  28. package/dist/{applyRowVisibilityHandler-LXCOGESZ.cjs → applyRowVisibilityHandler-Q64ZFC7A.cjs} +7 -6
  29. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  30. package/dist/{applyRowVisibilityHandler-KS6TMCBN.js → applyRowVisibilityHandler-ZLZXQEGY.js} +6 -5
  31. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.map +1 -0
  32. package/dist/callbackRemoteApi-BYLjmSI6.d.ts +51 -0
  33. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  34. package/dist/{cellRenderContext-DB7V_mlu.d.ts → cellRenderContext-BaNh4qn_.d.ts} +2 -2
  35. package/dist/{cellRenderContext-DG5BOlxK.d.cts → cellRenderContext-DvngkptV.d.cts} +2 -2
  36. package/dist/{chunk-HTNJT2QU.js → chunk-27ALJSZP.js} +617 -104
  37. package/dist/chunk-27ALJSZP.js.map +1 -0
  38. package/dist/{chunk-KUBVDIF7.cjs → chunk-3HP3HQCW.cjs} +52 -17
  39. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  40. package/dist/{chunk-DXRCYW42.cjs → chunk-52LFOPXD.cjs} +43 -23
  41. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  42. package/dist/{chunk-VVGYRZ7S.cjs → chunk-72IVAOTK.cjs} +4 -4
  43. package/dist/{chunk-VVGYRZ7S.cjs.map → chunk-72IVAOTK.cjs.map} +1 -1
  44. package/dist/{chunk-LJ7LMEXO.js → chunk-7GWV5HGO.js} +3 -3
  45. package/dist/{chunk-LJ7LMEXO.js.map → chunk-7GWV5HGO.js.map} +1 -1
  46. package/dist/{chunk-RM6ZWNT3.js → chunk-7T6AWRPU.js} +43 -23
  47. package/dist/chunk-7T6AWRPU.js.map +1 -0
  48. package/dist/{chunk-PXCHPZTP.cjs → chunk-CMQ4VLCW.cjs} +8 -7
  49. package/dist/{chunk-EHHHC5JV.js.map → chunk-CMQ4VLCW.cjs.map} +1 -1
  50. package/dist/chunk-E2J533UH.cjs +53 -0
  51. package/dist/chunk-E2J533UH.cjs.map +1 -0
  52. package/dist/chunk-F6EMC75A.cjs +34 -0
  53. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  54. package/dist/chunk-GKE33FOJ.js +32 -0
  55. package/dist/chunk-GKE33FOJ.js.map +1 -0
  56. package/dist/{chunk-QQMU44KJ.js → chunk-HLOHWFOA.js} +52 -19
  57. package/dist/chunk-HLOHWFOA.js.map +1 -0
  58. package/dist/{chunk-633KP74Z.js → chunk-KCNTKYUY.js} +19 -2
  59. package/dist/chunk-KCNTKYUY.js.map +1 -0
  60. package/dist/{chunk-BLYVOV3G.cjs → chunk-LY27YAXE.cjs} +19 -2
  61. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  62. package/dist/{chunk-EHHHC5JV.js → chunk-NB5GCGHL.js} +5 -4
  63. package/dist/chunk-NB5GCGHL.js.map +1 -0
  64. package/dist/{chunk-6XBXZPBW.js → chunk-NQUVAJQA.js} +3 -3
  65. package/dist/{chunk-6XBXZPBW.js.map → chunk-NQUVAJQA.js.map} +1 -1
  66. package/dist/chunk-SVO62ZV2.js +50 -0
  67. package/dist/chunk-SVO62ZV2.js.map +1 -0
  68. package/dist/{chunk-MU3RY46O.js → chunk-VBAZ77Q4.js} +3 -3
  69. package/dist/{chunk-MU3RY46O.js.map → chunk-VBAZ77Q4.js.map} +1 -1
  70. package/dist/{chunk-H2LESGMX.cjs → chunk-VSAFQTW5.cjs} +4 -4
  71. package/dist/{chunk-H2LESGMX.cjs.map → chunk-VSAFQTW5.cjs.map} +1 -1
  72. package/dist/{chunk-2BJCRYOS.cjs → chunk-VYJQ2HTA.cjs} +5 -5
  73. package/dist/{chunk-2BJCRYOS.cjs.map → chunk-VYJQ2HTA.cjs.map} +1 -1
  74. package/dist/{chunk-IIISFUW4.cjs → chunk-WTHTVKVI.cjs} +621 -108
  75. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  76. package/dist/{createEngineGridQuery-Mt1hc33m.d.ts → createEngineGridQuery-BBkud5oE.d.ts} +61 -6
  77. package/dist/{createEngineGridQuery-Dmq3i5v3.d.cts → createEngineGridQuery-D-fgO_jg.d.cts} +61 -6
  78. package/dist/date-picker-jalali.cjs +17 -17
  79. package/dist/date-picker-jalali.d.cts +3 -3
  80. package/dist/date-picker-jalali.d.ts +3 -3
  81. package/dist/date-picker-jalali.js +1 -1
  82. package/dist/headless.cjs +102 -102
  83. package/dist/headless.d.cts +13 -9
  84. package/dist/headless.d.ts +13 -9
  85. package/dist/headless.js +4 -4
  86. package/dist/index.cjs +440 -382
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +34 -14
  89. package/dist/index.d.ts +34 -14
  90. package/dist/index.js +200 -143
  91. package/dist/index.js.map +1 -1
  92. package/dist/plugins/csv.cjs +3 -3
  93. package/dist/plugins/csv.d.cts +2 -2
  94. package/dist/plugins/csv.d.ts +2 -2
  95. package/dist/plugins/csv.js +2 -2
  96. package/dist/plugins/excel.cjs +11 -11
  97. package/dist/plugins/excel.d.cts +4 -4
  98. package/dist/plugins/excel.d.ts +4 -4
  99. package/dist/plugins/excel.js +3 -3
  100. package/dist/plugins/pdf/fonts/vazirmatn.cjs +6 -6
  101. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +4 -4
  102. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +4 -4
  103. package/dist/plugins/pdf/fonts/vazirmatn.js +3 -3
  104. package/dist/plugins/pdf.cjs +5 -5
  105. package/dist/plugins/pdf.d.cts +5 -5
  106. package/dist/plugins/pdf.d.ts +5 -5
  107. package/dist/plugins/pdf.js +2 -2
  108. package/dist/presence.d.cts +3 -3
  109. package/dist/presence.d.ts +3 -3
  110. package/dist/sync.cjs +2 -2
  111. package/dist/sync.d.cts +3 -3
  112. package/dist/sync.d.ts +3 -3
  113. package/dist/sync.js +1 -1
  114. package/package.json +3 -3
  115. package/dist/GridSyncService-KTLB4KP3.js +0 -3
  116. package/dist/GridSyncService-TAPAHABV.cjs +0 -12
  117. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +0 -1
  118. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +0 -1
  119. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +0 -30
  120. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +0 -30
  121. package/dist/chunk-633KP74Z.js.map +0 -1
  122. package/dist/chunk-ASPTRYRD.cjs +0 -21
  123. package/dist/chunk-ASPTRYRD.cjs.map +0 -1
  124. package/dist/chunk-BHDRUZH5.cjs +0 -33
  125. package/dist/chunk-BHDRUZH5.cjs.map +0 -1
  126. package/dist/chunk-BLYVOV3G.cjs.map +0 -1
  127. package/dist/chunk-DXRCYW42.cjs.map +0 -1
  128. package/dist/chunk-HTNJT2QU.js.map +0 -1
  129. package/dist/chunk-IIISFUW4.cjs.map +0 -1
  130. package/dist/chunk-KUBVDIF7.cjs.map +0 -1
  131. package/dist/chunk-KYAOSBQN.js +0 -31
  132. package/dist/chunk-KYAOSBQN.js.map +0 -1
  133. package/dist/chunk-PXCHPZTP.cjs.map +0 -1
  134. package/dist/chunk-QQMU44KJ.js.map +0 -1
  135. package/dist/chunk-RM6ZWNT3.js.map +0 -1
  136. package/dist/chunk-Y6W5V2CI.js +0 -19
  137. package/dist/chunk-Y6W5V2CI.js.map +0 -1
@@ -1,4 +1,4 @@
1
- export { CallbackRemoteApi } from '../chunk-Y6W5V2CI.js';
1
+ export { CallbackRemoteApi, createBaseQueryRemoteApi } from '../chunk-SVO62ZV2.js';
2
2
 
3
3
  // infrastructure/Repositories/fetchRemoteApi.ts
4
4
  function readCookie(name) {
@@ -56,9 +56,17 @@ var FetchRemoteApi = class {
56
56
  body: payload ? JSON.stringify(payload) : void 0
57
57
  });
58
58
  if (!res.ok) {
59
- this.err?.handle(`RemoteApi request failed: ${res.status}`, "FetchRemoteApi.request");
59
+ throw new Error(
60
+ `RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`
61
+ );
62
+ }
63
+ try {
64
+ return await res.json();
65
+ } catch {
66
+ throw new Error(
67
+ `RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`
68
+ );
60
69
  }
61
- return await res.json();
62
70
  } catch (error) {
63
71
  this.err?.handle(error, "FetchRemoteApi.request");
64
72
  throw error;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../infrastructure/Repositories/fetchRemoteApi.ts"],"names":[],"mappings":"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","file":"arian-erp.js","sourcesContent":["import { EngineErrorHandler } from '../../engine/EngineErrorHandler';\r\nimport { RemoteApi } from '../../application/ports/RemoteApi';\r\n\r\nexport type ErpDefaults = {\r\n PlaceId?: { id?: number };\r\n YearId?: { id?: number };\r\n LanguageId?: { id?: number };\r\n CashierId?: { id?: number };\r\n CurrencyId?: { id?: number };\r\n};\r\n\r\nfunction readCookie(name: string): string {\r\n if (typeof document === 'undefined') return '';\r\n const cookies = document.cookie.split(';');\r\n const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));\r\n if (!cookie) return '';\r\n return cookie.trim().slice(name.length + 1);\r\n}\r\n\r\nfunction readErpDefaults(): ErpDefaults {\r\n if (typeof window === 'undefined') return {};\r\n try {\r\n const storage = localStorage.getItem('persist:arianERP');\r\n const parsedStorage = JSON.parse(storage ?? '{}');\r\n const parsedConfig = JSON.parse(parsedStorage.config ?? '{}');\r\n return parsedConfig.defaultConfigs ?? {};\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction joinUrl(baseUrl: string, endpoint: string): string {\r\n if (/^https?:\\/\\//i.test(endpoint)) return endpoint;\r\n const base = baseUrl.replace(/\\/$/, '');\r\n const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\r\n return `${base}${path}`;\r\n}\r\n\r\n/**\r\n * Host-injected RemoteApi for arianERP.\r\n * Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.\r\n * Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON\r\n * (relative URLs work on the ERP host).\r\n * See `examples/host-arian-erp/host-arian-erp.md`.\r\n */\r\nexport type FetchRemoteApiOptions = {\r\n baseUrl?: string;\r\n /** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */\r\n getToken?: () => string | undefined | null;\r\n /** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */\r\n getDefaults?: () => ErpDefaults;\r\n /** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */\r\n fetcher?: typeof fetch;\r\n};\r\n\r\nexport class FetchRemoteApi implements RemoteApi {\r\n constructor(\r\n private readonly err?: EngineErrorHandler,\r\n private readonly options: FetchRemoteApiOptions = {},\r\n ) {}\r\n\r\n async request<TResponse = unknown>(input: {\r\n endpoint: string;\r\n params?: Record<string, unknown>;\r\n method?: 'GET' | 'POST';\r\n }): Promise<TResponse> {\r\n try {\r\n const defaults = this.options.getDefaults?.() ?? readErpDefaults();\r\n const token = this.options.getToken\r\n ? (this.options.getToken() ?? '')\r\n : readCookie('_auth');\r\n const method = input.method ?? 'POST';\r\n const url = joinUrl(this.options.baseUrl ?? '', input.endpoint);\r\n const payload =\r\n method === 'GET'\r\n ? undefined\r\n : {\r\n ...(input.params ?? {}),\r\n Defaults: {\r\n CurrencyId: defaults.CurrencyId?.id,\r\n CashierId: defaults.CashierId?.id,\r\n PlaceId: defaults.PlaceId?.id,\r\n YearId: defaults.YearId?.id,\r\n LangId: defaults.LanguageId?.id,\r\n },\r\n };\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n };\r\n if (token) headers.Authorization = `Bearer ${token}`;\r\n\r\n const res = await (this.options.fetcher ?? fetch)(url, {\r\n method,\r\n headers,\r\n body: payload ? JSON.stringify(payload) : undefined,\r\n });\r\n if (!res.ok) {\r\n this.err?.handle(`RemoteApi request failed: ${res.status}`, 'FetchRemoteApi.request');\r\n }\r\n return (await res.json()) as TResponse;\r\n } catch (error) {\r\n this.err?.handle(error, 'FetchRemoteApi.request');\r\n throw error;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../infrastructure/Repositories/fetchRemoteApi.ts"],"names":[],"mappings":"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","file":"arian-erp.js","sourcesContent":["import { EngineErrorHandler } from '../../engine/EngineErrorHandler';\nimport { RemoteApi } from '../../application/ports/RemoteApi';\n\nexport type ErpDefaults = {\n PlaceId?: { id?: number };\n YearId?: { id?: number };\n LanguageId?: { id?: number };\n CashierId?: { id?: number };\n CurrencyId?: { id?: number };\n};\n\nfunction readCookie(name: string): string {\n if (typeof document === 'undefined') return '';\n const cookies = document.cookie.split(';');\n const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));\n if (!cookie) return '';\n return cookie.trim().slice(name.length + 1);\n}\n\nfunction readErpDefaults(): ErpDefaults {\n if (typeof window === 'undefined') return {};\n try {\n const storage = localStorage.getItem('persist:arianERP');\n const parsedStorage = JSON.parse(storage ?? '{}');\n const parsedConfig = JSON.parse(parsedStorage.config ?? '{}');\n return parsedConfig.defaultConfigs ?? {};\n } catch {\n return {};\n }\n}\n\nfunction joinUrl(baseUrl: string, endpoint: string): string {\n if (/^https?:\\/\\//i.test(endpoint)) return endpoint;\n const base = baseUrl.replace(/\\/$/, '');\n const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${base}${path}`;\n}\n\n/**\n * Host-injected RemoteApi for arianERP.\n * Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.\n * Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON\n * (relative URLs work on the ERP host).\n * Non-2xx responses and non-JSON bodies reject with an `Error` naming the HTTP\n * status and endpoint (also reported through the optional error handler).\n * See `examples/host-arian-erp/host-arian-erp.md`.\n */\nexport type FetchRemoteApiOptions = {\n baseUrl?: string;\n /** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */\n getToken?: () => string | undefined | null;\n /** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */\n getDefaults?: () => ErpDefaults;\n /** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */\n fetcher?: typeof fetch;\n};\n\nexport class FetchRemoteApi implements RemoteApi {\n constructor(\n private readonly err?: EngineErrorHandler,\n private readonly options: FetchRemoteApiOptions = {},\n ) {}\n\n async request<TResponse = unknown>(input: {\n endpoint: string;\n params?: Record<string, unknown>;\n method?: 'GET' | 'POST';\n }): Promise<TResponse> {\n try {\n const defaults = this.options.getDefaults?.() ?? readErpDefaults();\n const token = this.options.getToken\n ? (this.options.getToken() ?? '')\n : readCookie('_auth');\n const method = input.method ?? 'POST';\n const url = joinUrl(this.options.baseUrl ?? '', input.endpoint);\n const payload =\n method === 'GET'\n ? undefined\n : {\n ...(input.params ?? {}),\n Defaults: {\n CurrencyId: defaults.CurrencyId?.id,\n CashierId: defaults.CashierId?.id,\n PlaceId: defaults.PlaceId?.id,\n YearId: defaults.YearId?.id,\n LangId: defaults.LanguageId?.id,\n },\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await (this.options.fetcher ?? fetch)(url, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n if (!res.ok) {\n // Never hand an error body to callers as if it were data.\n throw new Error(\n `RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n try {\n return (await res.json()) as TResponse;\n } catch {\n throw new Error(\n `RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n } catch (error) {\n this.err?.handle(error, 'FetchRemoteApi.request');\n throw error;\n }\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { G as GridPlugin, a as GridPluginContext, E as ExportSource, b as ExportColumnDef } from './GridPlugin-oxhq8AsM.cjs';
2
- import { U as UITableController } from './UITableController-Cuwq481K.cjs';
3
- import { b as GridSession } from './GridSession-B-9lLcoB.cjs';
1
+ import { G as GridPlugin, a as GridPluginContext, E as ExportSource, b as ExportColumnDef } from './GridPlugin-DewWufGZ.cjs';
2
+ import { U as UITableController } from './UITableController-CIwnHIw8.cjs';
3
+ import { b as GridSession } from './GridSession-CmQn2RnL.cjs';
4
4
 
5
5
  type ExcelExportPluginOptions = {
6
6
  /** Skip browser download (useful in tests / Node). */
@@ -1,6 +1,6 @@
1
- import { G as GridPlugin, a as GridPluginContext, E as ExportSource, b as ExportColumnDef } from './GridPlugin-CJCaYnlw.js';
2
- import { U as UITableController } from './UITableController-DU8RopUM.js';
3
- import { b as GridSession } from './GridSession-Bc7UIawO.js';
1
+ import { G as GridPlugin, a as GridPluginContext, E as ExportSource, b as ExportColumnDef } from './GridPlugin-Bewn0X51.js';
2
+ import { U as UITableController } from './UITableController-C71LXBiX.js';
3
+ import { b as GridSession } from './GridSession-CeIfVFck.js';
4
4
 
5
5
  type ExcelExportPluginOptions = {
6
6
  /** Skip browser download (useful in tests / Node). */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkDXRCYW42_cjs = require('./chunk-DXRCYW42.cjs');
3
+ var chunk52LFOPXD_cjs = require('./chunk-52LFOPXD.cjs');
4
4
  var chunkKMRURD5J_cjs = require('./chunk-KMRURD5J.cjs');
5
5
  var chunkNTV2UUAJ_cjs = require('./chunk-NTV2UUAJ.cjs');
6
6
 
@@ -50,13 +50,14 @@ var ApplyRowVisibilityHandler = class {
50
50
  if (!cell) continue;
51
51
  const value = cell.getValue();
52
52
  if (value == null || value === "") continue;
53
- await this.applyRemoteVisibilityRules({
53
+ const ok = await this.applyRemoteVisibilityRules({
54
54
  table,
55
55
  rowId: new chunkNTV2UUAJ_cjs.RowId(rowId),
56
56
  changedColumnId: new chunkNTV2UUAJ_cjs.ColumnId(colCfg.resolveOn.fieldName),
57
57
  newValue: value,
58
58
  clearDependents: false
59
59
  });
60
+ if (!ok) this.lastSignature = null;
60
61
  }
61
62
  await this.repo.save(store, table);
62
63
  const out = {
@@ -70,16 +71,16 @@ var ApplyRowVisibilityHandler = class {
70
71
  this.audit.log({ type: "INFORMATION", message: "ROW_VISIBILITY_APPLIED", payload: out });
71
72
  return [out];
72
73
  } catch (e) {
73
- chunkDXRCYW42_cjs.logError(this.audit, e, `ApplyRowVisibilityHandler[${tableKey}:${rowId}]`);
74
+ chunk52LFOPXD_cjs.logError(this.audit, e, `ApplyRowVisibilityHandler[${tableKey}:${rowId}]`);
74
75
  return [];
75
76
  }
76
77
  }
77
78
  /* ── identical to ChangeCellValueHandler helper ───────────────────── */
78
79
  applyRemoteVisibilityRules(input) {
79
- return chunkDXRCYW42_cjs.applyRemoteVisibilityRules(this.dynamic, input);
80
+ return chunk52LFOPXD_cjs.applyRemoteVisibilityRules(this.dynamic, input, this.audit);
80
81
  }
81
82
  };
82
83
 
83
84
  exports.ApplyRowVisibilityHandler = ApplyRowVisibilityHandler;
84
- //# sourceMappingURL=applyRowVisibilityHandler-LXCOGESZ.cjs.map
85
- //# sourceMappingURL=applyRowVisibilityHandler-LXCOGESZ.cjs.map
85
+ //# sourceMappingURL=applyRowVisibilityHandler-Q64ZFC7A.cjs.map
86
+ //# sourceMappingURL=applyRowVisibilityHandler-Q64ZFC7A.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../application/handlers/applyRowVisibilityHandler.ts"],"names":["DomainError","RowId","ColumnId","logError","applyRemoteVisibilityRules"],"mappings":"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","file":"applyRowVisibilityHandler-Q64ZFC7A.cjs","sourcesContent":["// application/handlers/applyRowVisibilityHandler.ts — lazy module (loaded the\n// first time a row with `resolveOn` columns becomes active).\nimport { ColumnSchema } from '../../bootstrap/type';\nimport { DomainError } from '../../domain/errors/DomainError';\nimport { Actor, PermissionPolicy } from '../../domain/policies';\nimport { ColumnId, RowId } from '../../domain/value-objects';\nimport { ApplyRowVisibilityCommand } from '../commands';\nimport { TableEvent } from '../events';\nimport { AuditLogger } from '../ports/AuditLogger';\nimport { TableRepository } from '../ports/TableRepository';\nimport {\n applyRemoteVisibilityRules,\n DynamicConfig,\n logError,\n} from './cellCommandsHandler';\n\n/* ======================================================\n ApplyRowVisibilityHandler\n ====================================================== */\n\n/**\n * هنگام فعال‌شدن (active) شدن یک سطر اجرا می‌شود:\n * برای هر ستون دارای resolveOn که سلولش مقدار دارد، applyRemoteVisibilityRules\n * را (بدون پاک‌کردن سلول‌های وابسته) صدا می‌زند تا visibilityCondition سطر فعال\n * از سرویس ریموت به‌روز شود. مقدار RowState سطر را تغییر نمی‌دهد.\n */\nexport class ApplyRowVisibilityHandler {\n /**\n * Dedupe guard: آخرین امضای (row + کالکشن + مقادیر ستون‌های resolveOn) که\n * برایش سر ریموت صدا زده شد. بدون این، دو مسیر مستقل (کلیک سطر →\n * setActiveRow و کلیک سلول → setActiveCell) و رفرش‌های متوالی، همان API را\n * چند بار صدا می‌زدند. وقتی مقادیر عوض شود امضای جدید است و API دوباره\n * صدا زده می‌شود.\n */\n private lastSignature: string | null = null;\n\n constructor(\n private readonly repo: TableRepository,\n private readonly audit: AuditLogger,\n private readonly permissionPolicy: PermissionPolicy,\n private readonly dynamic?: DynamicConfig,\n ) { }\n\n async execute(\n command: ApplyRowVisibilityCommand,\n actor: Actor,\n ): Promise<TableEvent[]> {\n const { store, tableKey, rowId } = command;\n const table = await this.repo.getById(store, tableKey);\n\n try {\n if (!this.dynamic) return [];\n\n const row = table.getRow(rowId);\n if (!row) {\n throw new DomainError('ROW_NOT_FOUND', `Row ${rowId} not found`, { rowId });\n }\n\n const previousVisibility = { ...(row.getVisibilityCondition() ?? {}) };\n const activeCollection = table.getActiveCollectionName() ?? 'default';\n\n // گارد کالکشن: هر کالکشن فقط resolveOnِ خودش را اجرا کند. بدون این،\n // دوقلوهای RpWayId سایر کالکشن‌ها هم حلقه را طی می‌کردند و API به ازای\n // هر کالکشن (۴ بار) صدا زده می‌شد.\n const resolveOnColumns = Array.from(this.dynamic.columnMeta.values())\n .filter(\n (colCfg): colCfg is ColumnSchema & { resolveOn: NonNullable<ColumnSchema['resolveOn']> } =>\n colCfg.resolveOn != null,\n )\n .filter(\n colCfg => (colCfg.fieldCollection ?? 'default') === activeCollection,\n );\n\n if (resolveOnColumns.length === 0) return [];\n\n // امضای dedupe: مقادیر فعلی سلول‌های resolveOn این سطر.\n const signatureParts = resolveOnColumns.map(colCfg =>\n String(row.getCell(colCfg.resolveOn.fieldName)?.getValue() ?? ''),\n );\n const signature =\n `${store}:${tableKey}:${rowId}:${activeCollection}:${signatureParts.join('|')}`;\n if (signature === this.lastSignature) {\n // همان سطر با همان مقادیر — فلگ‌ها عوض نشده‌اند؛ API و save لازم نیست.\n return [];\n }\n\n // ثبت امضا «قبل» از فراخوانی ریموت: دو مسیر dispatch (کلیک سطر و\n // کلیک سلول) تقریباً همزمان اجرا می‌شوند و اگر امضا بعد از await ثبت\n // می‌شد، هر دو از فیلتر رد می‌شدند و API دوبار صدا زده می‌شد.\n this.lastSignature = signature;\n\n for (const colCfg of resolveOnColumns) {\n const cell = row.getCell(colCfg.resolveOn.fieldName);\n if (!cell) continue;\n const value = cell.getValue();\n if (value == null || value === '') continue;\n\n const ok = await this.applyRemoteVisibilityRules({\n table,\n rowId: new RowId(rowId),\n changedColumnId: new ColumnId(colCfg.resolveOn.fieldName),\n newValue: value,\n clearDependents: false,\n });\n // Failed lookup: forget the signature so the next activation retries.\n if (!ok) this.lastSignature = null;\n }\n\n await this.repo.save(store, table);\n\n const out: TableEvent = {\n type: 'CELL_CHANGED',\n tableId: tableKey,\n rowId,\n columnId: 'visibilityCondition',\n previousValue: previousVisibility,\n newValue: row.getVisibilityCondition(),\n };\n this.audit.log({ type: 'INFORMATION', message: 'ROW_VISIBILITY_APPLIED', payload: out });\n return [out];\n\n } catch (e) {\n logError(this.audit, e, `ApplyRowVisibilityHandler[${tableKey}:${rowId}]`);\n return [];\n }\n }\n\n /* ── identical to ChangeCellValueHandler helper ───────────────────── */\n\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\n }\n}"]}
@@ -1,4 +1,4 @@
1
- import { logError, applyRemoteVisibilityRules } from './chunk-RM6ZWNT3.js';
1
+ import { logError, applyRemoteVisibilityRules } from './chunk-7T6AWRPU.js';
2
2
  import { DomainError } from './chunk-KHMG6EI2.js';
3
3
  import { ColumnId, RowId } from './chunk-XLRE2J25.js';
4
4
 
@@ -48,13 +48,14 @@ var ApplyRowVisibilityHandler = class {
48
48
  if (!cell) continue;
49
49
  const value = cell.getValue();
50
50
  if (value == null || value === "") continue;
51
- await this.applyRemoteVisibilityRules({
51
+ const ok = await this.applyRemoteVisibilityRules({
52
52
  table,
53
53
  rowId: new RowId(rowId),
54
54
  changedColumnId: new ColumnId(colCfg.resolveOn.fieldName),
55
55
  newValue: value,
56
56
  clearDependents: false
57
57
  });
58
+ if (!ok) this.lastSignature = null;
58
59
  }
59
60
  await this.repo.save(store, table);
60
61
  const out = {
@@ -74,10 +75,10 @@ var ApplyRowVisibilityHandler = class {
74
75
  }
75
76
  /* ── identical to ChangeCellValueHandler helper ───────────────────── */
76
77
  applyRemoteVisibilityRules(input) {
77
- return applyRemoteVisibilityRules(this.dynamic, input);
78
+ return applyRemoteVisibilityRules(this.dynamic, input, this.audit);
78
79
  }
79
80
  };
80
81
 
81
82
  export { ApplyRowVisibilityHandler };
82
- //# sourceMappingURL=applyRowVisibilityHandler-KS6TMCBN.js.map
83
- //# sourceMappingURL=applyRowVisibilityHandler-KS6TMCBN.js.map
83
+ //# sourceMappingURL=applyRowVisibilityHandler-ZLZXQEGY.js.map
84
+ //# sourceMappingURL=applyRowVisibilityHandler-ZLZXQEGY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../application/handlers/applyRowVisibilityHandler.ts"],"names":[],"mappings":"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","file":"applyRowVisibilityHandler-ZLZXQEGY.js","sourcesContent":["// application/handlers/applyRowVisibilityHandler.ts — lazy module (loaded the\n// first time a row with `resolveOn` columns becomes active).\nimport { ColumnSchema } from '../../bootstrap/type';\nimport { DomainError } from '../../domain/errors/DomainError';\nimport { Actor, PermissionPolicy } from '../../domain/policies';\nimport { ColumnId, RowId } from '../../domain/value-objects';\nimport { ApplyRowVisibilityCommand } from '../commands';\nimport { TableEvent } from '../events';\nimport { AuditLogger } from '../ports/AuditLogger';\nimport { TableRepository } from '../ports/TableRepository';\nimport {\n applyRemoteVisibilityRules,\n DynamicConfig,\n logError,\n} from './cellCommandsHandler';\n\n/* ======================================================\n ApplyRowVisibilityHandler\n ====================================================== */\n\n/**\n * هنگام فعال‌شدن (active) شدن یک سطر اجرا می‌شود:\n * برای هر ستون دارای resolveOn که سلولش مقدار دارد، applyRemoteVisibilityRules\n * را (بدون پاک‌کردن سلول‌های وابسته) صدا می‌زند تا visibilityCondition سطر فعال\n * از سرویس ریموت به‌روز شود. مقدار RowState سطر را تغییر نمی‌دهد.\n */\nexport class ApplyRowVisibilityHandler {\n /**\n * Dedupe guard: آخرین امضای (row + کالکشن + مقادیر ستون‌های resolveOn) که\n * برایش سر ریموت صدا زده شد. بدون این، دو مسیر مستقل (کلیک سطر →\n * setActiveRow و کلیک سلول → setActiveCell) و رفرش‌های متوالی، همان API را\n * چند بار صدا می‌زدند. وقتی مقادیر عوض شود امضای جدید است و API دوباره\n * صدا زده می‌شود.\n */\n private lastSignature: string | null = null;\n\n constructor(\n private readonly repo: TableRepository,\n private readonly audit: AuditLogger,\n private readonly permissionPolicy: PermissionPolicy,\n private readonly dynamic?: DynamicConfig,\n ) { }\n\n async execute(\n command: ApplyRowVisibilityCommand,\n actor: Actor,\n ): Promise<TableEvent[]> {\n const { store, tableKey, rowId } = command;\n const table = await this.repo.getById(store, tableKey);\n\n try {\n if (!this.dynamic) return [];\n\n const row = table.getRow(rowId);\n if (!row) {\n throw new DomainError('ROW_NOT_FOUND', `Row ${rowId} not found`, { rowId });\n }\n\n const previousVisibility = { ...(row.getVisibilityCondition() ?? {}) };\n const activeCollection = table.getActiveCollectionName() ?? 'default';\n\n // گارد کالکشن: هر کالکشن فقط resolveOnِ خودش را اجرا کند. بدون این،\n // دوقلوهای RpWayId سایر کالکشن‌ها هم حلقه را طی می‌کردند و API به ازای\n // هر کالکشن (۴ بار) صدا زده می‌شد.\n const resolveOnColumns = Array.from(this.dynamic.columnMeta.values())\n .filter(\n (colCfg): colCfg is ColumnSchema & { resolveOn: NonNullable<ColumnSchema['resolveOn']> } =>\n colCfg.resolveOn != null,\n )\n .filter(\n colCfg => (colCfg.fieldCollection ?? 'default') === activeCollection,\n );\n\n if (resolveOnColumns.length === 0) return [];\n\n // امضای dedupe: مقادیر فعلی سلول‌های resolveOn این سطر.\n const signatureParts = resolveOnColumns.map(colCfg =>\n String(row.getCell(colCfg.resolveOn.fieldName)?.getValue() ?? ''),\n );\n const signature =\n `${store}:${tableKey}:${rowId}:${activeCollection}:${signatureParts.join('|')}`;\n if (signature === this.lastSignature) {\n // همان سطر با همان مقادیر — فلگ‌ها عوض نشده‌اند؛ API و save لازم نیست.\n return [];\n }\n\n // ثبت امضا «قبل» از فراخوانی ریموت: دو مسیر dispatch (کلیک سطر و\n // کلیک سلول) تقریباً همزمان اجرا می‌شوند و اگر امضا بعد از await ثبت\n // می‌شد، هر دو از فیلتر رد می‌شدند و API دوبار صدا زده می‌شد.\n this.lastSignature = signature;\n\n for (const colCfg of resolveOnColumns) {\n const cell = row.getCell(colCfg.resolveOn.fieldName);\n if (!cell) continue;\n const value = cell.getValue();\n if (value == null || value === '') continue;\n\n const ok = await this.applyRemoteVisibilityRules({\n table,\n rowId: new RowId(rowId),\n changedColumnId: new ColumnId(colCfg.resolveOn.fieldName),\n newValue: value,\n clearDependents: false,\n });\n // Failed lookup: forget the signature so the next activation retries.\n if (!ok) this.lastSignature = null;\n }\n\n await this.repo.save(store, table);\n\n const out: TableEvent = {\n type: 'CELL_CHANGED',\n tableId: tableKey,\n rowId,\n columnId: 'visibilityCondition',\n previousValue: previousVisibility,\n newValue: row.getVisibilityCondition(),\n };\n this.audit.log({ type: 'INFORMATION', message: 'ROW_VISIBILITY_APPLIED', payload: out });\n return [out];\n\n } catch (e) {\n logError(this.audit, e, `ApplyRowVisibilityHandler[${tableKey}:${rowId}]`);\n return [];\n }\n }\n\n /* ── identical to ChangeCellValueHandler helper ───────────────────── */\n\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\n }\n}"]}
@@ -0,0 +1,51 @@
1
+ import { R as RemoteApi } from './RemoteApi-CCQxiSf1.js';
2
+
3
+ /** Shape resolved by RTK Query base queries: they never throw, they resolve `{ error }`. */
4
+ type BaseQueryResult = {
5
+ data?: unknown;
6
+ error?: unknown;
7
+ } | null | undefined;
8
+ type RemoteApiRequest = {
9
+ endpoint: string;
10
+ params?: Record<string, unknown>;
11
+ method?: 'GET' | 'POST';
12
+ };
13
+ /**
14
+ * Wraps ANY host transport as a `RemoteApi` port — the grid never learns how
15
+ * requests are authenticated or where defaults come from.
16
+ *
17
+ * arianERP example (RTK Query base query with token refresh + Redux defaults):
18
+ *
19
+ * const remoteApi = new CallbackRemoteApi(async ({ endpoint, params, method }) => {
20
+ * const res = await baseQueryByToken(
21
+ * { url: endpoint, method: method ?? 'POST', body: params ?? {} },
22
+ * { getState: () => store.getState(), dispatch: store.dispatch } as never,
23
+ * {},
24
+ * );
25
+ * if (!res || res.error) throw new Error('request failed'); // RTK resolves { error }
26
+ * return res.data;
27
+ * });
28
+ *
29
+ * or let `createBaseQueryRemoteApi` do that check (throws on `error`, returns `data`).
30
+ */
31
+ declare class CallbackRemoteApi implements RemoteApi {
32
+ private readonly send;
33
+ private readonly onError?;
34
+ constructor(send: (request: RemoteApiRequest) => Promise<unknown>, onError?: ((error: unknown) => void) | undefined);
35
+ request<TResponse = unknown>(input: RemoteApiRequest): Promise<TResponse>;
36
+ }
37
+ /**
38
+ * Adapter for RTK-style base queries that resolve `{ data } | { error }` instead
39
+ * of throwing. The returned `send` rejects when `error` is set (or the result
40
+ * is empty) and resolves `data` otherwise, so the grid never treats a failure
41
+ * as `undefined` data.
42
+ *
43
+ * const remoteApi = new CallbackRemoteApi(
44
+ * createBaseQueryRemoteApi(({ endpoint, params, method }) =>
45
+ * baseQueryByToken({ url: endpoint, method: method ?? 'POST', body: params ?? {} }, api, {}),
46
+ * ),
47
+ * );
48
+ */
49
+ declare function createBaseQueryRemoteApi(run: (request: RemoteApiRequest) => Promise<BaseQueryResult>, onError?: (error: unknown, request: RemoteApiRequest) => void): (request: RemoteApiRequest) => Promise<unknown>;
50
+
51
+ export { type BaseQueryResult as B, CallbackRemoteApi as C, type RemoteApiRequest as R, createBaseQueryRemoteApi as c };
@@ -0,0 +1,51 @@
1
+ import { R as RemoteApi } from './RemoteApi-CCQxiSf1.cjs';
2
+
3
+ /** Shape resolved by RTK Query base queries: they never throw, they resolve `{ error }`. */
4
+ type BaseQueryResult = {
5
+ data?: unknown;
6
+ error?: unknown;
7
+ } | null | undefined;
8
+ type RemoteApiRequest = {
9
+ endpoint: string;
10
+ params?: Record<string, unknown>;
11
+ method?: 'GET' | 'POST';
12
+ };
13
+ /**
14
+ * Wraps ANY host transport as a `RemoteApi` port — the grid never learns how
15
+ * requests are authenticated or where defaults come from.
16
+ *
17
+ * arianERP example (RTK Query base query with token refresh + Redux defaults):
18
+ *
19
+ * const remoteApi = new CallbackRemoteApi(async ({ endpoint, params, method }) => {
20
+ * const res = await baseQueryByToken(
21
+ * { url: endpoint, method: method ?? 'POST', body: params ?? {} },
22
+ * { getState: () => store.getState(), dispatch: store.dispatch } as never,
23
+ * {},
24
+ * );
25
+ * if (!res || res.error) throw new Error('request failed'); // RTK resolves { error }
26
+ * return res.data;
27
+ * });
28
+ *
29
+ * or let `createBaseQueryRemoteApi` do that check (throws on `error`, returns `data`).
30
+ */
31
+ declare class CallbackRemoteApi implements RemoteApi {
32
+ private readonly send;
33
+ private readonly onError?;
34
+ constructor(send: (request: RemoteApiRequest) => Promise<unknown>, onError?: ((error: unknown) => void) | undefined);
35
+ request<TResponse = unknown>(input: RemoteApiRequest): Promise<TResponse>;
36
+ }
37
+ /**
38
+ * Adapter for RTK-style base queries that resolve `{ data } | { error }` instead
39
+ * of throwing. The returned `send` rejects when `error` is set (or the result
40
+ * is empty) and resolves `data` otherwise, so the grid never treats a failure
41
+ * as `undefined` data.
42
+ *
43
+ * const remoteApi = new CallbackRemoteApi(
44
+ * createBaseQueryRemoteApi(({ endpoint, params, method }) =>
45
+ * baseQueryByToken({ url: endpoint, method: method ?? 'POST', body: params ?? {} }, api, {}),
46
+ * ),
47
+ * );
48
+ */
49
+ declare function createBaseQueryRemoteApi(run: (request: RemoteApiRequest) => Promise<BaseQueryResult>, onError?: (error: unknown, request: RemoteApiRequest) => void): (request: RemoteApiRequest) => Promise<unknown>;
50
+
51
+ export { type BaseQueryResult as B, CallbackRemoteApi as C, type RemoteApiRequest as R, createBaseQueryRemoteApi as c };
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
- import { U as UIRow, C as ColumnSchema, V as ValidCell, D as DefaultOptionType } from './GridSession-Bc7UIawO.js';
3
- import { U as UITableController } from './UITableController-DU8RopUM.js';
2
+ import { U as UIRow, C as ColumnSchema, V as ValidCell, D as DefaultOptionType } from './GridSession-CeIfVFck.js';
3
+ import { U as UITableController } from './UITableController-C71LXBiX.js';
4
4
 
5
5
  /**
6
6
  * Argument passed to `ColumnSchema.render` / `ColumnViewBinding.render`.
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
- import { U as UIRow, C as ColumnSchema, V as ValidCell, D as DefaultOptionType } from './GridSession-B-9lLcoB.cjs';
3
- import { U as UITableController } from './UITableController-Cuwq481K.cjs';
2
+ import { U as UIRow, C as ColumnSchema, V as ValidCell, D as DefaultOptionType } from './GridSession-CmQn2RnL.cjs';
3
+ import { U as UITableController } from './UITableController-CIwnHIw8.cjs';
4
4
 
5
5
  /**
6
6
  * Argument passed to `ColumnSchema.render` / `ColumnViewBinding.render`.