persian-data-grid 0.5.0 → 0.7.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-E5Q6FYDS.js +125 -0
- package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
- package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
- package/dist/GridPlugin-DewWufGZ.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-CeIfVFck.d.ts +2625 -0
- package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
- package/dist/GridSyncService-3JQLEY65.cjs +12 -0
- package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
- package/dist/GridSyncService-GECXGEKL.js +3 -0
- package/dist/GridSyncService-GECXGEKL.js.map +1 -0
- package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
- package/dist/PdfRenderer-bN7ca_Aj.d.ts +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-C71LXBiX.d.ts +678 -0
- package/dist/UITableController-CIwnHIw8.d.cts +678 -0
- package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +89 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +62 -0
- package/dist/adapters/arian-erp.d.ts +62 -0
- package/dist/adapters/arian-erp.js +79 -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-C2fWYoPy.d.cts +135 -0
- package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.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-BYLjmSI6.d.ts +51 -0
- package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
- package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
- package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
- package/dist/chunk-27ALJSZP.js +12187 -0
- package/dist/chunk-27ALJSZP.js.map +1 -0
- package/dist/chunk-3HP3HQCW.cjs +688 -0
- package/dist/chunk-3HP3HQCW.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-52LFOPXD.cjs +588 -0
- package/dist/chunk-52LFOPXD.cjs.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-72IVAOTK.cjs +38 -0
- package/dist/chunk-72IVAOTK.cjs.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-7GWV5HGO.js +36 -0
- package/dist/chunk-7GWV5HGO.js.map +1 -0
- package/dist/chunk-7T6AWRPU.js +581 -0
- package/dist/chunk-7T6AWRPU.js.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-CMQ4VLCW.cjs +840 -0
- package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-E2J533UH.cjs +53 -0
- package/dist/chunk-E2J533UH.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-F6EMC75A.cjs +34 -0
- package/dist/chunk-F6EMC75A.cjs.map +1 -0
- package/dist/chunk-GKE33FOJ.js +32 -0
- package/dist/chunk-GKE33FOJ.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-HLOHWFOA.js +645 -0
- package/dist/chunk-HLOHWFOA.js.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-KCNTKYUY.js +206 -0
- package/dist/chunk-KCNTKYUY.js.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-LY27YAXE.cjs +208 -0
- package/dist/chunk-LY27YAXE.cjs.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.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-NB5GCGHL.js +833 -0
- package/dist/chunk-NB5GCGHL.js.map +1 -0
- package/dist/chunk-NQUVAJQA.js +298 -0
- package/dist/chunk-NQUVAJQA.js.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-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.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-SVO62ZV2.js +50 -0
- package/dist/chunk-SVO62ZV2.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-VBAZ77Q4.js +932 -0
- package/dist/chunk-VBAZ77Q4.js.map +1 -0
- package/dist/chunk-VSAFQTW5.cjs +319 -0
- package/dist/chunk-VSAFQTW5.cjs.map +1 -0
- package/dist/chunk-VYJQ2HTA.cjs +936 -0
- package/dist/chunk-VYJQ2HTA.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WTHTVKVI.cjs +12299 -0
- package/dist/chunk-WTHTVKVI.cjs.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-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-BBkud5oE.d.ts +939 -0
- package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -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 +508 -0
- package/dist/headless.d.ts +508 -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 +8060 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +457 -2305
- package/dist/index.d.ts +457 -2305
- package/dist/index.js +7302 -11084
- 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 +185 -29
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../ui/styles/injectStyles.ts","../ui/host/messages.ts","../ui/host/ERPTableHost.tsx","../ui/host/useMediaQuery.ts","../ui/host/useRemoteQuery.ts","../ui/host/toast.ts","../ui/hooks/useEngineSelector.ts","../ui/gridSearch/scrollToMatch.ts","../ui/hooks/useScrollToSearchMatch.ts","../ui/primitives/chrome.tsx","../ui/primitives/Dropdown.tsx","../ui/primitives/Select.tsx","../ui/primitives/icons.tsx","../ui/primitives/Pagination.tsx","../ui/primitives/DatePicker.tsx","../domain/value-objects/Viewport.ts","../domain/value-objects/index.ts","../ui/cellRenderer/ERPTableDynamicSelect.tsx","../ui/gridSearch/highlightText.tsx","../ui/helper.ts","../ui/cellRenderer/descriptionComponent/index.tsx","../ui/cellRenderer/index.tsx","../ui/desktop/indexCol.tsx","../ui/desktop/eRPTableRow.tsx","../ui/desktop/ERPTableBody.tsx","../ui/desktop/ERPTableFooter.tsx","../ui/gridSearch/utils.ts","../ui/desktop/ERPTableHeader.tsx","../engine/equality.ts","../engine/ViewportCalculator.ts","../ui/virtual/virtualWindow.ts","../ui/virtual/useVirtualWindow.ts","../ui/desktop/ERPTableVirtualBody.tsx","../packages/plugins/excel/src/formatExportValue.ts","../packages/plugins/excel/src/buildExportTable.ts","../packages/plugins/excel/src/buildXlsxBlob.ts","../packages/plugins/excel/src/exportActiveCollectionToExcel.ts","../packages/plugins/excel/src/parseXlsxBlob.ts","../packages/plugins/excel/src/mapImportedSheet.ts","../packages/plugins/excel/src/applyImportedRows.ts","../ui/gridSearch/GridSearchPanel.tsx","../ui/gridSearch/GridSearchControl.tsx","../ui/multiSelectList/body.tsx","../ui/multiSelectList/header.tsx","../ui/multiSelectList/index.tsx","../ui/desktop/groupActionButtons.tsx","../ui/desktop/pagination.tsx","../ui/desktop/resolveDesktopVirtualization.ts","../ui/desktop/useERPTableLayout.ts","../ui/desktop/DesktopTable.tsx","../ui/mobile/MobileActionButtons.tsx","../ui/mobile/MobileLoadMoreButton.tsx","../ui/mobile/buildDynamicSource.ts","../ui/mobile/MobileRowFormModal.tsx","../ui/mobile/MobileIndexCol.tsx","../ui/mobile/MobileTableRow.tsx","../ui/mobile/MobileTableBody.tsx","../ui/mobile/MobileTableHeader.tsx","../ui/mobile/scrollToTableEnd.ts","../ui/mobile/useScrollAfterMobileAdd.ts","../ui/mobile/MobileTable.tsx","../domain/events/index.ts","../domain/entities/Cell.ts","../domain/entities/Collection.ts","../domain/entities/Row.ts","../domain/entities/Table.ts","../application/commands/index.ts","../domain/errors/DomainError.ts","../engine/EngineErrorHandler.ts","../engine/managers/NavigationManager.ts","../engine/managers/RowManager.ts","../engine/managers/SelectionManager.ts","../engine/tableStore.ts","../engine/type.ts","../engine/ViewStateBuilder.ts","../engine/tableEngine.ts","../infrastructure/Repositories/indexedDbTableRepository.ts","../infrastructure/Repositories/localTableRepository.ts","../infrastructure/Repositories/cachedTableRepository.ts","../infrastructure/Repositories/consoleAuditLogger.ts","../infrastructure/Repositories/fetchRemoteApi.ts","../infrastructure/Repositories/noopRemoteApi.ts","../infrastructure/eventStore/InMemoryEventStore.ts","../infrastructure/eventStore/KvDatabase.ts","../infrastructure/eventStore/IndexedDbEventStore.ts","../infrastructure/history/HistoryPanelViewModel.ts","../infrastructure/projections/ChangelogProjection.ts","../infrastructure/ui/UITableController.ts","../application/undo/CellUndoStack.ts","../application/plugins/createEngineGridQuery.ts","../application/plugins/PluginHost.ts","../infrastructure/ui/UITableKeyboardHandler.ts","../infrastructure/session/DefaultGridSession.ts","../infrastructure/columns/mapColumnSchema.ts","../application/handlers/cellCommandsHandler.ts","../application/handlers/rowCommandsHandler.ts","../application/handlers/tableCommandHandler.ts","../application/TableAppService.ts","../bootstrap/builders/index.ts","../bootstrap/index.ts","../ui/useERPTable.ts","../ui/index.tsx","../infrastructure/snapshot/SnapshotStrategy.ts","../infrastructure/snapshot/InMemorySnapshotStore.ts","../application/events/eventCatalog.ts","../infrastructure/perf/benchmark.ts","../engine/SparseRowIndex.ts","../ui/virtual/VirtualList.tsx","../packages/plugins/excel/src/ExcelExportPlugin.ts","../packages/plugins/excel/src/ExcelImportPlugin.ts","../packages/plugins/pdf/src/TextPdfRenderer.ts","../packages/plugins/pdf/src/PdfExportPlugin.ts"],"names":["createContext","useMemo","jsx","useContext","useState","useEffect","useCallback","useRef","useLayoutEffect","Fragment","jsxs","createPortal","useId","PersianDatePicker","RowStateEnum","Pagination","forwardRef","dependOn","React","cellText","hasMeaningfulValue","strFromU8","unzipSync","rows","pageSize","toUint8Array"],"mappings":";;;;;;;;;;;;;AAAC,IAAM,QAAA,GAAW,wBAAA;AAElB,IAAM,GAAA,GAAM;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","file":"index.cjs","sourcesContent":["const STYLE_ID = 'erp-table-injected-css';\r\n\r\nconst CSS = `\r\n/* Visual tokens copied from the ERP Tailwind theme so the published\r\n table looks identical after npm install (no host Tailwind scan). */\r\n\r\n.erp-table {\r\n --erp-main-black: #0e0e0e;\r\n --erp-main-white: #fff;\r\n --erp-gray-3: #f4f4f4;\r\n --erp-gray-5: #ececec;\r\n --erp-gray-6: #cecece;\r\n --erp-gray-7: #b1b1b1;\r\n --erp-gray-8: #939393;\r\n --erp-gray-85: #848484;\r\n --erp-gray-9: #767676;\r\n --erp-gray-10: #585858;\r\n --erp-gray-11: #515151;\r\n --erp-black-6: #292929;\r\n --erp-blue-6: #0658b0;\r\n --erp-blue-11: #ddecfd;\r\n --erp-blue-100: #dbeafe;\r\n --erp-red-100: #fee2e2;\r\n --erp-red-300: #fca5a5;\r\n --erp-red-600: #dc2626;\r\n --erp-yellow-200: #fef08a;\r\n --erp-yellow-400: #facc15;\r\n --erp-zinc-200: #e4e4e7;\r\n --erp-neutral-500: #737373;\r\n font-family: IRANSans, Tahoma, sans-serif;\r\n color: var(--erp-black-6);\r\n box-sizing: border-box;\r\n width: 100%;\r\n}\r\n\r\n.erp-table *,\r\n.erp-table *::before,\r\n.erp-table *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n.erp-table table {\r\n border-collapse: collapse;\r\n}\r\n\r\n.erp-table .flex { display: flex; }\r\n.erp-table .inline-flex { display: inline-flex; }\r\n.erp-table .flex-col { flex-direction: column; }\r\n.erp-table .flex-1 { flex: 1 1 0%; }\r\n.erp-table .flex-wrap { flex-wrap: wrap; }\r\n.erp-table .shrink-0 { flex-shrink: 0; }\r\n.erp-table .items-center { align-items: center; }\r\n.erp-table .items-start { align-items: flex-start; }\r\n.erp-table .justify-between { justify-content: space-between; }\r\n.erp-table .justify-start { justify-content: flex-start; }\r\n.erp-table .justify-end { justify-content: flex-end; }\r\n.erp-table .justify-center { justify-content: center; }\r\n.erp-table .gap-1 { gap: 0.25rem; }\r\n.erp-table .gap-2 { gap: 0.5rem; }\r\n.erp-table .gap-3 { gap: 0.75rem; }\r\n.erp-table .gap-4 { gap: 1rem; }\r\n.erp-table .gap-5 { gap: 1.25rem; }\r\n.erp-table .w-full { width: 100%; }\r\n.erp-table .h-full { height: 100%; }\r\n.erp-table .h-8 { height: 2rem; }\r\n.erp-table .h-9 { height: 2.25rem; }\r\n.erp-table .h-10 { height: 2.5rem; }\r\n.erp-table .\\!h-9 { height: 2.25rem !important; }\r\n.erp-table .\\!h-full { height: 100% !important; }\r\n.erp-table .\\!h-\\[480px\\] { height: 480px !important; }\r\n.erp-table .min-w-max { min-width: max-content; }\r\n.erp-table .min-w-0 { min-width: 0; }\r\n.erp-table .min-w-24 { min-width: 6rem; }\r\n.erp-table .min-w-36 { min-width: 9rem; }\r\n.erp-table .min-w-5 { min-width: 1.25rem; }\r\n.erp-table .max-w-72 { max-width: 18rem; }\r\n.erp-table .max-h-\\[20rem\\] { max-height: 20rem; }\r\n.erp-table .max-w-\\[40vw\\] { max-width: 40vw; }\r\n.erp-table .w-2 { width: 0.5rem; }\r\n.erp-table .h-2 { height: 0.5rem; }\r\n.erp-table .w-fit { width: fit-content; }\r\n.erp-table .w-\\[16px\\] { width: 16px; }\r\n.erp-table .h-\\[16px\\] { height: 16px; }\r\n.erp-table .w-\\[20px\\] { width: 20px; }\r\n.erp-table .w-\\[2\\.125rem\\] { width: 2.125rem; }\r\n.erp-table .h-\\[2\\.125rem\\] { height: 2.125rem; }\r\n.erp-table .w-\\[720px\\] { width: 720px; }\r\n.erp-table .min-w-\\[320px\\] { min-width: 320px; }\r\n.erp-table .overflow-auto { overflow: auto; }\r\n.erp-table .overflow-hidden { overflow: hidden; }\r\n.erp-table .overflow-x-auto { overflow-x: auto; }\r\n.erp-table .overflow-y-auto { overflow-y: auto; }\r\n.erp-table .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n.erp-table .text-ellipsis { text-overflow: ellipsis; }\r\n.erp-table .whitespace-nowrap { white-space: nowrap; }\r\n.erp-table .text-3xs { font-size: 8px; }\r\n.erp-table .text-xs { font-size: 12px; line-height: 1.25rem; }\r\n.erp-table .text-sm { font-size: 14px; line-height: 1.25rem; }\r\n.erp-table .text-md { font-size: 16px; }\r\n.erp-table .text-start { text-align: start; }\r\n.erp-table .text-center { text-align: center; }\r\n.erp-table .text-white { color: #fff; }\r\n.erp-table .font-light { font-weight: 300; }\r\n.erp-table .font-medium { font-weight: 500; }\r\n.erp-table .font-semibold { font-weight: 600; }\r\n.erp-table .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; }\r\n.erp-table .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }\r\n.erp-table .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\r\n.erp-table .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\r\n.erp-table .py-1\\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }\r\n.erp-table .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\r\n.erp-table .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }\r\n.erp-table .p-0 { padding: 0; }\r\n.erp-table .p-1 { padding: 0.25rem; }\r\n.erp-table .p-1\\.5 { padding: 0.375rem; }\r\n.erp-table .p-2 { padding: 0.5rem; }\r\n.erp-table .p-3 { padding: 0.75rem; }\r\n.erp-table .pb-24 { padding-bottom: 6rem; }\r\n.erp-table .pt-5 { padding-top: 1.25rem; }\r\n.erp-table .m-0 { margin: 0; }\r\n.erp-table .m-12 { margin: 3rem; }\r\n.erp-table .my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; }\r\n.erp-table .ms-auto { margin-inline-start: auto; }\r\n.erp-table .start-1 { inset-inline-start: 0.25rem; }\r\n.erp-table .border { border-width: 1px; border-style: solid; border-color: var(--erp-gray-5); }\r\n.erp-table .border-0 { border-width: 0; }\r\n.erp-table .border-b { border-bottom: 1px solid var(--erp-gray-5); }\r\n.erp-table .border-t { border-top: 1px solid var(--erp-gray-5); }\r\n.erp-table .border-dashed { border-style: dashed; }\r\n.erp-table .rounded { border-radius: 0.25rem; }\r\n.erp-table .rounded-t-lg { border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; }\r\n.erp-table .rounded-lg { border-radius: 0.5rem; }\r\n.erp-table .rounded-full { border-radius: 9999px; }\r\n.erp-table .rounded-sm { border-radius: 0.125rem; }\r\n.erp-table .sticky { position: sticky; }\r\n.erp-table .absolute { position: absolute; }\r\n.erp-table .relative { position: relative; }\r\n.erp-table .fixed { position: fixed; }\r\n.erp-table .inset-0 { inset: 0; }\r\n.erp-table .top-0 { top: 0; }\r\n.erp-table .top-1 { top: 0.25rem; }\r\n.erp-table .right-0 { right: 0; }\r\n.erp-table .left-0 { left: 0; }\r\n.erp-table .z-10 { z-index: 10; }\r\n.erp-table .z-20 { z-index: 20; }\r\n.erp-table .shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); }\r\n.erp-table .shadow-lg { box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1); }\r\n.erp-table .transition-all { transition: all 0.2s ease; }\r\n.erp-table .transition-colors { transition: color 0.15s ease, background-color 0.15s ease; }\r\n.erp-table .duration-200 { transition-duration: 200ms; }\r\n.erp-table .duration-300 { transition-duration: 300ms; }\r\n.erp-table .duration-400 { transition-duration: 400ms; }\r\n.erp-table .cursor-pointer { cursor: pointer; }\r\n.erp-table .cursor-text { cursor: text; }\r\n.erp-table .cursor-not-allowed { cursor: not-allowed; }\r\n.erp-table .cursor-grab { cursor: grab; }\r\n.erp-table .cursor-grabbing,\r\n.erp-table .active\\\\:cursor-grabbing:active { cursor: grabbing; }\r\n.erp-table .cursor-wait { cursor: wait; }\r\n.erp-table .opacity-30 { opacity: 0.3; }\r\n.erp-table .opacity-40 { opacity: 0.4; }\r\n.erp-table .opacity-50 { opacity: 0.5; }\r\n.erp-table .opacity-60 { opacity: 0.6; }\r\n.erp-table .opacity-100 { opacity: 1; }\r\n.erp-table .line-through { text-decoration: line-through; }\r\n.erp-table .bg-transparent { background-color: transparent; }\r\n.erp-table .outline-none,\r\n.erp-table .focus\\:outline-none:focus,\r\n.erp-table .focus-visible\\:outline-none:focus-visible { outline: none; }\r\n.erp-table .ring-0,\r\n.erp-table .focus\\:ring-0:focus,\r\n.erp-table .focus\\:\\!ring-0:focus { box-shadow: none !important; }\r\n.erp-table .ring-2 { box-shadow: 0 0 0 2px var(--erp-yellow-400); }\r\n.erp-table .ring-yellow-400 { --tw-ring-color: var(--erp-yellow-400); }\r\n.erp-table .bg-main-white { background-color: var(--erp-main-white); }\r\n.erp-table .bg-main-black { background-color: var(--erp-main-black); }\r\n.erp-table .bg-gray-gray3 { background-color: var(--erp-gray-3); }\r\n.erp-table .bg-gray-gray5,\r\n.erp-table .\\!bg-gray-gray5 { background-color: var(--erp-gray-5) !important; }\r\n.erp-table .bg-gray-100 { background-color: #f3f4f6; }\r\n.erp-table .bg-blue-100 { background-color: var(--erp-blue-100); }\r\n.erp-table .bg-blue-blue11 { background-color: var(--erp-blue-11); }\r\n.erp-table .bg-blue-blue6 { background-color: var(--erp-blue-6); }\r\n.erp-table .bg-red-300 { background-color: var(--erp-red-300); }\r\n.erp-table .bg-red-600 { background-color: var(--erp-red-600); }\r\n.erp-table .bg-white,\r\n.erp-table .\\!bg-white { background-color: #fff !important; }\r\n.erp-table .text-main-white { color: var(--erp-main-white); }\r\n.erp-table .text-main-black { color: var(--erp-main-black); }\r\n.erp-table .text-gray-gray3 { color: var(--erp-gray-3); }\r\n.erp-table .text-gray-gray7 { color: var(--erp-gray-7); }\r\n.erp-table .text-gray-gray9 { color: var(--erp-gray-9); }\r\n.erp-table .text-gray-gray10 { color: var(--erp-gray-10); }\r\n.erp-table .stroke-gray-gray3 { stroke: var(--erp-gray-3); }\r\n.erp-table .stroke-gray-gray6 { stroke: var(--erp-gray-6); }\r\n.erp-table .stroke-gray-gray10 { stroke: var(--erp-gray-10); }\r\n.erp-table .stroke-gray-gray85 { stroke: var(--erp-gray-85); }\r\n.erp-table .fill-gray-gray6 { fill: var(--erp-gray-6); }\r\n.erp-table .fill-gray-gray7 { fill: var(--erp-gray-7); }\r\n.erp-table .fill-gray-gray8 { fill: var(--erp-gray-8); }\r\n.erp-table .fill-gray-gray10 { fill: var(--erp-gray-10); }\r\n.erp-table .fill-white { fill: #fff; }\r\n.erp-table .text-black-black6 { color: var(--erp-black-6); }\r\n.erp-table .text-blue-blue6 { color: var(--erp-blue-6); }\r\n.erp-table .text-red-600 { color: var(--erp-red-600); }\r\n.erp-table .text-neutral-500 { color: var(--erp-neutral-500); }\r\n.erp-table .border-gray-gray5 { border-color: var(--erp-gray-5); }\r\n.erp-table .border-gray-gray7,\r\n.erp-table .\\!border-gray-gray7 { border-color: var(--erp-gray-7) !important; }\r\n.erp-table .border-gray-gray8 { border-color: var(--erp-gray-8); }\r\n.erp-table .border-gray-gray5 { border-color: var(--erp-gray-5); }\r\n.erp-table .\\!border-\\[0\\.4px\\] { border-width: 0.4px !important; }\r\n.erp-table .hover\\:bg-red-100:hover { background-color: var(--erp-red-100); }\r\n.erp-table .hover\\:bg-zinc-200:hover { background-color: var(--erp-zinc-200); }\r\n.erp-table .disabled\\:opacity-40:disabled { opacity: 0.4; }\r\n.erp-table .animate-spin { animation: erp-table-spin 0.8s linear infinite; }\r\n.erp-table .bg-yellow-400 { background-color: var(--erp-yellow-400); }\r\n.erp-table .bg-yellow-200 { background-color: var(--erp-yellow-200); }\r\n.erp-table mark.bg-yellow-400 { background-color: var(--erp-yellow-400); font-weight: 600; }\r\n.erp-table mark.bg-yellow-200 { background-color: var(--erp-yellow-200); }\r\n\r\n.erp-table .hidden-show-scrollBar {\r\n scrollbar-width: thin;\r\n scrollbar-color: #d9d9d9 transparent;\r\n}\r\n.erp-table .hidden-show-scrollBar::-webkit-scrollbar {\r\n height: 6px;\r\n width: 6px;\r\n}\r\n.erp-table .hidden-show-scrollBar::-webkit-scrollbar-thumb {\r\n background: #d9d9d9;\r\n border-radius: 999px;\r\n}\r\n\r\n.erp-table .\\[overflow-anchor\\:none\\] { overflow-anchor: none; }\r\n\r\n.erp-table input,\r\n.erp-table select,\r\n.erp-table button {\r\n font-family: inherit;\r\n}\r\n\r\n.erp-table th,\r\n.erp-table td {\r\n vertical-align: middle;\r\n}\r\n\r\n@keyframes erp-table-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n/* Pagination (ERP antd look) */\r\n.erp-table-pagination {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-size: 12px;\r\n}\r\n.erp-table-pagination__pages {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n}\r\n.erp-table-pagination__page {\r\n min-width: 1.75rem;\r\n height: 1.75rem;\r\n padding: 0 0.4rem;\r\n border: 1px solid var(--erp-gray-5);\r\n border-radius: 0.25rem;\r\n background: #fff;\r\n cursor: pointer;\r\n}\r\n.erp-table-pagination__page.is-active {\r\n border-color: var(--erp-main-black);\r\n color: var(--erp-main-black);\r\n font-weight: 600;\r\n}\r\n.erp-table-pagination__page.is-active:hover {\r\n background: var(--erp-main-black);\r\n color: #fff;\r\n}\r\n.erp-table-pagination__nav {\r\n display: inline-flex;\r\n margin: 0;\r\n padding: 0;\r\n border-radius: 0.25rem;\r\n width: fit-content;\r\n border: 1px solid var(--erp-gray-5);\r\n background: #fff;\r\n cursor: pointer;\r\n}\r\n.erp-table-pagination__nav:hover {\r\n border-color: var(--erp-main-black);\r\n}\r\n.erp-table-pagination__nav:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n.erp-table-pagination select {\r\n height: 1.75rem;\r\n min-width: 3.25rem;\r\n padding: 0 0.4rem;\r\n border: 1px solid var(--erp-gray-5);\r\n border-radius: 0.25rem;\r\n background: #fff;\r\n font-size: 12px;\r\n color: var(--erp-black-6);\r\n cursor: pointer;\r\n}\r\n\r\n/* Modal */\r\n.erp-table-modal-overlay {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 11000;\r\n background: rgba(14, 14, 14, 0.35);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n}\r\n.erp-table-modal {\r\n background: #fff;\r\n border-radius: 0.5rem;\r\n width: min(720px, 100%);\r\n max-height: 90vh;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 20px 48px rgba(10, 21, 64, 0.18);\r\n}\r\n.erp-table-modal__header {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.75rem 1rem;\r\n border-bottom: 1px solid var(--erp-gray-5);\r\n font-size: 14px;\r\n}\r\n.erp-table-modal__body {\r\n padding: 0.5rem;\r\n overflow: auto;\r\n flex: 1;\r\n}\r\n.erp-table-modal__close {\r\n margin-inline-start: auto;\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n font-size: 1.1rem;\r\n}\r\n\r\n/* Dropdown / tooltip / select */\r\n.erp-table-tooltip {\r\n position: absolute;\r\n z-index: 12000;\r\n background: #292929;\r\n color: #fff;\r\n font-size: 11px;\r\n padding: 0.25rem 0.5rem;\r\n border-radius: 0.25rem;\r\n pointer-events: none;\r\n white-space: nowrap;\r\n}\r\n.erp-table-dropdown {\r\n position: absolute;\r\n z-index: 12000;\r\n background: #fff;\r\n border: 1px solid var(--erp-gray-5);\r\n border-radius: 0.375rem;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\r\n min-width: 10rem;\r\n max-height: 20rem;\r\n overflow: auto;\r\n padding: 0.25rem 0;\r\n}\r\n.erp-table-dropdown__item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 0.75rem;\r\n width: 100%;\r\n padding: 0.4rem 0.75rem;\r\n background: transparent;\r\n border: 0;\r\n cursor: pointer;\r\n font-size: 13px;\r\n text-align: start;\r\n}\r\n.erp-table-dropdown__item:hover { background: var(--erp-gray-3); }\r\n.erp-table-dropdown__divider {\r\n height: 1px;\r\n background: var(--erp-gray-5);\r\n margin: 0.25rem 0;\r\n}\r\n\r\n.erp-table-select {\r\n position: relative;\r\n width: 100%;\r\n height: 2.25rem;\r\n}\r\n.erp-table-select__control {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 0.25rem;\r\n padding: 0 0.5rem;\r\n border: 0.4px solid var(--erp-gray-7);\r\n border-radius: 0.25rem;\r\n background: #fff;\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n.erp-table-select__control.is-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.55;\r\n}\r\n.erp-table-select__menu {\r\n position: absolute;\r\n z-index: 13000;\r\n top: calc(100% + 2px);\r\n left: 0;\r\n right: 0;\r\n background: #fff;\r\n border: 1px solid var(--erp-gray-5);\r\n border-radius: 0.375rem;\r\n max-height: 16rem;\r\n overflow: auto;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\r\n}\r\n.erp-table-select__option {\r\n padding: 0.4rem 0.75rem;\r\n font-size: 12px;\r\n cursor: pointer;\r\n}\r\n.erp-table-select__option:hover,\r\n.erp-table-select__option.is-active {\r\n background: var(--erp-blue-11);\r\n}\r\n.erp-table-select__search {\r\n width: 100%;\r\n border: 0;\r\n border-bottom: 1px solid var(--erp-gray-5);\r\n padding: 0.4rem 0.5rem;\r\n font-size: 12px;\r\n outline: none;\r\n}\r\n\r\n.erp-table-checkbox {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n width: 16px;\r\n height: 16px;\r\n min-width: 16px;\r\n margin: 0;\r\n border: 1px solid #d9d9d9;\r\n border-radius: 4px;\r\n background: #fff;\r\n cursor: pointer;\r\n display: inline-block;\r\n position: relative;\r\n vertical-align: middle;\r\n flex-shrink: 0;\r\n}\r\n.erp-table-checkbox:checked {\r\n background: var(--erp-main-black);\r\n border-color: var(--erp-main-black);\r\n}\r\n.erp-table-checkbox:checked::after {\r\n content: '';\r\n position: absolute;\r\n inset-inline-start: 4px;\r\n top: 1px;\r\n width: 5px;\r\n height: 9px;\r\n border: 2px solid #fff;\r\n border-top: 0;\r\n border-inline-start: 0;\r\n transform: rotate(45deg);\r\n}\r\n.erp-table-checkbox:disabled {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n}\r\n\r\n.erp-table-toast {\r\n position: fixed;\r\n z-index: 14000;\r\n bottom: 1.25rem;\r\n inset-inline-end: 1.25rem;\r\n padding: 0.6rem 0.9rem;\r\n border-radius: 0.4rem;\r\n font-size: 12px;\r\n color: #fff;\r\n box-shadow: 0 0 16px rgba(0, 0, 0, 0.1);\r\n}\r\n.erp-table-toast.is-success { background: #2c8440; }\r\n.erp-table-toast.is-error { background: #dc3545; }\r\n\r\n.erp-table-date {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n.erp-table-date .erp-table-select__control,\r\n.erp-table-date input {\r\n height: 2.25rem;\r\n width: 100%;\r\n background: var(--erp-gray-3);\r\n border: none;\r\n border-radius: 0.125rem;\r\n font-size: 12px;\r\n padding: 0 0.5rem;\r\n}\r\n\r\n.erp-table-desktop__toolbar {\r\n padding: 0.5rem 0.25rem 0.35rem;\r\n}\r\n\r\n.erp-table-index-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: transparent;\r\n border: 0;\r\n padding: 0.125rem;\r\n border-radius: 0.125rem;\r\n cursor: pointer;\r\n line-height: 0;\r\n}\r\n\r\n`;\r\n\r\nexport function injectERPTableStyles(): void {\r\n if (typeof document === 'undefined') return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n const el = document.createElement('style');\r\n el.id = STYLE_ID;\r\n el.textContent = CSS;\r\n document.head.appendChild(el);\r\n}\r\n\r\ninjectERPTableStyles();\r\n","export type ERPTableLocale = 'fa' | 'en';\r\n\r\nexport type ERPTableMessages = Record<string, string>;\r\n\r\nexport const FA_MESSAGES: ERPTableMessages = {\r\n 'general.addNewRow': 'افزودن سطر',\r\n 'general.copy': 'کپی',\r\n 'general.cut': 'برش',\r\n 'general.paste': 'چسباندن',\r\n 'general.delete': 'حذف',\r\n 'general.chooseFromList': 'انتخاب از لیست',\r\n 'general.toggle': 'انتخاب همه',\r\n 'general.exportToExcel': 'خروجی اکسل',\r\n 'general.exportToExcelSuccess': 'خروجی اکسل با موفقیت انجام شد',\r\n 'general.exportToExcelError': 'خروجی اکسل ناموفق بود',\r\n 'general.selected': 'انتخاب شده',\r\n 'general.search': 'جستجو',\r\n 'general.selectField': 'انتخاب کنید',\r\n 'general.choice': 'انتخاب ستون',\r\n 'general.prev': 'قبلی',\r\n 'general.next': 'بعدی',\r\n 'general.noData': 'دادهای وجود ندارد',\r\n 'general.replicateRow': 'تکثیر سطر',\r\n 'general.edit': 'ویرایش',\r\n 'general.rowEdit': 'ویرایش سطر',\r\n 'general.row': 'سطر',\r\n 'general.save': 'ذخیره',\r\n 'general.notActive': 'غیرفعال',\r\n 'general.add': 'افزودن',\r\n};\r\n\r\nexport const EN_MESSAGES: 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.selected': 'Selected',\r\n 'general.search': 'Search',\r\n 'general.selectField': '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.replicateRow': 'Duplicate row',\r\n 'general.edit': 'Edit',\r\n 'general.rowEdit': 'Edit row',\r\n 'general.row': 'Row',\r\n 'general.save': 'Save',\r\n 'general.notActive': 'Inactive',\r\n 'general.add': 'Add',\r\n};\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 = locale === 'en' ? EN_MESSAGES : FA_MESSAGES;\r\n return overrides?.[key] ?? pack[key] ?? key;\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useMemo,\r\n type ReactNode,\r\n} from 'react';\r\n\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport {\r\n type ERPTableLocale,\r\n type ERPTableMessages,\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 remoteApi?: RemoteApi;\r\n messages?: Partial<ERPTableMessages>;\r\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\r\n};\r\n\r\nconst ERPTableHostContext = createContext<ERPTableHostValue>({\r\n locale: 'fa',\r\n direction: 'rtl',\r\n});\r\n\r\nexport function ERPTableHostProvider({\r\n children,\r\n locale = 'fa',\r\n direction,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n}: ERPTableHostValue & { children: ReactNode }) {\r\n const value = useMemo<ERPTableHostValue>(\r\n () => ({\r\n locale,\r\n direction: direction ?? (locale === 'fa' ? 'rtl' : 'ltr'),\r\n remoteApi,\r\n messages,\r\n onToast,\r\n }),\r\n [locale, direction, remoteApi, messages, onToast],\r\n );\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 useTranslations() {\r\n const { locale, messages } = useERPTableHost();\r\n return (key: string) => translate(key, locale, messages);\r\n}\r\n\r\nexport function useLocale(): ERPTableLocale {\r\n return useERPTableHost().locale;\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 { 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<any>({\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","import { 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 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, useState } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { TableViewState } from '../../engine/type';\r\n\r\nexport function useControllerSelector<T>(\r\n controller: UITableController,\r\n getter: () => T,\r\n isEqual: (previous: T, next: T) => boolean = Object.is,\r\n): T {\r\n const [value, setValue] = useState(() => getter());\r\n const getterRef = useRef(getter);\r\n const isEqualRef = useRef(isEqual);\r\n getterRef.current = getter;\r\n isEqualRef.current = isEqual;\r\n\r\n useEffect(() => {\r\n const unsubscribe = controller.subscribe(() => {\r\n const next = getterRef.current();\r\n setValue((previous) =>\r\n isEqualRef.current(previous, next) ? previous : next,\r\n );\r\n });\r\n\r\n return () => unsubscribe?.();\r\n }, [controller]);\r\n\r\n return value;\r\n}\r\n\r\nexport function useEngineSelector<T>(\r\n controller: UITableController,\r\n selector: (view: TableViewState | null | undefined) => T,\r\n isEqual: (previous: T, next: T) => boolean = Object.is,\r\n): T {\r\n return useControllerSelector(\r\n controller,\r\n () => selector(controller.getViewState()),\r\n isEqual,\r\n );\r\n}\r\n\r\nexport function jsonEqual<T>(previous: T, next: T): boolean {\r\n return JSON.stringify(previous) === JSON.stringify(next);\r\n}\r\n\r\nexport function useGridSearchState(controller: UITableController) {\r\n return useEngineSelector(\r\n controller,\r\n (view) => view?.gridSearch ?? null,\r\n jsonEqual,\r\n );\r\n}\r\n\r\nexport function useMobileEditorState(controller: UITableController) {\r\n return useEngineSelector(\r\n controller,\r\n (view) => view?.mobileEditor ?? null,\r\n jsonEqual,\r\n );\r\n}\r\n","import type { GridSearchState } from '../../engine/type';\r\nimport { GridSearchMatch } from './types';\r\n\r\nconst SCROLL_EDGE_PADDING = 12;\r\n\r\nexport function buildSearchScrollKey(\r\n search: NonNullable<GridSearchState>,\r\n match: GridSearchMatch,\r\n): string {\r\n return `${search.columnId}:${search.query}:${search.currentIndex}:${match.rowId}:${match.columnId}`;\r\n}\r\n\r\nfunction findMatchInContainer(\r\n container: HTMLElement,\r\n match: GridSearchMatch,\r\n): { rowEl: HTMLElement; cellEl: HTMLElement } | null {\r\n const rowEl = container.querySelector<HTMLElement>(\r\n `tr[data-rowid=\"${match.rowId}\"]`,\r\n );\r\n if (!rowEl) return null;\r\n\r\n const cellEl = rowEl.querySelector<HTMLElement>(\r\n `td[data-columnid=\"${match.columnId}\"]`,\r\n );\r\n if (!cellEl) return null;\r\n\r\n return { rowEl, cellEl };\r\n}\r\n\r\nfunction isHorizontallyVisible(\r\n cellRect: DOMRect,\r\n containerRect: DOMRect,\r\n): boolean {\r\n return (\r\n cellRect.left >= containerRect.left + SCROLL_EDGE_PADDING &&\r\n cellRect.right <= containerRect.right - SCROLL_EDGE_PADDING\r\n );\r\n}\r\n\r\nfunction isVerticallyVisible(\r\n rowRect: DOMRect,\r\n containerRect: DOMRect,\r\n): boolean {\r\n return (\r\n rowRect.top >= containerRect.top + SCROLL_EDGE_PADDING &&\r\n rowRect.bottom <= containerRect.bottom - SCROLL_EDGE_PADDING\r\n );\r\n}\r\n\r\nexport function restoreScrollPosition(\r\n container: HTMLElement,\r\n left: number,\r\n top: number,\r\n): void {\r\n if (Math.abs(container.scrollLeft - left) > 1) {\r\n container.scrollLeft = left;\r\n }\r\n if (Math.abs(container.scrollTop - top) > 1) {\r\n container.scrollTop = top;\r\n }\r\n}\r\n\r\nexport function applyScrollToMatch(\r\n container: HTMLElement,\r\n match: GridSearchMatch,\r\n): boolean {\r\n const elements = findMatchInContainer(container, match);\r\n if (!elements) return false;\r\n\r\n const { rowEl, cellEl } = elements;\r\n const cellRect = cellEl.getBoundingClientRect();\r\n const rowRect = rowEl.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n\r\n let deltaX = 0;\r\n let deltaY = 0;\r\n\r\n if (!isHorizontallyVisible(cellRect, containerRect)) {\r\n deltaX =\r\n (cellRect.left + cellRect.right) / 2 -\r\n (containerRect.left + containerRect.right) / 2;\r\n }\r\n\r\n if (!isVerticallyVisible(rowRect, containerRect)) {\r\n deltaY = rowRect.top - containerRect.top - SCROLL_EDGE_PADDING;\r\n }\r\n\r\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) {\r\n return true;\r\n }\r\n\r\n container.scrollBy({ left: deltaX, top: deltaY, behavior: 'auto' });\r\n return true;\r\n}\r\n","import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { GridSearchState } from '../../engine/type';\r\nimport { useEngineSelector, useGridSearchState } from './useEngineSelector';\r\nimport {\r\n applyScrollToMatch,\r\n buildSearchScrollKey,\r\n restoreScrollPosition,\r\n} from '../gridSearch/scrollToMatch';\r\n\r\nconst RESTORE_WINDOW_MS = 800;\r\n\r\nfunction jsonEqual<T>(previous: T, next: T): boolean {\r\n return JSON.stringify(previous) === JSON.stringify(next);\r\n}\r\n\r\nexport function useScrollToSearchMatch(\r\n scrollRef: RefObject<HTMLElement | null>,\r\n controller: UITableController,\r\n) {\r\n const gridSearch = useGridSearchState(controller);\r\n const activeRowId = useEngineSelector(\r\n controller,\r\n () => controller.getActiveRow(),\r\n Object.is,\r\n );\r\n const currentPage = useEngineSelector(\r\n controller,\r\n (view) => view?.pagination.page ?? 1,\r\n Object.is,\r\n );\r\n\r\n const savedScrollRef = useRef<{\r\n key: string;\r\n left: number;\r\n top: number;\r\n } | null>(null);\r\n const restoreUntilRef = useRef(0);\r\n\r\n const getActiveMatch = (search: GridSearchState | null) => {\r\n if (!search || search.currentIndex < 0 || !search.matches.length) {\r\n return null;\r\n }\r\n return search.matches[search.currentIndex];\r\n };\r\n\r\n const persistScroll = (key: string) => {\r\n const container = scrollRef.current;\r\n if (!container) return;\r\n\r\n savedScrollRef.current = {\r\n key,\r\n left: container.scrollLeft,\r\n top: container.scrollTop,\r\n };\r\n restoreUntilRef.current = Date.now() + RESTORE_WINDOW_MS;\r\n };\r\n\r\n const restoreIfNeeded = () => {\r\n const container = scrollRef.current;\r\n const saved = savedScrollRef.current;\r\n if (!container || !saved) return;\r\n if (Date.now() > restoreUntilRef.current) return;\r\n\r\n restoreScrollPosition(container, saved.left, saved.top);\r\n };\r\n\r\n const scrollToActiveMatch = (search: GridSearchState | null): boolean => {\r\n const container = scrollRef.current;\r\n const match = getActiveMatch(search);\r\n if (!container || !match) return false;\r\n\r\n if (activeRowId !== match.rowId) return false;\r\n\r\n const key = buildSearchScrollKey(search!, match);\r\n const applied = applyScrollToMatch(container, match);\r\n if (applied) {\r\n persistScroll(key);\r\n }\r\n return applied;\r\n };\r\n\r\n useLayoutEffect(() => {\r\n if (!gridSearch) {\r\n savedScrollRef.current = null;\r\n restoreUntilRef.current = 0;\r\n return;\r\n }\r\n\r\n const match = getActiveMatch(gridSearch);\r\n const key = match ? buildSearchScrollKey(gridSearch, match) : null;\r\n\r\n if (key && savedScrollRef.current?.key === key) {\r\n restoreIfNeeded();\r\n } else {\r\n savedScrollRef.current = null;\r\n }\r\n\r\n scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n }, [gridSearch, activeRowId, currentPage, controller, scrollRef]);\r\n\r\n useEffect(() => {\r\n if (!gridSearch) return;\r\n\r\n let frame1 = 0;\r\n let frame2 = 0;\r\n\r\n frame1 = requestAnimationFrame(() => {\r\n restoreIfNeeded();\r\n const applied = scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n\r\n if (!applied) {\r\n frame2 = requestAnimationFrame(() => {\r\n scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n });\r\n }\r\n });\r\n\r\n return () => {\r\n cancelAnimationFrame(frame1);\r\n cancelAnimationFrame(frame2);\r\n };\r\n }, [gridSearch, activeRowId, currentPage, controller, scrollRef]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = controller.subscribe(() => {\r\n if (!savedScrollRef.current) return;\r\n if (Date.now() > restoreUntilRef.current) return;\r\n\r\n requestAnimationFrame(() => {\r\n restoreIfNeeded();\r\n });\r\n });\r\n\r\n return () => unsubscribe?.();\r\n }, [controller, scrollRef]);\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useId, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\ntype Props = {\r\n title?: React.ReactNode;\r\n children: React.ReactNode;\r\n className?: string;\r\n};\r\n\r\nexport function CustomTooltip({ title, children }: Props) {\r\n const [pos, setPos] = useState<{ x: number; y: number } | null>(null);\r\n\r\n if (!title) return <>{children}</>;\r\n\r\n return (\r\n <span\r\n className=\"relative inline-flex\"\r\n onMouseEnter={(e) => {\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n setPos({ x: rect.left + rect.width / 2, y: rect.top - 6 });\r\n }}\r\n onMouseLeave={() => setPos(null)}\r\n >\r\n {children}\r\n {pos && typeof document !== 'undefined'\r\n ? createPortal(\r\n <span\r\n className=\"erp-table-tooltip\"\r\n style={{\r\n left: pos.x,\r\n top: pos.y,\r\n transform: 'translate(-50%, -100%)',\r\n }}\r\n >\r\n {title}\r\n </span>,\r\n document.body,\r\n )\r\n : null}\r\n </span>\r\n );\r\n}\r\n\r\nexport function Tooltip({ title, children }: { title?: React.ReactNode; children: React.ReactNode }) {\r\n return <CustomTooltip title={title}>{children}</CustomTooltip>;\r\n}\r\n\r\ntype ModalProps = {\r\n isModalOpen?: boolean;\r\n closeModal?: () => void;\r\n headerName?: React.ReactNode;\r\n headerIcon?: React.ReactNode;\r\n content?: React.ReactNode;\r\n width?: number;\r\n contentClassName?: string;\r\n};\r\n\r\nexport function CustomModal({\r\n isModalOpen,\r\n closeModal,\r\n headerName,\r\n headerIcon,\r\n content,\r\n width = 720,\r\n contentClassName,\r\n}: ModalProps) {\r\n if (!isModalOpen || typeof document === 'undefined') return null;\r\n\r\n return createPortal(\r\n <div className=\"erp-table-modal-overlay\" onClick={closeModal}>\r\n <div\r\n className=\"erp-table-modal\"\r\n style={{ width }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"erp-table-modal__header\">\r\n {headerIcon}\r\n <span>{headerName}</span>\r\n <button type=\"button\" className=\"erp-table-modal__close\" onClick={closeModal}>\r\n ×\r\n </button>\r\n </div>\r\n <div className={`erp-table-modal__body ${contentClassName ?? ''}`}>{content}</div>\r\n </div>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nexport function CustomCheckbox({\r\n checked,\r\n disabled,\r\n onClick,\r\n onChange,\r\n className,\r\n}: {\r\n checked?: boolean;\r\n disabled?: boolean;\r\n onClick?: (e: React.MouseEvent<HTMLInputElement>) => void;\r\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n className?: string;\r\n}) {\r\n return (\r\n <input\r\n type=\"checkbox\"\r\n className={`erp-table-checkbox ${className ?? ''}`}\r\n checked={!!checked}\r\n disabled={disabled}\r\n onClick={onClick}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport function CustomButton({\r\n children,\r\n className,\r\n onClick,\r\n htmlType = 'button',\r\n type,\r\n disabled,\r\n}: {\r\n children?: React.ReactNode;\r\n className?: string;\r\n onClick?: () => void;\r\n htmlType?: 'button' | 'submit' | 'reset';\r\n type?: string;\r\n disabled?: boolean;\r\n}) {\r\n return (\r\n <button\r\n type={htmlType}\r\n disabled={disabled}\r\n onClick={onClick}\r\n className={`flex justify-center items-center px-2 py-1 border rounded ${className ?? ''}`}\r\n data-variant={type}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nexport function InputText({\r\n value,\r\n onChange,\r\n placeholder,\r\n className,\r\n}: {\r\n value?: string;\r\n onChange?: (e: { target: { value: string } }) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}) {\r\n const id = useId();\r\n return (\r\n <input\r\n id={id}\r\n className={`px-3 py-2 border border-gray-gray5 rounded w-full text-sm outline-none ${className ?? ''}`}\r\n value={value ?? ''}\r\n placeholder={placeholder}\r\n onChange={onChange}\r\n />\r\n );\r\n}\r\n\r\nexport function Spin({\r\n indicator,\r\n}: {\r\n size?: string;\r\n indicator?: React.ReactNode;\r\n}) {\r\n return <span className=\"inline-flex animate-spin\">{indicator}</span>;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport type DropdownItem = {\r\n key?: string;\r\n label?: React.ReactNode;\r\n extra?: React.ReactNode;\r\n type?: 'divider' | 'item' | string;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n};\r\n\r\ntype DropdownProps = {\r\n items?: DropdownItem[];\r\n children: React.ReactNode;\r\n placement?: 'bottom' | 'bottomLeft' | 'bottomRight' | string;\r\n className?: string;\r\n dropdownClassName?: string;\r\n};\r\n\r\nexport function CustomDropdownButton({\r\n items = [],\r\n children,\r\n placement = 'bottom',\r\n className,\r\n dropdownClassName,\r\n}: DropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const triggerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n let left = rect.left;\r\n if (placement === 'bottomRight') left = rect.right - 180;\r\n if (placement === 'bottomLeft') left = rect.left;\r\n setPos({ top: rect.bottom + 4, left });\r\n }, [open, placement]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n if (triggerRef.current?.contains(e.target as Node)) return;\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open]);\r\n\r\n return (\r\n <div ref={triggerRef} className={className}>\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpen((v) => !v);\r\n }}\r\n >\r\n {children}\r\n </span>\r\n {open && typeof document !== 'undefined'\r\n ? createPortal(\r\n <div\r\n className={`erp-table-dropdown ${dropdownClassName ?? ''}`}\r\n style={{ top: pos.top, left: pos.left }}\r\n >\r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return <div key={`d-${index}`} className=\"erp-table-dropdown__divider\" />;\r\n }\r\n return (\r\n <button\r\n key={item.key ?? String(index)}\r\n type=\"button\"\r\n className=\"erp-table-dropdown__item\"\r\n disabled={item.disabled}\r\n onClick={() => {\r\n item.onClick?.();\r\n setOpen(false);\r\n }}\r\n >\r\n <span>{item.label}</span>\r\n {item.extra ? <span>{item.extra}</span> : null}\r\n </button>\r\n );\r\n })}\r\n </div>,\r\n document.body,\r\n )\r\n : null}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport type SelectOption = {\r\n value?: string | number;\r\n label?: React.ReactNode;\r\n title?: string;\r\n option?: any;\r\n [key: string]: unknown;\r\n};\r\n\r\ntype Props = {\r\n className?: string;\r\n value?: unknown;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n showSearch?: boolean;\r\n allowClear?: boolean;\r\n placeholder?: React.ReactNode;\r\n options?: SelectOption[];\r\n filterOption?: (input: string, option: any) => boolean;\r\n onChange?: (value: unknown, option?: unknown) => void;\r\n onClick?: () => void;\r\n onSearch?: (value: string) => void;\r\n onClear?: () => void;\r\n onPopupScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\r\n popupMatchSelectWidth?: number | boolean;\r\n popupRender?: (menu: React.ReactNode) => React.ReactNode;\r\n autoFocus?: boolean;\r\n optionRender?: (originNode: any, info?: any) => React.ReactNode;\r\n notFoundContent?: React.ReactNode;\r\n getPopupContainer?: (trigger: HTMLElement) => HTMLElement;\r\n optionFilterProp?: string;\r\n labelInValue?: boolean;\r\n};\r\n\r\nexport function Select({\r\n className,\r\n value,\r\n disabled,\r\n loading,\r\n showSearch,\r\n allowClear = true,\r\n placeholder,\r\n options = [],\r\n filterOption,\r\n onChange,\r\n onClick,\r\n onSearch,\r\n onClear,\r\n onPopupScroll,\r\n popupMatchSelectWidth,\r\n popupRender,\r\n autoFocus,\r\n optionRender,\r\n notFoundContent,\r\n getPopupContainer,\r\n}: Props) {\r\n const [open, setOpen] = useState(false);\r\n const [query, setQuery] = useState('');\r\n const [pos, setPos] = useState({ top: 0, left: 0, width: 180 });\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const searchRef = useRef<HTMLInputElement>(null);\r\n\r\n const selected = options.find((o) => String(o.value) === String(value));\r\n\r\n const filtered = useMemo(() => {\r\n if (!query) return options;\r\n return options.filter((option) => {\r\n if (typeof filterOption === 'function') {\r\n return filterOption(query, option);\r\n }\r\n const label = option.label;\r\n return typeof label === 'string' && label.toLowerCase().includes(query.toLowerCase());\r\n });\r\n }, [options, query, filterOption]);\r\n\r\n useEffect(() => {\r\n if (!open || !rootRef.current) return;\r\n const rect = rootRef.current.getBoundingClientRect();\r\n const width =\r\n typeof popupMatchSelectWidth === 'number' ? popupMatchSelectWidth : rect.width;\r\n setPos({ top: rect.bottom + 2, left: rect.left, width });\r\n if (autoFocus || showSearch) searchRef.current?.focus();\r\n }, [open, popupMatchSelectWidth, autoFocus, showSearch]);\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)) return;\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open]);\r\n\r\n const menu = (\r\n <div\r\n className=\"erp-table-select__menu\"\r\n style={{\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n width: pos.width,\r\n minWidth: pos.width,\r\n }}\r\n onScroll={onPopupScroll}\r\n >\r\n {showSearch ? (\r\n <input\r\n ref={searchRef}\r\n className=\"erp-table-select__search\"\r\n value={query}\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n onSearch?.(e.target.value);\r\n }}\r\n />\r\n ) : null}\r\n {loading ? (\r\n <div className=\"erp-table-select__option\">Loading...</div>\r\n ) : filtered.length === 0 ? (\r\n <div className=\"erp-table-select__option\">{notFoundContent ?? 'No options found'}</div>\r\n ) : (\r\n filtered.map((option) => (\r\n <div\r\n key={String(option.value)}\r\n className={`erp-table-select__option ${\r\n String(option.value) === String(value) ? 'is-active' : ''\r\n }`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n onChange?.(option.value, option);\r\n setOpen(false);\r\n setQuery('');\r\n }}\r\n >\r\n {optionRender\r\n ? optionRender({ data: option }, { data: option })\r\n : (option.title ?? option.label)}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div ref={rootRef} className={`erp-table-select ${className ?? ''}`}>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n className={`erp-table-select__control ${disabled ? 'is-disabled' : ''}`}\r\n onClick={() => {\r\n onClick?.();\r\n if (!disabled) setOpen((v) => !v);\r\n }}\r\n >\r\n <span className=\"truncate\">\r\n {selected ? (selected.title ?? selected.label) : placeholder}\r\n </span>\r\n {allowClear && value != null && value !== '' ? (\r\n <span\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onChange?.(undefined, undefined);\r\n onClear?.();\r\n }}\r\n >\r\n ×\r\n </span>\r\n ) : (\r\n <span>▾</span>\r\n )}\r\n </button>\r\n {open && typeof document !== 'undefined'\r\n ? createPortal(popupRender ? popupRender(menu) : menu, getPopupContainer?.(rootRef.current!) ?? document.body)\r\n : null}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport type IconConfig = {\r\n width?: number;\r\n height?: number;\r\n stroke?: string;\r\n fill?: string;\r\n strokeWidth?: number;\r\n};\r\n\r\ntype IconProps = {\r\n config?: IconConfig;\r\n className?: string;\r\n};\r\n\r\nfunction strokeClass(config?: IconConfig) {\r\n return !config?.stroke ? 'stroke-gray-gray10' : undefined;\r\n}\r\n\r\nexport function PlusIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 60 60\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M30 44.9996L30 29.1157M30 29.1157C30 29.1157 30 14.9996 29.9999 13.9996M30 29.1157L46 29.1157M30 29.1157L14 29.1157\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"3\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function GuaranteeReceive({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10.8327 2.50072C10.7531 2.5 10.6638 2.5 10.5616 2.5H6.83285C5.89942 2.5 5.43237 2.5 5.07585 2.68166C4.76224 2.84144 4.50746 3.09623 4.34767 3.40983C4.16602 3.76635 4.16602 4.23341 4.16602 5.16683V14.8335C4.16602 15.7669 4.16602 16.2334 4.34767 16.5899C4.50746 16.9035 4.76224 17.1587 5.07585 17.3185C5.43202 17.5 5.89852 17.5 6.83013 17.5L13.1686 17.5C14.1002 17.5 14.566 17.5 14.9222 17.3185C15.2358 17.1587 15.4914 16.9035 15.6512 16.5899C15.8327 16.2337 15.8327 15.7679 15.8327 14.8363V7.7714C15.8327 7.66913 15.8327 7.57967 15.8319 7.5M10.8327 2.50072C11.0707 2.50289 11.2213 2.51154 11.3651 2.54605C11.5351 2.58688 11.6976 2.65439 11.8467 2.74577C12.0148 2.8488 12.1592 2.99318 12.4473 3.28125L15.0518 5.88582C15.3401 6.17407 15.4834 6.3178 15.5865 6.48599C15.6779 6.63512 15.7455 6.79771 15.7863 6.96777C15.8208 7.11147 15.8296 7.26209 15.8319 7.5M10.8327 2.50072V4.83333C10.8327 5.76675 10.8327 6.23314 11.0143 6.58966C11.1741 6.90326 11.4289 7.15873 11.7425 7.31852C12.0987 7.5 12.5652 7.5 13.4968 7.5H15.8319M15.8319 7.5H15.8328\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CutIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 32 32\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M5.75 17.531h-0.125c-1.313 0-2.719 0.625-3.781 1.656-1.094 1-1.844 2.344-1.844 3.688 0 1.531 1.094 2.469 2.594 2.469 1.281 0 2.719-0.656 3.813-1.656 1.063-1.031 1.813-2.344 1.813-3.688 0-0.156 0-0.375-0.031-0.531l1-0.875 9.813 5.031c0.156 0.063 0.313 0.125 0.469 0.125 0.219 0 0.625-0.125 1.063-0.188 0.406-0.094 0.844-0.188 1.094-0.219 0.438-0.063 0.781-0.469 0.781-0.906 0-0.313-0.156-0.594-0.438-0.781l-8.156-5.656 8.156-5.656c0.281-0.188 0.438-0.469 0.438-0.781 0-0.438-0.344-0.875-0.781-0.938-0.125 0-0.281-0.031-0.469-0.094-0.375-0.094-0.875-0.156-1.25-0.219s-0.656-0.063-0.906 0.063c-0.063 0.031-0.25 0.125-0.594 0.281-0.313 0.156-0.719 0.375-1.188 0.625s-1 0.5-1.563 0.813c-0.563 0.281-1.219 0.594-1.781 0.906-1.188 0.594-2.344 1.188-3.219 1.625-0.438 0.219-0.813 0.438-1.094 0.563-0.25 0.125-0.375 0.219-0.375 0.219l-1-0.906c0.031-0.156 0.031-0.344 0.031-0.5 0-1.344-0.75-2.688-1.813-3.688-1.094-1-2.531-1.656-3.813-1.656-1.5 0-2.594 0.938-2.594 2.469 0 1.313 0.75 2.656 1.875 3.688 1.125 1.063 2.563 1.75 3.875 1.656 0.125 0.188 0.406 0.438 0.688 0.688s0.531 0.531 0.719 0.719v0.25c-0.188 0.188-0.406 0.406-0.719 0.688-0.281 0.25-0.531 0.531-0.688 0.719zM2.313 9.125v-0.094c0.094-0.031 0.188-0.031 0.281-0.031 0.75 0 1.563 0.469 2.094 0.906 0.25 0.219 0.563 0.594 0.781 0.969 0.25 0.375 0.469 0.813 0.469 1.156v0.063c-0.156 0.031-0.25 0.031-0.313 0.031-0.75 0-1.5-0.469-2.063-0.938-0.219-0.219-0.563-0.531-0.813-0.906s-0.438-0.813-0.438-1.156zM6.844 17.75l1.281-1.25-0.063-1.5 11.406-5.813 2 0.375-11.875 8.188-0.531-0.281-1.25 1.125c-0.219-0.344-0.563-0.625-0.969-0.844zM7.25 14.625l-0.406-0.438c0.406-0.156 0.75-0.438 0.969-0.781l0.5 0.438c-0.469 0.219-0.875 0.344-1.063 0.781zM8.688 16c0 0.5 0.406 0.906 0.906 0.906 0.531 0 0.938-0.406 0.938-0.906 0-0.531-0.406-0.938-0.906-0.938-0.563 0-0.938 0.406-0.938 0.938zM10.563 18.219l2.406-1.656 8.5 5.875-2 0.375zM2.344 22.875c0-0.688 0.469-1.469 1.156-2.031s1.5-1 2.125-1c0.094 0 0.188 0.031 0.25 0.031v0.063c0.031 0 0.031 0.031 0.031 0.063 0 0.688-0.469 1.438-1.156 2s-1.469 1-2.156 1h-0.125c-0.031-0.031-0.063-0.031-0.125-0.031v-0.094z\"\r\n className={!config?.fill ? 'fill-gray-gray8' : undefined}\r\n fill={config?.fill}\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ClipboardIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M13.3333 3.33594C15.1459 3.34603 16.1274 3.4264 16.7678 4.06672C17.5 4.79896 17.5 5.97747 17.5 8.33449V13.3345C17.5 15.6915 17.5 16.87 16.7678 17.6023C16.0355 18.3345 14.857 18.3345 12.5 18.3345H7.5C5.14298 18.3345 3.96447 18.3345 3.23223 17.6023C2.5 16.87 2.5 15.6915 2.5 13.3345V8.33449C2.5 5.97747 2.5 4.79896 3.23223 4.06672C3.87255 3.4264 4.85414 3.34603 6.66667 3.33594\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M6.66797 11.668H13.3346\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M5.83203 8.75H14.1654\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M7.5 14.582H12.5\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M6.66797 2.91797C6.66797 2.22761 7.22761 1.66797 7.91797 1.66797H12.0846C12.775 1.66797 13.3346 2.22761 13.3346 2.91797V3.7513C13.3346 4.44166 12.775 5.0013 12.0846 5.0013H7.91797C7.22761 5.0013 6.66797 4.44166 6.66797 3.7513V2.91797Z\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ClipboardCheck({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 52 52\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M44 2.5H19C16.4 2.5 14.3 4.6 14.3 7.2V8C14.3 8.5 14.6 8.8 15.1 8.8H37.8C40.4 8.8 42.5 10.9 42.5 13.5V37.8C42.5 38.3 42.8 38.6 43.3 38.6H44C46.6 38.6 48.7 36.5 48.7 33.9V7.2C48.7 4.6 46.6 2.5 44 2.5Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"none\"\r\n />\r\n <path\r\n d=\"M33 13.5H8C5.4 13.5 3.3 15.6 3.3 18.2V44.8C3.3 47.4 5.4 49.5 8 49.5H33C35.6 49.5 37.8 47.4 37.8 44.8V18.2C37.8 15.6 35.6 13.5 33 13.5ZM31 26.8L19 38.8C18.5 39.3 18 39.5 17.4 39.5C16.9 39.5 16.2 39.3 15.8 38.8L10 33C9.5 32.5 9.5 31.8 10 31.4L11.6 29.8C12.1 29.3 12.8 29.3 13.2 29.8L17.4 34L27.7 23.7C28.2 23.2 28.9 23.2 29.3 23.7L30.9 25.3C31.4 25.6 31.4 26.4 31 26.8Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"#000\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function TrashBin({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 18 18\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M15.3751 4.5H2.625\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n d=\"M14.125 6.375L13.78 11.5493C13.6473 13.5405 13.5809 14.5361 12.9322 15.1431C12.2834 15.75 11.2856 15.75 9.29001 15.75H8.70999C6.71439 15.75 5.71659 15.75 5.06783 15.1431C4.41907 14.5361 4.3527 13.5405 4.21996 11.5493L3.875 6.375\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n opacity=\"0.5\"\r\n d=\"M4.875 4.5C4.91691 4.5 4.93786 4.5 4.95686 4.49952C5.57444 4.48387 6.11927 4.09118 6.32941 3.51024C6.33588 3.49237 6.3425 3.47249 6.35576 3.43273L6.42857 3.21429C6.49073 3.02781 6.52181 2.93457 6.56304 2.8554C6.72751 2.53955 7.03181 2.32023 7.38346 2.26407C7.4716 2.25 7.56988 2.25 7.76645 2.25H10.2336C10.4301 2.25 10.5284 2.25 10.6165 2.26407C10.9682 2.32023 11.2725 2.53955 11.437 2.8554C11.4782 2.93457 11.5093 3.02781 11.5714 3.21429L11.6442 3.43273C11.6575 3.47244 11.6641 3.49238 11.6706 3.51024C11.8807 4.09118 12.4256 4.48387 13.0431 4.49952C13.0621 4.5 13.0831 4.5 13.125 4.5\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RedTrashBin({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 30 30\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M17.5 12.5V21.25M12.5 12.5V21.25M7.5 7.5V22.25C7.5 23.6501 7.5 24.3497 7.77248 24.8845C8.01217 25.3549 8.39434 25.7381 8.86475 25.9778C9.399 26.25 10.0987 26.25 11.4961 26.25H18.5039C19.9013 26.25 20.6 26.25 21.1342 25.9778C21.6046 25.7381 21.9881 25.3549 22.2278 24.8845C22.5 24.3502 22.5 23.6513 22.5 22.2539V7.5M7.5 7.5H10M7.5 7.5H5M10 7.5H20M10 7.5C10 6.33515 10 5.75301 10.1903 5.29358C10.444 4.68101 10.9304 4.19404 11.543 3.9403C12.0024 3.75 12.5851 3.75 13.75 3.75H16.25C17.4149 3.75 17.9973 3.75 18.4567 3.9403C19.0693 4.19404 19.5558 4.68101 19.8096 5.29358C19.9999 5.75301 20 6.33515 20 7.5M20 7.5H22.5M22.5 7.5H25\"\r\n stroke={config?.stroke ?? '#DC3545'}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Layers({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 30 30\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M26.25 15L15 22.5L3.75 15M26.25 20L15 27.5L3.75 20M26.25 10L15 17.5L3.75 10L15 2.5L26.25 10Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Excel({ config, className }: IconProps) {\r\n const width = config?.width ?? 18;\r\n const height = config?.height ?? 18;\r\n return (\r\n <svg\r\n className={className}\r\n width={width}\r\n height={height}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <rect x=\"3\" y=\"2.5\" width=\"18\" height=\"19\" rx=\"2\" fill={config?.fill ?? '#217346'} />\r\n <path\r\n d=\"M8 7.4h2.15l1.85 4.55L13.85 7.4H16L13.1 14.6h-2.2L8 7.4Z\"\r\n fill=\"#fff\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SpinIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path\r\n fill={config?.fill}\r\n className={!config?.fill ? 'fill-gray-gray6' : undefined}\r\n d=\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\"\r\n opacity=\".25\"\r\n />\r\n <path\r\n fill={config?.fill}\r\n className={!config?.fill ? 'fill-gray-gray7' : undefined}\r\n d=\"M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z\"\r\n >\r\n <animateTransform\r\n attributeName=\"transform\"\r\n type=\"rotate\"\r\n dur=\"0.75s\"\r\n values=\"0 12 12;360 12 12\"\r\n repeatCount=\"indefinite\"\r\n />\r\n </path>\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Magnifier({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 18 18\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <circle\r\n cx=\"8.625\"\r\n cy=\"8.625\"\r\n r=\"7.125\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n d=\"M13.875 13.875L16.5 16.5\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function LeftChevron({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M14 16L10 12L14 8\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RightChevron({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 8L14 12L10 16\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function InfoIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M12 11V16M12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21ZM12.0498 8V8.1L11.9502 8.1002V8H12.0498Z\"\r\n stroke={config?.stroke ?? '#086EDC'}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function NoData({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 60}\r\n height={config?.height ?? 60}\r\n viewBox=\"0 0 145 145\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M103.121 123.752L91.7249 112.357M89.3776 20.631C88.7208 20.625 87.982 20.625 87.1387 20.625H56.3763C48.6756 20.625 44.8224 20.625 41.8811 22.1237C39.2939 23.4419 37.1919 25.5439 35.8737 28.1311C34.375 31.0724 34.375 34.9256 34.375 42.6263V122.376C34.375 130.077 34.375 133.925 35.8737 136.867C37.1919 139.454 39.2939 141.56 41.8811 142.878C44.8195 144.375 48.6681 144.375 56.3539 144.375L108.646 144.375C116.332 144.375 120.175 144.375 123.113 142.878C125.701 141.56 127.81 139.454 129.128 136.867C130.625 133.928 130.625 130.085 130.625 122.4V64.1141C130.625 63.2708 130.624 62.5318 130.618 61.875M89.3776 20.631C91.3401 20.6489 92.5768 20.7217 93.7625 21.0064C95.1655 21.3432 96.5102 21.8987 97.7405 22.6526C99.1276 23.5026 100.319 24.6937 102.695 27.0703L124.183 48.558C126.561 50.9361 127.743 52.1219 128.594 53.5095C129.348 54.7397 129.905 56.0811 130.242 57.4841C130.527 58.6698 130.6 59.9125 130.618 61.875M89.3776 20.631L89.375 39.8764C89.375 47.5772 89.375 51.426 90.8737 54.3673C92.1919 56.9546 94.2939 59.0595 96.8811 60.3778C99.8195 61.875 103.668 61.875 111.354 61.875H130.618M79.0625 116.875C69.5701 116.875 61.875 109.18 61.875 99.6875C61.875 90.1951 69.5701 82.5 79.0625 82.5C88.5549 82.5 96.25 90.1951 96.25 99.6875C96.25 109.18 88.5549 116.875 79.0625 116.875Z\"\r\n className={!config?.stroke ? 'stroke-gray-gray6' : undefined}\r\n stroke={config?.stroke}\r\n strokeWidth=\"6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M84.5 105.5L79 100M79 100L73.5 94.5M79 100L84.5 94.5M79 100L73.5 105.5\"\r\n className={!config?.stroke ? 'stroke-gray-gray85' : undefined}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function DragIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 21 22\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path d=\"M10.5 2L10.5 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M11 2L14 5\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M1 11L4 14\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M17 8L20 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M7 17L10 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M10 2L7 5\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M14 17L11 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M20 11L17 14\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M4 8L1 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M1 11L20 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Expand({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 19H5V14M14 5H19V10\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Undo({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 8H5V3M5.29102 16.3569C6.22284 17.7918 7.59014 18.8902 9.19218 19.4907C10.7942 20.0913 12.547 20.1624 14.1925 19.6937C15.8379 19.225 17.2893 18.2413 18.3344 16.8867C19.3795 15.5321 19.963 13.878 19.9989 12.1675C20.0347 10.4569 19.5211 8.78001 18.5337 7.38281C17.5462 5.98561 16.1366 4.942 14.5122 4.40479C12.8878 3.86757 11.1341 3.86499 9.5083 4.39795C7.88252 4.93091 6.47059 5.97095 5.47949 7.36556\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Dots({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M11 18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18C13 17.4477 12.5523 17 12 17C11.4477 17 11 17.4477 11 18Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 6C11 6.55228 11.4477 7 12 7C12.5523 7 13 6.55228 13 6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18C13 17.4477 12.5523 17 12 17C11.4477 17 11 17.4477 11 18Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 6C11 6.55228 11.4477 7 12 7C12.5523 7 13 6.55228 13 6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SavePlus({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M17 21.0002L7 21M17 21.0002L17.8031 21C18.921 21 19.48 21 19.9074 20.7822C20.2837 20.5905 20.5905 20.2843 20.7822 19.908C21 19.4806 21 18.921 21 17.8031V9.21955C21 8.77072 21 8.54521 20.9521 8.33105C20.9095 8.14 20.8393 7.95652 20.7432 7.78595C20.6366 7.59674 20.487 7.43055 20.1929 7.10378L17.4377 4.04241C17.0969 3.66374 16.9242 3.47181 16.7168 3.33398C16.5303 3.21 16.3242 3.11858 16.1073 3.06287C15.8625 3 15.5998 3 15.075 3H6.2002C5.08009 3 4.51962 3 4.0918 3.21799C3.71547 3.40973 3.40973 3.71547 3.21799 4.0918C3 4.51962 3 5.08009 3 6.2002V17.8002C3 18.9203 3 19.4796 3.21799 19.9074C3.40973 20.2837 3.71547 20.5905 4.0918 20.7822C4.5192 21 5.07899 21 6.19691 21H7M17 21.0002V17.1969C17 16.079 17 15.5192 16.7822 15.0918C16.5905 14.7155 16.2837 14.4097 15.9074 14.218C15.4796 14 14.9203 14 13.8002 14H10.2002C9.08009 14 8.51962 14 8.0918 14.218C7.71547 14.4097 7.40973 14.7155 7.21799 15.0918C7 15.5196 7 16.0801 7 17.2002V21M15 7H9\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <circle\r\n cx=\"18.5\"\r\n cy=\"18.5\"\r\n r=\"4.75\"\r\n stroke={config?.stroke}\r\n fill={config?.fill}\r\n className={!config?.stroke && !config?.fill ? 'fill-white stroke-gray-gray3' : undefined}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n d=\"M18.5 20.7498L18.5 18.3673M18.5 18.3673C18.5 18.3673 18.5 16.2498 18.5 16.0998M18.5 18.3673L20.9 18.3673M18.5 18.3673L16.1 18.3673\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Reload({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 16H5V21M14 8H19V3M4.58301 9.0034C5.14369 7.61566 6.08244 6.41304 7.29255 5.53223C8.50266 4.65141 9.93686 4.12752 11.4298 4.02051C12.9227 3.9135 14.4147 4.2274 15.7381 4.92661C17.0615 5.62582 18.1612 6.68254 18.9141 7.97612M19.4176 14.9971C18.8569 16.3848 17.9181 17.5874 16.708 18.4682C15.4979 19.3491 14.0652 19.8723 12.5723 19.9793C11.0794 20.0863 9.58606 19.7725 8.2627 19.0732C6.93933 18.374 5.83882 17.3175 5.08594 16.0239\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function EditPencil({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M3.3335 16.6668H16.6668M3.3335 16.6668V13.3334L10.0002 6.66676M3.3335 16.6668L6.66683 16.6667L13.3335 10.0001M10.0002 6.66676L12.3907 4.27622L12.3921 4.2748C12.7212 3.94573 12.886 3.7809 13.076 3.71917C13.2434 3.66479 13.4237 3.66479 13.5911 3.71917C13.7809 3.78086 13.9456 3.9455 14.2742 4.2741L15.724 5.72393C16.054 6.05394 16.2191 6.21903 16.2809 6.4093C16.3353 6.57667 16.3353 6.75696 16.2809 6.92433C16.2191 7.11447 16.0543 7.2793 15.7247 7.60884L15.724 7.60955L13.3335 10.0001M10.0002 6.66676L13.3335 10.0001\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\n\r\nimport { LeftChevron, RightChevron } from './icons';\r\nimport { CustomButton } from './chrome';\r\n\r\ntype Props = {\r\n current: number;\r\n pageSize: number;\r\n total: number;\r\n onChange?: (page: number) => void;\r\n onShowSizeChange?: (page: number, pageSize: number) => void;\r\n pageSizeOptions?: string[];\r\n showSizeChanger?: boolean;\r\n showTotal?: (total: number) => React.ReactNode;\r\n prevIcon?: React.ReactNode;\r\n nextIcon?: React.ReactNode;\r\n jumpNextIcon?: React.ReactNode;\r\n jumpPrevIcon?: React.ReactNode;\r\n locale?: { items_per_page?: string };\r\n showTitle?: boolean;\r\n className?: string;\r\n direction?: 'rtl' | 'ltr';\r\n};\r\n\r\nexport function Pagination({\r\n current,\r\n pageSize,\r\n total,\r\n onChange,\r\n onShowSizeChange,\r\n pageSizeOptions = ['10', '20', '50', '100'],\r\n showSizeChanger,\r\n showTotal,\r\n prevIcon,\r\n nextIcon,\r\n className,\r\n direction = 'rtl',\r\n}: Props) {\r\n const options = pageSizeOptions.includes(String(pageSize))\r\n ? pageSizeOptions\r\n : [String(pageSize), ...pageSizeOptions];\r\n const totalPages = Math.max(1, Math.ceil((total || 0) / (pageSize || 1)));\r\n const pages: Array<number | 'gap'> = [];\r\n for (let i = 1; i <= totalPages; i += 1) {\r\n if (totalPages <= 7 || i === 1 || i === totalPages || Math.abs(i - current) <= 1) {\r\n pages.push(i);\r\n } else if (pages[pages.length - 1] !== 'gap') {\r\n pages.push('gap');\r\n }\r\n }\r\n\r\n return (\r\n <div className={`erp-table-pagination ${className ?? ''}`}>\r\n {showTotal ? showTotal(total) : null}\r\n <div className=\"erp-table-pagination__pages\">\r\n <button\r\n type=\"button\"\r\n className=\"erp-table-pagination__nav\"\r\n disabled={current <= 1}\r\n onClick={() => onChange?.(current - 1)}\r\n >\r\n {prevIcon ??\r\n (direction === 'rtl' ? <RightChevron config={{ width: 14, height: 14 }} /> : <LeftChevron config={{ width: 14, height: 14 }} />)}\r\n </button>\r\n {pages.map((p, i) =>\r\n p === 'gap' ? (\r\n <span key={`g-${i}`}>...</span>\r\n ) : (\r\n <button\r\n key={p}\r\n type=\"button\"\r\n className={`erp-table-pagination__page ${p === current ? 'is-active' : ''}`}\r\n onClick={() => onChange?.(p)}\r\n >\r\n {p.toLocaleString(direction === 'rtl' ? 'fa-IR' : 'en-US')}\r\n </button>\r\n ),\r\n )}\r\n <button\r\n type=\"button\"\r\n className=\"erp-table-pagination__nav\"\r\n disabled={current >= totalPages}\r\n onClick={() => onChange?.(current + 1)}\r\n >\r\n {nextIcon ??\r\n (direction === 'rtl' ? <LeftChevron config={{ width: 14, height: 14 }} /> : <RightChevron config={{ width: 14, height: 14 }} />)}\r\n </button>\r\n </div>\r\n {showSizeChanger ? (\r\n <select\r\n value={String(pageSize)}\r\n onChange={(e) => onShowSizeChange?.(1, Number(e.target.value))}\r\n >\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {Number(opt).toLocaleString(direction === 'rtl' ? 'fa-IR' : 'en-US')}\r\n </option>\r\n ))}\r\n </select>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport { CustomButton };\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\nimport { DatePicker as PersianDatePicker } from 'react-persian-range-picker';\r\n\r\nimport { useLocale } from '../host';\r\n\r\ntype Props = {\r\n value?: unknown;\r\n onChange?: (value: unknown) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n showMask?: boolean;\r\n};\r\n\r\nexport function NewDatePicker({\r\n value,\r\n onChange,\r\n disabled,\r\n className,\r\n showMask = true,\r\n}: Props) {\r\n const locale = useLocale();\r\n const parsed =\r\n value == null || value === ''\r\n ? null\r\n : typeof value === 'number'\r\n ? value\r\n : String(value);\r\n\r\n return (\r\n <div className={`erp-table-date ${className ?? ''}`}>\r\n <PersianDatePicker\r\n calendarType={locale === 'fa' ? 'jalali' : 'gregorian'}\r\n exportType=\"timeStamp\"\r\n showMask={showMask && !disabled}\r\n allowClear\r\n disabled={disabled}\r\n value={parsed as any}\r\n onChange={(next) => {\r\n onChange?.(next == null ? '' : next);\r\n }}\r\n primaryColor=\"#0e0e0e\"\r\n highlightColor=\"#ddecfd\"\r\n isTodaySelectPreset={false}\r\n />\r\n </div>\r\n );\r\n}\r\n","/**\r\n * View-state value object for virtual scrolling.\r\n * Lives in Domain types but is NOT an accounting invariant — Adapters drive it.\r\n */\r\nexport class Viewport {\r\n constructor(\r\n /** Vertical scroll offset in pixels. */\r\n public readonly scrollOffset: number,\r\n /** Visible viewport height in pixels. */\r\n public readonly viewportSize: number,\r\n /** Fixed row height in pixels (variable-height later). */\r\n public readonly rowHeight: number,\r\n /** Extra rows rendered above/below the window. */\r\n public readonly overscan: number = 2,\r\n ) {\r\n if (viewportSize <= 0) throw new Error('Viewport.viewportSize must be > 0');\r\n if (rowHeight <= 0) throw new Error('Viewport.rowHeight must be > 0');\r\n if (overscan < 0) throw new Error('Viewport.overscan must be >= 0');\r\n if (scrollOffset < 0) throw new Error('Viewport.scrollOffset must be >= 0');\r\n }\r\n\r\n equals(other: Viewport): boolean {\r\n return (\r\n this.scrollOffset === other.scrollOffset &&\r\n this.viewportSize === other.viewportSize &&\r\n this.rowHeight === other.rowHeight &&\r\n this.overscan === other.overscan\r\n );\r\n }\r\n\r\n withScrollOffset(scrollOffset: number): Viewport {\r\n return new Viewport(\r\n Math.max(0, scrollOffset),\r\n this.viewportSize,\r\n this.rowHeight,\r\n this.overscan,\r\n );\r\n }\r\n\r\n withViewportSize(viewportSize: number): Viewport {\r\n return new Viewport(\r\n this.scrollOffset,\r\n viewportSize,\r\n this.rowHeight,\r\n this.overscan,\r\n );\r\n }\r\n\r\n toJSON() {\r\n return {\r\n scrollOffset: this.scrollOffset,\r\n viewportSize: this.viewportSize,\r\n rowHeight: this.rowHeight,\r\n overscan: this.overscan,\r\n };\r\n }\r\n}\r\n\r\n/** Inclusive start, exclusive end — indices into the ordered row list. */\r\nexport type VisibleRange = {\r\n readonly startIndex: number;\r\n readonly endIndex: number;\r\n readonly startOffset: number;\r\n readonly endOffset: number;\r\n readonly totalHeight: number;\r\n readonly visibleCount: number;\r\n};\r\n","//domain/value-object\r\nexport class CellValue {\r\n constructor(public readonly value: unknown) { }\r\n\r\n equals(other: CellValue) {\r\n return this.value === other.value;\r\n }\r\n}\r\nexport class CellDisplay {\r\n constructor(public readonly value: unknown) { }\r\n\r\n equals(other: CellDisplay) {\r\n return this.value === other.value;\r\n }\r\n}\r\n\r\nexport class ColumnId {\r\n constructor(public readonly value: string) { }\r\n\r\n equals(other: ColumnId) {\r\n return this.value === other.value;\r\n }\r\n}\r\nexport type SelectOption = {\r\n label: string;\r\n value: string | number;\r\n};\r\nexport type KeyValue = {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type IRule = {\r\n type?: string | 'array' | 'object' | 'enum' | 'date' | 'number' | 'integer' | 'float' | 'boolean' | 'email' | 'url' | 'hex' | RegExp;\r\n required?: boolean;\r\n whitespace?: boolean;\r\n message?: string;\r\n transform?: (value: any) => any;\r\n pattern?: string | RegExp;\r\n min?: number;\r\n max?: number;\r\n len?: number;\r\n enum?: any[];\r\n validator?: (rule: IRule, value: any, callback: (error?: string[]) => void) => void | Promise<void>;\r\n asyncValidator?: (rule: IRule, value: any) => Promise<void>;\r\n warningOnly?: boolean;\r\n validateTrigger?: string | string[];\r\n};\r\nexport class RowId {\r\n constructor(public value: number) { }\r\n equals(other: RowId) {\r\n return this.value === other.value;\r\n }\r\n set(id: RowId) {\r\n this.value = id.value\r\n }\r\n}\r\nexport class TableId {\r\n constructor(public value: string) { }\r\n equals(other: TableId) {\r\n return this.value === other.value;\r\n }\r\n set(id: TableId) {\r\n this.value = id.value\r\n }\r\n}\r\nexport class RowState {\r\n constructor(public value: RowStateEnum) { }\r\n equals(other: RowStateEnum) {\r\n return this.value === other;\r\n }\r\n set(rowState: RowStateEnum) {\r\n this.value = rowState\r\n }\r\n}\r\n\r\nexport enum RowStateEnum {\r\n Added = \"Add\",\r\n Modified = \"Update\",\r\n Deleted = \"Delete\",\r\n Unchanged = \"None\",\r\n}\r\nexport enum RowOriginEnum {\r\n Persisted = \"Add\",\r\n New = \"Update\",\r\n\r\n}\r\nexport type TableActions = \"copy\" | \"cut\" | \"paste\" | \"pasteInsert\" | null\r\n\r\nexport { Viewport } from './Viewport';\r\nexport type { VisibleRange } from './Viewport';\r\n\r\nexport class Pagination {\r\n public readonly totalRows: number;\r\n public readonly totalPages: number;\r\n public readonly canPrev: boolean;\r\n public readonly canNext: boolean;\r\n\r\n constructor(\r\n public readonly page: number,\r\n public readonly pageSize: number,\r\n totalRows: number\r\n ) {\r\n this.totalRows = totalRows;\r\n this.totalPages = Math.max(1, Math.ceil(totalRows / pageSize));\r\n this.canPrev = page > 1;\r\n this.canNext = page < this.totalPages;\r\n }\r\n\r\n changePage(page: number): Pagination {\r\n return new Pagination(page, this.pageSize, this.totalRows);\r\n }\r\n changePageSize(size: number): Pagination {\r\n return new Pagination(\r\n Math.min(this.page, Math.ceil(this.totalRows / size)),\r\n size,\r\n this.totalRows\r\n );\r\n }\r\n\r\n toJSON() {\r\n return {\r\n page: this.page,\r\n pageSize: this.pageSize,\r\n totalRows: this.totalRows,\r\n totalPages: this.totalPages,\r\n canPrev: this.canPrev,\r\n canNext: this.canNext,\r\n };\r\n }\r\n}","\"use client\";\r\n\r\nimport React, { FC, useEffect, useMemo, useState } from 'react';\r\n\r\nimport { useRemoteQuery, useTranslations } from '../host';\r\nimport { Reload, Select } from '../primitives';\r\n\r\ntype DependOn = { fieldName: string; value: unknown };\r\ntype SelectOption = {\r\n _SelectId: string | number;\r\n _SelectValue?: string;\r\n _SelectDisplay?: string;\r\n};\r\n\r\nexport interface ERPTableDynamicSelectProps {\r\n className?: string;\r\n value?: unknown;\r\n onChange?: (value: unknown, option?: unknown) => void;\r\n dynamicValue: any;\r\n showId?: boolean;\r\n infinite?: boolean;\r\n onSearchPhrase?: (\r\n correctOptionValue: number,\r\n correctOptionTitle?: string,\r\n option?: unknown,\r\n ) => void;\r\n showSearch?: boolean;\r\n onOptionsChange?: (options: any[]) => void;\r\n labelValue?: 'selectDisplay' | 'selectValue';\r\n selectFirstDefault?: boolean;\r\n displayFormatter?: (option: SelectOption) => string;\r\n disabled?: boolean;\r\n showRefetch?: boolean;\r\n noCache?: boolean;\r\n filterOptions?: (option: any) => boolean;\r\n filterOption?: (input: string, option: any) => boolean;\r\n options?: any[];\r\n onClear?: () => void;\r\n onClick?: () => void;\r\n autoFocus?: boolean;\r\n popupMatchSelectWidth?: number | boolean;\r\n popupRender?: (menu: React.ReactNode) => React.ReactNode;\r\n placeholder?: React.ReactNode;\r\n allowClear?: boolean;\r\n onSearch?: (value: string) => void;\r\n}\r\n\r\nexport const ERPTableDynamicSelect: FC<ERPTableDynamicSelectProps> = ({\r\n className,\r\n value,\r\n onChange,\r\n dynamicValue,\r\n infinite = false,\r\n onSearchPhrase,\r\n showSearch = true,\r\n onOptionsChange,\r\n labelValue = 'selectDisplay',\r\n selectFirstDefault = false,\r\n displayFormatter,\r\n disabled,\r\n showRefetch,\r\n noCache = false,\r\n filterOptions,\r\n options: externalOptions,\r\n onClear,\r\n onClick,\r\n autoFocus,\r\n popupMatchSelectWidth,\r\n popupRender,\r\n filterOption,\r\n placeholder,\r\n allowClear,\r\n onSearch,\r\n}) => {\r\n const t = useTranslations();\r\n const [options, setOptions] = useState<any[]>([]);\r\n const [searchPhrase, setSearchPhrase] = useState<string | null>(null);\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const pageRecordCount = 5000;\r\n\r\n const {\r\n endpoint,\r\n repoViewId,\r\n dependOn,\r\n dependsOn,\r\n ...bodyRequest\r\n } = dynamicValue ?? {};\r\n\r\n const getOptionLabel = (option: SelectOption) => {\r\n if (displayFormatter) return displayFormatter(option);\r\n return option._SelectDisplay;\r\n };\r\n\r\n const hasDependValue = (dependency: DependOn | DependOn[] | undefined) => {\r\n if (!dependency) return true;\r\n if (Array.isArray(dependency)) {\r\n return dependency.every((item) => item.value !== null && item.value !== undefined);\r\n }\r\n return dependency.value !== null && dependency.value !== undefined;\r\n };\r\n\r\n const dependencySource = dependOn ?? dependsOn;\r\n const dependencyBody = Array.isArray(dependencySource)\r\n ? Object.fromEntries(dependencySource.map((item: DependOn) => [item.fieldName, item.value]))\r\n : dependencySource\r\n ? { [dependencySource.fieldName]: dependencySource.value }\r\n : {};\r\n\r\n const body = {\r\n ...bodyRequest,\r\n ...dependencyBody,\r\n PagingInfo: infinite\r\n ? { PageRecordCount: pageRecordCount, PageNumber: pageNumber }\r\n : null,\r\n RepoViewId: repoViewId,\r\n };\r\n const existBody = Object.fromEntries(\r\n Object.entries(body).filter(([, v]) => v !== null),\r\n );\r\n\r\n const { data, isFetching, refetch } = useRemoteQuery<SelectOption[]>({\r\n url: endpoint,\r\n body: existBody,\r\n skip: dependencySource ? !hasDependValue(dependencySource) : false,\r\n noCache,\r\n });\r\n\r\n const handleRefetch = () => {\r\n setPageNumber(1);\r\n if (!(dependencySource && !hasDependValue(dependencySource))) {\r\n void refetch();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!data?.Data) return;\r\n const mapOption = (option: SelectOption) => ({\r\n key: option._SelectId,\r\n value: option._SelectId,\r\n label: labelValue === 'selectValue' ? option._SelectValue : getOptionLabel(option),\r\n title: getOptionLabel(option),\r\n option,\r\n });\r\n const dynamicOptions = (data.Data as SelectOption[]).map(mapOption);\r\n if (infinite) {\r\n if (pageNumber === 1) setOptions(dynamicOptions);\r\n else setOptions((prev) => [...prev, ...dynamicOptions]);\r\n } else {\r\n setOptions(dynamicOptions);\r\n }\r\n }, [data?.Data, infinite, labelValue, pageNumber, selectFirstDefault]);\r\n\r\n useEffect(() => {\r\n if (infinite && searchPhrase && searchPhrase.length > 2) setPageNumber(1);\r\n }, [infinite, searchPhrase]);\r\n\r\n useEffect(() => {\r\n onOptionsChange?.(options);\r\n if (selectFirstDefault && options.length) onChange?.(options[0]?.value);\r\n }, [options, onChange, onOptionsChange, selectFirstDefault]);\r\n\r\n useEffect(() => {\r\n if (value === null || value === undefined) {\r\n setSearchPhrase(null);\r\n setPageNumber(1);\r\n }\r\n }, [value]);\r\n\r\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\r\n const bottom =\r\n e.currentTarget.scrollHeight ===\r\n e.currentTarget.scrollTop + e.currentTarget.clientHeight;\r\n if (infinite && bottom && !isFetching) {\r\n data?.ReturnCount === pageRecordCount && setPageNumber((prev) => prev + 1);\r\n }\r\n };\r\n\r\n const filteredOptions = useMemo(() => {\r\n const source = externalOptions ?? options;\r\n if (!filterOptions) return source;\r\n return source.filter(filterOptions);\r\n }, [externalOptions, filterOptions, options]);\r\n\r\n return (\r\n <div className=\"relative\">\r\n <Select\r\n className={className}\r\n value={value}\r\n disabled={disabled}\r\n loading={isFetching}\r\n showSearch={showSearch}\r\n allowClear={allowClear ?? true}\r\n autoFocus={autoFocus}\r\n popupMatchSelectWidth={popupMatchSelectWidth}\r\n popupRender={popupRender}\r\n placeholder={placeholder ?? (showSearch ? t('general.search') : t('general.selectField'))}\r\n filterOption={filterOption}\r\n onClick={onClick}\r\n onChange={onChange}\r\n onSearch={(currentValue) => {\r\n if (infinite) {\r\n setSearchPhrase(currentValue);\r\n const hit = options.filter(\r\n (item) =>\r\n String(item?.title ?? '').includes(currentValue) ||\r\n String(item?.label ?? '').includes(currentValue),\r\n );\r\n if (hit.length === 1 && onSearchPhrase) {\r\n onSearchPhrase(hit[0].value as number, hit[0]?.title, hit);\r\n return;\r\n }\r\n }\r\n onSearch?.(currentValue);\r\n }}\r\n onPopupScroll={handleScroll}\r\n onClear={() => {\r\n if (infinite) {\r\n setSearchPhrase('');\r\n setPageNumber(1);\r\n }\r\n onClear?.();\r\n }}\r\n options={filteredOptions}\r\n notFoundContent={isFetching ? 'Loading...' : 'No options found'}\r\n />\r\n {showRefetch && (\r\n <div\r\n className={`${isFetching ? 'animate-spin' : ''} ${disabled ? 'opacity-50' : 'opacity-100'} absolute left-6 top-[0.65rem] cursor-pointer`}\r\n onClick={handleRefetch}\r\n >\r\n <Reload config={{ height: 16, width: 16 }} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport function highlightSearchText(\r\n text: unknown,\r\n query: string,\r\n isCurrent: boolean,\r\n): React.ReactNode {\r\n const display = text == null ? '' : String(text);\r\n const q = query.trim();\r\n if (!q) return display;\r\n\r\n const lowerText = display.toLowerCase();\r\n const lowerQuery = q.toLowerCase();\r\n const index = lowerText.indexOf(lowerQuery);\r\n if (index === -1) return display;\r\n\r\n const markClass = isCurrent ? 'bg-yellow-400 font-semibold' : 'bg-yellow-200';\r\n const matchLength = lowerQuery.length;\r\n\r\n return (\r\n <>\r\n {display.slice(0, index)}\r\n <mark className={markClass}>{display.slice(index, index + matchLength)}</mark>\r\n {display.slice(index + matchLength)}\r\n </>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\n\r\nimport { FieldType } from '../bootstrap/type';\r\nimport type { ERPTableLocale } from './host/messages';\r\n\r\nconst FA_DIGITS = '۰۱۲۳۴۵۶۷۸۹';\r\n\r\nexport function toFaDigits(value: string): string {\r\n return value.replace(/\\d/g, (digit) => FA_DIGITS[Number(digit)] ?? digit);\r\n}\r\n\r\nexport function formatGroupedNumber(\r\n val: unknown,\r\n locale: ERPTableLocale = 'fa',\r\n): string {\r\n if (val == null || val === '') return '';\r\n const n = Number(val);\r\n if (!Number.isFinite(n)) return String(val);\r\n const grouped = `${n}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n return locale === 'fa' ? toFaDigits(grouped) : grouped;\r\n}\r\n\r\nexport function formatDisplayNumber(\r\n val: unknown,\r\n locale: ERPTableLocale = 'fa',\r\n): string {\r\n if (val == null || val === '') return '';\r\n const text = String(val);\r\n return locale === 'fa' ? toFaDigits(text) : text;\r\n}\r\n\r\nexport function formatJalaliDate(val: unknown): string | null {\r\n if (val == null || val === '') return null;\r\n const date =\r\n typeof val === 'number'\r\n ? new Date(val)\r\n : new Date(String(val));\r\n if (Number.isNaN(date.getTime())) return null;\r\n return new Intl.DateTimeFormat('fa-IR-u-ca-persian', {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n }).format(date);\r\n}\r\n\r\nexport const valueParser = (\r\n val: unknown,\r\n type: FieldType,\r\n locale: ERPTableLocale = 'fa',\r\n): ReactNode => {\r\n if (val == null) {\r\n return type === 'selectOption' ? 'انتخاب کنید' : '';\r\n }\r\n\r\n switch (type) {\r\n case 'text':\r\n case 'description':\r\n case 'number':\r\n case 'select':\r\n case 'selectOption':\r\n case 'static':\r\n return formatDisplayNumber(val, locale);\r\n\r\n case 'checkbox':\r\n return val ? '✔' : '✘';\r\n\r\n case 'price':\r\n return formatGroupedNumber(val, locale);\r\n\r\n case 'date':\r\n return formatJalaliDate(val);\r\n\r\n default:\r\n return '—';\r\n }\r\n};\r\n","\"use client\";\r\nimport React, {\r\n forwardRef,\r\n Ref,\r\n useMemo,\r\n} from 'react';\r\n\r\nimport { ColumnSchema } from '../../../bootstrap/type';\r\nimport {\r\n UITableController,\r\n} from '../../../infrastructure/ui/UITableController';\r\nimport { useLocale, useRemoteQuery } from '../../host';\r\nimport {\r\n CustomDropdownButton,\r\n CustomTooltip,\r\n Dots,\r\n SavePlus,\r\n} from '../../primitives';\r\nimport { UIRow } from '../../type';\r\nimport {\r\n VoucherTypeApiResponse,\r\n} from './type';\r\n\r\nexport interface DescriptionComponentProps extends React.HTMLAttributes<HTMLDivElement> {\r\n disabled?: boolean;\r\n value?: unknown;\r\n onChange?: (e: unknown) => void;\r\n meta: ColumnSchema;\r\n controller: UITableController;\r\n tableKey: string;\r\n row: UIRow;\r\n columnId: string;\r\n idx: number;\r\n inputRef: Ref<HTMLInputElement | null>;\r\n isDeleted: boolean;\r\n editable: boolean;\r\n blockDrag: (e: React.DragEvent) => void;\r\n dispatchChangeValue: (newValue: unknown) => void;\r\n activeCell: () => void;\r\n}\r\nexport interface IDesc {\r\n AccountDescItemId: number;\r\n AccountDescId: number;\r\n Desc: string;\r\n}\r\n\r\nexport const DescriptionComponent = forwardRef<\r\n HTMLDivElement,\r\n DescriptionComponentProps\r\n>((props, ref) => {\r\n const locale = useLocale();\r\n // const { inputKey, items, isDisabled, lang, handleSaveDescription } = useVoucherDescription({});\r\n const {\r\n meta,\r\n controller,\r\n tableKey,\r\n row,\r\n columnId,\r\n idx,\r\n inputRef,\r\n isDeleted,\r\n editable,\r\n value,\r\n blockDrag,\r\n dispatchChangeValue,\r\n activeCell,\r\n } = props;\r\n const { endpoint, dependOn } = meta.dynamicSource ?? {};\r\n\r\n const hasDependValue = (\r\n dependOn:\r\n | { fieldName: string; value: unknown }\r\n | Array<{ fieldName: string; value: unknown }>,\r\n ) => {\r\n if (Array.isArray(dependOn)) {\r\n return dependOn.every(\r\n (item) => item.value !== null && item.value !== undefined,\r\n );\r\n }\r\n return dependOn.value !== null && dependOn.value !== undefined;\r\n };\r\n const dependencyBody = Array.isArray(dependOn)\r\n ? Object.fromEntries(\r\n dependOn.map((item) => [item.fieldName, item.value]),\r\n )\r\n : dependOn\r\n ? { [dependOn.fieldName]: dependOn.value }\r\n : {};\r\n const { data: menuData } = useRemoteQuery<VoucherTypeApiResponse>({\r\n url: endpoint,\r\n body: {\r\n ...dependencyBody,\r\n PagingInfo: {\r\n PageNumber: 1,\r\n PageRecordCount: 10000,\r\n },\r\n },\r\n skip: dependOn ? !hasDependValue(dependOn) : false,\r\n });\r\n const items = useMemo(\r\n () =>\r\n menuData?.Data?.map((item, index) => ({\r\n key: String(index),\r\n label: item.Desc,\r\n onClick: () => {\r\n meta.onChange?.(tableKey, row.id, row, controller,item.Desc);\r\n controller?.dispatch({\r\n type: \"UI_CELL_CHANGE\",\r\n rowId: row.id,\r\n columnId,\r\n value: item.Desc,\r\n });\r\n },\r\n })) || [],\r\n [menuData?.Data],\r\n );\r\nconst handleSaveDescription = ()=>{\r\n controller?.dispatch({\r\n type: \"UI_DESCRIPTION_SAVE\",\r\n rowId: row.id,\r\n flag:true\r\n });\r\n}\r\n return (\r\n <div className=\"flex justify-between items-center w-full\">\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !editable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n bg-transparent px-2 outline-none focus-visible:outline-none\r\n focus:outline-none ring-0 focus:!ring-0 focus:ring-offset-0 transition-colors !h-full w-full text-xs ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e.target.value)}\r\n onClick={() => activeCell()}\r\n />\r\n\r\n <CustomDropdownButton\r\n placement={locale !== \"fa\" ? \"bottomRight\" : \"bottomLeft\"}\r\n className=\"flex justify-center items-center bg-gray-gray3 dark:!bg-gray-gray11 p-0 rounded !h-9 cursor-pointer\"\r\n items={items}\r\n dropdownClassName=\"max-h-[20rem] max-w-[40vw]\"\r\n >\r\n <span className=\"cursor-pointer\" id=\"descriptionsList\">\r\n <Dots />\r\n </span>\r\n </CustomDropdownButton>\r\n\r\n <CustomTooltip\r\n // title={isDisabled ? t(\"general.notActive\") : t(\"general.save\")}\r\n // className={`\r\n // bg-gray-gray3 flex justify-center items-center w-[2.125rem] h-[2.125rem] rounded\r\n // ${isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"}\r\n // `}\r\n >\r\n <button\r\n onClick={() => {\r\n // if (!isDisabled) {\r\n handleSaveDescription();\r\n // }\r\n }}\r\n >\r\n <SavePlus\r\n config={{\r\n width: 18,\r\n height: 18,\r\n stroke: \"black\",\r\n }}\r\n />\r\n </button>\r\n </CustomTooltip>\r\n </div>\r\n );\r\n});\r\n\r\nDescriptionComponent.displayName = \"DescriptionComponent\";\r\n","\"use client\";\r\nimport React, { useEffect } from 'react';\r\n\r\nimport { useLocale } from '../host';\r\nimport {\r\n CustomCheckbox,\r\n InfoIcon,\r\n NewDatePicker,\r\n Select,\r\n Tooltip,\r\n} from '../primitives';\r\nimport { ERPTableDynamicSelect as DynamicSelect } from './ERPTableDynamicSelect';\r\n\r\nimport {\r\n ColumnSchema,\r\n DefaultOptionType,\r\n} from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { ValidCell } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { highlightSearchText } from '../gridSearch/highlightText';\r\nimport { valueParser } from '../helper';\r\nimport { useGridSearchState } from '../hooks/useEngineSelector';\r\nimport { UIRow } from '../type';\r\nimport { DescriptionComponent } from './descriptionComponent';\r\n\r\n/* ======================================================\r\n Types\r\n ====================================================== */\r\n\r\ninterface CellRendererProps {\r\n tableKey: string;\r\n row: UIRow;\r\n columnId: string;\r\n idx: number;\r\n meta?: ColumnSchema;\r\n controller: UITableController;\r\n tabIndex: number;\r\n mode?: \"view\" | \"cell\" | \"form\";\r\n}\r\n\r\n/* ======================================================\r\n Cell Renderer\r\n ====================================================== */\r\n\r\nexport const CellRenderer: React.FC<CellRendererProps> = ({\r\n tableKey,\r\n row,\r\n columnId,\r\n meta,\r\n controller,\r\n tabIndex,\r\n idx,\r\n mode = \"cell\",\r\n}) => {\r\n const dateHostRef = React.useRef<HTMLDivElement | null>(null);\r\n const locale = useLocale();\r\n const searchState = useGridSearchState(controller);\r\n if (!meta) return null;\r\n const disable =\r\n typeof row.visibilityCondition[columnId] === \"boolean\" &&\r\n row.visibilityCondition[columnId] === false;\r\n const viewCell = controller.getCell(row.id, columnId);\r\n const value = viewCell?.getValue();\r\n const display = viewCell?.getDisplay();\r\n const isActive = controller.isActiveCell(row.id, columnId);\r\n const validation: ValidCell = controller.isValidCell(row.id, columnId) ?? {\r\n isValid: true,\r\n cellError: { rowId: row.id, caption: meta.fieldCaption, message: '' },\r\n };\r\n const inputRef = React.useRef<HTMLInputElement | null>(null);\r\n const dispatchChangeValue = (\r\n newValue: unknown,\r\n option?: DefaultOptionType,\r\n ) => {\r\n meta.onChange?.(tableKey, row.id, row, controller, newValue, option);\r\n controller.dispatch({\r\n type: \"UI_CELL_CHANGE\",\r\n rowId: row.id,\r\n columnId,\r\n value: newValue,\r\n });\r\n };\r\n const dispatchChangeDisplay = (label: string | null) => {\r\n controller.dispatch({\r\n type: \"UI_CELL_CHANGE_DISPLAY\",\r\n rowId: row.id,\r\n columnId,\r\n value: label ?? '',\r\n });\r\n };\r\n const activeCell = () => {\r\n controller.dispatch({type: \"UI_ACTIVE_CELL\", rowId: row.id, columnId});\r\n };\r\n\r\n const type = meta.fieldType;\r\n const isEditable = meta.editable !== false;\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isCurrentSearchMatch =\r\n !!searchState &&\r\n searchState.currentIndex >= 0 &&\r\n searchState.matches[searchState.currentIndex]?.rowId === row.id &&\r\n searchState.matches[searchState.currentIndex]?.columnId === columnId;\r\n\r\n const renderCellContent = (cellText: unknown) => {\r\n const parsed = valueParser(cellText, meta.fieldType, locale);\r\n if (isCurrentSearchMatch && searchState?.query) {\r\n return highlightSearchText(parsed, searchState.query, true);\r\n }\r\n return parsed;\r\n };\r\n\r\n const blockDrag = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n useEffect(() => {\r\n const shouldFocus = mode === \"form\" || (mode === \"cell\" && isActive);\r\n if (!shouldFocus) return;\r\n if (type === \"date\") {\r\n const id = window.setTimeout(() => {\r\n const el = dateHostRef.current?.querySelector(\r\n '[role=\"button\"][tabindex=\"0\"]',\r\n ) as HTMLElement | null;\r\n el?.focus();\r\n }, 0);\r\n return () => window.clearTimeout(id);\r\n }\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n if (mode !== \"form\") {\r\n inputRef.current.select();\r\n }\r\n }\r\n }, [isActive, mode, type]);\r\n const renderReadOnlyCell = (cellText: unknown) => (\r\n <span\r\n key={idx}\r\n className={`flex items-center px-2 w-full h-9 overflow-hidden text-xs text-ellipsis whitespace-nowrap ${meta.className}\r\n ${meta.fieldType === \"checkbox\" || meta.fieldType === \"price\" || meta.fieldType === \"number\" ? \"justify-center\" : \"justify-start\"}\r\n ${isCurrentSearchMatch ? \"ring-2 ring-yellow-400\" : \"\"}`}\r\n >\r\n <span className=\"truncate\">{renderCellContent(cellText)}</span>\r\n {!validation?.isValid && (\r\n <Tooltip title={validation?.cellError?.message}>\r\n <span>\r\n <InfoIcon config={{width: 18, height: 18, stroke: \"#f87171\"}} />\r\n </span>\r\n </Tooltip>\r\n )}\r\n </span>\r\n );\r\n\r\n if (mode === \"view\") {\r\n if (disable) {\r\n return (\r\n <span key={idx} className={`text-xs ${meta.className}`}>\r\n --\r\n </span>\r\n );\r\n }\r\n return renderReadOnlyCell(display ?? value);\r\n }\r\n\r\n if (disable) {\r\n return (\r\n <span key={idx} className={` \"text-xs\" ${meta.className}`}>\r\n {disable ? \"--\" : String(value ?? \"\")}\r\n </span>\r\n );\r\n } else if (isEditable === false) {\r\n if (meta.fieldType === \"selectOption\") {\r\n return (\r\n <span key={idx} className={`text-xs text-start ${meta.className} `}>\r\n {value ? renderCellContent(value) : \"--\"}\r\n </span>\r\n );\r\n } else {\r\n return (\r\n <span key={idx} className={`text-xs ${meta.className} `}>\r\n {renderCellContent(value)}\r\n </span>\r\n );\r\n }\r\n } else if (\r\n mode !== \"form\" &&\r\n (!isActive || isDeleted || isCurrentSearchMatch)\r\n ) {\r\n return (\r\n <>\r\n <button\r\n key={idx}\r\n tabIndex={tabIndex}\r\n disabled={isDeleted}\r\n className={` px-2 w-full \r\n text-start h-9 ${meta.className}\r\n ${isDeleted ? \"cursor-not-allowed \" : \"cursor-text\"}\r\n ${isCurrentSearchMatch ? \"ring-2 ring-yellow-400\" : \"\"}\r\n `}\r\n onClick={() => {\r\n activeCell();\r\n }}\r\n >\r\n <div\r\n className={`flex items-center w-full min-w-36 max-w-72 h-full overflow-hidden text-xs text-ellipsis whitespace-nowrap \r\n ${meta.fieldType === \"checkbox\" || meta.fieldType === \"price\" || meta.fieldType === \"number\" ? \"justify-center\" : \"justify-start\"}`}\r\n >\r\n <div className=\"truncate\">\r\n {renderCellContent(display ?? value)}\r\n {!validation?.isValid && (\r\n <Tooltip title={validation?.cellError?.message}>\r\n <span>\r\n <InfoIcon\r\n config={{width: 18, height: 18, stroke: \"#f87171\"}}\r\n />\r\n </span>\r\n </Tooltip>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n </>\r\n );\r\n }\r\n\r\n switch (type) {\r\n case \"number\":\r\n return (\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n value={value === \"\" || value == null ? \"\" : Number(value)}\r\n disabled={isDeleted || !isEditable}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n bg-transparent px-3 outline-none \r\n focus-visible:outline-none focus:outline-none ring-0 focus:!ring-0 \r\n focus:ring-offset-0 !h-full w-full text-xs transition-colors ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) =>\r\n dispatchChangeValue(\r\n e.target.value === \"\" ? \"\" : Number(e.target.value),\r\n )\r\n }\r\n />\r\n );\r\n case \"price\":\r\n return (\r\n <input\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9,]*\"\r\n min={0}\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !isEditable}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n bg-transparent px-3 outline-none !bg-white !rounded \r\n focus-visible:outline-none focus:outline-none ring-0 focus:!ring-0 \r\n focus:ring-offset-0 h-9 w-full text-xs transition-colors \r\n ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n value={\r\n value === \"\" || value == null\r\n ? \"\"\r\n : `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\")\r\n }\r\n onChange={(e) => {\r\n const inputValue = e.target.value;\r\n const parsedValue = inputValue.replace(/\\$\\s?|(,*)/g, \"\");\r\n if (parsedValue === \"\" || !isNaN(Number(parsedValue))) {\r\n dispatchChangeValue(\r\n parsedValue === \"\" ? \"\" : Number(parsedValue),\r\n );\r\n dispatchChangeDisplay(\r\n parsedValue === \"\"\r\n ? null\r\n : `${Number(parsedValue)}`.replace(\r\n /\\B(?=(\\d{3})+(?!\\d))/g,\r\n \",\",\r\n ),\r\n );\r\n }\r\n }}\r\n />\r\n );\r\n case \"date\":\r\n return (\r\n <div ref={dateHostRef} className=\"w-full h-full\">\r\n <NewDatePicker\r\n showMask\r\n className={`${meta.className}`}\r\n key={idx}\r\n disabled={isDeleted || !isEditable}\r\n value={\r\n value == null || value === ''\r\n ? undefined\r\n : typeof value === 'number'\r\n ? value\r\n : new Date(value as string).valueOf()\r\n }\r\n onChange={(v) => {\r\n dispatchChangeValue(v);\r\n }}\r\n />\r\n </div>\r\n );\r\n case \"checkbox\":\r\n return (\r\n <CustomCheckbox\r\n className={`${meta.className} w-full flex justify-center items-center`}\r\n key={idx}\r\n disabled={isDeleted || !isEditable}\r\n // value={value === true as boolean}\r\n checked={value === (true as boolean)}\r\n onChange={(e) => {\r\n dispatchChangeValue(e.target.checked);\r\n }}\r\n />\r\n );\r\n case \"select\":\r\n return (\r\n <Select\r\n key={idx}\r\n options={(meta?.options ?? []).map((opt) => ({\r\n value: opt.value,\r\n label: opt.label,\r\n }))}\r\n disabled={isDeleted || !isEditable}\r\n className={` h-9 ${isDeleted && \"cursor-not-allowed\"} ${meta.className}`}\r\n value={value}\r\n onClick={() => activeCell()}\r\n onChange={(v, o) => {\r\n dispatchChangeValue(v);\r\n const option = o as { label?: string } | undefined;\r\n if (option?.label) {\r\n dispatchChangeDisplay(option.label);\r\n } else {\r\n dispatchChangeDisplay('');\r\n }\r\n if (v) {\r\n controller.dispatch({\r\n type: \"UI_MOVE_ACTIVE_CELL\",\r\n rowId: row.id,\r\n columnId,\r\n direction: \"next\",\r\n });\r\n }\r\n }}\r\n />\r\n );\r\n case \"selectOption\": {\r\n const selectValue =\r\n value != null && value !== \"\" ? String(value) : undefined;\r\n\r\n return (\r\n <DynamicSelect\r\n labelValue={meta.labelValue}\r\n noCache={meta.noCache}\r\n key={`${row.id}-${columnId}`}\r\n showSearch\r\n infinite\r\n onSearchPhrase={(v, o) => {\r\n dispatchChangeValue(v);\r\n if (!Array.isArray(o)) {\r\n if (o) {\r\n dispatchChangeDisplay(o);\r\n } else {\r\n dispatchChangeDisplay(null);\r\n }\r\n }\r\n }}\r\n autoFocus={mode !== \"form\"}\r\n popupMatchSelectWidth={meta.popUpWidth}\r\n popupRender={(menu) => <div className=\"w-full\">{menu}</div>}\r\n disabled={isDeleted || !isEditable}\r\n // labelInValue is false in DynamicSelect — pass a primitive, not {value,label}\r\n value={selectValue}\r\n dynamicValue={meta?.dynamicSource}\r\n filterOption={(input, option) => {\r\n if (meta?.dynamicSelectFilterOption) {\r\n return meta.dynamicSelectFilterOption(input, option);\r\n } else {\r\n const label = option?.label;\r\n return (\r\n typeof label === \"string\" &&\r\n option.option._SelectDisplay.toLowerCase().includes(input)\r\n );\r\n }\r\n }}\r\n filterOptions={(option) => {\r\n const unique = (controller.getAllRows() ?? []).some(\r\n (r) => r.getCell(columnId)?.getValue() === option.value,\r\n );\r\n if (meta.isUnique) {\r\n return !unique;\r\n }\r\n return true;\r\n }}\r\n className={`bg-white !border-[0.4px] !border-gray-gray7 h-9 ${meta.className} ${isDeleted && \"cursor-not-allowed\"} relative`}\r\n onClick={() => activeCell()}\r\n onChange={(v, o) => {\r\n dispatchChangeValue(v, o as DefaultOptionType);\r\n const option = o as { label?: string } | undefined;\r\n dispatchChangeDisplay(option?.label ?? '');\r\n if (v) {\r\n controller.dispatch({\r\n type: \"UI_MOVE_ACTIVE_CELL\",\r\n rowId: row.id,\r\n columnId,\r\n direction: \"next\",\r\n });\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n case \"static\":\r\n return (\r\n <span\r\n key={idx}\r\n tabIndex={tabIndex}\r\n className={` px-2 w-full h-full text-xs cursor-text ${meta.className}`}\r\n onClick={() => activeCell()}\r\n >\r\n {String(display ?? value ?? \"\") || \"—\"}\r\n </span>\r\n );\r\n // case \"textArea\":\r\n // return (\r\n // <textarea\r\n // key={idx}\r\n // ref={inputRef as any}\r\n // disabled={isDeleted || !editable}\r\n // value={value == null ? \"\" : String(value)}\r\n // className={`${isDeleted && \"cursor-not-allowed\"}\r\n // flex items-center bg-transparent px-2 outline-none focus-visible:outline-none\r\n // focus:outline-none ring-0 focus:!ring-0 focus:ring-offset-0 h-8 transition-colors `}\r\n // draggable={false}\r\n // onDragStart={blockDrag}\r\n // onDragOver={blockDrag}\r\n // onDrop={blockDrag}\r\n // onChange={(e) => dispatchChangeValue(e.target.value)}\r\n // onClick={() => activeCell()}\r\n // />\r\n // );\r\n case \"description\":\r\n return (\r\n <DescriptionComponent\r\n activeCell={activeCell}\r\n blockDrag={blockDrag}\r\n isDeleted={isDeleted}\r\n editable={isEditable}\r\n dispatchChangeValue={dispatchChangeValue}\r\n idx={idx}\r\n inputRef={inputRef}\r\n tableKey={tableKey}\r\n row={row}\r\n controller={controller}\r\n columnId={columnId}\r\n key={idx}\r\n ref={inputRef as any}\r\n disabled={isDeleted || !isEditable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n flex items-center bg-transparent px-2 outline-none focus-visible:outline-none\r\n focus:outline-none ring-0 focus:!ring-0 focus:ring-offset-0 h-8 transition-colors `}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e)}\r\n onClick={() => activeCell()}\r\n meta={meta}\r\n />\r\n );\r\n case \"text\":\r\n default:\r\n return (\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !isEditable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n bg-transparent px-2 outline-none focus-visible:outline-none\r\n focus:outline-none ring-0 focus:ring-0! focus:ring-offset-0 transition-colors h-full! w-full text-xs ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e.target.value)}\r\n onClick={() => activeCell()}\r\n />\r\n );\r\n }\r\n};\r\n","import { useLocale, useTranslations } from '../host';\r\nimport {\r\n CustomDropdownButton,\r\n CustomCheckbox,\r\n Dots,\r\n DragIcon,\r\n Expand,\r\n RedTrashBin,\r\n Undo,\r\n} from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\n\r\ninterface IndexColProps {\r\n tableKey: string;\r\n idx: number;\r\n row: UIRow;\r\n controller: UITableController;\r\n meta: ColumnSchema;\r\n}\r\n\r\nexport const IndexCol: React.FC<IndexColProps> = ({\r\n idx,\r\n tableKey,\r\n row,\r\n controller,\r\n meta,\r\n}) => {\r\n const t = useTranslations();\r\n const locale = useLocale();\r\n\r\n const handleDeleteRow = () => {\r\n controller.dispatch({ type: \"ROW_DELETED\", rowId: row.id });\r\n };\r\n\r\n const handleCopyRow = () => {\r\n controller.dispatch({ type: \"DUPLICATE_ROW\", rowId: row.id });\r\n };\r\n\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: \"ADD_EMPTY_ROW\" });\r\n };\r\n\r\n const items = [\r\n {\r\n key: \"1\",\r\n label: (\r\n <span className=\"flex text-sm\" onClick={handleCopyRow}>\r\n {t(\"general.replicateRow\")}\r\n </span>\r\n ),\r\n extra: \"Ali + D\",\r\n },\r\n {\r\n key: \"2\",\r\n label: (\r\n <span className=\"flex text-sm\" onClick={handleAddRow}>\r\n {t(\"general.addNewRow\")}\r\n </span>\r\n ),\r\n extra: \"Alt + N\",\r\n },\r\n {\r\n type: \"divider\",\r\n },\r\n ...(meta.indexOptions?.(tableKey, row.id, row, controller) || []),\r\n ];\r\n\r\n const handleExpandRow = () => {\r\n controller.dispatch({ type: \"TOGGLE_ROW_EXPANDED\", rowId: row.id });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLInputElement>) => {\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isSelectedRow = controller.isSelectedRow(row.id);\r\n\r\n return (\r\n <div\r\n className={`${isDeleted && \"cursor-not-allowed\"} flex justify-between items-center w-full gap-2 px-2 h-full relative`}\r\n >\r\n <div className=\"flex justify-start items-center gap-2\">\r\n {!isDeleted && (\r\n <CustomCheckbox\r\n disabled={isDeleted}\r\n checked={!!isSelectedRow}\r\n onClick={handleSelectRow}\r\n />\r\n )}\r\n <div className=\"w-[20px] text-xs text-center\">\r\n {(idx + 1).toLocaleString(locale === 'fa' ? 'fa-IR' : 'en-US')}\r\n </div>\r\n\r\n {meta.enableMoveButton && !isDeleted && (\r\n <div\r\n className=\"erp-table-index-btn cursor-grab active:cursor-grabbing\"\r\n draggable={false}\r\n onMouseDown={(e) => {\r\n const tr = e.currentTarget.closest(\"tr\");\r\n tr?.setAttribute(\"draggable\", \"true\");\r\n }}\r\n >\r\n <DragIcon config={{ width: 16, height: 16 }} />\r\n </div>\r\n )}\r\n\r\n {meta.enableDeleteButton && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDeleteRow();\r\n }}\r\n className=\"erp-table-index-btn hover:bg-red-100\"\r\n >\r\n {!isDeleted ? (\r\n <RedTrashBin config={{ width: 18, height: 18 }} />\r\n ) : (\r\n <Undo config={{ width: 18, height: 18 }} />\r\n )}\r\n </button>\r\n )}\r\n\r\n {meta.enableExpandButton && (\r\n <button\r\n type=\"button\"\r\n onClick={handleExpandRow}\r\n className={`erp-table-index-btn z-20 ${\r\n isDeleted ? \"cursor-not-allowed \" : \"hover:bg-zinc-200\"\r\n } `}\r\n disabled={isDeleted}\r\n >\r\n <Expand config={{ width: 18, height: 18 }} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {meta.enableOptionsButton && !isDeleted && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"flex m-0 p-0 rounded\"\r\n items={items as any}\r\n >\r\n <a className=\"cursor-pointer\" onClick={(e) => e.preventDefault()}>\r\n <Dots config={{ width: 18, height: 18 }} />\r\n </a>\r\n </CustomDropdownButton>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, {\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport { NoData } from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { CellRenderer } from '../cellRenderer';\r\nimport { UIRow } from '../type';\r\nimport { IndexCol } from './indexCol';\r\n\r\ninterface ERPTableRowProps {\r\n row: UIRow;\r\n index: number;\r\n stripeIndex: number;\r\n table: any;\r\n controller: UITableController;\r\n tableKey: string;\r\n draggedRowIdRef: React.MutableRefObject<number | null>;\r\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\r\n isSelected: boolean;\r\n isActive: boolean;\r\n isCut: boolean;\r\n}\r\n\r\nfunction ERPTableRowComponent({\r\n row,\r\n index,\r\n stripeIndex,\r\n table,\r\n controller,\r\n tableKey,\r\n draggedRowIdRef,\r\n moreDetailComponent: MoreDetailComponent,\r\n isSelected: isSelectedRow,\r\n isActive: isActiveRow,\r\n isCut,\r\n}: ERPTableRowProps) {\r\n const t = useTranslations();\r\n const visibleColumns = (table.columns ?? []).filter((c: ColumnSchema) => !c.hidden);\r\n const totalColSpan = visibleColumns.length;\r\n const [dropZone, setDropZone] = useState<\"before\" | \"after\" | null>(null);\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n\r\n const handleRowClick = (e: React.MouseEvent) => {\r\n controller.onRowClick(row.id, {\r\n ctrlKey: e.ctrlKey,\r\n shiftKey: e.shiftKey,\r\n });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLElement>) => {\r\n const el = e.target as HTMLElement;\r\n if (el.tagName !== \"TR\") return;\r\n\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const handleDragStart = (\r\n e: React.DragEvent<HTMLTableRowElement>,\r\n rowId: number,\r\n ) => {\r\n draggedRowIdRef.current = rowId;\r\n e.dataTransfer.setData(\"text/plain\", String(rowId));\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n\r\n const handleDragOverLocal = (e: React.DragEvent<HTMLTableRowElement>) => {\r\n e.preventDefault();\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const mouseY = e.clientY - rect.top;\r\n setDropZone(mouseY < rect.height / 2 ? \"before\" : \"after\");\r\n };\r\n\r\n const handleDropLocal = (e: React.DragEvent<HTMLTableRowElement>) => {\r\n e.preventDefault();\r\n if (!dropZone) return;\r\n\r\n const sourceId = draggedRowIdRef.current;\r\n if (!sourceId || sourceId === row.id) return;\r\n controller.dispatch({\r\n type: \"ROW_REORDERED\",\r\n draggedRowId: sourceId,\r\n droppedRowId: row.id,\r\n position: dropZone,\r\n });\r\n\r\n setDropZone(null);\r\n };\r\n\r\n const rowClass = useMemo(() => {\r\n const zebraClass = stripeIndex % 2 ? \"bg-blue-blue11\" : \"bg-main-white\";\r\n\r\n return `relative w-full border\r\n ${isActiveRow ? \"border-gray-gray8\" : \"border-gray-gray5\"}\r\n ${isSelectedRow && !isDeleted ? \"bg-blue-100\" : \"\"}\r\n ${\r\n isDeleted\r\n ? \"!bg-gray-gray5 absolute inset-0 line-through\"\r\n : isSelectedRow\r\n ? \"\"\r\n : zebraClass\r\n }\r\n ${isCut ? \" border-dashed opacity-30\" : \"\"}\r\n h-9 rounded \r\n `;\r\n }, [isActiveRow, isSelectedRow, isDeleted, stripeIndex, isCut]);\r\n\r\n return (\r\n <>\r\n <tr\r\n className={rowClass}\r\n data-rowid={row.id}\r\n draggable\r\n onDragStart={(e) => handleDragStart(e, row.id)}\r\n onDragOver={handleDragOverLocal}\r\n onDrop={handleDropLocal}\r\n onClick={handleRowClick}\r\n onDoubleClick={handleSelectRow}\r\n >\r\n {visibleColumns.map((c: ColumnSchema, idx: number) => {\r\n const meta: ColumnSchema = {\r\n ...c,\r\n enableDeleteButton: c.enableDeleteButton ?? true,\r\n enableExpandButton: c.enableExpandButton ?? true,\r\n enableMoveButton: c.enableMoveButton ?? true,\r\n enableOptionsButton: c.enableOptionsButton ?? true,\r\n };\r\n\r\n if (c.fieldName === \"index\" || c.fieldType === \"index\") {\r\n return (\r\n <td\r\n className=\"p-0 h-full overflow-hidden border\"\r\n key={c.fieldName}\r\n data-columnid={c.fieldName}\r\n style={{ width: 168, minWidth: 168, maxWidth: 200 }}\r\n >\r\n <IndexCol\r\n idx={index}\r\n tableKey={tableKey}\r\n row={row}\r\n controller={controller}\r\n meta={meta}\r\n />\r\n </td>\r\n );\r\n }\r\n\r\n return (\r\n <td\r\n key={c.fieldName}\r\n className=\"p-0 h-full overflow-hidden border\"\r\n data-columnid={c.fieldName}\r\n style={{ minWidth: c.minWidth }}\r\n >\r\n <CellRenderer\r\n idx={idx}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={c.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={idx}\r\n mode=\"cell\"\r\n />\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n\r\n {row.isExpanded && (\r\n <tr>\r\n <td colSpan={totalColSpan}>\r\n {MoreDetailComponent ? (\r\n <MoreDetailComponent data={row} />\r\n ) : (\r\n <div className=\"flex justify-center items-center bg-gray-100 shadow my-1 rounded transition-all duration-300\">\r\n <div className=\"flex flex-col items-center gap-2 m-12\">\r\n <NoData config={{width: 60, height: 60}} />\r\n <span className=\"text-gray-gray9 text-md\">\r\n {t(\"general.noData\")}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nexport const ERPTableRow = React.memo(ERPTableRowComponent, (prev, next) => {\r\n return (\r\n prev.row === next.row &&\r\n prev.index === next.index &&\r\n prev.stripeIndex === next.stripeIndex &&\r\n prev.table === next.table &&\r\n prev.isSelected === next.isSelected &&\r\n prev.isActive === next.isActive &&\r\n prev.isCut === next.isCut\r\n );\r\n});\r\n","import React, { useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ERPTableRow } from './eRPTableRow';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\r\n}\r\n\r\nexport function ERPTableBody({\r\n controller,\r\n tableKey,\r\n moreDetailComponent: MoreDetailComponent,\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const dragRowId = useRef<number | null>(null);\r\n\r\n if (!table) return null;\r\n\r\n const rows = table.rows;\r\n const sortedRows = [...rows].sort(\r\n (a, b) =>\r\n (a.cells[\"index\"].value as number) - (b.cells[\"index\"].value as number),\r\n );\r\n\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\">\r\n {sortedRows.map((row, index) => (\r\n <ERPTableRow\r\n key={row.id}\r\n row={row}\r\n stripeIndex={index}\r\n index={index + (table.pagination.page - 1) * table.pagination.pageSize}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n draggedRowIdRef={dragRowId}\r\n moreDetailComponent={MoreDetailComponent}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n />\r\n ))}\r\n </tbody>\r\n );\r\n}\r\n","import React, {\r\n ReactNode,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useLocale } from '../host';\r\nimport { valueParser } from '../helper';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n footer?: boolean | ReactNode;\r\n}\r\n\r\nexport function ERPTableFooter({controller, footer}: Props) {\r\n const locale = useLocale();\r\n const [totals, setTotals] = useState<Record<string, number>>({});\r\n const table = controller.getViewState();\r\n const calculateTotals = () => {\r\n const view = controller.getViewState();\r\n if (!view) return;\r\n const data = controller.getSnapShot(\"active\") as {\r\n rows: Array<{ cells: Record<string, { value?: unknown } | unknown> }>;\r\n } | null;\r\n if (!data) return;\r\n const result: Record<string, number> = {};\r\n view.columns.forEach((column) => {\r\n if (column.fieldType === \"price\" || column.fieldType === \"number\") {\r\n result[column.fieldName] = data.rows.reduce((sum: number, row) => {\r\n const cell = row.cells[column.fieldName];\r\n const value = typeof cell === \"object\" && cell !== null && \"value\" in cell\r\n ? (cell as { value?: unknown }).value\r\n : cell;\r\n return sum + (Number(value) || 0);\r\n }, 0);\r\n }\r\n });\r\n setTotals(result);\r\n };\r\n\r\n useEffect(() => {\r\n const view = controller.getViewState();\r\n if (!view) return;\r\n calculateTotals();\r\n const unsubscribes: (() => void)[] = [];\r\n view.columns.forEach((column) => {\r\n if (column.fieldType === \"price\" || column.fieldType === \"number\") {\r\n const unsubscribe = controller.subscribeColumn<{ value?: unknown }>(\r\n column.fieldName,\r\n \"active\",\r\n (values) => {\r\n setTotals((prev) => ({\r\n ...prev,\r\n [column.fieldName]: values.reduce(\r\n (sum, item) => sum + (Number(item.value) || 0),\r\n 0,\r\n ),\r\n }));\r\n },\r\n );\r\n\r\n if (unsubscribe) unsubscribes.push(unsubscribe);\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribes.forEach((u) => u());\r\n };\r\n }, [controller]);\r\n\r\n if (!table || !table.columns) return null;\r\n const cols = table.columns.filter((c) => !c.hidden).length;\r\n if (typeof footer === \"boolean\" && footer === true) {\r\n return (\r\n <tfoot>\r\n <tr\r\n className={`w-full border border-gray-gray5 bg-main-white !h-9 rounded `}\r\n >\r\n {table.columns\r\n .filter((c) => !c.hidden)\r\n .map((c) => (\r\n <td key={c.fieldName}>\r\n {c.fieldType === \"price\" ||\r\n c.fieldType === \"number\" ||\r\n c.fieldType === \"static\"\r\n ? valueParser(totals[c.fieldName], c.fieldType, locale)\r\n : null}\r\n </td>\r\n ))}\r\n </tr>\r\n </tfoot>\r\n );\r\n } else {\r\n return (\r\n <tfoot>\r\n <tr\r\n className={`w-full border border-gray-gray5 bg-main-white h-9 rounded `}\r\n >\r\n <td colSpan={cols}>{footer}</td>\r\n </tr>\r\n </tfoot>\r\n );\r\n }\r\n}","import { Row } from '../../domain/entities/Row';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { GridSearchMatch } from './types';\r\n\r\nexport function getCellSearchText(\r\n controller: UITableController,\r\n rowId: number,\r\n columnId: string,\r\n): string {\r\n const cell = controller.getCell(rowId, columnId);\r\n const display = cell?.getDisplay();\r\n const value = cell?.getValue();\r\n if (display != null && display !== '') return String(display);\r\n return String(value ?? '');\r\n}\r\n\r\nexport function findColumnMatches(\r\n controller: UITableController,\r\n columnId: string,\r\n query: string,\r\n): GridSearchMatch[] {\r\n const q = query.trim().toLowerCase();\r\n if (!q) return [];\r\n\r\n const rows = controller.getAllRows() ?? [];\r\n const matches: GridSearchMatch[] = [];\r\n\r\n for (const row of rows) {\r\n if (row.rowState.value === RowStateEnum.Deleted) continue;\r\n const text = getCellSearchText(controller, row.id.value, columnId).toLowerCase();\r\n if (text.includes(q)) {\r\n matches.push({ rowId: row.id.value, columnId });\r\n }\r\n }\r\n\r\n return matches;\r\n}\r\n\r\nfunction sortRowsByIndex(rows: readonly Row[]): Row[] {\r\n return [...rows].sort(\r\n (a, b) =>\r\n (Number(a.getCell('index')?.getValue()) || 0) -\r\n (Number(b.getCell('index')?.getValue()) || 0),\r\n );\r\n}\r\n\r\n/** 0-based index in the same order as Desktop virtual body. */\r\nexport function getSortedRowAbsoluteIndex(\r\n controller: UITableController,\r\n rowId: number,\r\n): number {\r\n const sorted = sortRowsByIndex(controller.getAllRows() ?? []);\r\n return sorted.findIndex((row) => row.id.value === rowId);\r\n}\r\n\r\nexport function computeVirtualScrollOffset(\r\n absoluteIndex: number,\r\n rowHeight: number,\r\n viewportSize: number,\r\n): number {\r\n if (absoluteIndex < 0) return 0;\r\n const lead = Math.min(Math.floor(viewportSize / 3), rowHeight * 2);\r\n return Math.max(0, absoluteIndex * rowHeight - lead);\r\n}\r\n\r\nexport function findTableScrollRoot(\r\n tableKey: string,\r\n): HTMLElement | null {\r\n if (typeof document === 'undefined') return null;\r\n const safeKey = tableKey.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\r\n return document.querySelector(\r\n `[data-erp-table-scroll][data-erp-table-key=\"${safeKey}\"]`,\r\n );\r\n}\r\n\r\nexport function isVirtualScrollRoot(el: HTMLElement | null): boolean {\r\n return el?.dataset.erpVirtualization === 'on';\r\n}\r\n\r\nfunction getTargetPage(\r\n controller: UITableController,\r\n rowId: number,\r\n): number | null {\r\n const absoluteIndex = getSortedRowAbsoluteIndex(controller, rowId);\r\n const table = controller.getViewState();\r\n if (!table || absoluteIndex < 0) return null;\r\n\r\n return Math.ceil((absoluteIndex + 1) / table.pagination.pageSize);\r\n}\r\n\r\n/**\r\n * Brings a row into view (pagination page change OR virtual viewport scroll).\r\n */\r\nexport async function revealRow(\r\n controller: UITableController,\r\n rowId: number,\r\n): Promise<void> {\r\n const table = controller.getViewState();\r\n if (!table) return;\r\n\r\n const tableKey = controller.getTableKey();\r\n const scrollRoot = findTableScrollRoot(tableKey);\r\n const session = controller.getSession();\r\n\r\n if (isVirtualScrollRoot(scrollRoot) && session) {\r\n const absoluteIndex = getSortedRowAbsoluteIndex(controller, rowId);\r\n if (absoluteIndex < 0) return;\r\n\r\n const viewport = session.getViewport();\r\n const scrollOffset = computeVirtualScrollOffset(\r\n absoluteIndex,\r\n viewport.rowHeight,\r\n viewport.viewportSize,\r\n );\r\n\r\n await session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset,\r\n viewportSize: viewport.viewportSize,\r\n rowHeight: viewport.rowHeight,\r\n overscan: viewport.overscan,\r\n });\r\n\r\n if (scrollRoot) {\r\n scrollRoot.scrollTop = scrollOffset;\r\n }\r\n return;\r\n }\r\n\r\n const targetPage = getTargetPage(controller, rowId);\r\n if (!targetPage) return;\r\n\r\n if (table.pagination.page !== targetPage) {\r\n await controller.dispatch({ type: 'CHANGE_PAGE', page: targetPage });\r\n }\r\n}\r\n\r\nexport async function navigateToMatch(\r\n controller: UITableController,\r\n match: GridSearchMatch,\r\n): Promise<void> {\r\n const table = controller.getViewState();\r\n if (!table) return;\r\n\r\n await revealRow(controller, match.rowId);\r\n await controller.dispatch({ type: 'UI_ACTIVE_ROW', rowId: match.rowId });\r\n}\r\n","import React, {\r\n ReactNode,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { CustomDropdownButton, CustomCheckbox } from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { ValidationCallbackResult } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { revealRow } from '../gridSearch/utils';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n header?: ReactNode;\r\n}\r\n\r\nexport function ERPTableHeader({controller, tableKey, header}: Props) {\r\n const table = controller.getViewState();\r\n const [validationResult, setValidationResult] =\r\n useState<ValidationCallbackResult>({\r\n valid: true,\r\n data: null,\r\n errors: new Map(),\r\n });\r\n\r\n useEffect(() => {\r\n const validation = controller.validation();\r\n validation((res) => {\r\n setValidationResult(res);\r\n });\r\n }, [controller, table?.activeCell?.columnId, table?.activeCell?.rowId]);\r\n\r\n if (!table || !table.columns) return null;\r\n\r\n const visibleColumns = (table.columns ?? []).filter((c: ColumnSchema) => !c.hidden);\r\n const isSelectedActivePageRows = table.rows.every(\r\n (row) => !!table.selectedRows[row.id],\r\n );\r\n const handleSelectActivePageRows = () => {\r\n controller.dispatch({type: \"TOGGLE_PAGE_ROW_SELECTED\"});\r\n };\r\n const allRows = controller.getAllRows() ?? [];\r\n const handleNavigateToError = (rowId: number) => {\r\n void revealRow(controller, rowId);\r\n };\r\n const items = Array.from((validationResult.errors ?? new Map()).entries()).map(\r\n ([key, value], errorIndex) => {\r\n const Index = allRows.findIndex((r) => r.id.value == value.rowId) + 1;\r\n\r\n return {\r\n key: errorIndex.toString(),\r\n\r\n label: (\r\n <button\r\n className=\"flex bg-red-300 text-red-600 text-xs\"\r\n onClick={() => {\r\n handleNavigateToError(value.rowId);\r\n }}\r\n >\r\n {`\r\n در سطر\r\n ${Index}\r\n در ستون\r\n ${value.caption} :\r\n ${value.message}`}\r\n </button>\r\n ),\r\n };\r\n },\r\n );\r\n const cols = visibleColumns.length;\r\n\r\n return (\r\n <thead className=\"top-0 right-0 left-0 z-20 sticky inset-0\">\r\n {header}\r\n {!validationResult.valid && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"top-1 z-10 absolute flex m-0 p-0 rounded start-1\"\r\n items={items as any}\r\n >\r\n <span className=\"bg-red-600 border rounded-full w-2 h-2\"></span>\r\n </CustomDropdownButton>\r\n )}\r\n <tr\r\n style={{gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`}}\r\n className={`relative h-10 bg-gray-gray3 rounded-t-lg w-full `}\r\n >\r\n {visibleColumns.map((col, index) => {\r\n if (col.fieldType === \"index\") {\r\n return (\r\n <th\r\n key={col.fieldName}\r\n style={{...col.style, width: 168, minWidth: 168}}\r\n className={` px-2 text-xs border text-start whitespace-nowrap ${col.className || \"\"}`}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <CustomCheckbox\r\n checked={isSelectedActivePageRows}\r\n onClick={handleSelectActivePageRows}\r\n />\r\n\r\n {col.fieldCaption}\r\n </div>\r\n </th>\r\n );\r\n }\r\n\r\n return (\r\n <th\r\n key={col.fieldName}\r\n style={{...col.style, minWidth: col.minWidth}}\r\n className={`px-2 text-xs border text-start min-w-36 ${col.className || \"\"}`}\r\n >\r\n {index === 0 && (\r\n <CustomCheckbox\r\n checked={isSelectedActivePageRows}\r\n onClick={handleSelectActivePageRows}\r\n />\r\n )}\r\n {col.fieldCaption}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n );\r\n}\r\n","// engine/equality.ts — shared equality helpers for selector subscriptions\r\n\r\nexport function shallowEqualArray(\r\n a: unknown[] | null | undefined,\r\n b: unknown[] | null | undefined,\r\n): boolean {\r\n if (a === b) return true;\r\n if (!a || !b || a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i += 1) {\r\n if (!Object.is(a[i], b[i])) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Structural compare for plain JSON-like snapshots (rows / view slices). */\r\nexport function structuralEqual(a: unknown, b: unknown): boolean {\r\n if (Object.is(a, b)) return true;\r\n if (a == null || b == null) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n try {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { Viewport, type VisibleRange } from '../domain/value-objects/Viewport';\r\n\r\n/**\r\n * Pure virtual-window calculator — no DOM / window / document.\r\n * Input: totalRows + Viewport → VisibleRange for Adapter rendering.\r\n */\r\nexport class ViewportCalculator {\r\n static calculate(totalRows: number, viewport: Viewport): VisibleRange {\r\n const safeTotal = Math.max(0, Math.floor(totalRows));\r\n const { scrollOffset, viewportSize, rowHeight, overscan } = viewport;\r\n const totalHeight = safeTotal * rowHeight;\r\n\r\n if (safeTotal === 0) {\r\n return {\r\n startIndex: 0,\r\n endIndex: 0,\r\n startOffset: 0,\r\n endOffset: 0,\r\n totalHeight: 0,\r\n visibleCount: 0,\r\n };\r\n }\r\n\r\n const maxOffset = Math.max(0, totalHeight - viewportSize);\r\n const clampedScroll = Math.min(scrollOffset, maxOffset);\r\n\r\n const rawStart = Math.floor(clampedScroll / rowHeight);\r\n const rawEnd = Math.ceil((clampedScroll + viewportSize) / rowHeight);\r\n\r\n const startIndex = Math.max(0, rawStart - overscan);\r\n const endIndex = Math.min(safeTotal, rawEnd + overscan);\r\n\r\n return {\r\n startIndex,\r\n endIndex,\r\n startOffset: startIndex * rowHeight,\r\n endOffset: Math.max(0, totalHeight - endIndex * rowHeight),\r\n totalHeight,\r\n visibleCount: Math.max(0, endIndex - startIndex),\r\n };\r\n }\r\n\r\n /** Contiguous index list for the visible window. */\r\n static indices(range: VisibleRange): number[] {\r\n const out: number[] = [];\r\n for (let i = range.startIndex; i < range.endIndex; i += 1) {\r\n out.push(i);\r\n }\r\n return out;\r\n }\r\n\r\n /** Slice a dense array by VisibleRange (O(window), not O(n)). */\r\n static projectRows<T>(rows: readonly T[], range: VisibleRange): T[] {\r\n return rows.slice(range.startIndex, range.endIndex);\r\n }\r\n\r\n /**\r\n * Project from sparse structure: ordered id list + Map by id.\r\n * Suitable for 100k+ tables without materializing full UI rows.\r\n */\r\n static projectByIndex<T>(\r\n orderedIds: readonly number[],\r\n byId: ReadonlyMap<number, T>,\r\n range: VisibleRange,\r\n ): T[] {\r\n const out: T[] = [];\r\n const end = Math.min(range.endIndex, orderedIds.length);\r\n for (let i = range.startIndex; i < end; i += 1) {\r\n const id = orderedIds[i];\r\n const row = byId.get(id);\r\n if (row !== undefined) out.push(row);\r\n }\r\n return out;\r\n }\r\n}\r\n","import type { VisibleRange } from '../../domain/value-objects/Viewport';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\n\r\nexport type VirtualWindowModel<T> = {\r\n readonly range: VisibleRange;\r\n readonly visibleItems: readonly T[];\r\n /** Absolute row indices matching visibleItems. */\r\n readonly absoluteIndices: readonly number[];\r\n readonly spacerTop: number;\r\n readonly spacerBottom: number;\r\n readonly totalHeight: number;\r\n};\r\n\r\n/**\r\n * Pure adapter helper: map items + viewport → render window.\r\n * No React / DOM — unit-testable in Node.\r\n */\r\nexport function buildVirtualWindow<T>(\r\n items: readonly T[],\r\n viewport: Viewport,\r\n): VirtualWindowModel<T> {\r\n const range = ViewportCalculator.calculate(items.length, viewport);\r\n const visibleItems = ViewportCalculator.projectRows(items, range);\r\n const absoluteIndices = ViewportCalculator.indices(range);\r\n return {\r\n range,\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop: range.startOffset,\r\n spacerBottom: range.endOffset,\r\n totalHeight: range.totalHeight,\r\n };\r\n}\r\n\r\nexport function viewportFromScroll(params: {\r\n scrollOffset: number;\r\n viewportSize: number;\r\n rowHeight: number;\r\n overscan?: number;\r\n}): Viewport {\r\n return new Viewport(\r\n Math.max(0, params.scrollOffset),\r\n params.viewportSize,\r\n params.rowHeight,\r\n params.overscan ?? 2,\r\n );\r\n}\r\n\r\n/** Debounce-friendly equality for visible window identity. */\r\nexport function virtualWindowKey(range: VisibleRange): string {\r\n return `${range.startIndex}:${range.endIndex}:${range.totalHeight}`;\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport { structuralEqual } from '../../engine/equality';\r\nimport {\r\n buildVirtualWindow,\r\n type VirtualWindowModel,\r\n virtualWindowKey,\r\n} from './virtualWindow';\r\n\r\nexport type UseVirtualWindowResult<T> = VirtualWindowModel<T> & {\r\n readonly onScroll: (scrollTop: number, clientHeight?: number) => void;\r\n};\r\n\r\n/**\r\n * Syncs GridSession viewport with a scrollable container and returns\r\n * only the visible item window for rendering.\r\n */\r\nexport function useVirtualWindow<T>(\r\n session: GridSession | null | undefined,\r\n items: readonly T[],\r\n options?: {\r\n rowHeight?: number;\r\n overscan?: number;\r\n initialViewportSize?: number;\r\n },\r\n): UseVirtualWindowResult<T> {\r\n const rowHeight = options?.rowHeight ?? 40;\r\n const overscan = options?.overscan ?? 2;\r\n const initialViewportSize = options?.initialViewportSize ?? 400;\r\n\r\n const [windowModel, setWindowModel] = useState<VirtualWindowModel<T>>(() =>\r\n buildVirtualWindow(\r\n items,\r\n session?.getViewport() ??\r\n new Viewport(0, initialViewportSize, rowHeight, overscan),\r\n ),\r\n );\r\n\r\n useEffect(() => {\r\n if (!session) {\r\n setWindowModel(\r\n buildVirtualWindow(\r\n items,\r\n new Viewport(0, initialViewportSize, rowHeight, overscan),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const sync = () => {\r\n const next = buildVirtualWindow(items, session.getViewport());\r\n setWindowModel((prev) =>\r\n virtualWindowKey(prev.range) === virtualWindowKey(next.range) &&\r\n prev.visibleItems.length === next.visibleItems.length &&\r\n prev.visibleItems.every((item, i) => Object.is(item, next.visibleItems[i]))\r\n ? prev\r\n : next,\r\n );\r\n };\r\n\r\n sync();\r\n\r\n return session.subscribeSelected(\r\n () => {\r\n const vp = session.getViewport();\r\n return {\r\n scrollOffset: vp.scrollOffset,\r\n viewportSize: vp.viewportSize,\r\n rowHeight: vp.rowHeight,\r\n overscan: vp.overscan,\r\n itemCount: items.length,\r\n };\r\n },\r\n sync,\r\n structuralEqual,\r\n );\r\n }, [session, items, rowHeight, overscan, initialViewportSize]);\r\n\r\n const onScroll = (scrollTop: number, clientHeight?: number) => {\r\n if (!session) return;\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: Math.max(0, scrollTop),\r\n viewportSize: clientHeight,\r\n rowHeight,\r\n overscan,\r\n });\r\n };\r\n\r\n return {\r\n ...windowModel,\r\n onScroll,\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n type RefObject,\r\n useEffect,\r\n useRef,\r\n} from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { UIRow } from '../type';\r\nimport { useVirtualWindow } from '../virtual/useVirtualWindow';\r\nimport { ERPTableRow } from './eRPTableRow';\r\n\r\nconst DEFAULT_ROW_HEIGHT = 40;\r\n\r\ntype Props = {\r\n controller: UITableController;\r\n session: GridSession;\r\n tableKey: string;\r\n scrollParentRef: RefObject<HTMLDivElement | null>;\r\n viewportHeight: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n moreDetailComponent?: React.ComponentType<{ data: unknown }>;\r\n};\r\n\r\n/**\r\n * Table-native virtual body: same ERPTableRow as pagination path,\r\n * but only the visible window (via GridSession viewport) is mounted.\r\n */\r\nexport function ERPTableVirtualBody({\r\n controller,\r\n session,\r\n tableKey,\r\n scrollParentRef,\r\n viewportHeight,\r\n rowHeight = DEFAULT_ROW_HEIGHT,\r\n overscan = 2,\r\n moreDetailComponent: MoreDetailComponent,\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const dragRowId = useRef<number | null>(null);\r\n const allRows = (controller.getAllUIRows() ?? []) as UIRow[];\r\n\r\n const sortedRows = [...allRows].sort(\r\n (a, b) =>\r\n (Number(a.cells['index']?.value) || 0) -\r\n (Number(b.cells['index']?.value) || 0),\r\n );\r\n\r\n const {\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop,\r\n spacerBottom,\r\n onScroll,\r\n } = useVirtualWindow(session, sortedRows, {\r\n rowHeight,\r\n overscan,\r\n initialViewportSize: viewportHeight,\r\n });\r\n\r\n useEffect(() => {\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: session.getViewport().scrollOffset,\r\n viewportSize: viewportHeight,\r\n rowHeight,\r\n overscan,\r\n });\r\n }, [session, viewportHeight, rowHeight, overscan]);\r\n\r\n useEffect(() => {\r\n const el = scrollParentRef.current;\r\n if (!el) return;\r\n\r\n const handleScroll = () => {\r\n onScroll(el.scrollTop, el.clientHeight);\r\n };\r\n\r\n el.addEventListener('scroll', handleScroll, { passive: true });\r\n return () => el.removeEventListener('scroll', handleScroll);\r\n }, [scrollParentRef, onScroll]);\r\n\r\n if (!table) return null;\r\n\r\n const colSpan = Math.max(\r\n 1,\r\n (table.columns ?? []).filter((c) => !c.hidden).length,\r\n );\r\n\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\" data-erp-virtual-body>\r\n {spacerTop > 0 ? (\r\n <tr aria-hidden data-erp-virtual-spacer=\"top\">\r\n <td\r\n colSpan={colSpan}\r\n style={{\r\n height: spacerTop,\r\n padding: 0,\r\n border: 'none',\r\n lineHeight: 0,\r\n }}\r\n />\r\n </tr>\r\n ) : null}\r\n\r\n {visibleItems.map((row, i) => {\r\n const absoluteIndex = absoluteIndices[i] ?? i;\r\n return (\r\n <ERPTableRow\r\n key={row.id}\r\n row={row}\r\n stripeIndex={absoluteIndex}\r\n index={absoluteIndex}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n draggedRowIdRef={dragRowId}\r\n moreDetailComponent={MoreDetailComponent}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n />\r\n );\r\n })}\r\n\r\n {spacerBottom > 0 ? (\r\n <tr aria-hidden data-erp-virtual-spacer=\"bottom\">\r\n <td\r\n colSpan={colSpan}\r\n style={{\r\n height: spacerBottom,\r\n padding: 0,\r\n border: 'none',\r\n lineHeight: 0,\r\n }}\r\n />\r\n </tr>\r\n ) : null}\r\n </tbody>\r\n );\r\n}\r\n","/**\r\n * Pure string formatter for Excel/PDF export (no React).\r\n * Mirrors ui/helper valueParser for common field types.\r\n */\r\nexport function formatExportValue(\r\n val: unknown,\r\n fieldType?: string,\r\n): string {\r\n if (val == null || val === '') {\r\n return fieldType === 'selectOption' ? '' : '';\r\n }\r\n\r\n switch (fieldType) {\r\n case 'checkbox':\r\n return val ? '✔' : '✘';\r\n case 'price':\r\n return `${val}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n case 'date':\r\n if (typeof val === 'string' && val.length > 0) {\r\n try {\r\n return new Intl.DateTimeFormat('fa-IR-u-ca-persian', {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n }).format(new Date(val));\r\n } catch {\r\n return String(val);\r\n }\r\n }\r\n return '';\r\n default:\r\n return String(val);\r\n }\r\n}\r\n","import type {\r\n ExportColumnDef,\r\n ExportSource,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nexport type ExportTable = {\r\n columns: Array<{ fieldName: string; caption: string }>;\r\n /** Parallel to columns; already stringified cell text */\r\n rows: string[][];\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellText(\r\n source: ExportSource['rows'][number],\r\n column: ExportColumnDef,\r\n): string {\r\n const cell = source.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = hasMeaningfulValue(cell.display) ? cell.display : cell.value;\r\n if (!hasMeaningfulValue(raw)) return '';\r\n\r\n const text = formatExportValue(raw, column.fieldType).trim();\r\n if (!text || EMPTY_PLACEHOLDERS.has(text)) return '';\r\n return text;\r\n}\r\n\r\n/**\r\n * Builds a dense string matrix from ExportSource (plugin query port).\r\n */\r\nexport function buildExportTable(source: ExportSource): ExportTable {\r\n const columnsWithData = source.columns.filter((column) =>\r\n source.rows.some((row) => cellText(row, column) !== ''),\r\n );\r\n\r\n return {\r\n columns: columnsWithData.map((c) => ({\r\n fieldName: c.fieldName,\r\n caption: c.fieldCaption ?? c.fieldName,\r\n })),\r\n rows: source.rows.map((row) =>\r\n columnsWithData.map((col) => cellText(row, col)),\r\n ),\r\n };\r\n}\r\n","import type { ExportTable } from './buildExportTable';\r\n\r\nconst escapeXml = (value: string) =>\r\n value\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n\r\n/** 0-based column index → A, B, … Z, AA, … */\r\nconst toColumnLetter = (index: number): string => {\r\n let n = index + 1;\r\n let result = '';\r\n while (n > 0) {\r\n const rem = (n - 1) % 26;\r\n result = String.fromCharCode(65 + rem) + result;\r\n n = Math.floor((n - 1) / 26);\r\n }\r\n return result;\r\n};\r\n\r\nconst crcTable = (() => {\r\n const table = new Uint32Array(256);\r\n for (let i = 0; i < 256; i += 1) {\r\n let c = i;\r\n for (let k = 0; k < 8; k += 1) {\r\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n }\r\n table[i] = c >>> 0;\r\n }\r\n return table;\r\n})();\r\n\r\nconst crc32 = (data: Uint8Array): number => {\r\n let crc = 0xffffffff;\r\n for (let i = 0; i < data.length; i += 1) {\r\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\r\n }\r\n return (crc ^ 0xffffffff) >>> 0;\r\n};\r\n\r\nconst textEncoder = new TextEncoder();\r\n\r\ntype ZipEntry = { name: string; data: Uint8Array };\r\n\r\n/** Minimal ZIP (store / no compression) for OOXML .xlsx */\r\nconst buildZip = (entries: ZipEntry[]): Blob => {\r\n const parts: Uint8Array[] = [];\r\n const centralParts: Uint8Array[] = [];\r\n let offset = 0;\r\n\r\n for (const entry of entries) {\r\n const nameBytes = textEncoder.encode(entry.name);\r\n const data = entry.data;\r\n const crc = crc32(data);\r\n const size = data.length;\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true);\r\n lv.setUint16(4, 20, true);\r\n lv.setUint16(6, 0, true);\r\n lv.setUint16(8, 0, true);\r\n lv.setUint16(10, 0, true);\r\n lv.setUint16(12, 0, true);\r\n lv.setUint32(14, crc, true);\r\n lv.setUint32(18, size, true);\r\n lv.setUint32(22, size, true);\r\n lv.setUint16(26, nameBytes.length, true);\r\n lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n parts.push(local, data);\r\n\r\n const central = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(central.buffer);\r\n cv.setUint32(0, 0x02014b50, true);\r\n cv.setUint16(4, 20, true);\r\n cv.setUint16(6, 20, true);\r\n cv.setUint16(8, 0, true);\r\n cv.setUint16(10, 0, true);\r\n cv.setUint16(12, 0, true);\r\n cv.setUint16(14, 0, true);\r\n cv.setUint32(16, crc, true);\r\n cv.setUint32(20, size, true);\r\n cv.setUint32(24, size, true);\r\n cv.setUint16(28, nameBytes.length, true);\r\n cv.setUint16(30, 0, true);\r\n cv.setUint16(32, 0, true);\r\n cv.setUint16(34, 0, true);\r\n cv.setUint16(36, 0, true);\r\n cv.setUint32(38, 0, true);\r\n cv.setUint32(42, offset, true);\r\n central.set(nameBytes, 46);\r\n centralParts.push(central);\r\n\r\n offset += local.length + data.length;\r\n }\r\n\r\n const centralSize = centralParts.reduce((sum, p) => sum + p.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true);\r\n ev.setUint16(4, 0, true);\r\n ev.setUint16(6, 0, true);\r\n ev.setUint16(8, entries.length, true);\r\n ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, centralSize, true);\r\n ev.setUint32(16, offset, true);\r\n ev.setUint16(20, 0, true);\r\n\r\n return new Blob([...parts, ...centralParts, end] as BlobPart[], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n });\r\n};\r\n\r\nconst buildStylesXml = (direction: 'rtl' | 'ltr') => {\r\n const readingOrder = direction === 'rtl' ? 2 : 1;\r\n const horizontal = direction === 'rtl' ? 'right' : 'left';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"3\">\r\n <font><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"11\"/><color rgb=\"FFFFFFFF\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n </fonts>\r\n <fills count=\"4\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF2F5496\"/></patternFill></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FFD6EAF8\"/></patternFill></fill>\r\n </fills>\r\n <borders count=\"2\">\r\n <border><left/><right/><top/><bottom/><diagonal/></border>\r\n <border>\r\n <left style=\"thin\"><color rgb=\"FFBDD7EE\"/></left>\r\n <right style=\"thin\"><color rgb=\"FFBDD7EE\"/></right>\r\n <top style=\"thin\"><color rgb=\"FFBDD7EE\"/></top>\r\n <bottom style=\"thin\"><color rgb=\"FFBDD7EE\"/></bottom>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"6\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n <xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" wrapText=\"1\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n </cellXfs>\r\n</styleSheet>`;\r\n};\r\n\r\nconst inlineStrCell = (ref: string, text: string, styleId: number) =>\r\n `<c r=\"${ref}\" t=\"inlineStr\" s=\"${styleId}\"><is><t>${escapeXml(text)}</t></is></c>`;\r\n\r\nconst numberCell = (ref: string, value: number, styleId: number) =>\r\n `<c r=\"${ref}\" s=\"${styleId}\"><v>${value}</v></c>`;\r\n\r\nconst buildSheetXml = (\r\n table: ExportTable,\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): string => {\r\n const { direction, rowHeaderLabel } = options;\r\n const rightToLeft = direction === 'rtl' ? '1' : '0';\r\n const totalCols = table.columns.length + 1;\r\n\r\n const colsXml = Array.from({ length: totalCols }, (_, i) => {\r\n const width = i === 0 ? 6 : 18;\r\n return `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" customWidth=\"1\"/>`;\r\n }).join('');\r\n\r\n const headerCells = [\r\n inlineStrCell('A1', rowHeaderLabel, 1),\r\n ...table.columns.map((col, i) =>\r\n inlineStrCell(`${toColumnLetter(i + 1)}1`, col.caption, 1),\r\n ),\r\n ].join('');\r\n\r\n const bodyRows = table.rows\r\n .map((row, rowIndex) => {\r\n const excelRow = rowIndex + 2;\r\n const isOdd = rowIndex % 2 === 0;\r\n const dataStyle = isOdd ? 2 : 3;\r\n const rowNumStyle = isOdd ? 4 : 5;\r\n\r\n const cells = [\r\n numberCell(`A${excelRow}`, rowIndex + 1, rowNumStyle),\r\n ...row.map((text, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}${excelRow}`,\r\n text,\r\n dataStyle,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<row r=\"${excelRow}\" ht=\"18\" customHeight=\"1\">${cells}</row>`;\r\n })\r\n .join('');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>\r\n <sheetView workbookViewId=\"0\" rightToLeft=\"${rightToLeft}\"/>\r\n </sheetViews>\r\n <cols>${colsXml}</cols>\r\n <sheetData>\r\n <row r=\"1\" ht=\"22\" customHeight=\"1\">${headerCells}</row>\r\n ${bodyRows}\r\n </sheetData>\r\n</worksheet>`;\r\n};\r\n\r\nexport type BuildXlsxOptions = {\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n};\r\n\r\nexport function buildXlsxBlob(\r\n table: ExportTable,\r\n options: BuildXlsxOptions = {},\r\n): Blob {\r\n const direction = options.direction ?? 'rtl';\r\n const rowHeaderLabel = options.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options.sheetName ?? 'Sheet1';\r\n\r\n const safeSheetName = (sheetName.slice(0, 31) || 'Sheet1').replace(\r\n /[\\\\/*?:\\[\\]]/g,\r\n '',\r\n );\r\n\r\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\r\n <Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\r\n</Types>`;\r\n\r\n const rootRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n const workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheets>\r\n <sheet name=\"${escapeXml(safeSheetName)}\" sheetId=\"1\" r:id=\"rId1\"/>\r\n </sheets>\r\n</workbook>`;\r\n\r\n const workbookRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\r\n</Relationships>`;\r\n\r\n const styles = buildStylesXml(direction);\r\n const sheet = buildSheetXml(table, { direction, rowHeaderLabel });\r\n\r\n return buildZip([\r\n { name: '[Content_Types].xml', data: textEncoder.encode(contentTypes) },\r\n { name: '_rels/.rels', data: textEncoder.encode(rootRels) },\r\n { name: 'xl/workbook.xml', data: textEncoder.encode(workbook) },\r\n {\r\n name: 'xl/_rels/workbook.xml.rels',\r\n data: textEncoder.encode(workbookRels),\r\n },\r\n { name: 'xl/styles.xml', data: textEncoder.encode(styles) },\r\n { name: 'xl/worksheets/sheet1.xml', data: textEncoder.encode(sheet) },\r\n ]);\r\n}\r\n\r\nexport function downloadBlob(blob: Blob, fileName: string): void {\r\n if (typeof document === 'undefined') return;\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n document.body.appendChild(anchor);\r\n anchor.click();\r\n document.body.removeChild(anchor);\r\n URL.revokeObjectURL(url);\r\n}\r\n","import type { UITableController } from '../../../../infrastructure/ui/UITableController';\r\nimport { RowStateEnum } from '../../../../domain/value-objects';\r\nimport type { ExportSource } from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\n\r\nexport type ExportActiveCollectionResult = {\r\n rowCount: number;\r\n columnCount: number;\r\n};\r\n\r\nexport type ExportActiveCollectionOptions = {\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n /** When false, skip browser download (tests). */\r\n download?: boolean;\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/**\r\n * Imperative facade used by ERP toolbar buttons.\r\n * Prefer PluginHost.requestExport + ExcelExportPlugin for event-driven hosts.\r\n */\r\nexport async function exportActiveCollectionToExcel(\r\n controller: UITableController,\r\n options?: ExportActiveCollectionOptions,\r\n): Promise<ExportActiveCollectionResult> {\r\n const view = controller.getViewState();\r\n const columns = (\r\n view?.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view?.columns ?? [])\r\n )\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n const rows = (controller.getAllRows() ?? []).filter((row) => {\r\n if (row.rowState.value === RowStateEnum.Deleted) return false;\r\n return Array.from(row.getCells().entries()).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n );\r\n });\r\n\r\n const source: ExportSource = {\r\n columns: columns.map((col) => ({\r\n fieldName: col.fieldName,\r\n fieldCaption: col.fieldCaption,\r\n fieldType: col.fieldType,\r\n order: col.order,\r\n })),\r\n rows: rows.map((row) => ({\r\n id: row.id.value,\r\n rowState: String(row.rowState.value),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([key, cell]) => [\r\n key,\r\n { value: cell.getValue(), display: cell.getDisplay() },\r\n ]),\r\n ),\r\n })),\r\n };\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const direction = options?.direction ?? 'rtl';\r\n const rowHeaderLabel = options?.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options?.sheetName ?? 'Sheet1';\r\n const fileName =\r\n options?.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n await new Promise<void>((resolve) => {\r\n if (typeof setTimeout === 'function') setTimeout(resolve, 0);\r\n else resolve();\r\n });\r\n\r\n const blob = buildXlsxBlob(table, {\r\n direction,\r\n rowHeaderLabel,\r\n sheetName,\r\n });\r\n\r\n if (options?.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n\r\n return { rowCount: table.rows.length, columnCount: table.columns.length + 1 };\r\n}\r\n","import { strFromU8, unzipSync } from 'fflate';\r\n\r\nexport type ParsedXlsxSheet = {\r\n /** First row cells (header captions / field names). */\r\n headers: string[];\r\n /** Body rows; each row length matches headers (padded with ''). */\r\n rows: string[][];\r\n};\r\n\r\nconst textDecoder = new TextDecoder('utf-8');\r\n\r\nfunction toUint8Array(data: Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\r\n if (data instanceof Uint8Array) return Promise.resolve(data);\r\n if (data instanceof ArrayBuffer) return Promise.resolve(new Uint8Array(data));\r\n return data.arrayBuffer().then((buf) => new Uint8Array(buf));\r\n}\r\n\r\nfunction decodeXml(bytes: Uint8Array): string {\r\n return strFromU8(bytes) || textDecoder.decode(bytes);\r\n}\r\n\r\n/** A1 / AA12 → 0-based column index */\r\nfunction colIndexFromRef(ref: string): number {\r\n const letters = ref.match(/^([A-Za-z]+)/)?.[1];\r\n if (!letters) return 0;\r\n let n = 0;\r\n for (const ch of letters.toUpperCase()) {\r\n n = n * 26 + (ch.charCodeAt(0) - 64);\r\n }\r\n return n - 1;\r\n}\r\n\r\nfunction parseSharedStrings(xml: string): string[] {\r\n const out: string[] = [];\r\n // <si>…<t>…</t>…</si> (may include rich text runs)\r\n const siRe = /<si\\b[^>]*>([\\s\\S]*?)<\\/si>/gi;\r\n let m: RegExpExecArray | null;\r\n while ((m = siRe.exec(xml))) {\r\n const inner = m[1];\r\n const parts: string[] = [];\r\n const tRe = /<t\\b[^>]*>([\\s\\S]*?)<\\/t>/gi;\r\n let tm: RegExpExecArray | null;\r\n while ((tm = tRe.exec(inner))) {\r\n parts.push(decodeXmlEntities(tm[1]));\r\n }\r\n out.push(parts.join(''));\r\n }\r\n return out;\r\n}\r\n\r\nfunction decodeXmlEntities(s: string): string {\r\n return s\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, \"'\")\r\n .replace(/&/g, '&');\r\n}\r\n\r\nfunction findSheetPath(\r\n files: Record<string, Uint8Array>,\r\n sheetName?: string,\r\n): string {\r\n const preferred = 'xl/worksheets/sheet1.xml';\r\n if (!sheetName) {\r\n if (files[preferred]) return preferred;\r\n const first = Object.keys(files).find((k) =>\r\n /^xl\\/worksheets\\/sheet\\d+\\.xml$/i.test(k),\r\n );\r\n if (!first) throw new Error('NO_SHEET');\r\n return first;\r\n }\r\n\r\n const workbook = files['xl/workbook.xml'];\r\n if (!workbook) throw new Error('NO_WORKBOOK');\r\n const wbXml = decodeXml(workbook);\r\n const sheetRe =\r\n /<sheet\\b[^>]*name=\"([^\"]+)\"[^>]*r:id=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n const nameToRid = new Map<string, string>();\r\n let sm: RegExpExecArray | null;\r\n while ((sm = sheetRe.exec(wbXml))) {\r\n nameToRid.set(sm[1], sm[2]);\r\n }\r\n const rid = nameToRid.get(sheetName);\r\n if (!rid) throw new Error('SHEET_NOT_FOUND');\r\n\r\n const rels = files['xl/_rels/workbook.xml.rels'];\r\n if (!rels) throw new Error('NO_RELS');\r\n const relsXml = decodeXml(rels);\r\n const relRe =\r\n /<Relationship\\b[^>]*Id=\"([^\"]+)\"[^>]*Target=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n let rm: RegExpExecArray | null;\r\n while ((rm = relRe.exec(relsXml))) {\r\n if (rm[1] === rid) {\r\n const target = rm[2].replace(/^\\//, '');\r\n const path = target.startsWith('xl/') ? target : `xl/${target}`;\r\n if (!files[path]) throw new Error('NO_SHEET');\r\n return path;\r\n }\r\n }\r\n throw new Error('SHEET_NOT_FOUND');\r\n}\r\n\r\ntype CellVal = { col: number; text: string };\r\n\r\nfunction parseSheetRows(\r\n sheetXml: string,\r\n shared: string[],\r\n): { headers: string[]; rows: string[][] } {\r\n const rowRe = /<row\\b[^>]*>([\\s\\S]*?)<\\/row>/gi;\r\n const matrix: CellVal[][] = [];\r\n\r\n let rowMatch: RegExpExecArray | null;\r\n while ((rowMatch = rowRe.exec(sheetXml))) {\r\n const rowXml = rowMatch[1];\r\n const cells: CellVal[] = [];\r\n const cellRe = /<c\\b([^>]*)>([\\s\\S]*?)<\\/c>|<c\\b([^>]*)\\/>/gi;\r\n let cm: RegExpExecArray | null;\r\n while ((cm = cellRe.exec(rowXml))) {\r\n const attrs = cm[1] ?? cm[3] ?? '';\r\n const body = cm[2] ?? '';\r\n const ref = attrs.match(/\\br=\"([^\"]+)\"/)?.[1] ?? '';\r\n const t = attrs.match(/\\bt=\"([^\"]+)\"/)?.[1] ?? '';\r\n const col = colIndexFromRef(ref);\r\n\r\n let text = '';\r\n if (t === 'inlineStr') {\r\n const tm = body.match(/<t\\b[^>]*>([\\s\\S]*?)<\\/t>/i);\r\n text = tm ? decodeXmlEntities(tm[1]) : '';\r\n } else if (t === 's') {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n const idx = vm ? Number(vm[1]) : -1;\r\n text = idx >= 0 ? (shared[idx] ?? '') : '';\r\n } else {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n text = vm ? decodeXmlEntities(vm[1]) : '';\r\n }\r\n cells.push({ col, text });\r\n }\r\n matrix.push(cells);\r\n }\r\n\r\n if (matrix.length === 0) {\r\n return { headers: [], rows: [] };\r\n }\r\n\r\n const maxCol = Math.max(\r\n 0,\r\n ...matrix.flatMap((r) => r.map((c) => c.col)),\r\n );\r\n\r\n const dense = matrix.map((rowCells) => {\r\n const line = Array.from({ length: maxCol + 1 }, () => '');\r\n for (const c of rowCells) {\r\n if (c.col >= 0 && c.col <= maxCol) line[c.col] = c.text;\r\n }\r\n return line;\r\n });\r\n\r\n // Exported files put a row-number column in A; drop it when header looks like ردیف/Row/#.\r\n const header = dense[0] ?? [];\r\n const rowHeaderHints = new Set(['ردیف', 'row', '#', 'row · actions', 'row number']);\r\n const dropFirst =\r\n header.length > 1 &&\r\n rowHeaderHints.has(header[0].trim().toLowerCase());\r\n\r\n const slice = (line: string[]) => (dropFirst ? line.slice(1) : line);\r\n const headers = slice(header).map((h) => h.trim());\r\n const rows = dense\r\n .slice(1)\r\n .map(slice)\r\n .map((line) => {\r\n const padded = Array.from({ length: headers.length }, (_, i) => line[i] ?? '');\r\n return padded;\r\n })\r\n .filter((line) => line.some((c) => c.trim() !== ''));\r\n\r\n return { headers, rows };\r\n}\r\n\r\n/**\r\n * Parses a minimal OOXML .xlsx (store or deflate) into a string matrix.\r\n * Supports shared strings and inlineStr (as produced by buildXlsxBlob).\r\n */\r\nexport async function parseXlsxBlob(\r\n data: Blob | ArrayBuffer | Uint8Array,\r\n options?: { sheetName?: string },\r\n): Promise<ParsedXlsxSheet> {\r\n const bytes = await toUint8Array(data);\r\n let files: Record<string, Uint8Array>;\r\n try {\r\n files = unzipSync(bytes);\r\n } catch {\r\n throw new Error('INVALID_XLSX');\r\n }\r\n\r\n const sharedPath = Object.keys(files).find((k) =>\r\n /xl\\/sharedStrings\\.xml$/i.test(k),\r\n );\r\n const shared = sharedPath\r\n ? parseSharedStrings(decodeXml(files[sharedPath]))\r\n : [];\r\n\r\n const sheetPath = findSheetPath(files, options?.sheetName);\r\n return parseSheetRows(decodeXml(files[sheetPath]), shared);\r\n}\r\n","import type { ExportColumnDef } from '../../../../application/plugins/GridPlugin';\r\nimport type { ParsedXlsxSheet } from './parseXlsxBlob';\r\n\r\nexport type ImportCellKv = {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type MappedImportRows = {\r\n columns: Array<{ fieldName: string; fieldType?: string }>;\r\n /** One KeyValue[] per data row (no index column). */\r\n rows: ImportCellKv[][];\r\n};\r\n\r\nfunction normalizeHeader(h: string): string {\r\n return h.trim().toLowerCase().replace(/\\s+/g, ' ');\r\n}\r\n\r\nfunction coerceValue(raw: string, fieldType?: string): unknown {\r\n const text = raw.trim();\r\n if (text === '') return '';\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n case 'price': {\r\n const n = Number(text.replace(/,/g, ''));\r\n return Number.isFinite(n) ? n : text;\r\n }\r\n case 'checkbox': {\r\n const lower = text.toLowerCase();\r\n if (['1', 'true', 'yes', '✔', 'y'].includes(lower)) return true;\r\n if (['0', 'false', 'no', '✘', 'n'].includes(lower)) return false;\r\n return text;\r\n }\r\n default:\r\n return text;\r\n }\r\n}\r\n\r\n/**\r\n * Maps sheet headers to export/query columns by caption or fieldName.\r\n * Skips index/static columns.\r\n */\r\nexport function mapImportedSheet(\r\n sheet: ParsedXlsxSheet,\r\n columns: readonly ExportColumnDef[],\r\n): MappedImportRows {\r\n const importable = columns.filter(\r\n (c) =>\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n\r\n const byCaption = new Map<string, ExportColumnDef>();\r\n const byField = new Map<string, ExportColumnDef>();\r\n for (const col of importable) {\r\n byField.set(normalizeHeader(col.fieldName), col);\r\n if (col.fieldCaption) {\r\n byCaption.set(normalizeHeader(col.fieldCaption), col);\r\n }\r\n }\r\n\r\n const mappedCols: Array<{ fieldName: string; fieldType?: string; colIndex: number }> =\r\n [];\r\n\r\n sheet.headers.forEach((header, colIndex) => {\r\n const key = normalizeHeader(header);\r\n if (!key) return;\r\n const col = byCaption.get(key) ?? byField.get(key);\r\n if (!col) return;\r\n if (mappedCols.some((m) => m.fieldName === col.fieldName)) return;\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex,\r\n });\r\n });\r\n\r\n // If headers did not match, fall back to positional mapping of importable columns.\r\n if (mappedCols.length === 0 && sheet.headers.length > 0) {\r\n importable.forEach((col, i) => {\r\n if (i < sheet.headers.length) {\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex: i,\r\n });\r\n }\r\n });\r\n }\r\n\r\n const rows: ImportCellKv[][] = sheet.rows.map((line) =>\r\n mappedCols.map((m) => {\r\n const raw = line[m.colIndex] ?? '';\r\n const value = coerceValue(raw, m.fieldType);\r\n return { key: m.fieldName, value, display: value };\r\n }),\r\n );\r\n\r\n return {\r\n columns: mappedCols.map(({ fieldName, fieldType }) => ({\r\n fieldName,\r\n fieldType,\r\n })),\r\n rows,\r\n };\r\n}\r\n","import type { GridSession } from '../../../../application/session/GridSession';\r\nimport type { ImportCellKv } from './mapImportedSheet';\r\n\r\nexport type ApplyImportedRowsResult = {\r\n rowCount: number;\r\n};\r\n\r\n/**\r\n * Applies imported cell matrices through the engine (ADD_NEW_ROWS) so\r\n * CachedTableRepository / IndexedDB persistence stays on the normal path.\r\n *\r\n * Uses a synthetic unique `index` token only for dedupe in Table.addNewRows;\r\n * addNewRow still auto-assigns the real index cell.\r\n */\r\nexport async function applyImportedRows(\r\n session: GridSession,\r\n rows: ImportCellKv[][],\r\n): Promise<ApplyImportedRowsResult> {\r\n if (rows.length === 0) {\r\n return { rowCount: 0 };\r\n }\r\n\r\n const stamp = Date.now();\r\n const engine = session.getEngine();\r\n const payload = rows.map((cells, i) => [\r\n {\r\n key: 'index',\r\n value: `import-${stamp}-${i}`,\r\n display: `import-${stamp}-${i}`,\r\n },\r\n ...cells.filter((c) => c.key !== 'index'),\r\n ]);\r\n\r\n await engine.dispatch({\r\n type: 'ADD_NEW_ROWS',\r\n store: session.store,\r\n tableKey: session.tableKey,\r\n detailFieldKey: 'index',\r\n rows: payload,\r\n autoActivate: false,\r\n });\r\n\r\n return { rowCount: rows.length };\r\n}\r\n","'use client';\r\n\r\nimport React, {\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport { Select } from '../primitives';\r\nimport { useMediaQuery, useTranslations } from '../host';\r\nimport { LeftChevron, RightChevron } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useGridSearchState } from '../hooks/useEngineSelector';\r\nimport { findColumnMatches, navigateToMatch } from './utils';\r\n\r\nconst MOBILE_SEARCH_PANEL_HEIGHT = 220;\r\n\r\ninterface GridSearchPanelProps {\r\n controller: UITableController;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n anchorRef: React.RefObject<HTMLElement | null>;\r\n}\r\n\r\nexport function GridSearchPanel({\r\n controller,\r\n isOpen,\r\n onClose,\r\n anchorRef,\r\n}: GridSearchPanelProps) {\r\n const t = useTranslations();\r\n const { match: viewportMatch } = useMediaQuery('XLUP');\r\n const isMobile = viewportMatch === false;\r\n const searchState = useGridSearchState(controller);\r\n const [columnId, setColumnId] = useState('');\r\n const [query, setQuery] = useState('');\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const [position, setPosition] = useState({ top: 0, left: 0 });\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const table = controller.getViewState();\r\n const columns = useMemo(\r\n () => (table?.columns ?? []).filter(col => !col.hidden && col.fieldName !== 'index'),\r\n [table?.columns],\r\n );\r\n\r\n const columnOptions = useMemo(\r\n () =>\r\n columns.map(col => ({\r\n value: col.fieldName,\r\n label: col.fieldCaption || col.fieldName,\r\n })),\r\n [columns],\r\n );\r\n\r\n const isCurrentSearch =\r\n hasSearched &&\r\n searchState?.columnId === columnId &&\r\n searchState?.query === query.trim();\r\n\r\n const totalMatches = isCurrentSearch ? searchState?.matches.length ?? 0 : 0;\r\n const currentMatchIndex = isCurrentSearch ? searchState?.currentIndex ?? -1 : -1;\r\n const canNavigate = totalMatches > 1;\r\n\r\n useEffect(() => {\r\n if (!columnId && columns.length > 0) {\r\n setColumnId(columns[0].fieldName);\r\n }\r\n }, [columns, columnId]);\r\n\r\n useLayoutEffect(() => {\r\n if (!isOpen || isMobile || !anchorRef.current) return;\r\n\r\n const updatePosition = () => {\r\n const rect = anchorRef.current!.getBoundingClientRect();\r\n setPosition({\r\n left: rect.left,\r\n top: rect.top - 8,\r\n });\r\n };\r\n\r\n updatePosition();\r\n window.addEventListener('resize', updatePosition);\r\n window.addEventListener('scroll', updatePosition, true);\r\n\r\n return () => {\r\n window.removeEventListener('resize', updatePosition);\r\n window.removeEventListener('scroll', updatePosition, true);\r\n };\r\n }, [isOpen, isMobile, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n inputRef.current?.focus();\r\n }\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (panelRef.current?.contains(target) || anchorRef.current?.contains(target)) {\r\n return;\r\n }\r\n onClose();\r\n };\r\n\r\n const timer = window.setTimeout(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n }, 0);\r\n\r\n return () => {\r\n window.clearTimeout(timer);\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isOpen, onClose, anchorRef]);\r\n\r\n const runSearch = async (startIndex = 0) => {\r\n const trimmedQuery = query.trim();\r\n if (!columnId || !trimmedQuery) return;\r\n\r\n const matches = findColumnMatches(controller, columnId, trimmedQuery);\r\n setHasSearched(true);\r\n\r\n if (!matches.length) {\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: { columnId, query: trimmedQuery, matches: [], currentIndex: -1 },\r\n });\r\n return;\r\n }\r\n\r\n const index = Math.min(Math.max(startIndex, 0), matches.length - 1);\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: { columnId, query: trimmedQuery, matches, currentIndex: index },\r\n });\r\n await navigateToMatch(controller, matches[index]);\r\n };\r\n\r\n const goToMatch = async (direction: 1 | -1) => {\r\n if (!canNavigate || !searchState?.matches.length) return;\r\n\r\n const nextIndex =\r\n (searchState.currentIndex + direction + searchState.matches.length) %\r\n searchState.matches.length;\r\n const nextState = { ...searchState, currentIndex: nextIndex };\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: nextState,\r\n });\r\n await navigateToMatch(controller, nextState.matches[nextIndex]);\r\n };\r\n\r\n if (!isOpen || typeof document === 'undefined') return null;\r\n\r\n const resultSummary = !hasSearched\r\n ? ''\r\n : totalMatches > 0\r\n ? `${totalMatches} مورد پیدا شد`\r\n : 'موردی یافت نشد';\r\n\r\n const positionSummary =\r\n totalMatches > 0 && currentMatchIndex >= 0\r\n ? `${currentMatchIndex + 1} از ${totalMatches}`\r\n : '';\r\n\r\n const panelContent = (\r\n <>\r\n <Select\r\n className=\"w-full\"\r\n value={columnId || undefined}\r\n options={columnOptions}\r\n placeholder={t('general.choice')}\r\n getPopupContainer={(trigger: HTMLElement) => trigger.parentElement ?? document.body}\r\n onChange={(value) => {\r\n setColumnId(String(value ?? ''));\r\n setHasSearched(false);\r\n }}\r\n />\r\n\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={query}\r\n placeholder={t('general.search')}\r\n className=\"px-3 py-2 border border-gray-gray5 rounded w-full text-sm outline-none focus:border-blue-blue6\"\r\n onChange={event => {\r\n setQuery(event.target.value);\r\n setHasSearched(false);\r\n }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n void runSearch(0);\r\n }\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-between items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n className=\"flex-1 bg-blue-blue6 px-3 py-1.5 rounded text-white text-sm\"\r\n onClick={() => void runSearch(0)}\r\n >\r\n {t('general.search')}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n title={t('general.prev')}\r\n className=\"flex justify-center items-center p-1.5 border border-gray-gray5 rounded disabled:opacity-40\"\r\n disabled={!canNavigate}\r\n onClick={() => void goToMatch(-1)}\r\n >\r\n <LeftChevron config={{ width: 16, height: 16 }} />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n title={t('general.next')}\r\n className=\"flex justify-center items-center p-1.5 border border-gray-gray5 rounded disabled:opacity-40\"\r\n disabled={!canNavigate}\r\n onClick={() => void goToMatch(1)}\r\n >\r\n <RightChevron config={{ width: 16, height: 16 }} />\r\n </button>\r\n </div>\r\n\r\n {resultSummary ? (\r\n <span className=\"text-gray-gray7 text-xs text-center\">{resultSummary}</span>\r\n ) : null}\r\n\r\n {positionSummary ? (\r\n <span className=\"text-blue-blue6 text-xs text-center font-medium\">{positionSummary}</span>\r\n ) : null}\r\n </>\r\n );\r\n\r\n if (isMobile) {\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n style={{\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n width: '100%',\r\n height: MOBILE_SEARCH_PANEL_HEIGHT,\r\n zIndex: 9999,\r\n }}\r\n className=\"flex flex-col gap-2 bg-main-white shadow-lg px-3 py-3 border-b border-gray-gray5\"\r\n >\r\n {panelContent}\r\n </div>,\r\n document.body,\r\n );\r\n }\r\n\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n style={{\r\n position: 'fixed',\r\n left: position.left,\r\n top: position.top,\r\n transform: 'translateY(-100%)',\r\n zIndex: 9999,\r\n }}\r\n className=\"flex flex-col gap-2 bg-white shadow-lg p-3 border border-gray-gray5 rounded-lg min-w-[320px]\"\r\n >\r\n {panelContent}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useRef, useState } from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport { CustomTooltip, Magnifier } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { GridSearchPanel } from './GridSearchPanel';\r\n\r\ninterface GridSearchControlProps {\r\n controller: UITableController;\r\n}\r\n\r\nexport function GridSearchControl({ controller }: GridSearchControlProps) {\r\n const t = useTranslations();\r\n const [searchOpen, setSearchOpen] = useState(false);\r\n const searchAnchorRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleSearch = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n event.stopPropagation();\r\n setSearchOpen((prev) => {\r\n if (prev) {\r\n void controller.dispatch({ type: 'UI_CLEAR_GRID_SEARCH' });\r\n }\r\n return !prev;\r\n });\r\n };\r\n\r\n const closeSearch = () => {\r\n setSearchOpen(false);\r\n void controller.dispatch({ type: 'UI_CLEAR_GRID_SEARCH' });\r\n };\r\n\r\n return (\r\n <div className=\"relative\" ref={searchAnchorRef}>\r\n <CustomTooltip title={t(\"general.search\")}>\r\n <button\r\n type=\"button\"\r\n className={`flex justify-center items-center p-1 border rounded ${\r\n searchOpen ? \"bg-blue-blue11\" : \"\"\r\n }`}\r\n onClick={toggleSearch}\r\n >\r\n <Magnifier config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n <GridSearchPanel\r\n controller={controller}\r\n isOpen={searchOpen}\r\n anchorRef={searchAnchorRef}\r\n onClose={closeSearch}\r\n />\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nimport { useLocale, useTranslations } from '../host';\r\nimport { CustomCheckbox } from '../primitives';\r\n\r\nimport { valueParser } from '../helper';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface Props {\r\n rows: any[];\r\n ListConfig: IMultiSelectConfig[\"ListConfig\"];\r\n selectedRows: Map<any, any>;\r\n fieldKey:string\r\n onToggleRow: (id: any) => void;\r\n}\r\n\r\nexport function MultiSelectListBody({\r\n rows,\r\n ListConfig,\r\n selectedRows,\r\n fieldKey,\r\n onToggleRow,\r\n}: Props) {\r\n const locale = useLocale()\r\n const t = useTranslations()\r\n return (\r\n <tbody>\r\n {rows.map((row) => {\r\n const id = row[fieldKey];\r\n\r\n return (\r\n <tr key={id} className=\"border h-10\">\r\n {ListConfig.filter((c: any) => c.hidden !== true).map((col, idx: number) => (\r\n <td key={idx} className=\"px-2 border text-xs\">\r\n {idx === 0 && (\r\n <CustomCheckbox\r\n checked={selectedRows.has(id)}\r\n onClick={() => onToggleRow(row)}\r\n />\r\n )}\r\n\r\n {valueParser(row[col.fieldName],col.fieldType)}\r\n </td>\r\n ))}\r\n </tr>\r\n );\r\n })}\r\n</tbody>\r\n\r\n );\r\n}\r\n ","import React from 'react';\r\n\r\nimport { CustomCheckbox } from '../primitives';\r\n\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface Props {\r\n ListConfig: IMultiSelectConfig[\"ListConfig\"];\r\n rows: any[];\r\n fieldKey: string;\r\n selectedRows: Map<any, any>;\r\n onToggleAll: () => void;\r\n}\r\n\r\nexport function MultiSelectListHeader({\r\n ListConfig,\r\n rows,\r\n fieldKey,\r\n selectedRows,\r\n onToggleAll,\r\n}: Props) {\r\n const isAllSelected =\r\n rows.length > 0 && rows.every((r) => selectedRows.has(r[fieldKey]));\r\n\r\n return (\r\n <thead className=\"top-0 z-20 sticky\">\r\n <tr className=\"bg-gray-gray3 h-10\">\r\n {ListConfig.filter((c: any) => c.hidden !== true).map((col, index) => (\r\n <th key={index} className=\"px-2 border text-xs text-start\">\r\n {col.fieldName == \"index\" ? (\r\n <CustomCheckbox checked={isAllSelected} onClick={onToggleAll} />\r\n ) : (\r\n <>{col.fieldCaption}</>\r\n )}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n );\r\n}\r\n","import React, {\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport { Pagination, CustomButton, InputText, LeftChevron, RightChevron } from '../primitives';\r\nimport { useLocale, useRemoteQuery } from '../host';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { MultiSelectListBody } from './body';\r\nimport { MultiSelectListHeader } from './header';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n multiSelectConfig: IMultiSelectConfig;\r\n handleCloseModal: () => void;\r\n}\r\n\r\nexport default function MultiselectList({\r\n multiSelectConfig,\r\n controller,\r\n handleCloseModal,\r\n}: Props) {\r\n const { dynamicValue, fieldKey, detailFieldKey, onAdd, ListConfig } =\r\n multiSelectConfig;\r\n const locale = useLocale();\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const [pageRecordCount, setPageRecordCount] = useState(8);\r\n const [selectedRows, setSelectedRows] = useState<Map<any, any>>(new Map());\r\n const [searchInput, setSearchInput] = useState(\"\");\r\n const [quickSearch, setQuickSearch] = useState(\"\");\r\n const { endpoint, repoViewId, dependOn, ...bodyRequest } = dynamicValue;\r\n const hasDependValue = (\r\n dependOn:\r\n | { fieldName: string; value: unknown }\r\n | Array<{ fieldName: string; value: unknown }>,\r\n ) => {\r\n if (Array.isArray(dependOn)) {\r\n return dependOn.every(\r\n (item) => item.value !== null && item.value !== undefined,\r\n );\r\n }\r\n return dependOn.value !== null && dependOn.value !== undefined;\r\n };\r\n const dependencyBody = Array.isArray(dependOn)\r\n ? Object.fromEntries(\r\n dependOn.map((item) => [item.fieldName, item.value]),\r\n )\r\n : dependOn\r\n ? { [dependOn.fieldName]: dependOn.value }\r\n : {};\r\n const body = {\r\n ...bodyRequest,\r\n ...dependencyBody,\r\n PagingInfo: {\r\n PageRecordCount: pageRecordCount,\r\n PageNumber: pageNumber,\r\n },\r\n FullSearchPhrase: quickSearch,\r\n RepoViewId: repoViewId,\r\n };\r\n const existBody = Object.fromEntries(\r\n Object.entries(body).filter(([, value]) => value !== null),\r\n );\r\n const { data } = useRemoteQuery<any[]>({\r\n url: endpoint,\r\n body: existBody,\r\n skip: dependOn ? !hasDependValue(dependOn) : false,\r\n });\r\n // const processedData = useProcessedData({\r\n // data: data?.Data,\r\n // columnsConfig: ListConfig,\r\n // locale,\r\n // });\r\n // console.log(processedData);\r\n const rows = useMemo(() => {\r\n return data?.Data ?? [];\r\n }, [data]);\r\n\r\n const toggleRow = (row: any) => {\r\n const id = row[fieldKey];\r\n setSelectedRows((prev) => {\r\n const newMap = new Map(prev);\r\n\r\n if (newMap.has(id)) {\r\n newMap.delete(id);\r\n } else {\r\n newMap.set(id, row);\r\n }\r\n\r\n return newMap;\r\n });\r\n };\r\n\r\n const toggleSelectAll = () => {\r\n const allSelected = rows.every((r: Record<string, unknown>) =>\r\n selectedRows.has(r[fieldKey]),\r\n );\r\n\r\n setSelectedRows((prev) => {\r\n const newMap = new Map(prev);\r\n\r\n if (allSelected) {\r\n rows.forEach((r: Record<string, unknown>) => newMap.delete(r[fieldKey]));\r\n } else {\r\n rows.forEach((r: Record<string, unknown>) => newMap.set(r[fieldKey], r));\r\n }\r\n\r\n return newMap;\r\n });\r\n };\r\n\r\n const handleAdd = () => {\r\n const selected = Array.from(selectedRows.values());\r\n const rows = selected.map((row) =>\r\n Object.entries(row).map(([key, value]) => {\r\n const config = multiSelectConfig.ListConfig.find(\r\n (cfg) => cfg.fieldName === key,\r\n );\r\n return {\r\n key,\r\n value: config?.returnValue ? config.returnValue(row, key) : value,\r\n display: config?.returnDisplayValue\r\n ? config.returnDisplayValue(row, key)\r\n : value,\r\n };\r\n }),\r\n );\r\n controller.dispatch({ type: \"ADD_NEW_ROWS\", rows, detailFieldKey });\r\n onAdd?.(selected);\r\n handleCloseModal();\r\n };\r\n\r\n const handlePagination = (page: number) => {\r\n setPageNumber(page);\r\n };\r\n\r\n const handlePageSizeChange = (_: any, size: number) => {\r\n setPageRecordCount(size);\r\n setPageNumber(1);\r\n };\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setQuickSearch(searchInput);\r\n setPageNumber(1);\r\n }, 808);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [searchInput]);\r\n return (\r\n <div className=\"flex flex-col justify-between gap-2 p-2 border !h-full\">\r\n <div className=\"flex flex-col gap-2\">\r\n <InputText\r\n value={searchInput}\r\n onChange={(e: { target: { value: string } }) => setSearchInput(e.target.value)}\r\n placeholder=\"جستجو...\"\r\n className=\" \"\r\n />\r\n <table className=\"w-full border-collapse\">\r\n <MultiSelectListHeader\r\n ListConfig={ListConfig}\r\n fieldKey={fieldKey}\r\n rows={rows}\r\n selectedRows={selectedRows}\r\n onToggleAll={toggleSelectAll}\r\n />\r\n\r\n <MultiSelectListBody\r\n rows={rows}\r\n fieldKey={fieldKey}\r\n ListConfig={ListConfig}\r\n selectedRows={selectedRows}\r\n onToggleRow={toggleRow}\r\n />\r\n </table>\r\n </div>\r\n\r\n <div className=\"flex justify-between items-center\">\r\n <CustomButton\r\n type=\"text\"\r\n className=\"bg-main-black dark:bg-main-white text-gray-gray3 dark:text-gray-gray7\"\r\n onClick={handleAdd}\r\n >\r\n افزودن\r\n </CustomButton>\r\n\r\n <Pagination\r\n prevIcon={\r\n <CustomButton className=\"m-0 p-0 rounded w-fit\">\r\n {locale === \"fa\" ? <RightChevron /> : <LeftChevron />}\r\n </CustomButton>\r\n }\r\n nextIcon={\r\n <CustomButton className=\"m-0 p-0 w-fit\">\r\n {locale === \"fa\" ? <LeftChevron /> : <RightChevron />}\r\n </CustomButton>\r\n }\r\n current={pageNumber}\r\n pageSize={pageRecordCount}\r\n total={data?.TotalCount ?? 0}\r\n onShowSizeChange={handlePageSizeChange}\r\n onChange={handlePagination}\r\n // hideOnSinglePage\r\n showTitle={false}\r\n className={`\r\n [&_.ant-pagination-item-active:hover]:!bg-main-black \r\n [&_.ant-pagination-item-active:hover]:!border-main-black \r\n [&_.ant-pagination-item-active]:!border-main-black \r\n [&_.ant-pagination-next_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-prev_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-item-active_a:hover]:!text-main-white \r\n [&_.ant-pagination-item-active_a]:!text-main-black\r\n`}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\n\r\nimport { useDirection, useHostToast, useTranslations } from '../host';\r\nimport {\r\n ClipboardCheck,\r\n ClipboardIcon,\r\n CustomModal,\r\n CustomTooltip,\r\n CutIcon,\r\n Excel,\r\n GuaranteeReceive,\r\n Layers,\r\n PlusIcon,\r\n Spin,\r\n SpinIcon,\r\n TrashBin,\r\n} from '../primitives';\r\n\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport { exportActiveCollectionToExcel } from '../../infrastructure/excel/exportActiveCollectionToExcel';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { GridSearchControl } from '../gridSearch/GridSearchControl';\r\nimport MultiselectList from '../multiSelectList';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface GroupActionButtonsProps {\r\n controller: UITableController;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n}\r\n\r\nexport const GroupActionButtons: React.FC<GroupActionButtonsProps> = ({\r\n controller,\r\n multiSelectConfig,\r\n}) => {\r\n const t = useTranslations();\r\n const direction = useDirection();\r\n const { success, error } = useHostToast();\r\n const [modalIsOpen, setModalIsOpen] = useState<boolean>(false);\r\n const [isExporting, setIsExporting] = useState(false);\r\n\r\n const selectedRows = controller.getSelectedRows();\r\n const count = selectedRows ? Object.keys(selectedRows).length : 0;\r\n const table = controller.getViewState();\r\n const tableAction = table?.action;\r\n\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: \"ADD_EMPTY_ROW\" });\r\n };\r\n\r\n const handleExportToExcel = async () => {\r\n if (isExporting) return;\r\n setIsExporting(true);\r\n try {\r\n await exportActiveCollectionToExcel(controller, {\r\n direction,\r\n rowHeaderLabel: t('general.row'),\r\n });\r\n success(t(\"general.exportToExcelSuccess\"));\r\n } catch {\r\n error(t(\"general.exportToExcelError\"));\r\n } finally {\r\n setIsExporting(false);\r\n }\r\n };\r\n\r\n const handleSelectAllRows = () => {\r\n controller.dispatch({ type: \"TOGGLE_ROW_SELECTED\" });\r\n };\r\n\r\n const handleChangeTableAction = (action: TableActions) => {\r\n controller.dispatch({ type: \"UI_ACTION_TABLE\", action });\r\n };\r\n\r\n const handleDeleteSelectedRows = () => {\r\n controller.dispatch({ type: \"UI_DELETE_SELECTED_ROW\" });\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-2 flex-1 justify-start\">\r\n <CustomTooltip title={t(\"general.addNewRow\")}>\r\n <button\r\n type=\"button\"\r\n className=\"flex justify-center items-center p-1 border rounded\"\r\n onClick={handleAddRow}\r\n >\r\n <PlusIcon config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.copy\")}>\r\n <button\r\n type=\"button\"\r\n disabled={count == 0}\r\n className={`flex justify-center items-center p-1 border rounded ${count == 0 && \"opacity-40\"}`}\r\n onClick={() => {\r\n handleChangeTableAction(\"copy\");\r\n }}\r\n >\r\n <GuaranteeReceive config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.cut\")}>\r\n <button\r\n type=\"button\"\r\n disabled={count == 0}\r\n className={`flex justify-center items-center p-1 border rounded ${count == 0 && \"opacity-40\"}`}\r\n onClick={() => {\r\n handleChangeTableAction(\"cut\");\r\n }}\r\n >\r\n <CutIcon config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.paste\")}>\r\n <button\r\n type=\"button\"\r\n disabled={\r\n !((tableAction == \"copy\" || tableAction == \"cut\") && count != 0)\r\n }\r\n className={`flex justify-center items-center p-1 border rounded ${!((tableAction == \"copy\" || tableAction == \"cut\") && count != 0) && \"opacity-40\"}`}\r\n onClick={() => {\r\n handleChangeTableAction(\"paste\");\r\n }}\r\n >\r\n <ClipboardIcon config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.delete\")}>\r\n <button\r\n type=\"button\"\r\n disabled={count == 0}\r\n className={`flex justify-center items-center p-1 border rounded ${count == 0 && \"opacity-40\"}`}\r\n onClick={handleDeleteSelectedRows}\r\n >\r\n <TrashBin config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n {multiSelectConfig && (\r\n <>\r\n <CustomTooltip title={t(\"general.chooseFromList\")}>\r\n <button\r\n onClick={() => {\r\n setModalIsOpen(true);\r\n }}\r\n className=\"flex justify-center items-center p-1 border rounded\"\r\n >\r\n <ClipboardCheck config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n <CustomModal\r\n contentClassName={\"!h-[480px]\"}\r\n width={ 720}\r\n headerName={t(\"general.chooseFromList\")}\r\n headerIcon={<ClipboardCheck config={{ width: 18, height: 18 }} />}\r\n closeModal={() => setModalIsOpen(false)}\r\n isModalOpen={modalIsOpen}\r\n content={\r\n <MultiselectList\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n handleCloseModal={() => { setModalIsOpen(false); }}\r\n />\r\n }\r\n />\r\n </>\r\n )}\r\n\r\n <CustomTooltip title={t(\"general.toggle\")}>\r\n <button\r\n onClick={handleSelectAllRows}\r\n className=\"flex justify-center items-center p-1 border rounded\"\r\n >\r\n <Layers config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.exportToExcel\")}>\r\n <button\r\n type=\"button\"\r\n disabled={isExporting}\r\n className={`flex justify-center items-center p-1 border rounded ${isExporting ? \"opacity-60 cursor-wait\" : \"\"}`}\r\n onClick={() => {\r\n void handleExportToExcel();\r\n }}\r\n >\r\n {isExporting ? (\r\n <Spin\r\n size=\"small\"\r\n indicator={<SpinIcon config={{ width: 16, height: 16 }} />}\r\n />\r\n ) : (\r\n <Excel config={{ width: 18, height: 18 }} />\r\n )}\r\n </button>\r\n </CustomTooltip>\r\n\r\n <GridSearchControl controller={controller} />\r\n\r\n <span className=\"px-2 text-black-black6 text-xs\">\r\n {t(\"general.selected\")} {count.toLocaleString(direction === 'rtl' ? 'fa-IR' : 'en-US')}\r\n </span>\r\n </div>\r\n );\r\n};\r\n","// ui/pagination.tsx\r\n\r\nimport { Pagination } from '../primitives';\r\nimport { useLocale } from '../host';\r\nimport { CustomButton, LeftChevron, RightChevron } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n store: string;\r\n}\r\n\r\nexport default function ERPTablePagination({\r\n controller,\r\n tableKey\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const locale = useLocale();\r\n const direction = locale === \"fa\" ? \"rtl\" : \"ltr\";\r\n if (!table) return null;\r\n const { page, pageSize, totalPages, totalRows } = table.pagination;\r\n const handlePageChange = (e: number) => {\r\n controller.dispatch({ type: \"CHANGE_PAGE\", page: e });\r\n };\r\n const handlePageSizeChange = (_page: number, pageSize: number) => {\r\n controller.dispatch({ type: \"CHANGE_PAGE_SIZE\", pageSize: pageSize });\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3\">\r\n <Pagination\r\n prevIcon={\r\n <CustomButton className=\"m-0 p-0 rounded w-fit\">\r\n {direction === \"rtl\" ? <RightChevron /> : <LeftChevron />}\r\n </CustomButton>\r\n }\r\n nextIcon={\r\n <CustomButton className=\"m-0 p-0 w-fit\">\r\n {direction === \"rtl\" ? <LeftChevron /> : <RightChevron />}\r\n </CustomButton>\r\n }\r\n className={`\r\n [&_.ant-pagination-item-active:hover]:!bg-main-black \r\n [&_.ant-pagination-item-active:hover]:!border-main-black \r\n [&_.ant-pagination-item-active]:!border-main-black \r\n [&_.ant-pagination-next_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-prev_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-item-active_a:hover]:!text-main-white \r\n [&_.ant-pagination-item-active_a]:!text-main-black\r\n`}\r\n current={page}\r\n jumpNextIcon={<span>...</span>}\r\n jumpPrevIcon={<span>...</span>}\r\n pageSize={pageSize}\r\n total={totalRows}\r\n showSizeChanger={true}\r\n onShowSizeChange={handlePageSizeChange}\r\n pageSizeOptions={[\"9\", \"10\", \"20\", \"50\", \"100\"]}\r\n // hideOnSinglePage\r\n locale={{ items_per_page: \"\" }}\r\n showTotal={(total: number) => (\r\n <div className=\"flex items-center gap-1 h-full font-light text-gray-gray10 text-xs\">\r\n <span>{total.toLocaleString(\"fa-IR\")}</span>\r\n <span>سطر در</span>\r\n <span>{totalPages.toLocaleString(\"fa-IR\")}</span>\r\n <span>صفحه</span>\r\n </div>\r\n )}\r\n onChange={handlePageChange}\r\n direction={direction}\r\n />\r\n </div>\r\n );\r\n}","import type { GridSession } from '../../application/session/GridSession';\r\n\r\n/**\r\n * Desktop virtualization is off by default to match the ERP host\r\n * (classic pagination chrome). Pass `virtualization={true}` to enable.\r\n */\r\nexport function resolveDesktopVirtualization(\r\n virtualization: boolean | undefined,\r\n session: GridSession | null | undefined,\r\n): boolean {\r\n return virtualization === true && !!session;\r\n}\r\n","import {\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\nconst RECORD_HEIGHT = 40;\r\nconst TABLE_HEADER_HEIGHT = 40;\r\nconst VIEWPORT_BOTTOM_GAP = 20;\r\nconst MIN_TABLE_HEIGHT = 240;\r\n\r\ntype UseERPTableLayoutOptions = {\r\n rootRef: RefObject<HTMLDivElement | null>;\r\n bodyRef: RefObject<HTMLDivElement | null>;\r\n controller: UITableController | null;\r\n tableHeight?: number;\r\n ready?: boolean;\r\n /** When false, skip CHANGE_PAGE_SIZE sync (virtual scroll mode). */\r\n syncPageSize?: boolean;\r\n};\r\n\r\nexport function useERPTableLayout({\r\n rootRef,\r\n bodyRef,\r\n controller,\r\n tableHeight,\r\n ready = false,\r\n syncPageSize = true,\r\n}: UseERPTableLayoutOptions) {\r\n const [autoHeight, setAutoHeight] = useState<number | null>(null);\r\n\r\n const measureRootHeight = useCallback(() => {\r\n if (tableHeight != null) return;\r\n\r\n const root = rootRef.current;\r\n if (!root) return;\r\n\r\n const top = root.getBoundingClientRect().top;\r\n const available = window.innerHeight - top - VIEWPORT_BOTTOM_GAP;\r\n setAutoHeight(Math.max(MIN_TABLE_HEIGHT, Math.floor(available)));\r\n }, [tableHeight, rootRef]);\r\n\r\n useEffect(() => {\r\n if (!ready) return;\r\n if (tableHeight != null) return;\r\n\r\n const frame = requestAnimationFrame(measureRootHeight);\r\n window.addEventListener('resize', measureRootHeight);\r\n\r\n const parent = rootRef.current?.parentElement;\r\n const observer = parent ? new ResizeObserver(measureRootHeight) : null;\r\n if (parent && observer) {\r\n observer.observe(parent);\r\n }\r\n\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n window.removeEventListener('resize', measureRootHeight);\r\n observer?.disconnect();\r\n };\r\n }, [measureRootHeight, tableHeight, ready]);\r\n\r\n useEffect(() => {\r\n if (!syncPageSize) return;\r\n if (!controller) return;\r\n\r\n const syncPageSizeToHeight = (height: number) => {\r\n if (height < RECORD_HEIGHT * 2) return;\r\n\r\n const rowsArea = Math.max(0, height - TABLE_HEADER_HEIGHT);\r\n const pageSize = Math.max(3, Math.floor(rowsArea / RECORD_HEIGHT));\r\n const table = controller.getViewState();\r\n\r\n if (table && table.pagination.pageSize !== pageSize) {\r\n void controller.dispatch({ type: 'CHANGE_PAGE_SIZE', pageSize });\r\n }\r\n };\r\n\r\n if (tableHeight != null) {\r\n syncPageSizeToHeight(tableHeight);\r\n return;\r\n }\r\n\r\n if (!bodyRef.current) return;\r\n\r\n const updatePageSize = () => {\r\n syncPageSizeToHeight(bodyRef.current?.clientHeight ?? 0);\r\n };\r\n\r\n updatePageSize();\r\n const observer = new ResizeObserver(updatePageSize);\r\n observer.observe(bodyRef.current);\r\n\r\n return () => observer.disconnect();\r\n }, [controller, bodyRef, tableHeight, autoHeight, syncPageSize]);\r\n\r\n return {\r\n bodyHeight: tableHeight ?? autoHeight,\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React, { ReactNode, useRef } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useScrollToSearchMatch } from '../hooks/useScrollToSearchMatch';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { ERPTableBody } from './ERPTableBody';\r\nimport { ERPTableFooter } from './ERPTableFooter';\r\nimport { ERPTableHeader } from './ERPTableHeader';\r\nimport { ERPTableVirtualBody } from './ERPTableVirtualBody';\r\nimport { GroupActionButtons } from './groupActionButtons';\r\nimport ERPTablePagination from './pagination';\r\nimport { resolveDesktopVirtualization } from './resolveDesktopVirtualization';\r\nimport { useERPTableLayout } from './useERPTableLayout';\r\n\r\nexport interface DesktopTableProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n store: string;\r\n tableTitle?: ReactNode;\r\n header?: ReactNode;\r\n footer?: boolean | ReactNode;\r\n tableHeight?: number;\r\n multiSelectConfig: IMultiSelectConfig;\r\n moreDetailComponent?: React.ComponentType<{ data: unknown }>;\r\n ready: boolean;\r\n /**\r\n * Desktop virtual scroll (GridSession viewport + visible window).\r\n * Default true when `session` is present; pass false for classic pagination.\r\n */\r\n virtualization?: boolean;\r\n /** Used when virtualization is enabled (default). */\r\n session?: GridSession;\r\n}\r\n\r\nexport function DesktopTable({\r\n controller,\r\n tableKey,\r\n store,\r\n tableTitle,\r\n header,\r\n footer,\r\n tableHeight,\r\n multiSelectConfig,\r\n moreDetailComponent,\r\n ready,\r\n virtualization,\r\n session,\r\n}: DesktopTableProps) {\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const bodyRef = useRef<HTMLDivElement>(null);\r\n const useVirtual = resolveDesktopVirtualization(virtualization, session);\r\n\r\n const { bodyHeight } = useERPTableLayout({\r\n rootRef,\r\n bodyRef,\r\n controller,\r\n tableHeight,\r\n ready,\r\n syncPageSize: !useVirtual,\r\n });\r\n const resolvedBodyHeight = tableHeight ?? bodyHeight ?? 400;\r\n\r\n useScrollToSearchMatch(bodyRef, controller);\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className=\"flex flex-col w-full h-full transition-all duration-200 erp-table-desktop\"\r\n >\r\n {tableTitle}\r\n <div\r\n ref={bodyRef}\r\n data-erp-table-scroll\r\n data-erp-table-key={tableKey}\r\n data-erp-virtualization={useVirtual ? 'on' : 'off'}\r\n className=\"overflow-auto [overflow-anchor:none]\"\r\n style={{\r\n height: resolvedBodyHeight ?? '100%',\r\n width: 'auto',\r\n overflowAnchor: 'none',\r\n }}\r\n >\r\n <table className=\"border-collapse min-w-max w-full\">\r\n <ERPTableHeader\r\n controller={controller}\r\n tableKey={tableKey}\r\n header={header}\r\n />\r\n {useVirtual && session ? (\r\n <ERPTableVirtualBody\r\n controller={controller}\r\n session={session}\r\n tableKey={tableKey}\r\n scrollParentRef={bodyRef}\r\n viewportHeight={resolvedBodyHeight}\r\n moreDetailComponent={moreDetailComponent}\r\n />\r\n ) : (\r\n <ERPTableBody\r\n controller={controller}\r\n tableKey={tableKey}\r\n moreDetailComponent={moreDetailComponent}\r\n />\r\n )}\r\n {footer && (\r\n <ERPTableFooter controller={controller} footer={footer} />\r\n )}\r\n </table>\r\n </div>\r\n <div className=\"flex justify-between items-center gap-3 w-full shrink-0 erp-table-desktop__toolbar\">\r\n <GroupActionButtons\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n />\r\n {!useVirtual ? (\r\n <ERPTablePagination\r\n controller={controller}\r\n store={store}\r\n tableKey={tableKey}\r\n />\r\n ) : (\r\n <div\r\n className=\"text-xs text-neutral-500 px-2\"\r\n data-erp-virtual-row-count\r\n >\r\n {(controller.getAllUIRows() ?? []).length} rows\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport {\r\n CustomModal,\r\n CustomTooltip,\r\n ClipboardCheck,\r\n PlusIcon,\r\n TrashBin,\r\n} from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { GridSearchControl } from '../gridSearch/GridSearchControl';\r\nimport MultiselectList from '../multiSelectList';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface MobileActionButtonsProps {\r\n controller: UITableController;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n}\r\n\r\nexport function MobileActionButtons({\r\n controller,\r\n multiSelectConfig,\r\n}: MobileActionButtonsProps) {\r\n const t = useTranslations();\r\n const [modalIsOpen, setModalIsOpen] = useState(false);\r\n\r\n const selectedRows = controller.getSelectedRows();\r\n const count = selectedRows ? Object.keys(selectedRows).length : 0;\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: 'UI_OPEN_MOBILE_ADD' });\r\n };\r\n\r\n const handleDeleteSelectedRows = () => {\r\n controller.dispatch({ type: \"UI_DELETE_SELECTED_ROW\" });\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-2 justify-end\">\r\n <CustomTooltip title={t(\"general.addNewRow\")}>\r\n <button\r\n type=\"button\"\r\n className=\"flex justify-center items-center p-1 border rounded\"\r\n onClick={handleAddRow}\r\n >\r\n <PlusIcon config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n <CustomTooltip title={t(\"general.delete\")}>\r\n <button\r\n type=\"button\"\r\n disabled={count == 0}\r\n className={`flex justify-center items-center p-1 border rounded ${count == 0 && \"opacity-40\"}`}\r\n onClick={handleDeleteSelectedRows}\r\n >\r\n <TrashBin config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n\r\n {multiSelectConfig && (\r\n <>\r\n <CustomTooltip title={t(\"general.chooseFromList\")}>\r\n <button\r\n onClick={() => setModalIsOpen(true)}\r\n className=\"flex justify-center items-center p-1 border rounded\"\r\n >\r\n <ClipboardCheck config={{ width: 18, height: 18 }} />\r\n </button>\r\n </CustomTooltip>\r\n <CustomModal\r\n contentClassName={\"w-[720px] !h-[480px]\"}\r\n headerName={t(\"general.chooseFromList\")}\r\n headerIcon={<ClipboardCheck config={{ width: 18, height: 18 }} />}\r\n closeModal={() => setModalIsOpen(false)}\r\n isModalOpen={modalIsOpen}\r\n content={\r\n <MultiselectList\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n handleCloseModal={() => setModalIsOpen(false)}\r\n />\r\n }\r\n />\r\n </>\r\n )}\r\n\r\n <GridSearchControl controller={controller} />\r\n\r\n <span className=\"px-2 text-black-black6 text-xs\">\r\n {t(\"general.selected\")} {count}\r\n </span>\r\n </div>\r\n );\r\n}\r\n","import { CustomButton } from '../primitives';\r\n\r\ninterface Props {\r\n onClick: () => void;\r\n visibleCount: number;\r\n totalRows: number;\r\n}\r\n\r\nexport function MobileLoadMoreButton({\r\n onClick,\r\n visibleCount,\r\n totalRows,\r\n}: Props) {\r\n return (\r\n <div className=\"shrink-0 w-full py-3 border-gray-gray5 border-t bg-main-white\">\r\n <CustomButton\r\n htmlType=\"button\"\r\n type=\"default\"\r\n className=\"w-full h-10 text-sm\"\r\n onClick={onClick}\r\n >\r\n نمایش بیشتر ({visibleCount.toLocaleString('fa-IR')} از{' '}\r\n {totalRows.toLocaleString('fa-IR')})\r\n </CustomButton>\r\n </div>\r\n );\r\n}\r\n","import { ColumnSchema } from \"../../bootstrap/type\";\r\nimport { UIRow } from \"../type\";\r\n\r\nexport function buildDynamicSourceForRow(\r\n dynamicSource: ColumnSchema[\"dynamicSource\"],\r\n row: UIRow,\r\n): ColumnSchema[\"dynamicSource\"] {\r\n if (!dynamicSource) return dynamicSource;\r\n\r\n const { dependsOn, dependOn, ...rest } = dynamicSource;\r\n\r\n if (dependOn) {\r\n return dynamicSource;\r\n }\r\n\r\n if (!dependsOn?.length) {\r\n return dynamicSource;\r\n }\r\n\r\n const deps = dependsOn.map((fieldName) => ({\r\n fieldName,\r\n value: row.cells[fieldName]?.value ?? null,\r\n }));\r\n\r\n return {\r\n ...rest,\r\n dependsOn,\r\n dependOn: deps.length === 1 ? deps[0] : deps,\r\n };\r\n}\r\n\r\nexport function resolveColumnMetaForRow(\r\n col: ColumnSchema,\r\n row: UIRow,\r\n): ColumnSchema {\r\n if (!col.dynamicSource) return col;\r\n\r\n return {\r\n ...col,\r\n dynamicSource: buildDynamicSourceForRow(col.dynamicSource, row),\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { useTranslations } from \"../host\";\r\nimport { CustomButton, CustomModal } from \"../primitives\";\r\n\r\nimport { ColumnSchema } from \"../../bootstrap/type\";\r\nimport { RowStateEnum } from \"../../domain/value-objects\";\r\nimport { UITableController } from \"../../infrastructure/ui/UITableController\";\r\nimport { CellRenderer } from \"../cellRenderer\";\r\nimport { resolveColumnMetaForRow } from \"./buildDynamicSource\";\r\nimport type { MobileRowEditorState } from \"./types\";\r\nimport { UIRow } from \"../type\";\r\n\r\ninterface MobileRowFormModalProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n editor: NonNullable<MobileRowEditorState>;\r\n onClose: () => void;\r\n}\r\n\r\nexport function MobileRowFormModal({\r\n controller,\r\n tableKey,\r\n editor,\r\n onClose,\r\n}: MobileRowFormModalProps) {\r\n const t = useTranslations();\r\n\r\n const getRowById = (): UIRow | null => {\r\n return controller.getRowView(editor.rowId);\r\n };\r\n\r\n const [row, setRow] = useState<UIRow | null>(getRowById);\r\n\r\n useEffect(() => {\r\n const syncRow = () => {\r\n setRow(getRowById());\r\n };\r\n\r\n syncRow();\r\n const unsubscribe = controller.subscribe(syncRow);\r\n return () => unsubscribe?.();\r\n }, [controller, editor.rowId]);\r\n\r\n const formColumns = useMemo(() => {\r\n const table = controller.getViewState();\r\n if (!table?.columns) return [];\r\n return table.columns.filter(\r\n (c) =>\r\n !c.hidden && c.fieldType !== \"index\" && c.fieldName !== \"index\",\r\n );\r\n }, [controller, row]);\r\n\r\n if (!row || row.rowState === RowStateEnum.Deleted) {\r\n return null;\r\n }\r\n\r\n const title =\r\n editor.mode === \"add\" ? t(\"general.addNewRow\") : t(\"general.rowEdit\");\r\n\r\n return (\r\n <CustomModal\r\n headerName={title}\r\n isModalOpen\r\n closeModal={onClose}\r\n content={\r\n <div className=\"relative w-full h-[calc(100dvh-150px)]\">\r\n <div className=\"flex flex-col gap-4 px-2 pb-24 w-full h-full overflow-y-auto\">\r\n {formColumns.map((col, idx) => {\r\n const disable =\r\n typeof row.visibilityCondition[col.fieldName] === \"boolean\" &&\r\n row.visibilityCondition[col.fieldName] === false;\r\n\r\n if (disable) return null;\r\n\r\n const meta: ColumnSchema = resolveColumnMetaForRow(\r\n {\r\n ...col,\r\n enableDeleteButton: col.enableDeleteButton ?? true,\r\n enableExpandButton: col.enableExpandButton ?? true,\r\n enableMoveButton: col.enableMoveButton ?? true,\r\n enableOptionsButton: col.enableOptionsButton ?? true,\r\n },\r\n row,\r\n );\r\n\r\n return (\r\n <div key={col.fieldName} className=\"flex flex-col gap-2\">\r\n {col.fieldType !== \"checkbox\" && (\r\n <span className=\"font-medium text-sm\">\r\n {col.fieldCaption}\r\n </span>\r\n )}\r\n <CellRenderer\r\n key={`${row.id}-${col.fieldName}`}\r\n idx={idx}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={col.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={idx}\r\n mode={col.editable === false ? \"view\" : \"form\"}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"bottom-0 fixed px-4 py-4 -end-4 start-0 topShadow\">\r\n <CustomButton\r\n type=\"text\"\r\n className=\"flex justify-center items-center !bg-black-black95 focus:!text-none rounded w-full h-[42px] text-white text-sm\"\r\n onClick={onClose}\r\n >\r\n {t(\"general.add\")}\r\n </CustomButton>\r\n </div>\r\n </div>\r\n }\r\n />\r\n );\r\n}\r\n","import { useTranslations } from '../host';\r\nimport {\r\n CustomCheckbox,\r\n EditPencil,\r\n RedTrashBin,\r\n Undo,\r\n} from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\n\r\ninterface MobileIndexColProps {\r\n idx: number;\r\n row: UIRow;\r\n controller: UITableController;\r\n meta: ColumnSchema;\r\n}\r\n\r\nexport function MobileIndexCol({\r\n idx,\r\n row,\r\n controller,\r\n meta,\r\n}: MobileIndexColProps) {\r\n const t = useTranslations();\r\n\r\n const handleDeleteRow = () => {\r\n controller.dispatch({ type: \"ROW_DELETED\", rowId: row.id });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLInputElement>) => {\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isSelectedRow = controller.isSelectedRow(row.id);\r\n\r\n return (\r\n <div\r\n className={`${isDeleted && \"cursor-not-allowed\"} flex justify-between items-center w-full gap-2 px-2 h-full relative`}\r\n >\r\n <div className=\"flex justify-start items-center gap-2\">\r\n {!isDeleted && (\r\n <CustomCheckbox\r\n disabled={isDeleted}\r\n checked={!!isSelectedRow}\r\n onClick={handleSelectRow}\r\n />\r\n )}\r\n <div className=\"w-[20px] text-xs text-center\">{(idx + 1).toLocaleString('fa-IR')}</div>\r\n\r\n {!isDeleted && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n void controller.dispatch({\r\n type: 'UI_OPEN_MOBILE_EDIT',\r\n rowId: row.id,\r\n });\r\n }}\r\n className=\"hover:bg-zinc-200\"\r\n aria-label={t(\"general.edit\")}\r\n >\r\n <EditPencil config={{ width: 16, height: 16 }} />\r\n </button>\r\n )}\r\n\r\n {meta.enableDeleteButton && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDeleteRow();\r\n }}\r\n className=\"hover:bg-red-100\"\r\n >\r\n {!isDeleted ? (\r\n <RedTrashBin config={{ width: 18, height: 18 }} />\r\n ) : (\r\n <Undo config={{ width: 18, height: 18 }} />\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useMemo } from 'react';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { CellRenderer } from '../cellRenderer';\r\nimport { UIRow } from '../type';\r\nimport { MobileIndexCol } from './MobileIndexCol';\r\n\r\ninterface MobileTableRowProps {\r\n row: UIRow;\r\n index: number;\r\n columns: ColumnSchema[];\r\n controller: UITableController;\r\n tableKey: string;\r\n isSelected: boolean;\r\n isActive: boolean;\r\n isCut: boolean;\r\n}\r\n\r\nfunction MobileTableRowComponent({\r\n row,\r\n index,\r\n columns,\r\n controller,\r\n tableKey,\r\n isSelected: isSelectedRow,\r\n isActive: isActiveRow,\r\n isCut,\r\n}: MobileTableRowProps) {\r\n const visibleColumns = columns.filter(\r\n (c: ColumnSchema) => !c.hidden,\r\n );\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n\r\n const handleRowClick = (e: React.MouseEvent) => {\r\n controller.onRowClick(row.id, {\r\n ctrlKey: e.ctrlKey,\r\n shiftKey: e.shiftKey,\r\n });\r\n };\r\n\r\n const rowClass = useMemo(() => {\r\n return `relative w-full border bg-main-white\r\n ${isActiveRow ? \"border-gray-gray8\" : \"border-gray-gray5\"}\r\n ${isSelectedRow && !isDeleted ? \"bg-blue-100\" : \"\"}\r\n ${\r\n isDeleted\r\n ? \"!bg-gray-gray5 absolute inset-0 line-through\"\r\n : isSelectedRow\r\n ? \"\"\r\n : \"bg-main-white\"\r\n }\r\n ${isCut ? \" border-dashed opacity-30\" : \"\"}\r\n h-9 rounded`;\r\n }, [isActiveRow, isSelectedRow, isDeleted, isCut]);\r\n\r\n return (\r\n <tr className={rowClass} data-rowid={row.id} onClick={handleRowClick}>\r\n {visibleColumns.map((c: ColumnSchema, idx: number) => {\r\n const meta: ColumnSchema = {\r\n ...c,\r\n enableDeleteButton: c.enableDeleteButton ?? true,\r\n enableExpandButton: c.enableExpandButton ?? true,\r\n enableMoveButton: c.enableMoveButton ?? true,\r\n enableOptionsButton: c.enableOptionsButton ?? true,\r\n };\r\n\r\n if (c.fieldName === \"index\") {\r\n return (\r\n <td\r\n className=\"p-0 h-full\"\r\n key={c.fieldName}\r\n data-columnid={c.fieldName}\r\n >\r\n <MobileIndexCol\r\n idx={index}\r\n row={row}\r\n controller={controller}\r\n meta={meta}\r\n />\r\n </td>\r\n );\r\n }\r\n\r\n return (\r\n <td\r\n key={c.fieldName}\r\n className=\"p-0 h-full\"\r\n data-columnid={c.fieldName}\r\n >\r\n <CellRenderer\r\n idx={idx}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={c.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={idx}\r\n mode=\"view\"\r\n />\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n}\r\n\r\nexport const MobileTableRow = React.memo(\r\n MobileTableRowComponent,\r\n (prev, next) => {\r\n return (\r\n prev.row === next.row &&\r\n prev.index === next.index &&\r\n prev.columns === next.columns &&\r\n prev.isSelected === next.isSelected &&\r\n prev.isActive === next.isActive &&\r\n prev.isCut === next.isCut\r\n );\r\n },\r\n);\r\n","import { ColumnSchema } from '../../bootstrap/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\nimport { MobileTableRow } from './MobileTableRow';\r\n\r\ninterface MobileTableBodyProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n rows: UIRow[];\r\n columns: ColumnSchema[];\r\n}\r\n\r\nexport function MobileTableBody({\r\n controller,\r\n tableKey,\r\n rows,\r\n columns,\r\n}: MobileTableBodyProps) {\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\">\r\n {rows.map((row, index) => (\r\n <MobileTableRow\r\n key={row.id}\r\n row={row}\r\n index={index}\r\n columns={columns}\r\n controller={controller}\r\n tableKey={tableKey}\r\n isSelected={!!controller.isSelectedRow(row.id)}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n />\r\n ))}\r\n </tbody>\r\n );\r\n}\r\n","import React, { ReactNode, useEffect, useState } from 'react';\r\n\r\nimport { CustomDropdownButton, CustomCheckbox } from '../primitives';\r\n\r\nimport { ValidationCallbackResult } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\ninterface MobileTableHeaderProps {\r\n controller: UITableController;\r\n header?: ReactNode;\r\n}\r\n\r\nexport function MobileTableHeader({\r\n controller,\r\n header,\r\n}: MobileTableHeaderProps) {\r\n const table = controller.getViewState();\r\n const [validationResult, setValidationResult] =\r\n useState<ValidationCallbackResult>({\r\n valid: true,\r\n data: null,\r\n errors: new Map(),\r\n });\r\n\r\n useEffect(() => {\r\n const validation = controller.validation();\r\n validation((res) => {\r\n setValidationResult(res);\r\n });\r\n }, [controller, table?.activeCell?.columnId, table?.activeCell?.rowId]);\r\n\r\n if (!table || !table.columns) return null;\r\n\r\n const visibleColumns = table.columns.filter((c) => !c.hidden);\r\n const isSelectedActivePageRows = table.rows.every(\r\n (row) => !!table.selectedRows[row.id],\r\n );\r\n const handleSelectActivePageRows = () => {\r\n controller.dispatch({ type: \"TOGGLE_PAGE_ROW_SELECTED\" });\r\n };\r\n\r\n const allRows = controller.getAllRows() ?? [];\r\n const handleNavigateToError = (rowId: number) => {\r\n const currentTable = controller.getViewState();\r\n if (!currentTable || allRows.length === 0) return;\r\n const rowIndex = allRows.findIndex((r) => r.id.value == rowId) + 1;\r\n const { pageSize } = currentTable.pagination;\r\n const targetPage = Math.ceil(rowIndex / pageSize);\r\n controller.dispatch({ type: \"CHANGE_PAGE\", page: targetPage });\r\n };\r\n\r\n const items = Array.from((validationResult.errors ?? new Map()).entries()).map(\r\n ([key, value], errorIndex) => {\r\n const Index = allRows.findIndex((r) => r.id.value == value.rowId) + 1;\r\n\r\n return {\r\n key: errorIndex.toString(),\r\n label: (\r\n <button\r\n className=\"flex bg-red-300 text-red-600 text-xs\"\r\n onClick={() => {\r\n handleNavigateToError(value.rowId);\r\n }}\r\n >\r\n {`\r\n در سطر\r\n ${Index}\r\n در ستون\r\n ${value.caption} :\r\n ${value.message}`}\r\n </button>\r\n ),\r\n };\r\n },\r\n );\r\n\r\n return (\r\n <thead className=\"top-0 right-0 left-0 z-20 sticky inset-0\">\r\n {header}\r\n {!validationResult.valid && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"top-1 z-10 absolute flex m-0 p-0 rounded start-1\"\r\n items={items as any}\r\n >\r\n <span className=\"bg-red-600 border rounded-full w-2 h-2\"></span>\r\n </CustomDropdownButton>\r\n )}\r\n <tr className=\"relative h-10 bg-gray-gray3 rounded-t-lg w-full\">\r\n {visibleColumns.map((col) => {\r\n if (col.fieldType === \"index\") {\r\n return (\r\n <th\r\n key={col.fieldName}\r\n style={{ ...col.style, width: 120 }}\r\n className={`px-2 text-xs border text-start whitespace-nowrap ${col.className || \"\"}`}\r\n >\r\n <CustomCheckbox\r\n checked={isSelectedActivePageRows}\r\n onClick={handleSelectActivePageRows}\r\n />\r\n {col.fieldCaption}\r\n </th>\r\n );\r\n }\r\n\r\n return (\r\n <th\r\n key={col.fieldName}\r\n style={{ ...col.style, minWidth: col.minWidth }}\r\n className={`px-2 text-xs border text-start min-w-24 ${col.className || \"\"}`}\r\n >\r\n {col.fieldCaption}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n );\r\n}\r\n","export function scrollToTableEnd(\r\n container: HTMLElement | null,\r\n rowId?: number,\r\n): void {\r\n if (!container) return;\r\n\r\n container.scrollLeft = Math.max(\r\n 0,\r\n container.scrollWidth - container.clientWidth,\r\n );\r\n\r\n const rowEl = rowId\r\n ? container.querySelector<HTMLElement>(`tr[data-rowid=\"${rowId}\"]`)\r\n : container.querySelector<HTMLElement>('tbody tr:last-child');\r\n\r\n rowEl?.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });\r\n}\r\n","import { RefObject, useEffect, useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useMobileEditorState } from '../hooks/useEngineSelector';\r\nimport { scrollToTableEnd } from './scrollToTableEnd';\r\n\r\nexport function useScrollAfterMobileAdd(\r\n scrollRef: RefObject<HTMLElement | null>,\r\n controller: UITableController,\r\n revealAllRows: () => void,\r\n) {\r\n const mobileEditor = useMobileEditorState(controller);\r\n const previousEditorRef = useRef(mobileEditor);\r\n\r\n useEffect(() => {\r\n const previousEditor = previousEditorRef.current;\r\n previousEditorRef.current = mobileEditor;\r\n\r\n if (previousEditor?.mode !== 'add' || mobileEditor) {\r\n return;\r\n }\r\n\r\n revealAllRows();\r\n\r\n const rowId = previousEditor.rowId;\r\n requestAnimationFrame(() => {\r\n scrollToTableEnd(scrollRef.current, rowId);\r\n requestAnimationFrame(() => {\r\n scrollToTableEnd(scrollRef.current, rowId);\r\n });\r\n });\r\n }, [mobileEditor, revealAllRows, scrollRef]);\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n ReactNode,\r\n useEffect,\r\n useRef,\r\n} from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ERPTableFooter } from '../desktop/ERPTableFooter';\r\nimport { jsonEqual, useControllerSelector } from '../hooks/useEngineSelector';\r\nimport { useScrollToSearchMatch } from '../hooks/useScrollToSearchMatch';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { MobileActionButtons } from './MobileActionButtons';\r\nimport { MobileLoadMoreButton } from './MobileLoadMoreButton';\r\nimport { MobileRowFormModal } from './MobileRowFormModal';\r\nimport { MobileTableBody } from './MobileTableBody';\r\nimport { MobileTableHeader } from './MobileTableHeader';\r\nimport { useScrollAfterMobileAdd } from './useScrollAfterMobileAdd';\r\nimport { scrollToTableEnd } from './scrollToTableEnd';\r\n\r\nexport interface MobileTableProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n tableTitle?: ReactNode;\r\n header?: ReactNode;\r\n footer?: boolean | ReactNode;\r\n multiSelectConfig: IMultiSelectConfig;\r\n}\r\n\r\nexport function MobileTable({\r\n controller,\r\n tableKey,\r\n tableTitle,\r\n header,\r\n footer,\r\n multiSelectConfig,\r\n}: MobileTableProps) {\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const mobileView =controller.getMobileViewState();\r\n const mobileEditor = mobileView?.mobileEditor ?? null;\r\n useEffect(() => {\r\n controller.resetMobileVisibleRows();\r\n }, [controller, tableKey]);\r\n\r\n useScrollToSearchMatch(scrollRef, controller);\r\n useScrollAfterMobileAdd(scrollRef, controller, () =>\r\n controller.revealAllMobileRows(),\r\n );\r\n\r\n if (!mobileView) return null;\r\n\r\n return (\r\n <>\r\n <div className=\"flex flex-col w-full transition-all duration-200\">\r\n <div className=\"flex items-center gap-2 bg-main-white px-1 py-2 border-gray-gray5 border-b w-full shrink-0\">\r\n <div className=\"shrink-0\">{tableTitle}</div>\r\n <div className=\"flex items-center ms-auto\">\r\n <MobileActionButtons\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div\r\n ref={scrollRef}\r\n data-erp-table-scroll\r\n className=\"hidden-show-scrollBar overflow-x-auto [overflow-anchor:none]\"\r\n style={{ overflowAnchor: 'none' }}\r\n >\r\n <table className=\"min-w-max border-collapse\">\r\n <MobileTableHeader controller={controller} header={header} />\r\n <MobileTableBody\r\n controller={controller}\r\n tableKey={tableKey}\r\n rows={mobileView.rows}\r\n columns={mobileView.columns}\r\n />\r\n {footer && (\r\n <ERPTableFooter controller={controller} footer={footer} />\r\n )}\r\n </table>\r\n </div>\r\n\r\n {mobileView.hasMore && (\r\n <MobileLoadMoreButton\r\n onClick={\r\n \r\n async () =>{\r\n await controller.loadMoreMobileRows()\r\n scrollToTableEnd(scrollRef.current)\r\n } \r\n\r\n\r\n }\r\n visibleCount={mobileView.visibleCount}\r\n totalRows={mobileView.totalRows}\r\n />\r\n )}\r\n </div>\r\n\r\n {mobileEditor && (\r\n <MobileRowFormModal\r\n controller={controller}\r\n tableKey={tableKey}\r\n editor={mobileEditor}\r\n onClose={() => {\r\n void controller.dispatch({ type: 'UI_CLOSE_MOBILE_EDITOR' });\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n}\r\n","//domain/events\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n} from '../value-objects';\r\n\r\nexport class TablePageChanged {\r\n constructor(\r\n public readonly page: number,\r\n public readonly pageSize: number\r\n ) {}\r\n}\r\n\r\n\r\nexport class CellChanged {\r\n readonly type = 'CELL_CHANGED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly newValue: unknown,\r\n public readonly previousValue: unknown,\r\n ) { }\r\n}\r\nexport class DisplayChanged {\r\n readonly type = 'DISPLAY_CHANGED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly newValue: unknown\r\n ) { }\r\n}\r\nexport class DescriptionSaved {\r\n readonly type = 'DESCRIPTION_SAVED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly flag: boolean,\r\n \r\n ) { }\r\n}\r\nexport class Validated {\r\n readonly type = 'CELL_VALIDATED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly valid: boolean,\r\n public readonly error: string\r\n ) { }\r\n}\r\n\r\nexport class ColumnReordered {\r\n readonly type = \"COLUMN_REORDERED\";\r\n constructor(\r\n public readonly sourceIndex: number,\r\n public readonly destIndex: number\r\n ) { }\r\n}\r\n\r\nexport class DynamicDataRequested {\r\n readonly type = 'DYNAMIC_DATA_REQUESTED';\r\n\r\n constructor(\r\n public readonly sourceColumn: ColumnId,\r\n public readonly value: CellValue\r\n ) { }\r\n}\r\n\r\nexport type PageChanged = { type: \"PageChanged\"; payload: { page: number; }; };\r\n\r\nexport class RowAdded {\r\n readonly type = 'ROW_ADDED';\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class NewRowAdded {\r\n readonly type = 'NEW_ROW_ADDED';\r\n\r\n constructor(public readonly rowId: RowId,\r\n public readonly initialValues: Record<string, unknown>\r\n ) { }\r\n}\r\n\r\nexport class RowDeleted {\r\n readonly type = \"ROW_DELETED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class RowRemoved {\r\n readonly type = \"NEW_ROW_REMOVED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class MinimumRowConstraintViolated {\r\n readonly type = \"NEW_AND_FIRST_ROW_CAN_NOT_BE_REMOVE\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\n\r\n\r\nexport class RowRestored {\r\n readonly type = \"ROW_RESTORED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\n\r\nexport class RowReordered {\r\n readonly type = \"ROW_REORDERED\";\r\n constructor(\r\n public readonly draggedRowNum: number,\r\n public readonly droppedRowNum: number\r\n ) { }\r\n}\r\n\r\nexport class RowExpanded {\r\n constructor(public readonly rowId: RowId) {}\r\n}\r\nexport class RowCollapsed {\r\n constructor(public readonly rowId: RowId) {}\r\n}","// domain/entities/Cell.ts\r\nimport {\r\n CellChanged,\r\n DisplayChanged,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n} from '../value-objects';\r\n\r\nexport class Cell {\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n private value: CellValue,\r\n private originalValue: CellValue,\r\n private display: CellDisplay\r\n ) { }\r\n changeValue(newValue: unknown): CellChanged | null {\r\n // if (this.value.equals(newValue)) return null;\r\n const previousValue = this.value.value;\r\n this.value = new CellValue(newValue);\r\n return new CellChanged(this.rowId, this.columnId, newValue, previousValue);\r\n }\r\n changeDisplay(newValue: unknown): DisplayChanged | null {\r\n if (this.display.value===newValue) return null;\r\n this.display = new CellValue(newValue);\r\n return new DisplayChanged(this.rowId, this.columnId, newValue);\r\n }\r\n\r\n changeOriginalValue(newValue: unknown): CellChanged | null {\r\n if (this.originalValue.value ===newValue) return null;\r\n const previousValue = this.originalValue.value;\r\n this.originalValue = new CellValue(newValue);\r\n return new CellChanged(this.rowId, this.columnId, newValue, previousValue);\r\n }\r\n\r\n getValue(): unknown {\r\n return this.value.value;\r\n }\r\n getValueObject(): CellValue {\r\n return this.value;\r\n }\r\n getDisplay(): unknown {\r\n return this.display.value;\r\n }\r\n getDisplayObject(): CellDisplay {\r\n return this.display;\r\n }\r\n getOriginalValue(): CellValue {\r\n return this.originalValue;\r\n }\r\n\r\n clone(): Cell {\r\n return new Cell(this.rowId, this.columnId, this.value, this.originalValue, this.display);\r\n }\r\n}\r\n","import type { ColumnSchema } from '../types/ColumnSchema';\r\nimport { Row } from './Row';\r\n\r\nexport class Collection {\r\n\r\n constructor(\r\n public name: string = \"default\",\r\n private rows: Map<number, Row>,\r\n private columns: Map<string, ColumnSchema>,\r\n\r\n\r\n\r\n ) { }\r\n setCollectionName(name: string): void {\r\n this.name = name\r\n }\r\n getCollectionName(): string {\r\n return this.name\r\n }\r\n getRows(): Map<number, Row> {\r\n return this.rows;\r\n }\r\n setRows(rows: Map<number, Row>): void {\r\n this.rows = rows;\r\n }\r\n\r\n getColumns(): Map<string, ColumnSchema> {\r\n return this.columns;\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n","//domain/entities\r\nimport {\r\n CellChanged,\r\n DescriptionSaved,\r\n DisplayChanged,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../value-objects';\r\nimport { Cell } from './Cell';\r\n\r\nexport class Row {\r\n\r\n constructor(\r\n public id: RowId,\r\n public cells: Map<string, Cell>,\r\n public rowState: RowState,\r\n public changeFields: Set<string> = new Set(),\r\n public visibilityCondition: Record<string, boolean>,\r\n public collection: string = \"default\",\r\n public isSaveDescription: boolean\r\n ) { }\r\n updateChangeFields(columnId: ColumnId): void {\r\n const cell = this.cells.get(columnId.value);\r\n if (!cell) return;\r\n const value = cell.getValueObject();\r\n const originalValue = cell.getOriginalValue();\r\n if (this.rowState.value !== RowStateEnum.Added) {\r\n if (!value.equals(originalValue)) {\r\n this.changeFields.add(columnId.value);\r\n } else {\r\n this.changeFields.delete(columnId.value);\r\n }\r\n if (this.changeFields.size > 0) {\r\n this.rowState = new RowState(RowStateEnum.Modified)\r\n } else {\r\n this.rowState = new RowState(RowStateEnum.Unchanged)\r\n }\r\n }\r\n }\r\n\r\n getCollection(): string {\r\n return this.collection\r\n }\r\n setCollection(collection:string) {\r\n this.collection = collection\r\n }\r\n getChangeFields(): readonly string[] {\r\n return Array.from(this.changeFields);\r\n }\r\n getSnapshotChangeFields(): readonly string[] {\r\n return Array.from(this.changeFields).map(field =>\r\n field.replace(\"index\", \"RowNum\")\r\n );\r\n }\r\n changeCell(\r\n columnId: ColumnId,\r\n value: unknown\r\n ): CellChanged | null {\r\n const cell = this.cells.get(columnId.value);\r\n if (!cell) return null;\r\n return cell.changeValue(value);\r\n }\r\n saveDescription(\r\n flag: boolean,\r\n\r\n ): DescriptionSaved {\r\n this.isSaveDescription = flag\r\n return new DescriptionSaved( this.id,flag) \r\n }\r\n changeDisplay(\r\n columnId: ColumnId,\r\n value: unknown\r\n ): DisplayChanged | null {\r\n const cell = this.cells.get(columnId.value);\r\n if (!cell) return null;\r\n return cell.changeDisplay(value);\r\n }\r\n getCells(): ReadonlyMap<string, Cell> {\r\n return new Map(this.cells);\r\n }\r\n getCell(columnId: string): Cell|undefined {\r\n return this.cells.get(columnId)\r\n }\r\n ensureCell(columnId: ColumnId, defaultValue: CellValue, displayValue: CellDisplay) {\r\n if (this.cells.has(columnId.value)) return;\r\n\r\n const newCell = new Cell(this.id, columnId, defaultValue, defaultValue, displayValue);\r\n this.cells.set(columnId.value, newCell);\r\n }\r\n setRowId(rowId: RowId) {\r\n this.id.set(rowId);\r\n }\r\n \r\n setVisibilityCondition(Condition: Record<string, boolean>) {\r\n this.visibilityCondition = Condition;\r\n }\r\n getVisibilityCondition(): Record<string, boolean> {\r\n return this.visibilityCondition\r\n }\r\n \r\n\r\n removeCell(columnId: ColumnId) {\r\n this.cells.delete(columnId.value);\r\n }\r\n\r\n\r\n clone(): Row {\r\n const clonedCells = new Map<string, Cell>();\r\n for (const [k, cell] of this.cells.entries()) {\r\n const clonedCell = cell.clone();\r\n clonedCells.set(k, clonedCell);\r\n }\r\n return new Row(this.id, clonedCells, this.rowState, this.changeFields,this.visibilityCondition, this.collection,this.isSaveDescription);\r\n }\r\n\r\n}\r\n","import type { ColumnSchema } from '../types/ColumnSchema';\r\nimport {\r\n CellChanged,\r\n ColumnReordered,\r\n DescriptionSaved,\r\n DisplayChanged,\r\n MinimumRowConstraintViolated,\r\n RowAdded,\r\n RowDeleted,\r\n RowRemoved,\r\n RowReordered,\r\n RowRestored,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n KeyValue,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n TableActions,\r\n} from '../value-objects';\r\nimport { Cell } from './Cell';\r\nimport { Collection } from './Collection';\r\nimport { Row } from './Row';\r\n\r\nexport type CollectionScope = 'active' | 'all' | string[];\r\n\r\nexport class Table {\r\n constructor(\r\n public readonly id: string,\r\n private collection: Map<string, Collection>,\r\n private pagination: Pagination,\r\n private action: TableActions,\r\n private activeCollection: string = 'default'\r\n ) { }\r\n\r\n // ─── Collection accessor helper ───────────────────────────────────────────\r\n\r\n private getActiveCollection(): Collection {\r\n const collection = this.collection.get(this.activeCollection);\r\n if (!collection) throw new Error(`Collection \"${this.activeCollection}\" not found`);\r\n return collection;\r\n }\r\n private getCollection(collectionName: string): Collection {\r\n const collection = this.collection.get(collectionName);\r\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\r\n return collection;\r\n }\r\n /** Finds which Collection currently owns a given column id (if any). */\r\n private findCollectionForColumn(columnKey: string): Collection | undefined {\r\n for (const col of this.collection.values()) {\r\n if (col.getColumns().has(columnKey)) return col;\r\n }\r\n return undefined;\r\n }\r\n\r\n getCollections(): Map<string, Collection> {\r\n return this.collection;\r\n }\r\n\r\n // ─── Column helpers ───────────────────────────────────────────────────────\r\n\r\n getColumnSchema(columnId: ColumnId): ColumnSchema | undefined {\r\n return this.getActiveCollection().getColumns().get(columnId.value);\r\n }\r\n\r\n getActiveCollectionName(): string {\r\n return this.activeCollection;\r\n }\r\n\r\n setActiveCollection(activeCollection: string): void {\r\n this.activeCollection = activeCollection;\r\n }\r\n\r\n getRowCollection(rowId: number): string | undefined {\r\n return this.getActiveCollection().getRows().get(rowId)?.getCollection();\r\n }\r\n\r\n setRowCollection(rowId: number, collection: string): void {\r\n this.getActiveCollection().getRows().get(rowId)?.setCollection(collection);\r\n }\r\n\r\n setColumnSchema(columnId: ColumnId, DetailColumnConfig: ColumnSchema): ColumnSchema | undefined {\r\n const prev = this.getActiveCollection().getColumns().get(columnId.value);\r\n this.getActiveCollection().getColumns().set(columnId.value, DetailColumnConfig);\r\n return prev;\r\n }\r\n\r\n getColumns(): ColumnSchema[] {\r\n return Array.from(this.getActiveCollection().getColumns().values());\r\n }\r\n getActiveCollectionColumns(): ColumnSchema[] {\r\n const allColumns = this.getActiveCollection().getColumns();\r\n return Array.from(allColumns.values()).sort(\r\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\r\n );\r\n }\r\n\r\n getColumnsForCollectionScope(collectionScope: CollectionScope = 'active'): ColumnSchema[] {\r\n if (collectionScope === 'active') return this.getActiveCollectionColumns();\r\n\r\n const names = collectionScope === 'all' ? Array.from(this.collection.keys()) : collectionScope;\r\n const merged = new Map<string, ColumnSchema>();\r\n for (const name of names) {\r\n for (const [id, col] of this.getCollection(name).getColumns()) {\r\n merged.set(id, col);\r\n }\r\n }\r\n return Array.from(merged.values());\r\n }\r\n getColumnValues(colId: string): unknown[] {\r\n const result: unknown[] = [];\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n const cell = row.getCell(colId);\r\n if (!cell) continue;\r\n result.push(cell.getValue());\r\n }\r\n return result;\r\n }\r\n\r\n setColumns(newColumns: ColumnSchema[]): void {\r\n // Snapshot before clear — getColumns() returns the live Map reference.\r\n const existingByField = new Map(this.getActiveCollection().getColumns());\r\n for (const col of this.collection.values()) {\r\n col.getColumns().clear();\r\n }\r\n\r\n for (const col of newColumns) {\r\n const existing = existingByField.get(col.fieldName);\r\n const targetCollectionKey = col.fieldCollection ?? this.activeCollection;\r\n const updatedCol: ColumnSchema = {\r\n ...col,\r\n fieldCollection: targetCollectionKey,\r\n // Prefer explicit hidden from caller; otherwise keep persisted visibility.\r\n hidden: col.hidden ?? existing?.hidden ?? false,\r\n };\r\n const targetCollection = this.collection.get(targetCollectionKey);\r\n if (targetCollection) {\r\n targetCollection.getColumns().set(col.fieldName, updatedCol);\r\n }\r\n }\r\n\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n for (const col of newColumns) {\r\n if (!row.getCells().has(col.fieldName)) {\r\n const defaultValue = col.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n const defaultDisplay = col.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n row.ensureCell(new ColumnId(col.fieldName), defaultValue, defaultDisplay);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n // ─── Cell mutations ───────────────────────────────────────────────────────\r\n\r\n changeCell(rowId: RowId, columnId: ColumnId, value: unknown): CellChanged | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n const ev = row.changeCell(columnId, value);\r\n if (ev) row.updateChangeFields(columnId);\r\n return ev;\r\n }\r\n\r\n changeDisplay(rowId: RowId, columnId: ColumnId, value: unknown): DisplayChanged | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n return row.changeDisplay(columnId, value);\r\n }\r\n\r\n saveDescription(rowId: RowId, flag: boolean): DescriptionSaved | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n return row.saveDescription(flag);\r\n }\r\n\r\n // ─── Row operations ───────────────────────────────────────────────────────\r\n\r\n duplicateRow(rowId: RowId): RowAdded {\r\n const col = this.getActiveCollection();\r\n const target = col.getRows().get(rowId.value);\r\n if (!target) throw new Error('Row not found');\r\n\r\n const rowsArray = Array.from(col.getRows().values());\r\n const targetIndex = rowsArray.findIndex(r => r.id.value === rowId.value);\r\n const nextRow = targetIndex < rowsArray.length - 1 ? rowsArray[targetIndex + 1] : undefined;\r\n\r\n const targetIndexValue = target.getCell('index')?.getValue() as number;\r\n let x: number;\r\n if (!nextRow) {\r\n x = targetIndexValue + 1;\r\n } else {\r\n const nextIndexValue = nextRow.getCell('index')?.getValue() as number;\r\n x = (targetIndexValue + nextIndexValue) / 2;\r\n }\r\n\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const newCells = new Map<string, Cell>();\r\n const newIndex = new CellValue(x);\r\n const newDisplay = new CellDisplay(x);\r\n\r\n for (const [colId, cell] of target.getCells().entries()) {\r\n if (colId === 'index') {\r\n newCells.set(colId, new Cell(newRowId, new ColumnId(colId), newIndex, newIndex, newDisplay));\r\n } else {\r\n newCells.set(\r\n colId,\r\n new Cell(\r\n newRowId,\r\n new ColumnId(colId),\r\n cell.getValueObject(),\r\n cell.getValueObject(),\r\n cell.getDisplayObject(),\r\n )\r\n );\r\n }\r\n }\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n newCells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n target.visibilityCondition,\r\n target.collection,\r\n target.isSaveDescription\r\n );\r\n\r\n rowsArray.sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number)\r\n );\r\n rowsArray.splice(targetIndex + 1, 0, newRow);\r\n col.setRows(new Map(rowsArray.map(r => [r.id.value, r])));\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addRow(targetRowId: number, placedRowId?: number): RowAdded {\r\n const col = this.getActiveCollection();\r\n const target = col.getRows().get(targetRowId);\r\n if (!target) throw new Error('Row not found');\r\n\r\n const rowsArray = Array.from(col.getRows().values()).sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number)\r\n );\r\n\r\n let placeIndex: number | undefined;\r\n let x = 0;\r\n\r\n if (placedRowId !== undefined) {\r\n placeIndex = rowsArray.findIndex(r => r.id.value === placedRowId);\r\n const placedRow = rowsArray[placeIndex];\r\n const placeIndexValue = placedRow?.getCell('index')?.getValue() as number;\r\n const nextRow = placeIndex < rowsArray.length - 1 ? rowsArray[placeIndex + 1] : undefined;\r\n if (nextRow) {\r\n const nextIndexValue = nextRow.getCell('index')?.getValue() as number;\r\n x = (placeIndexValue + nextIndexValue) / 2;\r\n } else {\r\n x = placeIndexValue + 1;\r\n }\r\n } else {\r\n const lastRowIndexValue = rowsArray[rowsArray.length - 1].getCell('index')?.getValue() as number;\r\n x = lastRowIndexValue + 1;\r\n }\r\n\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const newCells = new Map<string, Cell>();\r\n const newIndex = new CellValue(x);\r\n const newDisplay = new CellDisplay(x);\r\n\r\n for (const [colId, cell] of target.getCells().entries()) {\r\n\r\n if (colId === \"index\") {\r\n newCells.set(\"index\", new Cell(newRowId, new ColumnId(\"index\"), newIndex, newIndex, newDisplay));\r\n } else {\r\n newCells.set(\r\n colId,\r\n new Cell(\r\n newRowId,\r\n new ColumnId(colId),\r\n cell.getValueObject(),\r\n cell.getValueObject(),\r\n cell.getDisplayObject(),\r\n )\r\n );\r\n }\r\n }\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n newCells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n target.visibilityCondition,\r\n target.collection,\r\n target.isSaveDescription\r\n );\r\n\r\n rowsArray.splice((placeIndex ?? 0) + 1, 0, newRow);\r\n col.setRows(new Map<number, Row>(rowsArray.map(r => [r.id.value, r])));\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addNewRow(data?: KeyValue[]): RowAdded {\r\n const col = this.getActiveCollection();\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const rowId = new RowId(newRowId.value);\r\n const cells = new Map<string, Cell>();\r\n\r\n const dataMap = data ? new Map(data.map(kv => [kv.key, kv])) : undefined;\r\n\r\n // getColumns() already returns the active collection columns.\r\n // Do not filter by fieldCollection === activeCollection: after reload /\r\n // setColumns, fieldCollection may be undefined and the filter would\r\n // create a row with zero cells (breaks validation + action clicks).\r\n this.getColumns().forEach(column => {\r\n const columnId = column.fieldName;\r\n let value: unknown = null;\r\n let display: unknown = null;\r\n if (columnId === \"index\") {\r\n const rows = Array.from(col.getRows().values());\r\n\r\n const maxIndex = rows.length\r\n ? Math.max(\r\n ...rows.map(r =>\r\n Number(r.getCell(\"index\")?.getValue() ?? 0)\r\n )\r\n )\r\n : 0;\r\n\r\n value = maxIndex + 1;\r\n display = value;\r\n } else if (dataMap?.has(columnId)) {\r\n const item = dataMap.get(columnId);\r\n value = item?.value;\r\n display = item?.display;\r\n }\r\n\r\n const cellValue = new CellValue(value);\r\n const cellDisplay = new CellValue(display);\r\n cells.set(columnId, new Cell(rowId, new ColumnId(columnId), cellValue, cellValue, cellDisplay));\r\n });\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n cells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n {} as Record<string, boolean>,\r\n this.activeCollection,\r\n false\r\n );\r\n\r\n col.getRows().set(newRowId.value, newRow);\r\n\r\n const totalRows = col.getRows().size;\r\n const lastPage = Math.ceil(totalRows / this.pagination.pageSize);\r\n this.changePage(lastPage);\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addNewRows(cmd: { rows: KeyValue[][]; detailFieldKey: string }): RowAdded[] {\r\n const events: RowAdded[] = [];\r\n const existingValues = new Set(\r\n this.getRows().map(r => r.getCell(cmd.detailFieldKey)?.getValue())\r\n );\r\n\r\n for (const data of cmd.rows) {\r\n const incomingValue = data.find(kv => kv.key === cmd.detailFieldKey)?.value;\r\n if (incomingValue !== undefined && !existingValues.has(incomingValue)) {\r\n events.push(this.addNewRow(data));\r\n existingValues.add(incomingValue);\r\n }\r\n }\r\n return events;\r\n }\r\n\r\n addColumns(newColumns: ColumnSchema[]): { added: ColumnId[] } {\r\n const added: ColumnId[] = [];\r\n const allColumns = this.getActiveCollection().getColumns();\r\n for (const incoming of newColumns) {\r\n const key = incoming.fieldName;\r\n const existing = allColumns.get(key);\r\n const targetCollectionKey = incoming.fieldCollection ?? this.activeCollection;\r\n const targetCollection = this.collection.get(targetCollectionKey);\r\n if (!targetCollection) continue;\r\n if (existing) {\r\n const shouldUnhide = existing.hidden === true;\r\n targetCollection.getColumns().set(key, {\r\n ...existing,\r\n editable: incoming.editable ?? existing.editable,\r\n hidden: shouldUnhide ? false : existing.hidden,\r\n });\r\n if (shouldUnhide) added.push(new ColumnId(incoming.fieldName));\r\n continue;\r\n }\r\n targetCollection.getColumns().set(key, {\r\n ...incoming,\r\n fieldCollection: targetCollectionKey,\r\n hidden: incoming.hidden ?? false,\r\n });\r\n added.push(new ColumnId(incoming.fieldName));\r\n\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n const defaultValue =\r\n incoming.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n const defaultDisplay =\r\n incoming.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n row.ensureCell(new ColumnId(incoming.fieldName), defaultValue, defaultDisplay);\r\n }\r\n }\r\n\r\n return { added };\r\n }\r\n\r\n removeColumns(columnIds: ColumnId[]): { removed: ColumnId[] } {\r\n const removed: ColumnId[] = [];\r\n for (const colId of columnIds) {\r\n const ownerCollection = this.findCollectionForColumn(colId.value);\r\n if (!ownerCollection) continue;\r\n const schema = ownerCollection.getColumns().get(colId.value);\r\n if (!schema || schema.hidden) continue;\r\n ownerCollection.getColumns().set(colId.value, { ...schema, hidden: true });\r\n removed.push(colId);\r\n }\r\n return { removed };\r\n }\r\n\r\n // ─── Row reads ────────────────────────────────────────────────────────────\r\n\r\n\r\n getRows(collectionScope: CollectionScope = 'active'): Row[] {\r\n if (collectionScope === 'all') {\r\n const rows: Row[] = [];\r\n for (const col of this.collection.values()) {\r\n rows.push(...col.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n if (Array.isArray(collectionScope)) {\r\n const rows: Row[] = [];\r\n for (const name of collectionScope) {\r\n const collection = this.getCollection(name);\r\n rows.push(...collection.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n return Array.from(this.getActiveCollection().getRows().values());\r\n }\r\n getCollectionsRows(collections: string[]): Row[] {\r\n const rows: Row[] = [];\r\n for (const name of collections) {\r\n const collection = this.getCollection(name);\r\n rows.push(...collection.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n getRow(rowId: number): Row | undefined {\r\n return this.getActiveCollection().getRows().get(rowId);\r\n }\r\n\r\n addRows(newRows: Row[]): void {\r\n const rows = this.getActiveCollection().getRows();\r\n newRows.forEach(r => rows.set(r.id.value, r));\r\n }\r\n\r\n // ─── Pagination ───────────────────────────────────────────────────────────\r\n\r\n getPagination(): Pagination {\r\n return this.pagination;\r\n }\r\n\r\n setPagination(pagination: Pagination): void {\r\n this.pagination = pagination;\r\n }\r\n\r\n changePage(page: number): void {\r\n this.pagination = this.pagination.changePage(page);\r\n }\r\n\r\n changePageSize(size: number): void {\r\n this.pagination = this.pagination.changePageSize(size).changePage(1);\r\n }\r\n\r\n getVisibleRows(): Row[] {\r\n const filteredRows = this.getRows().filter(r => r.collection === this.activeCollection);\r\n const start = (this.pagination.page - 1) * this.pagination.pageSize;\r\n return filteredRows.slice(start, start + this.pagination.pageSize);\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────\r\n\r\n setTableAction(action: TableActions): void {\r\n this.action = action;\r\n }\r\n\r\n getTableAction(): TableActions {\r\n return this.action;\r\n }\r\n\r\n // ─── Delete / restore ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Re-inserts a previously Added row after hard-remove (undo of ADD → redo).\r\n * Preserves rowId and cell values; no-ops if the id already exists.\r\n */\r\n restoreAddedRow(params: {\r\n rowId: number;\r\n cells: Readonly<\r\n Record<\r\n string,\r\n {\r\n readonly value: unknown;\r\n readonly display?: unknown;\r\n readonly originalValue?: unknown;\r\n }\r\n >\r\n >;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n }): RowAdded {\r\n const col = this.getActiveCollection();\r\n const existing = col.getRows().get(params.rowId);\r\n if (existing) {\r\n return new RowAdded(existing.id);\r\n }\r\n\r\n const rowId = new RowId(params.rowId);\r\n const cells = new Map<string, Cell>();\r\n\r\n for (const [columnId, snap] of Object.entries(params.cells)) {\r\n const value = new CellValue(snap.value);\r\n const original = new CellValue(\r\n snap.originalValue !== undefined ? snap.originalValue : snap.value,\r\n );\r\n const display = new CellDisplay(\r\n snap.display !== undefined ? snap.display : snap.value,\r\n );\r\n cells.set(\r\n columnId,\r\n new Cell(rowId, new ColumnId(columnId), value, original, display),\r\n );\r\n }\r\n\r\n for (const column of this.getColumns()) {\r\n if (cells.has(column.fieldName)) continue;\r\n const empty = new CellValue(null);\r\n cells.set(\r\n column.fieldName,\r\n new Cell(\r\n rowId,\r\n new ColumnId(column.fieldName),\r\n empty,\r\n empty,\r\n new CellDisplay(null),\r\n ),\r\n );\r\n }\r\n\r\n const newRow = new Row(\r\n rowId,\r\n cells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n {} as Record<string, boolean>,\r\n params.collection ?? this.activeCollection,\r\n params.isSaveDescription ?? false,\r\n );\r\n\r\n col.getRows().set(rowId.value, newRow);\r\n return new RowAdded(rowId);\r\n }\r\n\r\n deleteRow(\r\n rowId: RowId\r\n ): RowDeleted | RowRestored | RowRemoved | MinimumRowConstraintViolated | null {\r\n const col = this.getActiveCollection();\r\n const rows = col.getRows();\r\n const row = rows.get(rowId.value);\r\n if (!row) return null;\r\n if (row.rowState.value === RowStateEnum.Added && rows.size === 1) {\r\n rows.delete(rowId.value);\r\n this.addNewRow();\r\n return new MinimumRowConstraintViolated(rowId);\r\n }\r\n\r\n if (row.rowState.value === RowStateEnum.Added && rows.size > 1) {\r\n rows.delete(rowId.value);\r\n return new RowRemoved(rowId);\r\n }\r\n\r\n if (row.rowState.value === RowStateEnum.Unchanged) {\r\n row.rowState = new RowState(RowStateEnum.Deleted);\r\n row.updateChangeFields(new ColumnId('RowState'));\r\n return new RowDeleted(rowId);\r\n }\r\n\r\n // Modified or Deleted → restore\r\n if (row.getChangeFields().length > 0) {\r\n row.rowState = new RowState(RowStateEnum.Modified);\r\n } else {\r\n row.rowState = new RowState(RowStateEnum.Unchanged);\r\n }\r\n row.updateChangeFields(new ColumnId('RowState'));\r\n return new RowRestored(rowId);\r\n }\r\n // ─── Reorder ──────────────────────────────────────────────────────────────\r\n reorderRows(\r\n draggedRowNum: number,\r\n droppedRowNum: number,\r\n position: 'before' | 'after' = 'after'\r\n ): RowReordered {\r\n if (draggedRowNum === droppedRowNum) return new RowReordered(draggedRowNum, droppedRowNum);\r\n\r\n const col = this.getActiveCollection();\r\n const rowsArray = Array.from(col.getRows().values()).sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number)\r\n );\r\n\r\n const fromIndex = rowsArray.findIndex(r => r.id.value === draggedRowNum);\r\n const toIndex = rowsArray.findIndex(r => r.id.value === droppedRowNum);\r\n if (fromIndex === -1 || toIndex === -1)\r\n throw new Error(`Row ${draggedRowNum} or ${droppedRowNum} does not exist`);\r\n\r\n const [moved] = rowsArray.splice(fromIndex, 1);\r\n let insertIndex = toIndex;\r\n if (position === 'after') {\r\n insertIndex = toIndex + 1;\r\n if (fromIndex < toIndex) insertIndex -= 1;\r\n } else {\r\n if (fromIndex < toIndex) insertIndex -= 1;\r\n }\r\n\r\n let newIndex: number;\r\n if (insertIndex === 0) {\r\n newIndex = (rowsArray[0]?.getCell('index')?.getValue() as number) / 2;\r\n } else if (insertIndex >= rowsArray.length) {\r\n newIndex = (rowsArray[rowsArray.length - 1]?.getCell('index')?.getValue() as number) + 1;\r\n } else {\r\n const prevIndex = rowsArray[insertIndex - 1].getCell('index')?.getValue() as number;\r\n const nextIndex = rowsArray[insertIndex].getCell('index')?.getValue() as number;\r\n newIndex = (prevIndex + nextIndex) / 2;\r\n }\r\n\r\n moved.changeCell(new ColumnId('index'), newIndex);\r\n rowsArray.splice(insertIndex, 0, moved);\r\n col.setRows(new Map(rowsArray.map(r => [r.id.value, r])));\r\n moved.updateChangeFields(new ColumnId('index'));\r\n\r\n return new RowReordered(draggedRowNum, droppedRowNum);\r\n }\r\n\r\n reorderColumns(sourceIndex: number, destIndex: number): ColumnReordered {\r\n // Reorders columns within the currently active Collection only.\r\n const activeCollection = this.getActiveCollection();\r\n const colsMap = activeCollection.getColumns();\r\n const colsArray = Array.from(colsMap.values());\r\n const [moved] = colsArray.splice(sourceIndex, 1);\r\n colsArray.splice(destIndex, 0, moved);\r\n\r\n colsMap.clear();\r\n for (const c of colsArray) {\r\n colsMap.set(c.fieldName, c);\r\n }\r\n\r\n return new ColumnReordered(sourceIndex, destIndex);\r\n }\r\n\r\n // ─── Clone ────────────────────────────────────────────────────────────────\r\n\r\n clone(): Table {\r\n const clonedCollection = new Map<string, Collection>();\r\n\r\n for (const [collectionName, col] of this.collection.entries()) {\r\n\r\n const clonedRows = new Map<number, Row>();\r\n\r\n for (const [k, row] of col.getRows().entries()) {\r\n clonedRows.set(k, row.clone());\r\n }\r\n\r\n clonedCollection.set(\r\n collectionName,\r\n new Collection(\r\n col.getCollectionName(),\r\n clonedRows,\r\n new Map(col.getColumns())\r\n )\r\n );\r\n }\r\n\r\n return new Table(\r\n this.id,\r\n clonedCollection,\r\n this.pagination,\r\n this.action,\r\n this.activeCollection\r\n );\r\n }\r\n}","// application/commands/tableCommands.ts\r\n\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport type {\r\n GridSearchState,\r\n MobileEditorState,\r\n} from '../../engine/type';\r\n\r\nexport interface BaseTableCommand {\r\n readonly store: string;\r\n readonly tableKey: string;\r\n /** When set, undoable events from separate executes merge into one undo unit. */\r\n readonly correlationId?: string;\r\n}\r\n\r\nexport type Actor = {\r\n readonly userId: string;\r\n readonly roles: string[];\r\n};\r\n\r\n/**\r\n * Base invariant:\r\n * هر Command دقیقاً متعلق به یک Table است\r\n */\r\n\r\n/* ---------- Cell ---------- */\r\n\r\nexport interface MoveActiveCellCommand {\r\n readonly type: 'MOVE_ACTIVE_CELL';\r\n readonly store: string;\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly direction: 'next' | 'prev';\r\n}\r\nexport interface MoveActiveCellVerticalCommand {\r\n readonly type: 'MOVE_ACTIVE_CELL_VERTICAL';\r\n readonly store: string;\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface MoveVerticalSelectedRows {\r\n readonly type: 'MOVE_VERTICAL_SELECTED_ROWS';\r\n readonly tableKey: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface MoveVerticalActiveRow {\r\n readonly type: 'MOVE_VERTICAL_ACTIVE_ROW';\r\n readonly tableKey: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface ActiveCellCommand {\r\n readonly type: 'ACTIVE_CELL';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n}\r\nexport interface ActiveRowCommand extends BaseTableCommand {\r\n readonly type: 'ACTIVE_ROW';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n}\r\nexport interface ActiveFirstCellCommand {\r\n readonly type: 'ACTIVATE_FIRST_CELL';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n\r\n}\r\n\r\nexport interface ChangeCellValueCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_CELL_VALUE';\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: unknown;\r\n}\r\n \r\nexport interface SaveDescriptionCommand extends BaseTableCommand {\r\n readonly type: 'SAVE_DESCRIPTION';\r\n readonly rowId: number;\r\n readonly flag: boolean;\r\n \r\n}\r\nexport interface ChangeCellDisplayValueCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_CELL_DISPLAY_VALUE';\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: string;\r\n}\r\n\r\n\r\n/* ---------- Row ---------- */\r\n\r\nexport interface AddEmptyRowCommand extends BaseTableCommand {\r\n readonly type: 'ADD_EMPTY_ROW';\r\n readonly autoActivate: boolean;\r\n}\r\nexport interface AddNewRowsCommand extends BaseTableCommand {\r\n readonly type: 'ADD_NEW_ROWS';\r\n readonly detailFieldKey: string;\r\n readonly rows: {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n }[][];\r\n readonly autoActivate?: boolean;\r\n}\r\n\r\n\r\nexport interface DuplicateRowCommand extends BaseTableCommand {\r\n readonly type: 'DUPLICATE_ROW';\r\n readonly rowId: number;\r\n}\r\n\r\n/**\r\n * Clone one source row (clipboard paste). Engine batches these with a shared\r\n * correlationId so undo reverses the whole paste unit.\r\n */\r\nexport interface PasteRowCommand extends BaseTableCommand {\r\n readonly type: 'PASTE_ROW';\r\n readonly sourceRowId: number;\r\n /** When set (pasteInsert), place the clone relative to this row. */\r\n readonly placeAtRowId?: number;\r\n}\r\n\r\nexport interface DeleteRowCommand extends BaseTableCommand {\r\n readonly type: 'ROW_DELETED';\r\n readonly rowId: number;\r\n\r\n}\r\n\r\n/** Undo-stack redo: re-insert a previously added row with original identity/values. */\r\nexport interface RestoreAddedRowCommand extends BaseTableCommand {\r\n readonly type: 'RESTORE_ADDED_ROW';\r\n readonly rowId: number;\r\n readonly cells: Readonly<\r\n Record<\r\n string,\r\n {\r\n readonly value: unknown;\r\n readonly display?: unknown;\r\n readonly originalValue?: unknown;\r\n }\r\n >\r\n >;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\nexport interface DeleteRowsCommand extends BaseTableCommand {\r\n readonly type: 'ROWS_DELETED';\r\n}\r\nexport interface ExpandRowCommand {\r\n readonly type: 'ROW_EXPANDED';\r\n readonly tableKey: string,\r\n readonly rowId: number,\r\n readonly value: boolean\r\n\r\n}\r\nexport interface SelectRowCommand {\r\n readonly type: 'ROW_SELECTED';\r\n readonly tableKey: string,\r\n readonly rowId: number,\r\n}\r\nexport interface ToggleRowSelectionCommand {\r\n readonly type: \"ROW_SELECTION_TOGGLED\";\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n\r\n}\r\nexport interface ToggleRowExpandCommand {\r\n readonly type: 'ROW_EXPAND_TOGGLED';\r\n readonly tableKey: string,\r\n readonly rowId: number\r\n\r\n}\r\nexport interface SelectRangeCommand {\r\n readonly type: \"ROW_RANGE_SELECTED\";\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n}\r\nexport interface SelectActiveRowToLastCommand {\r\n readonly type: \"SELECT_FROM_ACTIVE_TO_LAST\";\r\n readonly tableKey: string;\r\n readonly anchorRowId: number;\r\n}\r\nexport interface RowReorderedCommand extends BaseTableCommand {\r\n readonly type: 'ROW_REORDERED';\r\n readonly draggedRowId: number;\r\n readonly droppedRowId: number;\r\n readonly position: 'before' | 'after';\r\n}\r\n\r\nexport interface SelectAllRowsCommand {\r\n readonly type: 'TOGGLE_SELECT_ALL_ROWS';\r\n readonly tableKey: string;\r\n\r\n\r\n\r\n}\r\nexport interface SelectPageRowsCommand {\r\n readonly type: 'TOGGLE_SELECT_PAGE_ROWS';\r\n readonly tableKey: string;\r\n\r\n\r\n\r\n}\r\nexport interface ClearRowSelectionCommand {\r\n readonly type: 'CLEAR_ROW_SELECTION';\r\n readonly tableKey: string;\r\n\r\n\r\n\r\n}\r\nexport interface CollapseAllRowsCommand {\r\n readonly type: 'COLLAPSE_ALL_ROWS';\r\n readonly tableKey: string;\r\n\r\n\r\n}\r\n/* ---------- Column ---------- */\r\n\r\nexport interface ColumnReorderedCommand extends BaseTableCommand {\r\n readonly type: 'COLUMN_REORDERED';\r\n readonly sourceIndex: number;\r\n readonly destIndex: number;\r\n}\r\n/* ---------- Table ---------- */\r\nexport interface DeleteTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_DELETED';\r\n\r\n}\r\nexport interface SetActiveCollectionCommand extends BaseTableCommand {\r\n readonly type: 'SET_ACTIVE_COLLECTION';\r\n readonly activeCollection: string;\r\n\r\n}\r\nexport interface ResetTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_RESET';\r\n readonly rowId: string;\r\n\r\n}\r\nexport interface RegisterTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_REGISTERED';\r\n readonly store: string,\r\n readonly table: Table\r\n\r\n}\r\nexport interface DisposeTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_DISPOSED';\r\n}\r\nexport interface ChangeTableActionCommand extends BaseTableCommand {\r\n readonly type: 'SET_TABLE_ACTION';\r\n action: TableActions\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/* ---------- Pagination ---------- */\r\n\r\nexport interface ChangePageCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_PAGE';\r\n readonly page: number;\r\n}\r\n\r\nexport interface ChangePageSizeCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_PAGE_SIZE';\r\n readonly pageSize: number;\r\n}\r\n\r\n/* ---------- Other ---------- */\r\n\r\nexport interface ChangeUnitLevelCommand extends BaseTableCommand {\r\n readonly type: 'SET_UNIT_LEVEL';\r\n readonly level: number;\r\n}\r\nexport interface ApplyDynamicProjectionCommand extends BaseTableCommand {\r\n readonly type: 'APPLY_DYNAMIC_PROJECTION';\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n\r\n}\r\n\r\n/* ---------- UI overlay state (engine-managed) ---------- */\r\n\r\nexport interface SetGridSearchCommand {\r\n readonly type: 'SET_GRID_SEARCH';\r\n readonly tableKey: string;\r\n readonly search: GridSearchState;\r\n}\r\n\r\nexport interface SetMobileEditorCommand {\r\n readonly type: 'SET_MOBILE_EDITOR';\r\n readonly tableKey: string;\r\n readonly editor: MobileEditorState;\r\n}\r\n\r\n/* ---------- Union ---------- */\r\n\r\nexport type EngineTableCommand =\r\n SelectActiveRowToLastCommand\r\n | SelectRangeCommand\r\n | ToggleRowExpandCommand\r\n | SelectRowCommand\r\n | ColumnReorderedCommand\r\n | CollapseAllRowsCommand\r\n | RegisterTableCommand\r\n | DisposeTableCommand\r\n | DeleteRowsCommand\r\n | ToggleRowSelectionCommand\r\n | SelectAllRowsCommand\r\n | SelectPageRowsCommand\r\n | ActiveCellCommand\r\n | ActiveRowCommand\r\n | MoveActiveCellCommand\r\n | MoveActiveCellVerticalCommand\r\n | MoveVerticalSelectedRows\r\n | MoveVerticalActiveRow\r\n | ActiveFirstCellCommand\r\n | ExpandRowCommand\r\n | ChangeTableActionCommand\r\n | SetGridSearchCommand\r\n | SetMobileEditorCommand;\r\n\r\nexport type ApplicationTableCommand =\r\n | ChangeCellValueCommand\r\n | SaveDescriptionCommand\r\n | ChangeCellDisplayValueCommand\r\n | AddEmptyRowCommand\r\n | AddNewRowsCommand\r\n | DuplicateRowCommand\r\n | PasteRowCommand\r\n | DeleteRowCommand\r\n | RestoreAddedRowCommand\r\n | DeleteTableCommand\r\n | SetActiveCollectionCommand\r\n | ResetTableCommand\r\n | RowReorderedCommand\r\n | ChangePageCommand\r\n | ChangePageSizeCommand\r\n | ApplyDynamicProjectionCommand\r\n | ChangeUnitLevelCommand;\r\n\r\nexport type TableCommand =\r\n | EngineTableCommand\r\n | ApplicationTableCommand;\r\n\r\nconst applicationCommandTypes = new Set<TableCommand['type']>([\r\n 'CHANGE_CELL_VALUE',\r\n 'SAVE_DESCRIPTION',\r\n 'CHANGE_CELL_DISPLAY_VALUE',\r\n 'ADD_EMPTY_ROW',\r\n 'ADD_NEW_ROWS',\r\n 'DUPLICATE_ROW',\r\n 'PASTE_ROW',\r\n 'ROW_DELETED',\r\n 'RESTORE_ADDED_ROW',\r\n 'TABLE_DELETED',\r\n 'SET_ACTIVE_COLLECTION',\r\n 'TABLE_RESET',\r\n 'ROW_REORDERED',\r\n 'CHANGE_PAGE',\r\n 'CHANGE_PAGE_SIZE',\r\n 'APPLY_DYNAMIC_PROJECTION',\r\n 'SET_UNIT_LEVEL',\r\n]);\r\n\r\nexport function isApplicationTableCommand(\r\n command: TableCommand\r\n): command is ApplicationTableCommand {\r\n return applicationCommandTypes.has(command.type);\r\n}\r\n","//domain/errors\r\nexport type DomainErrorCode =\r\n | 'ROW_NOT_FOUND'\r\n | 'PAGE_NOT_CHANGED'\r\n | 'COLUMN_NOT_FOUND'\r\n | 'CELL_NOT_FOUND'\r\n | 'NOT_EDITABLE'\r\n | 'FORBIDDEN'\r\n | 'INVALID_VALUE'\r\n | 'DUPLICATE_ROW'\r\n | 'INVARIANT_VIOLATION'\r\n | 'ROW_NOT_EXPANDED'\r\n | 'DRAG_OR_DROP_ROW_NOT_FOUND';\r\n\r\nexport class DomainError extends Error {\r\n constructor(\r\n public readonly code: DomainErrorCode,\r\n message: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'DomainError';\r\n }\r\n}\r\n","// engine/EngineErrorHandler.ts\r\n\r\nimport { DomainError } from '../domain/errors/DomainError';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\n\r\nexport class EngineErrorHandler {\r\n constructor(private readonly audit: ConsoleAuditLogger) {}\r\n\r\n /**\r\n * همهی خطاها — چه DomainError چه runtime error — از اینجا رد میشن\r\n * و از طریق ConsoleAuditLogger لاگ میشن.\r\n */\r\n handle(error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code as any,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n return;\r\n }\r\n\r\n if (error instanceof Error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n return;\r\n }\r\n\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'Unknown error',\r\n payload: { error, context },\r\n });\r\n }\r\n\r\n /** برای جاهایی که store یا table پیدا نشد */\r\n notFound(entity: string, key: string, context?: string): void {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `${entity} \"${key}\" could not be found`,\r\n payload: { key, context },\r\n });\r\n }\r\n}","// engine/managers/NavigationManager.ts\r\n\r\nimport {\r\n Actor,\r\n ApplyDynamicProjectionCommand,\r\n} from '../../application/commands';\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { TableAppService } from '../../application/TableAppService';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport {\r\n TableState,\r\n TableViewState,\r\n} from '../type';\r\n\r\nexport class NavigationManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly app: TableAppService,\r\n private readonly repo: TableRepository,\r\n private readonly actor: Actor,\r\n private readonly err: EngineErrorHandler,\r\n /**\r\n * getViewState از TableEngine تزریق میشه\r\n * تا NavigationManager به ViewStateBuilder وابستگی مستقیم نداشته باشه\r\n */\r\n private readonly getViewState: () => TableViewState | undefined,\r\n private readonly dispatch: (cmd: any) => Promise<void>,\r\n ) { }\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'NavigationManager');\r\n }\r\n return store;\r\n }\r\n\r\n setActiveCell(cmd: {\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const current = prev.activeCell;\r\n if (\r\n current &&\r\n current.rowId === cmd.rowId &&\r\n current.columnId === cmd.columnId\r\n ) {\r\n return prev;\r\n }\r\n return {\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: { rowId: cmd.rowId, columnId: cmd.columnId },\r\n };\r\n });\r\n }\r\n async setActiveRow(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n const { table } = store.getState();\r\n if (!table) return;\r\n const row = table.getRows().find(r => r.id.value === cmd.rowId);\r\n if (!row) {\r\n this.err.handle('Row not found in setActiveRow', `${cmd.tableKey, cmd.rowId}`);\r\n return;\r\n }\r\n // Re-apply remote visibility flags for this row without wiping dependent values\r\n // (clearing is only for real cell value changes via CHANGE_CELL_VALUE).\r\n await this.fetchVisibilityCondition(cmd, row);\r\n store.setState(prev => {\r\n if (prev.activeRowId === cmd.rowId) {\r\n return {\r\n ...prev,\r\n rangeAnchorRowId: cmd.rowId,\r\n };\r\n }\r\n return {\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: null,\r\n rangeAnchorRowId: cmd.rowId,\r\n };\r\n });\r\n }\r\n\r\n activateFirstCell(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const firstEditable = state.table\r\n .getActiveCollectionColumns()\r\n .find(\r\n c =>\r\n c.editable !== false &&\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static' &&\r\n !c.hidden,\r\n );\r\n\r\n if (!firstEditable) return;\r\n\r\n store.setState(() => ({\r\n ...state,\r\n activeCell: { rowId: cmd.rowId, columnId: firstEditable.fieldName },\r\n }));\r\n }\r\n\r\n async fetchVisibilityCondition(\r\n cmd: { store: string; tableKey: string; rowId: number },\r\n row: Row,\r\n ): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n if (!table) return;\r\n\r\n const columns = table.getColumns();\r\n const cellDependency = new Set<string>();\r\n\r\n columns\r\n .filter(\r\n col =>\r\n !!col.dynamicSource?.dependsOn &&\r\n col.dynamicSource.dependsOn.length > 0,\r\n )\r\n .forEach(col => {\r\n const deps = col.dynamicSource?.dependsOn;\r\n if (!deps) return;\r\n for (const dep of deps) {\r\n cellDependency.add(dep);\r\n }\r\n });\r\n\r\n for (const col of cellDependency) {\r\n const cell = row.getCell(col);\r\n\r\n if (!cell) {\r\n this.err.notFound('Cell not found', `${cmd.rowId, col}`);\r\n continue;\r\n }\r\n\r\n const val = cell.getValue(); if (val) {\r\n const command: ApplyDynamicProjectionCommand = {\r\n type: 'APPLY_DYNAMIC_PROJECTION',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n rowId: cmd.rowId,\r\n columnId: col,\r\n };\r\n try {\r\n await this.app.execute(command, this.actor);\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.fetchVisibilityCondition');\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(cmd.store, cmd.tableKey);\r\n const currentStore = this.getStore(cmd.tableKey);\r\n if (currentStore && updated) {\r\n const prev = currentStore.getState();\r\n currentStore.setState(() => ({ ...prev, table: updated }));\r\n }\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.fetchVisibilityCondition.reload');\r\n }\r\n }\r\n\r\n async moveActiveCell(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n direction: 'next' | 'prev';\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = await store.getState();\r\n const table = state.table;\r\n\r\n const row = table.getRow(cmd.rowId);\r\n\r\n if (!row) {\r\n this.err.notFound('Row not found in moveActiveCell', `${cmd.rowId}`);\r\n\r\n return;\r\n }\r\n\r\n const disabledCols = Object.entries(\r\n row.getVisibilityCondition() ?? {},\r\n )\r\n .filter(([, value]) => value === false)\r\n .map(([key]) => key);\r\n\r\n const columns = table\r\n .getActiveCollectionColumns()\r\n .filter(\r\n c =>\r\n !c.hidden &&\r\n c.editable !== false &&\r\n !disabledCols.includes(c.fieldName) &&\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n\r\n const currentColIndex = columns.findIndex(c => c.fieldName === cmd.columnId);\r\n if (currentColIndex === -1) return;\r\n\r\n const nextColIndex =\r\n cmd.direction === 'next' ? currentColIndex + 1 : currentColIndex - 1;\r\n const nextColumn = columns[nextColIndex];\r\n\r\n // حرکت در همان سطر\r\n if (nextColumn !== undefined) {\r\n store.setState(prev => ({\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: { rowId: cmd.rowId, columnId: nextColumn.fieldName },\r\n }));\r\n await this.repo.save(cmd.store, store.getState().table);\r\n return;\r\n }\r\n\r\n // رسیدیم به انتهای ستونهای سطر جاری\r\n const allRows = table.getRows();\r\n const currentRowIndex = allRows.findIndex(r => r.id.value === cmd.rowId);\r\n const isLastRow = currentRowIndex === allRows.length - 1;\r\n const isFirstRow = currentRowIndex === 0;\r\n\r\n if (cmd.direction === 'next') {\r\n if (isLastRow) {\r\n await this.addEmptyRowAndActivate(cmd, store, state, columns);\r\n return;\r\n }\r\n\r\n let nextValidRowIndex = -1;\r\n for (let offset = 1; currentRowIndex + offset < allRows.length; offset++) {\r\n if (allRows[currentRowIndex + offset].rowState.value !== 'Delete') {\r\n nextValidRowIndex = currentRowIndex + offset;\r\n break;\r\n }\r\n }\r\n\r\n if (nextValidRowIndex !== -1) {\r\n const nextRowId = allRows[nextValidRowIndex].id.value;\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: nextRowId,\r\n activeCell: { rowId: nextRowId, columnId: columns[0].fieldName },\r\n }));\r\n await this.repo.save(cmd.tableKey, store.getState().table);\r\n return;\r\n }\r\n\r\n await this.addEmptyRowAndActivate(cmd, store, state, columns);\r\n return;\r\n }\r\n\r\n if (cmd.direction === 'prev') {\r\n if (isFirstRow) return;\r\n\r\n let prevValidRowIndex = -1;\r\n for (let offset = 1; currentRowIndex - offset >= 0; offset++) {\r\n if (allRows[currentRowIndex - offset].rowState.value !== 'Delete') {\r\n prevValidRowIndex = currentRowIndex - offset;\r\n break;\r\n }\r\n }\r\n\r\n if (prevValidRowIndex !== -1) {\r\n const prevRowId = allRows[prevValidRowIndex].id.value;\r\n const lastColumn = columns[columns.length - 1];\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: prevRowId,\r\n activeCell: { rowId: prevRowId, columnId: lastColumn.fieldName },\r\n }));\r\n await this.repo.save(cmd.tableKey, store.getState().table);\r\n }\r\n }\r\n }\r\n\r\n private async addEmptyRowAndActivate(\r\n cmd: { store: string; tableKey: string },\r\n store: TableStore<TableState>,\r\n state: TableState,\r\n columns: ReturnType<typeof state.table.getColumns>,\r\n ): Promise<void> {\r\n try {\r\n const newRow = await this.app.execute(\r\n {\r\n type: 'ADD_EMPTY_ROW',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n autoActivate: true,\r\n },\r\n this.actor,\r\n );\r\n const firstColumn = columns[0];\r\n\r\n if (!firstColumn) {\r\n this.err.notFound('No editable column found after adding row', cmd.tableKey);\r\n return;\r\n }\r\n\r\n\r\n if (\r\n !newRow ||\r\n typeof newRow !== 'object' ||\r\n !('rowId' in newRow)\r\n ) {\r\n this.err.notFound('Invalid ADD_EMPTY_ROW response', `${newRow}`);\r\n return;\r\n }\r\n\r\n\r\n const rowId = (newRow as any).rowId?.value;\r\n\r\n if (!rowId) {\r\n\r\n this.err.notFound('Missing rowId in ADD_EMPTY_ROW response', `${newRow}`);\r\n return;\r\n }\r\n\r\n\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: rowId,\r\n activeCell: {\r\n rowId,\r\n columnId: firstColumn.fieldName,\r\n },\r\n }));\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.addEmptyRowAndActivate');\r\n }\r\n }\r\n\r\n async moveActiveCellVertical(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n direction: 'up' | 'down';\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n if (!table) return;\r\n\r\n // Full row order (not paginated view.rows) so VirtualList can navigate.\r\n const navigable = [...table.getRows()]\r\n .filter(r => r.rowState.value !== 'Delete')\r\n .sort(\r\n (a, b) =>\r\n (Number(a.getCell('index')?.getValue()) || 0) -\r\n (Number(b.getCell('index')?.getValue()) || 0),\r\n );\r\n const curIdx = navigable.findIndex(r => r.id.value === cmd.rowId);\r\n if (curIdx === -1) return;\r\n\r\n const nxtIdx = cmd.direction === 'down' ? curIdx + 1 : curIdx - 1;\r\n if (nxtIdx < 0 || nxtIdx >= navigable.length) {\r\n const view = this.getViewState();\r\n if (cmd.direction === 'down' && view?.pagination.canNext) {\r\n void this.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n page: view.pagination.page + 1,\r\n });\r\n } else if (cmd.direction === 'up' && view?.pagination.canPrev) {\r\n void this.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n page: view.pagination.page - 1,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n const nextRow = navigable[nxtIdx];\r\n await this.fetchVisibilityCondition(cmd, nextRow);\r\n\r\n store.setState(prev => ({\r\n ...prev,\r\n activeRowId: nextRow.id.value,\r\n activeCell: { rowId: nextRow.id.value, columnId: cmd.columnId },\r\n }));\r\n }\r\n}","// engine/managers/RowManager.ts\r\n\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n TableActions,\r\n} from '../../domain/value-objects';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport { TableState } from '../type';\r\n\r\nexport class RowManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n ) { }\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'RowManager');\r\n }\r\n return store;\r\n }\r\n\r\n setRowExpanded(cmd: {\r\n tableKey: string;\r\n rowId: number;\r\n value: boolean;\r\n }): void {\r\n const { rowId, tableKey, value } = cmd;\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const key = String(rowId);\r\n if (!!state.expandedRows[rowId] === value) return;\r\n\r\n store.setState(() => ({\r\n ...state,\r\n expandedRows: { ...state.expandedRows, [key]: value },\r\n }));\r\n }\r\n\r\n toggleRowExpanded(cmd: { tableKey: string; rowId: number }): void {\r\n const { rowId, tableKey } = cmd;\r\n const key = String(rowId);\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const next = !state.expandedRows[key];\r\n store.setState(() => ({\r\n ...state,\r\n expandedRows: { ...state.expandedRows, [key]: next },\r\n }));\r\n }\r\n\r\n collapseAll(tableKey: string): void {\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n if (!state.expandedRows || Object.keys(state.expandedRows).length === 0)\r\n return;\r\n\r\n store.setState(() => ({ ...state, expandedRows: {} }));\r\n }\r\n\r\n moveVerticalSelectedRows(cmd: {\r\n tableKey: string;\r\n direction: 'down' | 'up';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const table = prev.table;\r\n const selectedMap = prev.selectedRows;\r\n const allRows = table.getRows();\r\n\r\n const sortedRows = [...allRows].sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number),\r\n );\r\n\r\n const selectedRows = sortedRows.filter(r => selectedMap[r.id.value]);\r\n if (selectedRows.length === 0) return prev;\r\n\r\n if (cmd.direction === 'up') {\r\n for (const row of selectedRows) {\r\n const idx = sortedRows.findIndex(r => r.id.value === row.id.value);\r\n if (idx === 0) continue;\r\n\r\n const upperRow = sortedRows[idx - 1];\r\n const rowIndex = row.getCell('index')?.getValue() as number;\r\n const upperIndex = upperRow.getCell('index')?.getValue() as number;\r\n\r\n row.changeCell(new ColumnId('index'), new CellValue(upperIndex));\r\n upperRow.changeCell(new ColumnId('index'), new CellValue(rowIndex));\r\n\r\n sortedRows[idx - 1] = row;\r\n sortedRows[idx] = upperRow;\r\n }\r\n }\r\n\r\n if (cmd.direction === 'down') {\r\n for (let i = selectedRows.length - 1; i >= 0; i--) {\r\n const row = selectedRows[i];\r\n const idx = sortedRows.findIndex(r => r.id.value === row.id.value);\r\n if (idx === sortedRows.length - 1) continue;\r\n\r\n const lowerRow = sortedRows[idx + 1];\r\n const rowIndex = row.getCell('index')?.getValue() as number;\r\n const lowerIndex = lowerRow.getCell('index')?.getValue() as number;\r\n\r\n row.changeCell(new ColumnId('index'), new CellValue(lowerIndex));\r\n lowerRow.changeCell(new ColumnId('index'), new CellValue(rowIndex));\r\n\r\n sortedRows[idx] = lowerRow;\r\n sortedRows[idx + 1] = row;\r\n }\r\n }\r\n\r\n return { ...prev, table };\r\n });\r\n }\r\n\r\n moveVerticalActiveRow(cmd: {\r\n tableKey: string;\r\n direction: 'down' | 'up';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n try {\r\n store.setState(prev => {\r\n const table = prev.table;\r\n const allRows = table.getRows();\r\n const activeRow = allRows.find(r => r.id.value == prev.activeRowId);\r\n if (!activeRow) return prev;\r\n\r\n const sortedRows = [...allRows].sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number),\r\n );\r\n\r\n if (cmd.direction === 'up') {\r\n const idx = sortedRows.findIndex(\r\n r => r.id.value === prev.activeRowId,\r\n );\r\n if (idx !== 0) {\r\n const upperRow = sortedRows[idx - 1];\r\n const rowIndex = activeRow.getCell('index')?.getValue() as number;\r\n const upperIndex = upperRow.getCell('index')?.getValue() as number;\r\n\r\n activeRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(upperIndex),\r\n );\r\n upperRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(rowIndex),\r\n );\r\n sortedRows[idx - 1] = activeRow;\r\n sortedRows[idx] = upperRow;\r\n }\r\n }\r\n\r\n if (cmd.direction === 'down') {\r\n const idx = sortedRows.findIndex(\r\n r => r.id.value === prev.activeRowId,\r\n );\r\n if (idx !== sortedRows.length - 1) {\r\n const lowerRow = sortedRows[idx + 1];\r\n const rowIndex = activeRow.getCell('index')?.getValue() as number;\r\n const lowerIndex = lowerRow.getCell('index')?.getValue() as number;\r\n\r\n activeRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(lowerIndex),\r\n );\r\n lowerRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(rowIndex),\r\n );\r\n sortedRows[idx] = lowerRow;\r\n sortedRows[idx + 1] = activeRow;\r\n }\r\n }\r\n\r\n return { ...prev, table };\r\n });\r\n } catch (error) {\r\n this.err.handle(error, 'RowManager.moveVerticalActiveRow');\r\n }\r\n }\r\n\r\n setTableAction(\r\n cmd: { tableKey: string; action: TableActions },\r\n _activeRowId: number | undefined,\r\n ): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n\r\n switch (cmd.action) {\r\n case 'copy':\r\n case 'cut':\r\n case null:\r\n table.setTableAction(cmd.action);\r\n break;\r\n\r\n case 'paste':\r\n case 'pasteInsert':\r\n // Paste is handled by TableEngine.executePasteAction → AppService.\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n store.setState(prev => ({ ...prev, table }));\r\n }\r\n}\r\n","// engine/managers/SelectionManager.ts\r\n\r\nimport { RowId } from '../../domain/value-objects';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport { TableState } from '../type';\r\n\r\nexport class SelectionManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n ) {}\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'SelectionManager');\r\n }\r\n return store;\r\n }\r\n\r\n setSelectRow(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const isSelected = !!prev.selectedRows[cmd.rowId];\r\n\r\n return {\r\n ...prev,\r\n selectedRows: isSelected ? {} : { [cmd.rowId]: true },\r\n rangeAnchorRowId: isSelected ? undefined : cmd.rowId,\r\n };\r\n });\r\n }\r\n\r\n toggleRowSelection(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const isSelected = !!prev.selectedRows[cmd.rowId];\r\n\r\n const nextSelected = { ...prev.selectedRows };\r\n\r\n if (isSelected) {\r\n delete nextSelected[cmd.rowId];\r\n } else {\r\n nextSelected[cmd.rowId] = true;\r\n }\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n toggleSelectAllRows(cmd: { tableKey: string }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const allRows = state.table.getRows();\r\n\r\n const allSelected =\r\n Object.keys(state.selectedRows).length === allRows.length;\r\n\r\n store.setState(prev => {\r\n if (allSelected) {\r\n return { ...prev, selectedRows: {} };\r\n }\r\n\r\n const nextSelected: Record<number, true> = {};\r\n\r\n allRows.forEach(row => {\r\n nextSelected[row.id.value] = true;\r\n });\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n toggleSelectPageRows(cmd: { tableKey: string }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n\r\n const pageRows = state.table.getVisibleRows();\r\n const selectedRows = state.selectedRows;\r\n\r\n const allPageRowsSelected = pageRows.every(row =>\r\n Object.prototype.hasOwnProperty.call(selectedRows, row.id.value),\r\n );\r\n\r\n store.setState(prev => {\r\n if (allPageRowsSelected) {\r\n return { ...prev, selectedRows: {} };\r\n }\r\n\r\n const nextSelected: Record<number, true> = {};\r\n\r\n pageRows.forEach(row => {\r\n nextSelected[row.id.value] = true;\r\n });\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n selectRange(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const anchor = prev.rangeAnchorRowId ?? prev.activeRowId;\r\n if (!anchor) return prev;\r\n\r\n const rows = prev.table.getVisibleRows();\r\n\r\n const startIndex = rows.findIndex(r => r.id.value === anchor);\r\n const endIndex = rows.findIndex(r => r.id.value === cmd.rowId);\r\n\r\n if (startIndex === -1 || endIndex === -1) return prev;\r\n\r\n const [from, to] =\r\n startIndex < endIndex\r\n ? [startIndex, endIndex]\r\n : [endIndex, startIndex];\r\n\r\n const nextSelected: Record<number, true> = {};\r\n\r\n for (let i = from; i <= to; i++) {\r\n nextSelected[rows[i].id.value] = true;\r\n }\r\n\r\n return {\r\n ...prev,\r\n selectedRows: nextSelected,\r\n rangeAnchorRowId: anchor,\r\n };\r\n });\r\n }\r\n\r\n selectFromActiveToLast(cmd: {\r\n tableKey: string;\r\n anchorRowId: number;\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const rows = prev.table.getVisibleRows();\r\n\r\n const startIdx = rows.findIndex(\r\n r => r.id.value === cmd.anchorRowId,\r\n );\r\n\r\n if (startIdx === -1) return prev;\r\n\r\n const nextSelected: Record<number, true> = {\r\n ...prev.selectedRows,\r\n };\r\n\r\n for (let i = startIdx; i < rows.length; i++) {\r\n nextSelected[rows[i].id.value] = true;\r\n }\r\n\r\n return {\r\n ...prev,\r\n selectedRows: nextSelected,\r\n rangeAnchorRowId: cmd.anchorRowId,\r\n };\r\n });\r\n }\r\n\r\n deleteAll(tableKey: string): void {\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const { table, selectedRows } = store.getState();\r\n\r\n try {\r\n Object.entries(selectedRows).forEach(([key]) => {\r\n table.deleteRow(new RowId(Number(key)));\r\n });\r\n } catch (e) {\r\n this.err.handle(e, 'SelectionManager.deleteAll');\r\n }\r\n\r\n store.setState(prev => ({\r\n ...prev,\r\n selectedRows: {},\r\n table,\r\n }));\r\n }\r\n}","// /table/engine/tableStore.ts\r\n\r\nimport { Row } from '../domain/entities/Row';\r\n\r\ntype Subscriber = () => void;\r\n\r\nexport class TableStore<T> {\r\n private subscribers: Subscriber[] = [];\r\n private state: T;\r\n private originalState: T;\r\n\r\n constructor(initialState: T) {\r\n this.state = initialState;\r\n this.originalState = initialState;\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n getRowByRowId(rowId: number): Row | undefined {\r\n return undefined;\r\n }\r\n\r\n setState(updater: (prev: T) => T) {\r\n const nextState = updater(this.state);\r\n if (nextState === this.state) return;\r\n this.state = nextState;\r\n this.notify();\r\n }\r\n\r\n subscribe(cb: Subscriber) {\r\n this.subscribers.push(cb);\r\n return () => {\r\n this.subscribers = this.subscribers.filter((s) => s !== cb);\r\n };\r\n }\r\n\r\n /**\r\n * Notify only when the selected slice changes (Object.is by default).\r\n * Prevents React adapters from re-rendering on unrelated store updates.\r\n */\r\n subscribeWithSelector<TSelected>(\r\n selector: (state: T) => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n let current = selector(this.state);\r\n return this.subscribe(() => {\r\n const next = selector(this.state);\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n });\r\n }\r\n\r\n resetTable(): void {\r\n this.state = this.originalState;\r\n }\r\n\r\n private notify() {\r\n this.subscribers.forEach((cb) => cb());\r\n }\r\n}\r\n","import type * as React from 'react';\r\n\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Table } from '../domain/entities/Table';\r\nimport {\r\n RowStateEnum,\r\n TableActions,\r\n} from '../domain/value-objects';\r\nimport { UIRow } from '../ui/type';\r\n\r\nexport const MOBILE_PAGE_SIZE = 50;\r\n\r\nexport type GridSearchMatch = {\r\n rowId: number;\r\n columnId: string;\r\n};\r\n\r\nexport type GridSearchState = {\r\n columnId: string;\r\n query: string;\r\n matches: GridSearchMatch[];\r\n currentIndex: number;\r\n} | null;\r\n\r\nexport type MobileEditorState = {\r\n mode: 'add' | 'edit';\r\n rowId: number;\r\n} | null;\r\n\r\nexport type TableViewState = {\r\n // table: Table\r\n activeCell: ActiveCell;\r\n selectedRows: Record<number, true>;\r\n rows: UIRow[];\r\n deletedRows: Array<{\r\n id: string;\r\n cells: Record<string, unknown>;\r\n isExpanded: boolean;\r\n }>;\r\n columns: ColumnSchema[];\r\n activeCollectionColumn: ColumnSchema[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n totalRows: number;\r\n totalPages: number;\r\n canPrev: boolean;\r\n canNext: boolean;\r\n };\r\n action: TableActions;\r\n gridSearch: GridSearchState;\r\n mobileEditor: MobileEditorState;\r\n};\r\n\r\nexport type MobileTableViewState = {\r\n rows: UIRow[];\r\n columns: ColumnSchema[];\r\n totalRows: number;\r\n visibleCount: number;\r\n hasMore: boolean;\r\n pageSize: number;\r\n mobileEditor: MobileEditorState;\r\n};\r\n\r\nexport type TableSnapShot = {\r\n rows: Array<{\r\n id: number;\r\n cells: Record<string, unknown>;\r\n rowState: RowStateEnum\r\n collection: string\r\n rowType?: string\r\n changeFields: readonly string[]\r\n isSaveDescription: boolean\r\n }>;\r\n};\r\nexport type ActiveCell = {\r\n rowId: number;\r\n columnId: string;\r\n} | null;\r\nexport type ValidCell = { isValid: boolean, cellError: CellError }\r\n\r\nexport type TableState = {\r\n table: Table;\r\n expandedRows: Record<string, boolean>;\r\n selectedRows: Record<number, true>;\r\n activeRowId: number | undefined;\r\n activeCell: ActiveCell | undefined;\r\n rangeAnchorRowId: number | undefined;\r\n gridSearch: GridSearchState;\r\n mobileEditor: MobileEditorState;\r\n};\r\n\r\n\r\n\r\n\r\nexport type TCell = {\r\n value: unknown;\r\n originalValue: unknown;\r\n display: unknown;\r\n};\r\n//======================================dropdownType===========================================================================================\r\nexport type ItemType = {\r\n type?: 'submenu' | 'item' | 'group' | 'divider';\r\n label?: React.ReactNode;\r\n children?: ItemType[];\r\n disabled?: boolean;\r\n ref?: React.Ref<HTMLLIElement | null>;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n isSelected?: boolean;\r\n isOpen?: boolean;\r\n isSubMenu?: boolean;\r\n danger?: boolean;\r\n icon?: React.ReactNode; //(name: string) => React.ReactNode | React.ReactNode;\r\n title?: string;\r\n key: string;\r\n theme?: 'dark' | 'light';\r\n dashed?: boolean;\r\n rootClassName?: string;\r\n itemIcon?: React.ReactNode;\r\n expandIcon?: React.ReactNode;\r\n popupClassName?: string;\r\n popupOffset?: number[];\r\n popupStyle?: React.CSSProperties;\r\n onClick?: () => void;\r\n extra?: React.ReactNode;\r\n}\r\n\r\nexport type ValidationCallback = (result: ValidationCallbackResult) => void;\r\nexport type ValidationCallbackResult = {\r\n valid: boolean,\r\n errors?: Map<string, CellError>,\r\n data?: any\r\n}\r\nexport interface CellError {\r\n rowId: number;\r\n caption: string;\r\n message: string;\r\n}\r\n","// engine/ViewStateBuilder.ts\r\n\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Cell } from '../domain/entities/Cell';\r\nimport { Row } from '../domain/entities/Row';\r\nimport { CollectionScope } from '../domain/entities/Table';\r\nimport { RowStateEnum } from '../domain/value-objects';\r\nimport { UIRow } from '../ui/type';\r\nimport { EngineErrorHandler } from './EngineErrorHandler';\r\nimport { TableStore } from './tableStore';\r\nimport {\r\n MOBILE_PAGE_SIZE,\r\n MobileTableViewState,\r\n TableSnapShot,\r\n TableState,\r\n TableViewState,\r\n TCell,\r\n} from './type';\r\n\r\nexport class ViewStateBuilder {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n ) { }\r\n\r\n private getStore() {\r\n const store = this.readStore();\r\n\r\n if (!store) {\r\n this.err.notFound('TableStore', 'active', 'ViewStateBuilder');\r\n }\r\n return store;\r\n }\r\n\r\n private mapRowCells(\r\n row: Row,\r\n columns: ColumnSchema[],\r\n ): Record<string, TCell> {\r\n const cells: Record<string, TCell> = {};\r\n\r\n for (const col of columns) {\r\n try {\r\n const cell = row.getCells().get(col.fieldName);\r\n\r\n cells[col.fieldName] = {\r\n value: cell?.getValue() ?? null,\r\n originalValue: cell?.getOriginalValue()?.value ?? null,\r\n display: cell?.getDisplay() ?? null,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.mapRowCells');\r\n }\r\n }\r\n\r\n return cells;\r\n }\r\n\r\n private sortRows(rows: Row[]): Row[] {\r\n return rows.sort((a, b) => {\r\n const aIndex = Number(a.getCells().get('index')?.getValue() ?? 0);\r\n const bIndex = Number(b.getCells().get('index')?.getValue() ?? 0);\r\n return aIndex - bIndex;\r\n });\r\n }\r\n\r\n private mapRowToUIRow(\r\n row: Row,\r\n columns: ColumnSchema[],\r\n expandedRows: Record<string, boolean>,\r\n ): UIRow {\r\n return {\r\n id: row.id.value,\r\n rowState: row.rowState.value,\r\n changeFields: row.getChangeFields(),\r\n cells: this.mapRowCells(row, columns),\r\n isExpanded: !!expandedRows[row.id.value],\r\n visibilityCondition: row.visibilityCondition,\r\n };\r\n }\r\n\r\n private mapRowsToUIRows(\r\n rows: Row[],\r\n columns: ColumnSchema[],\r\n expandedRows: Record<string, boolean>,\r\n ): UIRow[] {\r\n return this.sortRows(rows).map((row) =>\r\n this.mapRowToUIRow(row, columns, expandedRows),\r\n );\r\n }\r\n\r\n private getRenderableMobileRows(\r\n rows: Row[],\r\n mobileEditor: TableState['mobileEditor'],\r\n ): Row[] {\r\n return this.sortRows(\r\n rows\r\n .filter((row) => row.rowState.value !== RowStateEnum.Deleted)\r\n .filter(\r\n (row) =>\r\n !(\r\n mobileEditor?.mode === 'add' &&\r\n row.id.value === mobileEditor.rowId\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n getViewState(): TableViewState | undefined {\r\n try {\r\n const storeRef = this.getStore();\r\n\r\n if (!storeRef) return undefined;\r\n\r\n const store = storeRef.getState();\r\n\r\n const { table, expandedRows, activeCell, selectedRows, gridSearch, mobileEditor } = store;\r\n\r\n const pagination = table.getPagination();\r\n\r\n const totalRows = table.getRows().length;\r\n\r\n const totalPages = Math.max(\r\n 1,\r\n Math.ceil(totalRows / pagination.pageSize),\r\n );\r\n\r\n const columns = table.getActiveCollectionColumns()\r\n\r\n return {\r\n activeCell: activeCell ?? null,\r\n selectedRows,\r\n rows: this.mapRowsToUIRows(table.getVisibleRows(), columns, expandedRows),\r\n deletedRows: [],\r\n columns,\r\n activeCollectionColumn:table.getActiveCollectionColumns(),\r\n pagination: {\r\n page: pagination.page,\r\n pageSize: pagination.pageSize,\r\n totalRows,\r\n totalPages,\r\n canPrev: pagination.page > 1,\r\n canNext: pagination.page < totalPages,\r\n },\r\n action: table.getTableAction(),\r\n gridSearch,\r\n mobileEditor,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getViewState');\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * All active-collection UI rows (no pagination slice) for virtual scroll.\r\n */\r\n getAllUIRows(): UIRow[] | null {\r\n try {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n const { table, expandedRows } = storeRef.getState();\r\n const columns = table.getActiveCollectionColumns();\r\n const activeName = table.getActiveCollectionName();\r\n const activeRows = table\r\n .getRows()\r\n .filter((r) => r.collection === activeName);\r\n return this.mapRowsToUIRows(activeRows, columns, expandedRows);\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getAllUIRows');\r\n return null;\r\n }\r\n }\r\n\r\n // ViewBuilder\r\n getAllRows(collectionScope: CollectionScope = 'active'): Row[] | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n const { table } = storeRef.getState();\r\n return this.sortRows(table.getRows(collectionScope));\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | undefined {\r\n try {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return undefined;\r\n\r\n const { table, expandedRows, mobileEditor } = storeRef.getState();\r\n const pagination = table.getPagination();\r\n const columns = table.getActiveCollectionColumns();\r\n const allRows = this.getRenderableMobileRows(table.getRows('active'), mobileEditor);\r\n const pageSize = Math.max(MOBILE_PAGE_SIZE, pagination.pageSize);\r\n const visibleRows = allRows.slice(0, pageSize);\r\n const totalRows = allRows.length;\r\n const visibleCount = Math.min(pageSize, totalRows);\r\n\r\n return {\r\n rows: this.mapRowsToUIRows(visibleRows, columns, expandedRows),\r\n columns,\r\n totalRows,\r\n visibleCount,\r\n hasMore: visibleCount < totalRows,\r\n pageSize,\r\n mobileEditor,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getMobileViewState');\r\n return undefined;\r\n }\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const { table, expandedRows } = storeRef.getState();\r\n const row = table.getRow(rowId) // getRows().find((item) => item.id.value === rowId);\r\n\r\n if (!row) return null;\r\n\r\n return this.mapRowToUIRow(\r\n row,\r\n table.getActiveCollectionColumns(),\r\n expandedRows,\r\n );\r\n }\r\n\r\n getSnapShot(collectionScope?: CollectionScope): TableSnapShot | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const { table } = storeRef.getState();\r\n const hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n return {\r\n rows: table\r\n .getRows(collectionScope)\r\n .filter(row =>\r\n Array.from(row.getCells().entries()).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n ),\r\n )\r\n .map(row => ({\r\n id: row.id.value,\r\n changeFields: row.getSnapshotChangeFields(),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([k, c]) => [k, c.getValue()]),\r\n ),\r\n rowState: row.rowState.value,\r\n collection: row.getCollection(),\r\n rowType: row.getCollection(),\r\n isSaveDescription: row.isSaveDescription,\r\n })),\r\n };\r\n }\r\n\r\n getExpandedRowData(\r\n rowId: number,\r\n ): Record<string, unknown> | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const { table } = storeRef.getState();\r\n const row = table.getRows().find(r => r.id.value === rowId);\r\n if (!row) return null;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n return rowValues;\r\n }\r\n\r\n getActiveCell(): TableState['activeCell'] | null {\r\n const store = this.getStore()?.getState();\r\n if (!store) return null;\r\n return store.activeCell;\r\n }\r\n getActiveRow(): number | null {\r\n\r\n try {\r\n\r\n const store = this.getStore()?.getState();\r\n\r\n if (!store) return null;\r\n\r\n return store.activeRowId ?? null;\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.getActiveRow');\r\n\r\n return null;\r\n }\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | undefined {\r\n const store = this.getStore()?.getState();\r\n if (!store) return undefined;\r\n return store.selectedRows;\r\n }\r\n\r\n getCell(rowId: number, columnId: string): Cell | undefined {\r\n const store = this.getStore()?.getState();\r\n if (!store) return undefined;\r\n return store.table.getRow(rowId)?.getCell(columnId);\r\n }\r\n isActiveCell(rowId: number, columnId: string): boolean {\r\n\r\n try {\r\n const store = this.getStore();\r\n if (!store) return false;\r\n const { activeCell } = store.getState();\r\n return (\r\n !!activeCell &&\r\n activeCell.rowId === rowId &&\r\n activeCell.columnId === columnId\r\n );\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.isActiveCell');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isSelectedRow(rowId: number): boolean {\r\n\r\n try {\r\n\r\n const store = this.getStore();\r\n\r\n if (!store) return false;\r\n\r\n const { selectedRows } = store.getState();\r\n\r\n return !!selectedRows && !!selectedRows[rowId];\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.isSelectedRow');\r\n\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isCutRow(rowId: number): boolean {\r\n try {\r\n const store = this.getStore();\r\n if (!store) return false;\r\n const { selectedRows, table } = store.getState();\r\n return selectedRows[rowId] && table.getTableAction() === 'cut';\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.isCutRow');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isActiveRow(rowId: number): boolean {\r\n\r\n try {\r\n\r\n const store = this.getStore();\r\n\r\n if (!store) return false;\r\n\r\n const { activeRowId } = store.getState();\r\n\r\n return !!activeRowId && activeRowId === rowId;\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.isActiveRow');\r\n\r\n return false;\r\n }\r\n }\r\n\r\n}","import {\r\n Actor,\r\n AddEmptyRowCommand,\r\n ApplicationTableCommand,\r\n isApplicationTableCommand,\r\n TableCommand,\r\n} from '../application/commands';\r\nimport { TableRepository } from '../application/ports/TableRepository';\r\nimport { TableAppService } from '../application/TableAppService';\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Cell } from '../domain/entities/Cell';\r\nimport { Row } from '../domain/entities/Row';\r\nimport {\r\n CollectionScope,\r\n Table,\r\n} from '../domain/entities/Table';\r\nimport { RowAdded } from '../domain/events';\r\nimport {\r\n ColumnId,\r\n RowStateEnum,\r\n} from '../domain/value-objects';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\nimport { UIRow } from '../ui/type';\r\nimport { EngineErrorHandler } from './EngineErrorHandler';\r\nimport { NavigationManager } from './managers/NavigationManager';\r\nimport { RowManager } from './managers/RowManager';\r\nimport { SelectionManager } from './managers/SelectionManager';\r\nimport { TableStore } from './tableStore';\r\nimport {\r\n CellError,\r\n MobileTableViewState,\r\n TableSnapShot,\r\n TableState,\r\n TableViewState,\r\n ValidationCallback,\r\n ValidCell,\r\n} from './type';\r\nimport { ViewStateBuilder } from './ViewStateBuilder';\r\n\r\nexport class TableEngine {\r\n // ─── internal state ────────────────────────────────────────────────────────\r\n private tableStore?: TableStore<TableState>;\r\n private tableKey?: string;\r\n public readonly errors = new Map<string, CellError>();\r\n public readonly searchResult = new Map<string, CellError>();\r\n\r\n\r\n // ─── collaborators ─────────────────────────────────────────────────────────\r\n private readonly errHandler: EngineErrorHandler;\r\n private readonly selection: SelectionManager;\r\n private readonly rowMgr: RowManager;\r\n private readonly nav: NavigationManager;\r\n private readonly viewBuilder: ViewStateBuilder;\r\n\r\n constructor(\r\n private readonly app: TableAppService,\r\n private readonly repo: TableRepository,\r\n private readonly actor: Actor,\r\n audit: ConsoleAuditLogger,\r\n ) {\r\n this.errHandler = new EngineErrorHandler(audit);\r\n this.selection = new SelectionManager(() => this.tableStore, this.errHandler);\r\n this.rowMgr = new RowManager(() => this.tableStore, this.errHandler);\r\n this.viewBuilder = new ViewStateBuilder(() => this.tableStore, this.errHandler);\r\n this.nav = new NavigationManager(\r\n () => this.tableStore,\r\n this.app,\r\n this.repo,\r\n this.actor,\r\n this.errHandler,\r\n () => this.getViewState(),\r\n (cmd) => this.dispatch(cmd),\r\n );\r\n }\r\n\r\n // ─── private table lifecycle ────────────────────────────────────────────────\r\n\r\n private async registerTable(cmd: {\r\n store: string;\r\n table: Table;\r\n }): Promise<void> {\r\n const { store, table } = cmd;\r\n if (this.tableStore && this.tableKey === table.id) {\r\n const existsInRepo = await this.repo.exists(store, table.id);\r\n if (existsInRepo) return;\r\n await this.repo.save(store, table);\r\n return;\r\n }\r\n const tableStore = new TableStore<TableState>({\r\n table,\r\n expandedRows: {},\r\n selectedRows: {},\r\n activeRowId: undefined,\r\n activeCell: undefined,\r\n rangeAnchorRowId: undefined,\r\n gridSearch: null,\r\n mobileEditor: null,\r\n });\r\n this.tableKey = table.id;\r\n this.tableStore = tableStore;\r\n try {\r\n await this.repo.save(store, table);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.registerTable');\r\n }\r\n }\r\n\r\n private async deleteTable(cmd: {\r\n store: string;\r\n tableKey: string;\r\n }): Promise<void> {\r\n try {\r\n await this.repo.delete(cmd.store, cmd.tableKey);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.deleteTable');\r\n }\r\n if (this.tableKey === cmd.tableKey) {\r\n this.tableStore = undefined;\r\n this.tableKey = undefined;\r\n }\r\n }\r\n\r\n private disposeTable(cmd: { store: string; tableKey: string }): void {\r\n this.repo.delete(cmd.store, cmd.tableKey);\r\n if (this.tableKey === cmd.tableKey) {\r\n this.tableStore = undefined;\r\n this.tableKey = undefined;\r\n }\r\n }\r\n\r\n private async resetTable(cmd: {\r\n store: string;\r\n tableKey: string;\r\n }): Promise<void> {\r\n const tableStore = this.getStore(cmd.tableKey);\r\n if (!tableStore) {\r\n this.errHandler.notFound('TableStore', cmd.tableKey, 'TableEngine.resetTable');\r\n return;\r\n }\r\n\r\n try {\r\n const freshTable = await this.repo.getById(cmd.store, cmd.tableKey);\r\n if (!freshTable) {\r\n this.errHandler.notFound('Table (from repo)', cmd.tableKey, 'TableEngine.resetTable');\r\n return;\r\n }\r\n tableStore.setState(prev => ({\r\n ...prev,\r\n table: freshTable,\r\n expandedRows: {},\r\n selectedRows: {},\r\n activeRowId: undefined,\r\n activeCell: undefined,\r\n rangeAnchorRowId: undefined,\r\n gridSearch: null,\r\n mobileEditor: null,\r\n }));\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.resetTable');\r\n }\r\n }\r\n\r\n // ─── private helper ─────────────────────────────────────────────────────────\r\n\r\n private getStore(expectedTableKey?: string): TableStore<TableState> | undefined {\r\n const store = this.tableStore;\r\n if (!store || (expectedTableKey && this.tableKey && expectedTableKey !== this.tableKey)) {\r\n this.errHandler.notFound('TableStore', expectedTableKey ?? this.tableKey ?? 'active', 'TableEngine');\r\n return undefined;\r\n }\r\n return store;\r\n }\r\n\r\n /**\r\n * Default case در dispatch:\r\n * command را به AppService میدهد و سپس repo را reload میکند.\r\n */\r\n private async executeAppCommand(command: ApplicationTableCommand): Promise<void> {\r\n let result: unknown;\r\n\r\n try {\r\n result = await this.app.execute(command, this.actor);\r\n } catch (e) {\r\n this.errHandler.handle(e, `TableEngine.dispatch[${command.type}]`);\r\n return;\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(\r\n (command as any).store,\r\n (command as any).tableKey,\r\n );\r\n const store = this.getStore((command as any).tableKey);\r\n if (!store || !updated) return;\r\n const prev = store.getState();\r\n store.setState(() => ({ ...prev, table: updated }));\r\n\r\n if (command.type === 'ADD_EMPTY_ROW') {\r\n const addCommand = command as AddEmptyRowCommand;\r\n const rowAdded = result as RowAdded | null;\r\n const rowId = rowAdded?.rowId?.value;\r\n\r\n if (addCommand.autoActivate && rowId != null) {\r\n await this.nav.setActiveRow({\r\n store: addCommand.store,\r\n tableKey: addCommand.tableKey,\r\n rowId,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n this.errHandler.handle(e, `TableEngine.dispatch.reload[${command.type}]`);\r\n }\r\n }\r\n\r\n /**\r\n * Paste goes through AppService (PASTE_ROW + optional ROW_DELETED for cut)\r\n * with one correlationId so undo reverses the whole unit.\r\n */\r\n private async executePasteAction(command: {\r\n store: string;\r\n tableKey: string;\r\n action: 'paste' | 'pasteInsert';\r\n correlationId?: string;\r\n }): Promise<void> {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n\r\n const { table, selectedRows, activeRowId } = store.getState();\r\n const wasCut = table.getTableAction() === 'cut';\r\n const correlationId =\r\n command.correlationId ??\r\n `paste-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n const sources = table\r\n .getRows()\r\n .filter((r) => r.rowState.value !== RowStateEnum.Deleted)\r\n .filter((row) => selectedRows[row.id.value] === true)\r\n .sort((a, b) => {\r\n const aIndex = Number(a.getCells().get('index')?.getValue() ?? 0);\r\n const bIndex = Number(b.getCells().get('index')?.getValue() ?? 0);\r\n return bIndex - aIndex;\r\n });\r\n\r\n if (sources.length === 0) {\r\n table.setTableAction(null);\r\n store.setState((prev) => ({ ...prev, table }));\r\n return;\r\n }\r\n\r\n const placeAtRowId =\r\n command.action === 'pasteInsert' ? activeRowId : undefined;\r\n\r\n for (const row of sources) {\r\n await this.executeAppCommand({\r\n type: 'PASTE_ROW',\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n sourceRowId: row.id.value,\r\n placeAtRowId,\r\n correlationId,\r\n });\r\n }\r\n\r\n if (wasCut) {\r\n for (const row of sources) {\r\n await this.executeAppCommand({\r\n type: 'ROW_DELETED',\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n rowId: row.id.value,\r\n correlationId,\r\n });\r\n }\r\n const afterCut = this.getStore(command.tableKey);\r\n afterCut?.setState((prev) => ({ ...prev, selectedRows: {} }));\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(command.store, command.tableKey);\r\n updated.setTableAction(null);\r\n await this.repo.save(command.store, updated);\r\n const live = this.getStore(command.tableKey);\r\n if (live) {\r\n const prev = live.getState();\r\n live.setState(() => ({ ...prev, table: updated }));\r\n }\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.executePasteAction.clearAction');\r\n }\r\n }\r\n\r\n // ─── public dispatch ────────────────────────────────────────────────────────\r\n\r\n async dispatch(command: TableCommand): Promise<void> {\r\n switch (command.type) {\r\n // ── Navigation ──────────────────────────────────────────────────────────\r\n case 'ACTIVE_CELL':\r\n this.nav.setActiveCell(command);\r\n return;\r\n case 'ACTIVE_ROW':\r\n await this.nav.setActiveRow(command);\r\n return;\r\n case 'MOVE_ACTIVE_CELL':\r\n await this.nav.moveActiveCell(command);\r\n return;\r\n case 'MOVE_ACTIVE_CELL_VERTICAL':\r\n await this.nav.moveActiveCellVertical(command);\r\n return;\r\n case 'ACTIVATE_FIRST_CELL':\r\n this.nav.activateFirstCell(command);\r\n return;\r\n\r\n // ── Table lifecycle ──────────────────────────────────────────────────────\r\n case 'TABLE_REGISTERED':\r\n await this.registerTable(command);\r\n return;\r\n case 'TABLE_DELETED':\r\n await this.deleteTable(command);\r\n return;\r\n case 'TABLE_DISPOSED':\r\n this.disposeTable(command);\r\n return;\r\n case 'TABLE_RESET':\r\n await this.resetTable(command);\r\n return;\r\n\r\n // ── Row expand / collapse ────────────────────────────────────────────────\r\n case 'ROW_EXPANDED':\r\n this.rowMgr.setRowExpanded(command);\r\n return;\r\n case 'ROW_EXPAND_TOGGLED':\r\n this.rowMgr.toggleRowExpanded(command);\r\n return;\r\n case 'COLLAPSE_ALL_ROWS':\r\n this.rowMgr.collapseAll(command.tableKey);\r\n return;\r\n\r\n // ── Row movement ─────────────────────────────────────────────────────────\r\n case 'MOVE_VERTICAL_SELECTED_ROWS':\r\n this.rowMgr.moveVerticalSelectedRows(command);\r\n return;\r\n case 'MOVE_VERTICAL_ACTIVE_ROW':\r\n this.rowMgr.moveVerticalActiveRow(command);\r\n return;\r\n\r\n // ── Row selection ────────────────────────────────────────────────────────\r\n case 'ROWS_DELETED':\r\n this.selection.deleteAll(command.tableKey);\r\n return;\r\n case 'TOGGLE_SELECT_ALL_ROWS':\r\n this.selection.toggleSelectAllRows(command);\r\n return;\r\n case 'TOGGLE_SELECT_PAGE_ROWS':\r\n this.selection.toggleSelectPageRows(command);\r\n return;\r\n case 'ROW_SELECTION_TOGGLED':\r\n this.selection.toggleRowSelection(command);\r\n return;\r\n case 'ROW_RANGE_SELECTED':\r\n this.selection.selectRange(command);\r\n return;\r\n case 'ROW_SELECTED':\r\n this.selection.setSelectRow(command);\r\n return;\r\n case 'SELECT_FROM_ACTIVE_TO_LAST':\r\n this.selection.selectFromActiveToLast(command);\r\n return;\r\n\r\n // ── Table action (copy/cut/paste) ────────────────────────────────────────\r\n case 'SET_TABLE_ACTION': {\r\n const pasteAction = command.action;\r\n if (pasteAction === 'paste' || pasteAction === 'pasteInsert') {\r\n await this.executePasteAction({\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n action: pasteAction,\r\n correlationId: command.correlationId,\r\n });\r\n return;\r\n }\r\n const activeRowId = this.getStore(command.tableKey)?.getState().activeRowId;\r\n this.rowMgr.setTableAction(command, activeRowId);\r\n return;\r\n }\r\n\r\n // ── UI overlay state ─────────────────────────────────────────────────────\r\n case 'SET_GRID_SEARCH':\r\n this.setGridSearch(command);\r\n return;\r\n case 'SET_MOBILE_EDITOR':\r\n this.setMobileEditor(command);\r\n return;\r\n\r\n // ── Delegate to AppService ───────────────────────────────────────────────\r\n default:\r\n if (!isApplicationTableCommand(command)) {\r\n this.errHandler.handle(\r\n new Error(`Unhandled engine command: ${command.type}`),\r\n 'TableEngine.dispatch'\r\n );\r\n return;\r\n }\r\n await this.executeAppCommand(command);\r\n }\r\n }\r\n\r\n private setGridSearch(command: {\r\n tableKey: string;\r\n search: TableState['gridSearch'];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState(prev => ({\r\n ...prev,\r\n gridSearch: command.search,\r\n }));\r\n }\r\n\r\n private setMobileEditor(command: {\r\n tableKey: string;\r\n editor: TableState['mobileEditor'];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState(prev => ({\r\n ...prev,\r\n mobileEditor: command.editor,\r\n }));\r\n }\r\n\r\n // ─── public read API ────────────────────────────────────────────────────────\r\n\r\n getViewState(): TableViewState | undefined {\r\n return this.viewBuilder.getViewState();\r\n }\r\n\r\n getAllRows(): Row[] | null {\r\n return this.viewBuilder.getAllRows();\r\n }\r\n\r\n getAllUIRows(): UIRow[] | null {\r\n return this.viewBuilder.getAllUIRows();\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | undefined {\r\n return this.viewBuilder.getMobileViewState();\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n return this.viewBuilder.getRowView(rowId);\r\n }\r\n\r\n getSnapShot(collectionScope: CollectionScope): TableSnapShot | null {\r\n return this.viewBuilder.getSnapShot(collectionScope);\r\n }\r\n\r\n getExpandedRowData(rowId: number): Record<string, unknown> | null {\r\n return this.viewBuilder.getExpandedRowData(rowId);\r\n }\r\n\r\n getActiveCell(): TableState['activeCell'] | null {\r\n return this.viewBuilder.getActiveCell();\r\n }\r\n\r\n getActiveRow(): number | null {\r\n return this.viewBuilder.getActiveRow();\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | undefined {\r\n return this.viewBuilder.getSelectedRows();\r\n }\r\n\r\n getCell(rowId: number, columnId: string): Cell | undefined {\r\n return this.viewBuilder.getCell(rowId, columnId);\r\n }\r\n getMobileEditor(): TableState['mobileEditor'] | undefined {\r\n const store = this.getStore();\r\n if (!store) return undefined;\r\n return store.getState().mobileEditor;\r\n }\r\n\r\n isActiveCell(rowId: number, columnId: string): boolean {\r\n return this.viewBuilder.isActiveCell(rowId, columnId);\r\n }\r\n\r\n isSelectedRow(rowId: number): boolean {\r\n return this.viewBuilder.isSelectedRow(rowId);\r\n }\r\n\r\n isCutRow(rowId: number): boolean {\r\n return this.viewBuilder.isCutRow(rowId);\r\n }\r\n\r\n isActiveRow(rowId: number): boolean {\r\n return this.viewBuilder.isActiveRow(rowId);\r\n }\r\n\r\n private validateCell(value: any, schema: ColumnSchema, caption: string, rowId: number): CellError | undefined {\r\n const rules = schema?.rules ?? [];\r\n if (!rules.length) return undefined;\r\n for (const rule of rules) {\r\n const v = rule.transform ? rule.transform(value) : value;\r\n const isEmpty =\r\n v === null ||\r\n v === undefined ||\r\n (typeof v === \"string\" && v.trim() === \"\") ||\r\n (Array.isArray(v) && v.length === 0);\r\n\r\n // Required\r\n if (rule.required) {\r\n if (isEmpty) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} الزامی است` };\r\n }\r\n\r\n // Optional empty values should not fail type/min/max checks\r\n if (isEmpty) continue;\r\n\r\n // Pattern\r\n if (rule.pattern) {\r\n const reg = typeof rule.pattern === \"string\" ? new RegExp(rule.pattern) : rule.pattern;\r\n if (!reg.test(String(v))) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} فرمت نامعتبر دارد` };\r\n }\r\n\r\n // Type-based\r\n switch (rule.type) {\r\n case \"number\":\r\n case \"integer\":\r\n case \"float\": {\r\n const n = Number(v);\r\n\r\n if (Number.isNaN(n)) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید عددی باشد` };\r\n if (rule.min != null && n < rule.min) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ≥ ${rule.min} باشد` };\r\n if (rule.max != null && n > rule.max) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ≤ ${rule.max} باشد` };\r\n if (rule.type === \"integer\" && !Number.isInteger(n)) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید عدد صحیح باشد` };\r\n break;\r\n }\r\n case \"boolean\":\r\n if (typeof v !== \"boolean\") return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید بولی باشد` };\r\n break;\r\n case \"email\": {\r\n const reg = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!reg.test(String(v))) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} ایمیل معتبر نیست` };\r\n break;\r\n }\r\n case \"url\": {\r\n try {\r\n new URL(v);\r\n } catch {\r\n return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید URL معتبر باشد` };\r\n }\r\n break;\r\n }\r\n case \"date\": {\r\n const d = new Date(v);\r\n if (isNaN(d.getTime())) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} تاریخ معتبر نیست` };\r\n break;\r\n }\r\n case \"enum\":\r\n if (rule.enum && !rule.enum.includes(v))\r\n return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} مقدار نامعتبر دارد` };\r\n break;\r\n default:\r\n break;\r\n }\r\n if (typeof v === \"string\") {\r\n if (rule.len != null && v.length !== rule.len) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ${rule.len} کاراکتر باشد` };\r\n if (rule.min != null && v.length < rule.min) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید حداقل ${rule.min} کاراکتر باشد` };\r\n if (rule.max != null && v.length > rule.max) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید حداکثر ${rule.max} کاراکتر باشد` };\r\n }\r\n if (rule.validator) {\r\n let customError: string[] | undefined;\r\n rule.validator(rule, v, (err?: string[]) => (customError = err));\r\n if (customError && customError.length) return { caption, rowId, message: rule.message ?? customError[0] };\r\n }\r\n if (rule.asyncValidator) {\r\n // async validatorها رو اینجا فقط ignore میکنیم (درصورت نیاز async handle کن)\r\n }\r\n }\r\n return undefined;\r\n }\r\n validation(cb: ValidationCallback): void {\r\n const store = this.getStore();\r\n if (!store) {\r\n cb({\r\n valid: false,\r\n errors: new Map<string, CellError>([\r\n [\r\n \"system\",\r\n {\r\n caption: \"\",\r\n rowId: NaN,\r\n message: `TableStore not found for active table`,\r\n },\r\n ],\r\n ]),\r\n data: null,\r\n });\r\n return;\r\n }\r\n const table = store.getState().table;\r\n try {\r\n const nextErrors = new Map<string, CellError>();\r\n this.getAllRows()\r\n ?.filter((row) => row.rowState.value !== RowStateEnum.Deleted)\r\n .forEach((row: Row, rowIndex: number) => {\r\n for (const [columnId, cell] of row.getCells().entries()) {\r\n const schema = table.getColumnSchema(new ColumnId(columnId));\r\n if (!schema || schema.hidden) continue;\r\n const cellId = `row-${rowIndex}-${columnId}`;\r\n const error = this.validateCell(\r\n cell.getValue() as any,\r\n schema,\r\n schema.fieldCaption,\r\n row.id.value,\r\n );\r\n if (error) {\r\n nextErrors.set(cellId, error);\r\n }\r\n }\r\n });\r\n this.errors.clear();\r\n nextErrors.forEach((error, cellId) => {\r\n this.errors.set(cellId, error);\r\n });\r\n cb(\r\n {\r\n valid: this.errors.size === 0,\r\n errors: this.errors,\r\n data: this.getAllRows()\r\n }\r\n );\r\n store.setState(prev => {\r\n return {\r\n ...prev,\r\n // activeRowId: null,\r\n // activeCell: null,\r\n expandedRows: {}\r\n };\r\n });\r\n } catch (error) {\r\n const message =\r\n error instanceof Error ? error.message : String(error ?? \"خطای اعتبارسنجی\");\r\n cb(\r\n {\r\n valid: false,\r\n errors: new Map<string, CellError>([['system', { caption: '', rowId: NaN, message }]]),\r\n data: null\r\n }\r\n );\r\n\r\n }\r\n }\r\n isValidCell(\r\n rowId: number,\r\n caption: string\r\n ): ValidCell {\r\n try {\r\n const store = this.getStore()?.getState();\r\n if (!store) return { isValid: false, cellError: { caption: \"\", rowId: NaN, message: \"حافظه پیدا نشد\" } };\r\n\r\n const table = store.table;\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n if (row.rowState.value === RowStateEnum.Deleted) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n const rowIndex = table.getRows().sort((a, b) => {\r\n const aIndex = Number(a.getCells().get(\"index\")?.getValue() ?? 0);\r\n const bIndex = Number(b.getCells().get(\"index\")?.getValue() ?? 0);\r\n return aIndex - bIndex;\r\n }).findIndex(r => r.id.value == rowId)\r\n const schema = table.getColumnSchema(new ColumnId(caption));\r\n if (!schema) return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n const cell = row.getCell(caption);\r\n if (!cell) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n const error = this.validateCell(cell.getValue() as any, schema, caption, rowId);\r\n if (error) {\r\n return { isValid: false, cellError: error }\r\n } else {\r\n const cellId = `row-${rowIndex}-${caption}`;\r\n this.errors.delete(cellId);\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: '' } }\r\n }\r\n } catch (e) {\r\n const message = e instanceof Error ? e.message : String(e ?? \"خطای اعتبارسنجی\");\r\n return { isValid: false, cellError: { caption: \"\", rowId: NaN, message } }\r\n }\r\n }\r\n // ─── subscriptions ───────────────────────────────────────────────────────────\r\n\r\n subscribe(cb: () => void): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n try {\r\n return store.subscribe(cb);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.subscribe');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Selector-based subscription over engine-derived view data.\r\n * `selector` closes over engine getters (snapshot, activeCell, …).\r\n */\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n try {\r\n let current = selector();\r\n return store.subscribe(() => {\r\n const next = selector();\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n });\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.subscribeSelected');\r\n return null;\r\n }\r\n }\r\n\r\n subscribeColumn<T = unknown>(\r\n columnId: string,\r\n collections: CollectionScope,\r\n cb: (items: Array<{ id: number; rowNum: unknown; value: T }>) => void,\r\n ): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n\r\n const buildItems = () =>\r\n (this.viewBuilder.getAllRows(collections) ?? [])\r\n .filter(r => r.rowState.value !== RowStateEnum.Deleted)\r\n .map(r => ({\r\n id: r.id.value,\r\n rowNum: r.getCell('index')?.getValue(),\r\n value: r.getCell(columnId)?.getValue() as T,\r\n }));\r\n\r\n let prev = buildItems();\r\n\r\n return store.subscribe(() => {\r\n const next = buildItems();\r\n\r\n const changed =\r\n next.length !== prev.length ||\r\n next.some(\r\n (item, i) =>\r\n item.id !== prev[i].id ||\r\n item.rowNum !== prev[i].rowNum ||\r\n item.value !== prev[i].value,\r\n );\r\n\r\n if (changed) {\r\n prev = next;\r\n cb(next);\r\n }\r\n });\r\n }\r\n}","// adapters/infra/indexedDbTableRepository.ts\r\n\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { Cell } from '../../domain/entities/Cell';\r\nimport { Collection } from '../../domain/entities/Collection';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\n\r\n// ─── Serialization interfaces ─────────────────────────────────────────────────\r\n\r\ninterface SerializedCell {\r\n colId: string;\r\n value: unknown;\r\n originalValue: unknown;\r\n display: unknown;\r\n}\r\n\r\ninterface SerializedRow {\r\n rowId: number;\r\n cells: SerializedCell[];\r\n rowState: RowStateEnum;\r\n visibilityCondition: Record<string, boolean>;\r\n collection?: string;\r\n rowType?: string;\r\n isSaveDescription: boolean;\r\n}\r\n\r\ninterface SerializedCollection {\r\n name?: string;\r\n type?: string;\r\n rows: SerializedRow[];\r\n}\r\n\r\ninterface SerializedTable {\r\n id: string;\r\n pages: string[];\r\n collections: SerializedCollection[];\r\n activeCollection?: string;\r\n activeDetailType?: string;\r\n}\r\n\r\n// ─── Repository ───────────────────────────────────────────────────────────────\r\n\r\nexport class IndexedDbTableRepository implements TableRepository {\r\n private dbName = 'ERP_TABLE_DB';\r\n private dbPromise: Promise<IDBDatabase>;\r\n\r\n constructor() {\r\n this.dbPromise = this.initDb();\r\n }\r\n\r\n private initDb(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName);\r\n request.onupgradeneeded = (_event: IDBVersionChangeEvent) => { };\r\n request.onsuccess = () => {\r\n const db = request.result;\r\n db.onversionchange = () => {\r\n db.close();\r\n console.warn('DB version changed, connection closed');\r\n };\r\n resolve(db);\r\n };\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n private async getDb(): Promise<IDBDatabase> {\r\n return this.dbPromise;\r\n }\r\n\r\n // ─── Serialization ──────────────────────────────────────────────────────────\r\n\r\n private serializeRows(rows: Row[]): SerializedRow[] {\r\n return rows.map(row => ({\r\n rowId: row.id.value,\r\n rowState: row.rowState.value,\r\n visibilityCondition: row.visibilityCondition,\r\n collection: row.collection,\r\n isSaveDescription: row.isSaveDescription,\r\n cells: Array.from(row.getCells().entries()).map(([colId, cell]) => ({\r\n colId,\r\n value: cell.getValue(),\r\n originalValue: cell.getOriginalValue().value,\r\n display: cell.getDisplay(),\r\n })),\r\n }));\r\n }\r\n\r\n /**\r\n * Serializes the entire collection map.\r\n * Each Collection becomes { name, rows[] }.\r\n */\r\n private serializeCollections(\r\n collectionMap: Map<string, Collection>\r\n ): SerializedCollection[] {\r\n const collections = Array.from(collectionMap.entries()).map(([name, collection]) => {\r\n return{\r\n name,\r\n rows: this.serializeRows(Array.from(collection.getRows().values())),\r\n }});\r\n return collections\r\n }\r\n\r\n // ─── Deserialization ────────────────────────────────────────────────────────\r\n\r\n private deserializeRowMap(data: SerializedRow[]): Map<number, Row> {\r\n const rowMap = new Map<number, Row>();\r\n\r\n data.forEach(r => {\r\n const cells = new Map<string, Cell>();\r\n r.cells.forEach(c => {\r\n cells.set(\r\n c.colId,\r\n new Cell(\r\n new RowId(r.rowId),\r\n new ColumnId(c.colId),\r\n new CellValue(c.value),\r\n new CellValue(c.originalValue),\r\n new CellValue(c.display)\r\n )\r\n );\r\n });\r\n\r\n const changeFields = new Set<string>();\r\n if (r.rowState === RowStateEnum.Modified) {\r\n r.cells.forEach(c => {\r\n if (c.value !== c.originalValue) changeFields.add(c.colId);\r\n });\r\n }\r\n\r\n rowMap.set(\r\n r.rowId,\r\n new Row(\r\n new RowId(r.rowId),\r\n cells,\r\n new RowState(r.rowState),\r\n changeFields,\r\n r.visibilityCondition,\r\n r.collection ?? r.rowType ?? 'default',\r\n r.isSaveDescription\r\n )\r\n );\r\n });\r\n\r\n return rowMap;\r\n }\r\n\r\n /**\r\n * Rebuilds the full Map<string, Collection> from persisted data.\r\n * If the stored data is empty/missing, seeds a default empty collection\r\n * so Table always has at least one entry.\r\n */\r\n private deserializeCollections(\r\n data: SerializedCollection[],\r\n activeCollection: string\r\n ): Map<string, Collection> {\r\n const collectionMap = new Map<string, Collection>();\r\n\r\n if (!data || data.length === 0) {\r\n collectionMap.set(activeCollection, new Collection(activeCollection, new Map<number, Row>(), new Map<string, ColumnSchema>));\r\n return collectionMap;\r\n }\r\n\r\n data.forEach(({ name, type, rows }) => {\r\n const collectionName = name ?? type ?? activeCollection;\r\n collectionMap.set(collectionName, new Collection(collectionName, this.deserializeRowMap(rows), new Map<string, ColumnSchema>));\r\n });\r\n\r\n // Ensure the active collection always has an entry even if not in stored data\r\n if (!collectionMap.has(activeCollection)) {\r\n collectionMap.set(activeCollection, new Collection(activeCollection, new Map<number, Row>(), new Map<string, ColumnSchema>));\r\n }\r\n\r\n return collectionMap;\r\n }\r\n\r\n // ─── Store management ───────────────────────────────────────────────────────\r\n\r\n private async ensureStore(db: IDBDatabase, storeName: string): Promise<IDBDatabase> {\r\n if (db.objectStoreNames.contains(storeName)) return db;\r\n\r\n db.close();\r\n const newDb = await new Promise<IDBDatabase>((resolve, reject) => {\r\n const req = indexedDB.open(this.dbName, db.version + 1);\r\n req.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n const upgradedDb = (event.target as IDBOpenDBRequest).result;\r\n if (!upgradedDb.objectStoreNames.contains(storeName)) {\r\n upgradedDb.createObjectStore(storeName, { keyPath: 'id' });\r\n }\r\n };\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n this.dbPromise = Promise.resolve(newDb);\r\n return newDb;\r\n }\r\n\r\n // ─── CRUD ───────────────────────────────────────────────────────────────────\r\n\r\n async save(storeName: string, table: Table): Promise<void> {\r\n let db = await this.getDb();\r\n db = await this.ensureStore(db, storeName);\r\n const serialized: SerializedTable = {\r\n id: table.id,\r\n pages: [table.id],\r\n collections: this.serializeCollections(table.getCollections()),\r\n activeCollection: table.getActiveCollectionName(),\r\n };\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n if(!objectStore)return\r\n const req = objectStore.put(serialized);\r\n req.onsuccess = () => resolve();\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async getById(storeName: string, tableId: string): Promise<Table> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) {\r\n throw new Error(`Store ${storeName} not found`);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.get(tableId) as IDBRequest<SerializedTable>;\r\n\r\n req.onsuccess = () => {\r\n const result = req.result;\r\n if (!result) {\r\n reject(new Error(`Table ${tableId} not found`));\r\n return;\r\n }\r\n const activeCollection = result.activeCollection ?? result.activeDetailType ?? 'default';\r\n resolve(\r\n new Table(\r\n tableId,\r\n this.deserializeCollections(result.collections, activeCollection),\r\n new Pagination(1, 10, 10),\r\n null,\r\n activeCollection\r\n )\r\n );\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async exists(storeName: string, tableId: string): Promise<boolean> {\r\n if (!tableId) return false;\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return false;\r\n\r\n return new Promise(resolve => {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.get(tableId);\r\n req.onsuccess = () => resolve(Boolean(req.result));\r\n req.onerror = () => resolve(false);\r\n });\r\n }\r\n\r\n async delete(storeName: string, tableId: string): Promise<void> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.delete(tableId);\r\n req.onsuccess = () => resolve();\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async resetTable(storeName: string, tableId: string): Promise<void> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n const getReq = objectStore.get(tableId) as IDBRequest<SerializedTable>;\r\n\r\n getReq.onsuccess = () => {\r\n if (!getReq.result) {\r\n reject(new Error(`Table ${tableId} not found`));\r\n return;\r\n }\r\n const resetTable: SerializedTable = {\r\n id: tableId,\r\n pages: [tableId],\r\n collections: [], // empty — Table will seed a default collection on next load\r\n activeDetailType: getReq.result.activeDetailType,\r\n };\r\n const putReq = objectStore.put(resetTable);\r\n putReq.onsuccess = () => resolve();\r\n putReq.onerror = () => reject(putReq.error);\r\n };\r\n getReq.onerror = () => reject(getReq.error);\r\n });\r\n }\r\n}","// adapters/infra/localTableRepository.ts\r\n\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { Table } from '../../domain/entities/Table';\r\n\r\nexport class LocalTableRepository implements TableRepository {\r\n private tables = new Map<string, Table>();\r\n private initTables = new Map<string, Table>();\r\n\r\n constructor(initialTables: Table[] = []) {\r\n initialTables.forEach(t => {\r\n this.tables.set(t.id, t.clone());\r\n this.initTables.set(t.id, t.clone()); \r\n });\r\n }\r\n\r\n async exists(_store: string, tableKey: string): Promise<boolean> {\r\n return this.tables.has(tableKey);\r\n }\r\n\r\n async getById(_store: string, tableKey: string): Promise<Table> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) throw new Error(`Table ${tableKey} not found`);\r\n return table;\r\n }\r\n\r\n async save(_store: string, table: Table): Promise<void> {\r\n this.tables.set(table.id, table);\r\n }\r\n\r\n async delete(_store: string, tableKey: string): Promise<void> {\r\n this.tables.delete(tableKey);\r\n }\r\n\r\n async resetTable(_store: string, tableKey: string): Promise<void> {\r\n const initTable = this.initTables.get(tableKey);\r\n if (initTable) this.tables.set(tableKey, initTable.clone()); // ← fresh clone each reset\r\n }\r\n}","// adapters/infra/cachedTableRepository.ts\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { IndexedDbTableRepository } from './indexedDbTableRepository';\r\nimport { LocalTableRepository } from './localTableRepository';\r\n\r\nexport class CachedTableRepository implements TableRepository {\r\n private localRepo: LocalTableRepository;\r\n private indexedRepo: IndexedDbTableRepository;\r\n\r\n constructor() {\r\n this.localRepo = new LocalTableRepository();\r\n this.indexedRepo = new IndexedDbTableRepository();\r\n }\r\n\r\n async getById(store: string, tableKey: string): Promise<Table> {\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n return this.localRepo.getById(store, tableKey);\r\n }\r\n const table = await this.indexedRepo.getById(store, tableKey);\r\n await this.localRepo.save(store, table);\r\n return table;\r\n }\r\n\r\n async save(store: string, table: Table): Promise<void> {\r\n await this.localRepo.save(store, table);\r\n await this.indexedRepo.save(store, table);\r\n }\r\n\r\n async delete(store: string, tableKey: string): Promise<void> {\r\n await this.localRepo.delete(store, tableKey);\r\n await this.indexedRepo.delete(store, tableKey);\r\n }\r\n\r\n async resetTable(store: string, tableKey: string): Promise<void> {\r\n await this.localRepo.resetTable(store, tableKey);\r\n await this.indexedRepo.resetTable(store, tableKey);\r\n }\r\n\r\n async exists(store: string, tableKey: string): Promise<boolean> {\r\n return this.indexedRepo.exists(store, tableKey);\r\n }\r\n}\r\n\r\n","//adapters/infra\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\n\r\nexport class ConsoleAuditLogger implements AuditLogger {\r\n log(event: unknown) {\r\n console.log('[AuditLog]', event);\r\n }\r\n error(event: unknown) {\r\n console.error('[AuditLog]', event);\r\n }\r\n warn(event: unknown) {\r\n console.warn('[AuditLog]', event);\r\n }\r\n info(event: unknown) {\r\n console.info('[AuditLog]', event);\r\n }\r\n}\r\n","import { EngineErrorHandler } from '../../engine/EngineErrorHandler';\r\nimport { RemoteApi } from '../../application/ports/RemoteApi';\r\n\r\ntype 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 * Browser RemoteApi used by ERP after npm install.\r\n * Reads auth cookie `_auth` and redux-persist `persist:arianERP` the same way\r\n * the ERP FetchRemoteApi did, then POSTs JSON (relative URLs work on the ERP host).\r\n */\r\nexport class FetchRemoteApi implements RemoteApi {\r\n constructor(\r\n private readonly err?: EngineErrorHandler,\r\n private readonly options: { baseUrl?: string } = {},\r\n ) {}\r\n\r\n async request<TResponse = any>(input: {\r\n endpoint: string;\r\n params?: Record<string, any>;\r\n method?: 'GET' | 'POST';\r\n }): Promise<TResponse> {\r\n try {\r\n const defaults = readErpDefaults();\r\n const token = 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 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","import type { RemoteApi } from '../../application/ports/RemoteApi';\r\n\r\n/** Default RemoteApi for Node/tests/package builds — host injects a real adapter. */\r\nexport class NoopRemoteApi implements RemoteApi {\r\n async request<TResponse = unknown>(): Promise<TResponse> {\r\n return null as TResponse;\r\n }\r\n}\r\n","import type { EventStore, AppendResult, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\ntype Listener = (event: GridEvent) => void;\r\n\r\nexport class InMemoryEventStore implements EventStore {\r\n private streams = new Map<string, GridEvent[]>();\r\n private globalLog: GridEvent[] = [];\r\n private listeners = new Map<string, Set<Listener>>();\r\n private globalListeners = new Set<Listener>();\r\n\r\n async append(\r\n streamId: string,\r\n events: GridEvent[],\r\n expectedVersion: number\r\n ): Promise<AppendResult> {\r\n const stream = this.streams.get(streamId) ?? [];\r\n const actualVersion = stream.length;\r\n\r\n if (expectedVersion !== -1 && expectedVersion !== actualVersion) {\r\n return { ok: false, conflict: { expectedVersion, actualVersion } };\r\n }\r\n\r\n const stamped: GridEvent[] = [];\r\n for (const event of events) {\r\n const versioned: GridEvent = {\r\n ...event,\r\n streamId,\r\n version: stream.length + stamped.length + 1,\r\n };\r\n stamped.push(versioned);\r\n stream.push(versioned);\r\n this.globalLog.push(versioned);\r\n }\r\n this.streams.set(streamId, stream);\r\n\r\n const subs = this.listeners.get(streamId);\r\n for (const event of stamped) {\r\n if (subs) {\r\n for (const listener of subs) { listener(event); }\r\n }\r\n for (const listener of this.globalListeners) { listener(event); }\r\n }\r\n\r\n return { ok: true, version: stream.length };\r\n }\r\n\r\n async read(streamId: string, fromVersion: number = 0): Promise<GridEvent[]> {\r\n const stream = this.streams.get(streamId) ?? [];\r\n return stream.slice(fromVersion);\r\n }\r\n\r\n async readAll(fromPosition: number = 0): Promise<GridEvent[]> {\r\n return this.globalLog.slice(fromPosition);\r\n }\r\n\r\n subscribe(streamId: string, onEvent: Listener): Unsubscribe {\r\n if (!this.listeners.has(streamId)) {\r\n this.listeners.set(streamId, new Set());\r\n }\r\n const subs = this.listeners.get(streamId)!;\r\n subs.add(onEvent);\r\n return () => { subs.delete(onEvent); };\r\n }\r\n\r\n subscribeAll(onEvent: Listener): Unsubscribe {\r\n this.globalListeners.add(onEvent);\r\n return () => { this.globalListeners.delete(onEvent); };\r\n }\r\n\r\n getStreamVersion(streamId: string): number {\r\n return (this.streams.get(streamId) ?? []).length;\r\n }\r\n\r\n getGlobalPosition(): number {\r\n return this.globalLog.length;\r\n }\r\n}\r\n","/**\r\n * Minimal async key-value backend so IndexedDbEventStore can run in Node tests\r\n * without a real IndexedDB, and in browsers via an IDB adapter.\r\n */\r\nexport interface KvStore {\r\n get<T = unknown>(key: string): Promise<T | undefined>;\r\n put(key: string, value: unknown): Promise<void>;\r\n delete(key: string): Promise<void>;\r\n getAllKeys(): Promise<string[]>;\r\n getAll<T = unknown>(): Promise<T[]>;\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport interface KvDatabase {\r\n objectStore(name: string): KvStore;\r\n}\r\n\r\nexport class MemoryKvStore implements KvStore {\r\n private data = new Map<string, unknown>();\r\n\r\n async get<T = unknown>(key: string): Promise<T | undefined> {\r\n return this.data.get(key) as T | undefined;\r\n }\r\n\r\n async put(key: string, value: unknown): Promise<void> {\r\n this.data.set(key, value);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.data.delete(key);\r\n }\r\n\r\n async getAllKeys(): Promise<string[]> {\r\n return Array.from(this.data.keys());\r\n }\r\n\r\n async getAll<T = unknown>(): Promise<T[]> {\r\n return Array.from(this.data.values()) as T[];\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.data.clear();\r\n }\r\n}\r\n\r\nexport class MemoryKvDatabase implements KvDatabase {\r\n private stores = new Map<string, MemoryKvStore>();\r\n\r\n objectStore(name: string): KvStore {\r\n let store = this.stores.get(name);\r\n if (!store) {\r\n store = new MemoryKvStore();\r\n this.stores.set(name, store);\r\n }\r\n return store;\r\n }\r\n}\r\n\r\n/**\r\n * Browser IndexedDB adapter. Opens (or creates) a DB with the given object stores.\r\n * Falls back callers should use MemoryKvDatabase in Node/tests.\r\n */\r\nexport async function openIndexedDbDatabase(\r\n dbName: string,\r\n storeNames: string[],\r\n version = 1,\r\n): Promise<KvDatabase> {\r\n if (typeof indexedDB === 'undefined') {\r\n throw new Error('indexedDB is not available in this environment');\r\n }\r\n\r\n const db = await new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(dbName, version);\r\n request.onerror = () => reject(request.error ?? new Error('indexedDB.open failed'));\r\n request.onupgradeneeded = () => {\r\n const database = request.result;\r\n for (const name of storeNames) {\r\n if (!database.objectStoreNames.contains(name)) {\r\n database.createObjectStore(name);\r\n }\r\n }\r\n };\r\n request.onsuccess = () => resolve(request.result);\r\n });\r\n\r\n return {\r\n objectStore(name: string): KvStore {\r\n return {\r\n async get<T = unknown>(key: string): Promise<T | undefined> {\r\n return run(db, name, 'readonly', (store) => store.get(key)) as Promise<T | undefined>;\r\n },\r\n async put(key: string, value: unknown): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.put(value, key));\r\n },\r\n async delete(key: string): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.delete(key));\r\n },\r\n async getAllKeys(): Promise<string[]> {\r\n const keys = await run(db, name, 'readonly', (store) => store.getAllKeys());\r\n return (keys as IDBValidKey[]).map(String);\r\n },\r\n async getAll<T = unknown>(): Promise<T[]> {\r\n return run(db, name, 'readonly', (store) => store.getAll()) as Promise<T[]>;\r\n },\r\n async clear(): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.clear());\r\n },\r\n };\r\n },\r\n };\r\n}\r\n\r\nfunction run<T>(\r\n db: IDBDatabase,\r\n storeName: string,\r\n mode: IDBTransactionMode,\r\n op: (store: IDBObjectStore) => IDBRequest<T>,\r\n): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, mode);\r\n const store = tx.objectStore(storeName);\r\n const request = op(store);\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error ?? new Error('IDB request failed'));\r\n });\r\n}\r\n","import type { EventStore, AppendResult, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type { KvDatabase } from './KvDatabase';\r\nimport { MemoryKvDatabase, openIndexedDbDatabase } from './KvDatabase';\r\n\r\ntype Listener = (event: GridEvent) => void;\r\n\r\nconst STREAMS = 'streams';\r\nconst GLOBAL = 'global';\r\nconst META = 'meta';\r\n\r\ntype StreamRecord = {\r\n events: GridEvent[];\r\n};\r\n\r\n/**\r\n * Durable EventStore backed by IndexedDB (or any KvDatabase).\r\n * Same OCC contract as InMemoryEventStore.\r\n */\r\nexport class IndexedDbEventStore implements EventStore {\r\n private listeners = new Map<string, Set<Listener>>();\r\n private globalListeners = new Set<Listener>();\r\n private ready: Promise<void>;\r\n\r\n constructor(private readonly db: KvDatabase) {\r\n this.ready = Promise.resolve();\r\n }\r\n\r\n static async open(\r\n dbName = 'erp-table-events',\r\n ): Promise<IndexedDbEventStore> {\r\n const db = await openIndexedDbDatabase(dbName, [STREAMS, GLOBAL, META]);\r\n return new IndexedDbEventStore(db);\r\n }\r\n\r\n /** Test / Node helper — durable API with in-memory persistence backend. */\r\n static inMemory(): IndexedDbEventStore {\r\n return new IndexedDbEventStore(new MemoryKvDatabase());\r\n }\r\n\r\n async append(\r\n streamId: string,\r\n events: GridEvent[],\r\n expectedVersion: number,\r\n ): Promise<AppendResult> {\r\n await this.ready;\r\n const streamStore = this.db.objectStore(STREAMS);\r\n const globalStore = this.db.objectStore(GLOBAL);\r\n const metaStore = this.db.objectStore(META);\r\n\r\n const record = (await streamStore.get<StreamRecord>(streamId)) ?? {\r\n events: [],\r\n };\r\n const actualVersion = record.events.length;\r\n\r\n if (expectedVersion !== -1 && expectedVersion !== actualVersion) {\r\n return { ok: false, conflict: { expectedVersion, actualVersion } };\r\n }\r\n\r\n const stamped: GridEvent[] = [];\r\n for (const event of events) {\r\n const versioned: GridEvent = {\r\n ...event,\r\n streamId,\r\n version: record.events.length + stamped.length + 1,\r\n };\r\n stamped.push(versioned);\r\n record.events.push(versioned);\r\n }\r\n\r\n await streamStore.put(streamId, record);\r\n\r\n const globalPos =\r\n (await metaStore.get<number>('globalPosition')) ?? 0;\r\n let nextPos = globalPos;\r\n for (const event of stamped) {\r\n nextPos += 1;\r\n await globalStore.put(String(nextPos), event);\r\n }\r\n await metaStore.put('globalPosition', nextPos);\r\n\r\n const subs = this.listeners.get(streamId);\r\n for (const event of stamped) {\r\n if (subs) {\r\n for (const listener of subs) listener(event);\r\n }\r\n for (const listener of this.globalListeners) listener(event);\r\n }\r\n\r\n return { ok: true, version: record.events.length };\r\n }\r\n\r\n async read(streamId: string, fromVersion: number = 0): Promise<GridEvent[]> {\r\n await this.ready;\r\n const record = await this.db.objectStore(STREAMS).get<StreamRecord>(streamId);\r\n return (record?.events ?? []).slice(fromVersion);\r\n }\r\n\r\n async readAll(fromPosition: number = 0): Promise<GridEvent[]> {\r\n await this.ready;\r\n const globalStore = this.db.objectStore(GLOBAL);\r\n const keys = (await globalStore.getAllKeys())\r\n .map(Number)\r\n .filter((n) => Number.isFinite(n))\r\n .sort((a, b) => a - b)\r\n .filter((n) => n > fromPosition);\r\n\r\n const events: GridEvent[] = [];\r\n for (const key of keys) {\r\n const event = await globalStore.get<GridEvent>(String(key));\r\n if (event) events.push(event);\r\n }\r\n return events;\r\n }\r\n\r\n subscribe(streamId: string, onEvent: Listener): Unsubscribe {\r\n if (!this.listeners.has(streamId)) {\r\n this.listeners.set(streamId, new Set());\r\n }\r\n const subs = this.listeners.get(streamId)!;\r\n subs.add(onEvent);\r\n return () => {\r\n subs.delete(onEvent);\r\n };\r\n }\r\n\r\n subscribeAll(onEvent: Listener): Unsubscribe {\r\n this.globalListeners.add(onEvent);\r\n return () => {\r\n this.globalListeners.delete(onEvent);\r\n };\r\n }\r\n}\r\n","import type { Unsubscribe } from '../../application/ports/EventStore';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogProjection,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\n\r\nexport type HistorySeverity = 'info' | 'warning' | 'error';\r\nexport type HistoryCategory = 'data' | 'structure' | 'view' | 'system';\r\n\r\nexport interface HistoryClassification {\r\n readonly severity: HistorySeverity;\r\n readonly category: HistoryCategory;\r\n}\r\n\r\nexport interface HistoryQuery extends ChangelogQuery {\r\n severity?: HistorySeverity;\r\n category?: HistoryCategory;\r\n}\r\n\r\nexport interface HistoryItem {\r\n readonly id: string;\r\n readonly type: string;\r\n readonly title: string;\r\n readonly description: string;\r\n readonly occurredAt: number;\r\n readonly tableId: string;\r\n readonly actorId: string;\r\n readonly severity: HistorySeverity;\r\n readonly category: HistoryCategory;\r\n readonly raw: ChangelogEntry;\r\n}\r\n\r\nconst HISTORY_CLASSIFICATIONS: Record<string, HistoryClassification> = {\r\n CELL_CHANGED: { category: 'data', severity: 'info' },\r\n CELL_DISPLAY_CHANGED: { category: 'data', severity: 'info' },\r\n ROW_ADDED: { category: 'data', severity: 'info' },\r\n NEW_ROW_ADDED: { category: 'data', severity: 'info' },\r\n ROW_DELETED: { category: 'data', severity: 'warning' },\r\n ROW_RESTORED: { category: 'data', severity: 'info' },\r\n ROW_REORDERED: { category: 'data', severity: 'info' },\r\n ROW_DESCRIPTION_SAVED: { category: 'data', severity: 'info' },\r\n DYNAMIC_PROJECTION_DONE: { category: 'data', severity: 'info' },\r\n DYNAMIC_DATA_REQUESTED: { category: 'data', severity: 'info' },\r\n VALIDATION_FAILED: { category: 'data', severity: 'error' },\r\n CELL_EDIT_CONFLICTED: { category: 'data', severity: 'error' },\r\n COLUMN_REORDERED: { category: 'structure', severity: 'info' },\r\n UNIT_COLUMN_ADDED: { category: 'structure', severity: 'info' },\r\n ACTIVE_COLLECTION_CHANGED: { category: 'structure', severity: 'info' },\r\n PAGE_CHANGED: { category: 'view', severity: 'info' },\r\n PAGE_SIZE_CHANGED: { category: 'view', severity: 'info' },\r\n VIEWPORT_CHANGED: { category: 'view', severity: 'info' },\r\n ROWS_LOADED: { category: 'system', severity: 'info' },\r\n TABLE_RESET: { category: 'system', severity: 'warning' },\r\n TABLE_DELETED: { category: 'system', severity: 'warning' },\r\n INVARIANT_VIOLATION: { category: 'system', severity: 'error' },\r\n};\r\n\r\nexport function classifyHistoryEvent(type: string): HistoryClassification {\r\n return HISTORY_CLASSIFICATIONS[type] ?? { category: 'system', severity: 'info' };\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value == null) return String(value);\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction describeEntry(entry: ChangelogEntry): Pick<HistoryItem, 'title' | 'description'> {\r\n const payload = entry.payload as Record<string, unknown> | null;\r\n const rowId = payload?.rowId;\r\n const columnId = payload?.columnId;\r\n\r\n switch (entry.type) {\r\n case 'CELL_CHANGED':\r\n return {\r\n title: 'Cell changed',\r\n description:\r\n payload?.previousValue !== undefined\r\n ? `Row ${rowId}, column \"${columnId}\" changed from ${formatValue(payload?.previousValue)} to ${formatValue(payload?.newValue)}.`\r\n : `Row ${rowId}, column \"${columnId}\" changed to ${formatValue(payload?.newValue)}.`,\r\n };\r\n case 'CELL_DISPLAY_CHANGED':\r\n return {\r\n title: 'Cell display changed',\r\n description: `Row ${rowId}, column \"${columnId}\" display changed to ${formatValue(payload?.newValue)}.`,\r\n };\r\n case 'PAGE_CHANGED':\r\n return {\r\n title: 'Page changed',\r\n description: `Table page changed to ${formatValue(payload?.page)}.`,\r\n };\r\n case 'PAGE_SIZE_CHANGED':\r\n return {\r\n title: 'Page size changed',\r\n description: `Page size changed to ${formatValue(payload?.pageSize)}.`,\r\n };\r\n case 'VIEWPORT_CHANGED':\r\n return {\r\n title: 'Viewport changed',\r\n description: `Scroll offset ${formatValue(payload?.scrollOffset)}; visible [${formatValue(payload?.startIndex)}–${formatValue(payload?.endIndex)}).`,\r\n };\r\n case 'ROW_ADDED':\r\n case 'NEW_ROW_ADDED':\r\n return {\r\n title: 'Row added',\r\n description: `Row ${formatValue(payload?.rowId)} was added.`,\r\n };\r\n case 'ROW_DELETED':\r\n return {\r\n title: 'Row deleted',\r\n description: `Row ${formatValue(payload?.rowId)} was deleted.`,\r\n };\r\n case 'ROW_RESTORED':\r\n return {\r\n title: 'Row restored',\r\n description: `Row ${formatValue(payload?.rowId)} was restored.`,\r\n };\r\n case 'ROW_REORDERED':\r\n return {\r\n title: 'Rows reordered',\r\n description: `Rows moved from ${formatValue(payload?.sourceIndex)} to ${formatValue(payload?.destIndex)}.`,\r\n };\r\n case 'ROW_DESCRIPTION_SAVED':\r\n return {\r\n title: 'Description saved',\r\n description: `Row ${formatValue(payload?.rowId)} description flag changed to ${formatValue(payload?.description)}.`,\r\n };\r\n case 'ACTIVE_COLLECTION_CHANGED':\r\n return {\r\n title: 'Active collection changed',\r\n description: 'The active collection was changed.',\r\n };\r\n case 'TABLE_RESET':\r\n return {\r\n title: 'Table reset',\r\n description: 'The table was reset.',\r\n };\r\n case 'TABLE_DELETED':\r\n return {\r\n title: 'Table deleted',\r\n description: 'The table was deleted.',\r\n };\r\n case 'UNIT_COLUMN_ADDED':\r\n return {\r\n title: 'Unit columns updated',\r\n description: `Unit-level columns updated: ${formatValue(payload?.reason)}.`,\r\n };\r\n case 'VALIDATION_FAILED':\r\n return {\r\n title: 'Validation failed',\r\n description: formatValue(payload?.reason ?? payload?.message ?? 'Validation failed.'),\r\n };\r\n case 'CELL_EDIT_CONFLICTED':\r\n return {\r\n title: 'Cell edit conflicted',\r\n description: `Row ${rowId}, column \"${columnId}\" could not be saved because of a version conflict.`,\r\n };\r\n case 'INVARIANT_VIOLATION':\r\n return {\r\n title: 'Invariant violation',\r\n description: formatValue(payload?.reason ?? payload?.message ?? 'A domain invariant was violated.'),\r\n };\r\n default:\r\n return {\r\n title: entry.type,\r\n description: `Event ${entry.type} was recorded.`,\r\n };\r\n }\r\n}\r\n\r\nfunction toChangelogQuery(filter: HistoryQuery): ChangelogQuery {\r\n const { severity: _severity, category: _category, limit: _limit, ...changelogFilter } = filter;\r\n return changelogFilter;\r\n}\r\n\r\nfunction applyHistoryFilters(items: HistoryItem[], filter: HistoryQuery): HistoryItem[] {\r\n let result = items;\r\n\r\n if (filter.severity) {\r\n result = result.filter((item) => item.severity === filter.severity);\r\n }\r\n if (filter.category) {\r\n result = result.filter((item) => item.category === filter.category);\r\n }\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(-filter.limit);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport class HistoryPanelViewModel {\r\n constructor(private readonly changelogProjection: ChangelogProjection) {}\r\n\r\n query(filter: HistoryQuery = {}): HistoryItem[] {\r\n return applyHistoryFilters(\r\n this.changelogProjection.query(toChangelogQuery(filter)).map((entry) => this.toHistoryItem(entry)),\r\n filter,\r\n );\r\n }\r\n\r\n count(filter: HistoryQuery = {}): number {\r\n return this.query(filter).length;\r\n }\r\n\r\n subscribe(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: HistoryQuery = {},\r\n ): Unsubscribe {\r\n return this.changelogProjection.subscribe((entries) => {\r\n cb(applyHistoryFilters(entries.map((entry) => this.toHistoryItem(entry)), filter));\r\n }, toChangelogQuery(filter));\r\n }\r\n\r\n private toHistoryItem(entry: ChangelogEntry): HistoryItem {\r\n const description = describeEntry(entry);\r\n const classification = classifyHistoryEvent(entry.type);\r\n\r\n return {\r\n id: entry.eventId,\r\n type: entry.type,\r\n title: description.title,\r\n description: description.description,\r\n occurredAt: entry.occurredAt,\r\n tableId: entry.tableId,\r\n actorId: entry.actorId,\r\n severity: classification.severity,\r\n category: classification.category,\r\n raw: entry,\r\n };\r\n }\r\n}\r\n","import type { EventStore, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\nexport interface ChangelogEntry {\r\n readonly eventId: string;\r\n readonly type: string;\r\n readonly tableId: string;\r\n readonly occurredAt: number;\r\n readonly actorId: string;\r\n readonly payload: unknown;\r\n}\r\n\r\nexport interface ChangelogQuery {\r\n tableId?: string;\r\n rowId?: number | string;\r\n columnId?: string;\r\n type?: string;\r\n since?: number;\r\n limit?: number;\r\n}\r\n\r\ntype ChangelogSubscriber = {\r\n filter: ChangelogQuery;\r\n notify: (entries: ChangelogEntry[]) => void;\r\n};\r\n\r\nexport class ChangelogProjection {\r\n private entries: ChangelogEntry[] = [];\r\n private unsubscribe: Unsubscribe | null = null;\r\n private subscribers = new Set<ChangelogSubscriber>();\r\n private seenEventIds = new Set<string>();\r\n private started = false;\r\n\r\n constructor(private readonly eventStore: EventStore) {}\r\n\r\n /**\r\n * Catch up via readAll, then subscribe for live events.\r\n * Dedupes by eventId so subscribe-before-replay races are safe.\r\n */\r\n async start(): Promise<void> {\r\n if (this.started) return;\r\n this.started = true;\r\n\r\n const projectOnce = (event: GridEvent) => {\r\n if (this.seenEventIds.has(event.eventId)) return;\r\n this.seenEventIds.add(event.eventId);\r\n this.project(event);\r\n };\r\n\r\n this.unsubscribe = this.eventStore.subscribeAll(projectOnce);\r\n\r\n const past = await this.eventStore.readAll(0);\r\n for (const event of past) {\r\n projectOnce(event);\r\n }\r\n }\r\n\r\n stop(): void {\r\n this.unsubscribe?.();\r\n this.unsubscribe = null;\r\n this.started = false;\r\n }\r\n\r\n query(filter: ChangelogQuery = {}): ChangelogEntry[] {\r\n let result = this.entries;\r\n\r\n if (filter.tableId) {\r\n result = result.filter((e) => e.tableId === filter.tableId);\r\n }\r\n if (filter.type) {\r\n result = result.filter((e) => e.type === filter.type);\r\n }\r\n if (filter.since) {\r\n const since = filter.since;\r\n result = result.filter((e) => e.occurredAt >= since);\r\n }\r\n if (filter.rowId !== undefined) {\r\n const rid = filter.rowId;\r\n result = result.filter((e) => {\r\n const p = e.payload as any;\r\n return p?.rowId === rid;\r\n });\r\n }\r\n if (filter.columnId) {\r\n const cid = filter.columnId;\r\n result = result.filter((e) => {\r\n const p = e.payload as any;\r\n return p?.columnId === cid;\r\n });\r\n }\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(-filter.limit);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n count(filter: ChangelogQuery = {}): number {\r\n return this.query(filter).length;\r\n }\r\n\r\n subscribe(\r\n notify: (entries: ChangelogEntry[]) => void,\r\n filter: ChangelogQuery = {},\r\n ): Unsubscribe {\r\n const subscriber: ChangelogSubscriber = { filter, notify };\r\n this.subscribers.add(subscriber);\r\n notify(this.query(filter));\r\n\r\n return () => {\r\n this.subscribers.delete(subscriber);\r\n };\r\n }\r\n\r\n clear(): void {\r\n this.entries = [];\r\n this.seenEventIds.clear();\r\n this.notifySubscribers();\r\n }\r\n\r\n private project(event: GridEvent): void {\r\n this.entries.push({\r\n eventId: event.eventId,\r\n type: event.type,\r\n tableId: event.tableId,\r\n occurredAt: event.occurredAt,\r\n actorId: event.actorId,\r\n payload: event.payload,\r\n });\r\n this.notifySubscribers();\r\n }\r\n\r\n private notifySubscribers(): void {\r\n for (const subscriber of this.subscribers) {\r\n subscriber.notify(this.query(subscriber.filter));\r\n }\r\n }\r\n}\r\n","// adapters/ui/UITableController.ts\r\n\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport {\r\n CollectionScope,\r\n Table,\r\n} from '../../domain/entities/Table';\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport { TableEngine } from '../../engine/tableEngine';\r\nimport { MOBILE_PAGE_SIZE } from '../../engine/type';\r\nimport type {\r\n GridSearchState,\r\n MobileEditorState,\r\n MobileTableViewState,\r\n ValidationCallbackResult,\r\n ValidCell,\r\n} from '../../engine/type';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\nimport type { ChangelogProjection } from '../projections/ChangelogProjection';\r\nimport type {\r\n HistoryItem,\r\n HistoryPanelViewModel,\r\n HistoryQuery,\r\n} from '../history/HistoryPanelViewModel';\r\nimport type { CellUndoStack } from '../../application/undo/CellUndoStack';\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { UIRow } from '../../ui/type';\r\nimport { UITableCommand } from './uiEvents';\r\n\r\nexport class UITableController {\r\n private disposed = false;\r\n constructor(\r\n private readonly engine: TableEngine,\r\n private readonly store: string,\r\n private readonly tableKey: string,\r\n private readonly audit: AuditLogger,\r\n private readonly changelogProjection?: ChangelogProjection,\r\n private readonly historyPanelViewModel?: HistoryPanelViewModel,\r\n private readonly cellUndoStack?: CellUndoStack,\r\n private readonly session?: GridSession,\r\n private readonly remoteApi?: RemoteApi,\r\n ) {}\r\n\r\n getRemoteApi(): RemoteApi | undefined {\r\n return this.remoteApi;\r\n }\r\n\r\n // ─── private dispatch helpers ───────────────────────────────────────\r\n\r\n private safe<T>(fn: () => T, context: string): T | null {\r\n try {\r\n return fn();\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `UITableController error in ${context}`,\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return null;\r\n }\r\n }\r\n\r\n private changePageSize(pageSize: number): void {\r\n this.engine.dispatch({ type: 'CHANGE_PAGE_SIZE', store: this.store, tableKey: this.tableKey, pageSize });\r\n }\r\n\r\n private changePage(page: number): void {\r\n this.engine.dispatch({ type: 'CHANGE_PAGE', store: this.store, tableKey: this.tableKey, page });\r\n }\r\n\r\n private onCellChange(rowId: number, columnId: string, value: unknown): void {\r\n this.engine.dispatch({ type: 'CHANGE_CELL_VALUE', store: this.store, tableKey: this.tableKey, rowId, columnId, newValue: value });\r\n }\r\n\r\n private onDescriptionSave(rowId: number, flag: boolean): void {\r\n this.engine.dispatch({ type: 'SAVE_DESCRIPTION', store: this.store, tableKey: this.tableKey, rowId, flag });\r\n }\r\n\r\n private onCellDisplayChange(rowId: number, columnId: string, value: string): void {\r\n this.engine.dispatch({ type: 'CHANGE_CELL_DISPLAY_VALUE', store: this.store, tableKey: this.tableKey, rowId, columnId, newValue: value });\r\n }\r\n\r\n private setActiveCell(rowId: number, columnId: string): void {\r\n const prev = this.engine.getActiveCell();\r\n if (prev?.rowId === rowId && prev?.columnId === columnId) return;\r\n this.engine.dispatch({ type: 'ACTIVE_CELL', tableKey: this.tableKey, rowId, columnId });\r\n }\r\n\r\n private setActiveRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'ACTIVE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private moveActiveCellVertical(rowId: number, columnId: string, direction: 'up' | 'down'): void {\r\n this.engine.dispatch({ type: 'MOVE_ACTIVE_CELL_VERTICAL', store: this.store, tableKey: this.tableKey, rowId, columnId, direction });\r\n }\r\n\r\n private reorderRow(draggedRowId: number, droppedRowId: number, position: 'before' | 'after'): void {\r\n this.engine.dispatch({ type: 'ROW_REORDERED', store: this.store, tableKey: this.tableKey, draggedRowId, droppedRowId, position });\r\n }\r\n\r\n private async addEmptyRow(): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'ADD_EMPTY_ROW',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n autoActivate: true,\r\n });\r\n }\r\n\r\n private async openMobileAddEditor(): Promise<void> {\r\n await this.addEmptyRow();\r\n const rowId = this.engine.getActiveRow();\r\n if (rowId != null) {\r\n this.setMobileEditor({ mode: 'add', rowId });\r\n }\r\n }\r\n\r\n private addNewRows(cmd: { rows: { key: string; value: unknown; display: unknown }[][]; detailFieldKey: string }): void {\r\n this.engine.dispatch({ type: 'ADD_NEW_ROWS', store: this.store, tableKey: this.tableKey, rows: cmd.rows, detailFieldKey: cmd.detailFieldKey });\r\n }\r\n\r\n private duplicateRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'DUPLICATE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private deleteRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'ROW_DELETED', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private deleteRows(): void {\r\n this.engine.dispatch({ type: 'ROWS_DELETED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n private deleteTable(): void {\r\n this.engine.dispatch({ type: 'TABLE_DELETED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n private async registerTable(table: Table): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'TABLE_REGISTERED',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n table,\r\n });\r\n }\r\n\r\n private async toggleRowExpanded(rowId: number): Promise<void> {\r\n await this.engine.dispatch({ type: 'ROW_EXPAND_TOGGLED', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private async toggleRowSelect(): Promise<void> {\r\n await this.engine.dispatch({ type: 'TOGGLE_SELECT_ALL_ROWS', tableKey: this.tableKey });\r\n }\r\n\r\n private async togglePageRowSelect(): Promise<void> {\r\n await this.engine.dispatch({ type: 'TOGGLE_SELECT_PAGE_ROWS', tableKey: this.tableKey });\r\n }\r\n\r\n private selectFromActiveToLast(activeRowId: number): void {\r\n if (activeRowId == null) return;\r\n this.engine.dispatch({ type: 'SELECT_FROM_ACTIVE_TO_LAST', tableKey: this.tableKey, anchorRowId: activeRowId });\r\n }\r\n\r\n private activateFirstEditableCell(rowId: number): void {\r\n this.engine.dispatch({ type: 'ACTIVATE_FIRST_CELL', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private moveToNextCell(rowId: number, columnId: string, direction: 'next' | 'prev' = 'next'): void {\r\n this.engine.dispatch({ type: 'MOVE_ACTIVE_CELL', store: this.store, tableKey: this.tableKey, rowId, columnId, direction });\r\n }\r\n\r\n private async setTableAction(action: TableActions): Promise<void> {\r\n await this.engine.dispatch({ type: 'SET_TABLE_ACTION', store: this.store, tableKey: this.tableKey, action });\r\n }\r\n\r\n private async setActiveCollection(activeCollection: string): Promise<void> {\r\n await this.engine.dispatch({ type: 'SET_ACTIVE_COLLECTION', store: this.store, tableKey: this.tableKey, activeCollection });\r\n }\r\n\r\n private setGridSearch(search: GridSearchState): void {\r\n this.engine.dispatch({ type: 'SET_GRID_SEARCH', tableKey: this.tableKey, search });\r\n }\r\n\r\n private setMobileEditor(editor: MobileEditorState): void {\r\n this.engine.dispatch({ type: 'SET_MOBILE_EDITOR', tableKey: this.tableKey, editor });\r\n }\r\n\r\n // ─── public read API ────────────────────────────────────────────────\r\n\r\n getViewState() {\r\n return this.safe(() => this.engine.getViewState(), 'getViewState');\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | null | undefined {\r\n return this.safe(\r\n () => this.engine.getMobileViewState(),\r\n 'getMobileViewState',\r\n );\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n return this.safe(() => this.engine.getRowView(rowId), 'getRowView');\r\n }\r\n\r\n getAllRows(): Row[] | null {\r\n return this.safe(() => this.engine.getAllRows(), 'getAllRows');\r\n }\r\n\r\n getAllUIRows() {\r\n return this.safe(() => this.engine.getAllUIRows(), 'getAllUIRows');\r\n }\r\n\r\n getSnapShot(collectionScope?: CollectionScope) {\r\n return this.safe(() => this.engine.getSnapShot(collectionScope ?? \"active\"), 'getSnapShot');\r\n }\r\n\r\n getCell(rowId: number, columnId: string) {\r\n return this.safe(() => this.engine.getCell(rowId, columnId), 'getCell');\r\n }\r\n\r\n getChangelog(filter: Omit<ChangelogQuery, 'tableId'> = {}): ChangelogEntry[] {\r\n if (!this.changelogProjection) return [];\r\n return this.safe(\r\n () => this.changelogProjection!.query({ tableId: this.tableKey, ...filter }),\r\n 'getChangelog',\r\n ) ?? [];\r\n }\r\n\r\n getChangelogCount(filter: Omit<ChangelogQuery, 'tableId'> = {}): number {\r\n if (!this.changelogProjection) return 0;\r\n return this.safe(\r\n () => this.changelogProjection!.count({ tableId: this.tableKey, ...filter }),\r\n 'getChangelogCount',\r\n ) ?? 0;\r\n }\r\n\r\n subscribeChangelog(\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter: Omit<ChangelogQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.changelogProjection) return () => {};\r\n return this.safe(\r\n () => this.changelogProjection!.subscribe(cb, { tableId: this.tableKey, ...filter }),\r\n 'subscribeChangelog',\r\n ) ?? (() => {});\r\n }\r\n\r\n getHistoryItems(filter: Omit<HistoryQuery, 'tableId'> = {}): HistoryItem[] {\r\n if (!this.historyPanelViewModel) return [];\r\n return this.safe(\r\n () => this.historyPanelViewModel!.query({ tableId: this.tableKey, ...filter }),\r\n 'getHistoryItems',\r\n ) ?? [];\r\n }\r\n\r\n getHistoryItemCount(filter: Omit<HistoryQuery, 'tableId'> = {}): number {\r\n if (!this.historyPanelViewModel) return 0;\r\n return this.safe(\r\n () => this.historyPanelViewModel!.count({ tableId: this.tableKey, ...filter }),\r\n 'getHistoryItemCount',\r\n ) ?? 0;\r\n }\r\n\r\n subscribeHistoryItems(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: Omit<HistoryQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.historyPanelViewModel) return () => {};\r\n return this.safe(\r\n () => this.historyPanelViewModel!.subscribe(cb, { tableId: this.tableKey, ...filter }),\r\n 'subscribeHistoryItems',\r\n ) ?? (() => {});\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.cellUndoStack?.canUndo() ?? false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.cellUndoStack?.canRedo() ?? false;\r\n }\r\n\r\n async undo(): Promise<boolean> {\r\n if (!this.cellUndoStack) return false;\r\n try {\r\n return await this.cellUndoStack.undo(this.store, (command) =>\r\n this.engine.dispatch(command),\r\n );\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'UITableController.undo failed',\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n async redo(): Promise<boolean> {\r\n if (!this.cellUndoStack) return false;\r\n try {\r\n return await this.cellUndoStack.redo(this.store, (command) =>\r\n this.engine.dispatch(command),\r\n );\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'UITableController.redo failed',\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n getActiveRow() {\r\n return this.safe(() => this.engine.getActiveRow(), 'getActiveRow');\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | null | undefined {\r\n return this.safe(() => this.engine.getSelectedRows(), 'getSelectedRows');\r\n }\r\n\r\n getActiveCell() {\r\n return this.safe(() => this.engine.getActiveCell(), 'getActiveCell');\r\n }\r\n getMobileEditor(){\r\n return this.safe(() => this.engine.getMobileEditor(), 'getMobileEditor');\r\n }\r\n\r\n resetMobileVisibleRows(size: number = MOBILE_PAGE_SIZE): void {\r\n this.changePageSize(size);\r\n }\r\n\r\n loadMoreMobileRows(step: number = MOBILE_PAGE_SIZE): void {\r\n const mobileView = this.getMobileViewState();\r\n if (!mobileView) return;\r\n const nextPageSize = Math.min(\r\n mobileView.totalRows,\r\n mobileView.pageSize + step,\r\n );\r\n if (nextPageSize !== mobileView.pageSize) {\r\n this.changePageSize(nextPageSize);\r\n }\r\n }\r\n\r\n revealAllMobileRows(minSize: number = MOBILE_PAGE_SIZE): void {\r\n const mobileView = this.getMobileViewState();\r\n if (!mobileView) return;\r\n const nextPageSize = Math.max(minSize, mobileView.totalRows);\r\n if (nextPageSize !== mobileView.pageSize) {\r\n this.changePageSize(nextPageSize);\r\n }\r\n }\r\n\r\n isActiveCell(rowId: number, columnId: string) {\r\n return this.safe(() => this.engine.isActiveCell(rowId, columnId), 'isActiveCell');\r\n }\r\n\r\n isActiveRow(rowId: number) {\r\n return this.safe(() => this.engine.isActiveRow(rowId), 'isActiveRow');\r\n }\r\n\r\n isSelectedRow(rowId: number) {\r\n return this.safe(() => this.engine.isSelectedRow(rowId), 'isSelectedRow');\r\n }\r\n\r\n isCutRow(rowId: number) {\r\n return this.safe(() => this.engine.isCutRow(rowId), 'isCutRow');\r\n }\r\n\r\n subscribe(cb: () => void) {\r\n return this.safe(() => this.engine.subscribe(cb), 'subscribe');\r\n }\r\n\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n if (this.session) {\r\n return this.session.subscribeSelected(selector, listener, isEqual);\r\n }\r\n return (\r\n this.safe(\r\n () => this.engine.subscribeSelected(selector, listener, isEqual),\r\n 'subscribeSelected',\r\n ) ?? (() => {})\r\n );\r\n }\r\n\r\n getSession(): GridSession | undefined {\r\n return this.session;\r\n }\r\n\r\n getTableKey(): string {\r\n return this.tableKey;\r\n }\r\n\r\n subscribeColumn<T>(columnId: string, collections: CollectionScope, cb: (values: T[]) => void) {\r\n return this.engine.subscribeColumn(columnId, collections, cb as (values: unknown[]) => void);\r\n }\r\n validation: () => (callback: (result: ValidationCallbackResult) => void) => void = () => (callback) => {\r\n this.engine.validation((result) => {\r\n callback(result);\r\n });\r\n }\r\n isValidCell(rowId: number, columnId: string): ValidCell | null {\r\n try {\r\n return this.engine.isValidCell(rowId, columnId);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // ─── row interactions ────────────────────────────────────────────────\r\n\r\n onRowClick(rowId: number, modifiers: { ctrlKey: boolean; shiftKey: boolean }): void {\r\n if (modifiers.shiftKey) {\r\n this.engine.dispatch({ type: 'ROW_RANGE_SELECTED', tableKey: this.tableKey, rowId });\r\n } else if (modifiers.ctrlKey) {\r\n this.engine.dispatch({ type: 'ROW_SELECTION_TOGGLED', tableKey: this.tableKey, rowId });\r\n } else {\r\n this.engine.dispatch({ type: 'ACTIVE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n }\r\n\r\n onRowSelect(rowId: number): void {\r\n this.engine.dispatch({ type: 'ROW_SELECTION_TOGGLED', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n // ─── lifecycle ───────────────────────────────────────────────────────\r\n\r\n dispose(): void {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n this.engine.dispatch({ type: 'TABLE_DISPOSED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n // ─── main dispatch ───────────────────────────────────────────────────\r\n\r\n async dispatch(command: UITableCommand): Promise<void> {\r\n try {\r\n await this.dispatchInternal(command);\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `UITableController.dispatch failed for command \"${command.type}\"`,\r\n payload: { error, tableKey: this.tableKey, command },\r\n });\r\n }\r\n }\r\n\r\n private async dispatchInternal(command: UITableCommand): Promise<void> {\r\n switch (command.type) {\r\n case 'CHANGE_PAGE_SIZE':\r\n this.changePageSize(command.pageSize);\r\n return;\r\n case 'CHANGE_PAGE':\r\n this.changePage(command.page);\r\n return;\r\n case 'UI_CELL_CHANGE':\r\n this.onCellChange(command.rowId, command.columnId, command.value);\r\n return;\r\n case 'UI_DESCRIPTION_SAVE':\r\n this.onDescriptionSave(command.rowId, command.flag);\r\n return;\r\n case 'UI_CELL_CHANGE_DISPLAY':\r\n this.onCellDisplayChange(command.rowId, command.columnId, command.value);\r\n return;\r\n case 'ADD_EMPTY_ROW':\r\n await this.addEmptyRow();\r\n return;\r\n case 'ADD_NEW_ROWS':\r\n this.addNewRows(command);\r\n return;\r\n case 'DUPLICATE_ROW':\r\n this.duplicateRow(command.rowId);\r\n return;\r\n case 'ROW_DELETED':\r\n this.deleteRow(command.rowId);\r\n return;\r\n case 'UI_DELETE_SELECTED_ROW':\r\n this.deleteRows();\r\n return;\r\n case 'TABLE_DELETED':\r\n this.deleteTable();\r\n return;\r\n case 'TOGGLE_ROW_EXPANDED':\r\n await this.toggleRowExpanded(command.rowId);\r\n return;\r\n case 'ROW_REORDERED':\r\n this.reorderRow(command.draggedRowId, command.droppedRowId, command.position);\r\n return;\r\n case 'TABLE_REGISTERED':\r\n await this.registerTable(command.table);\r\n return;\r\n case 'UI_ACTIVE_FIRST_CELL':\r\n this.activateFirstEditableCell(command.rowId);\r\n return;\r\n case 'UI_ACTIVE_CELL':\r\n this.setActiveCell(command.rowId, command.columnId);\r\n return;\r\n case 'UI_MOVE_ACTIVE_CELL':\r\n this.moveToNextCell(command.rowId, command.columnId, command.direction);\r\n return;\r\n case 'UI_MOVE_ACTIVE_CELL_VERTICAL':\r\n this.moveActiveCellVertical(command.rowId, command.columnId, command.direction);\r\n return;\r\n case 'UI_ACTIVE_ROW':\r\n this.setActiveRow(command.rowId);\r\n return;\r\n case 'KEY_DOWN':\r\n if (this.session) {\r\n await this.session.handleKeydown(command.event, command.ctx);\r\n }\r\n return;\r\n case 'TOGGLE_ROW_SELECTED':\r\n await this.toggleRowSelect();\r\n return;\r\n case 'ROW_SELECTED':\r\n await this.toggleRowSelect();\r\n return;\r\n case 'TOGGLE_PAGE_ROW_SELECTED':\r\n await this.togglePageRowSelect();\r\n return;\r\n case 'UI_ACTION_TABLE':\r\n await this.setTableAction(command.action);\r\n return;\r\n case 'UI_CHANGE_ACTIVE_COLLECTION':\r\n await this.setActiveCollection(command.activeCollection);\r\n return;\r\n case 'UI_SET_GRID_SEARCH':\r\n this.setGridSearch(command.search);\r\n return;\r\n case 'UI_CLEAR_GRID_SEARCH':\r\n this.setGridSearch(null);\r\n return;\r\n case 'UI_OPEN_MOBILE_ADD':\r\n await this.openMobileAddEditor();\r\n return;\r\n case 'UI_OPEN_MOBILE_EDIT':\r\n this.setActiveRow(command.rowId);\r\n this.setMobileEditor({ mode: 'edit', rowId: command.rowId });\r\n return;\r\n case 'UI_CLOSE_MOBILE_EDITOR':\r\n this.setMobileEditor(null);\r\n return;\r\n default: {\r\n const _exhaustive: never = command;\r\n return _exhaustive;\r\n }\r\n }\r\n }\r\n}","import type { CellChangedEvent } from '../../application/events';\r\n\r\nexport interface CellUndoEntry {\r\n readonly kind: 'CELL_CHANGED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: unknown;\r\n readonly previousValue: unknown;\r\n}\r\n\r\nexport type RowCellSnapshot = {\r\n readonly value: unknown;\r\n readonly display?: unknown;\r\n readonly originalValue?: unknown;\r\n};\r\n\r\nexport interface RowAddedUndoEntry {\r\n readonly kind: 'ROW_ADDED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n /** Captured at record time so redo can restore identity + values. */\r\n readonly cells: Readonly<Record<string, RowCellSnapshot>>;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\n/**\r\n * Compensating entry for a delete:\r\n * - soft: Unchanged→Deleted (undo/redo = toggle ROW_DELETED)\r\n * - hard: Added row removed from map (undo = RESTORE_ADDED_ROW)\r\n */\r\nexport interface RowDeletedUndoEntry {\r\n readonly kind: 'ROW_DELETED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n readonly mode: 'soft' | 'hard';\r\n readonly cells: Readonly<Record<string, RowCellSnapshot>>;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\nexport type AtomicUndoEntry =\r\n | CellUndoEntry\r\n | RowAddedUndoEntry\r\n | RowDeletedUndoEntry;\r\n\r\nexport interface UndoUnit {\r\n readonly correlationId?: string;\r\n readonly entries: AtomicUndoEntry[];\r\n}\r\n\r\nexport type UndoDispatchCommand =\r\n | {\r\n type: 'CHANGE_CELL_VALUE';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n newValue: unknown;\r\n }\r\n | {\r\n type: 'ROW_DELETED';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n }\r\n | {\r\n type: 'RESTORE_ADDED_ROW';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n cells: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n };\r\n\r\nexport type CellUndoDispatch = (\r\n command: UndoDispatchCommand,\r\n) => Promise<void>;\r\n\r\nfunction isNoOpCell(entry: CellUndoEntry): boolean {\r\n return Object.is(entry.newValue, entry.previousValue);\r\n}\r\n\r\n/**\r\n * Compensating undo/redo stack for domain edits.\r\n * - CELL_CHANGED: restore previousValue / re-apply newValue\r\n * - ROW_ADDED: delete on undo; RESTORE_ADDED_ROW on redo\r\n * - ROW_DELETED soft: toggle ROW_DELETED; hard: RESTORE_ADDED_ROW / ROW_DELETED\r\n * - Same correlationId merges into one undo unit (paste / cut+paste)\r\n */\r\nexport class CellUndoStack {\r\n private undoEntries: UndoUnit[] = [];\r\n private redoEntries: UndoUnit[] = [];\r\n private applying: 'undo' | 'redo' | null = null;\r\n\r\n record(event: CellChangedEvent, correlationId?: string): void {\r\n if (this.applying) return;\r\n const entry: CellUndoEntry = {\r\n kind: 'CELL_CHANGED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n columnId: event.columnId,\r\n newValue: event.newValue,\r\n previousValue: event.previousValue,\r\n };\r\n if (isNoOpCell(entry)) return;\r\n this.pushAtomic(entry, correlationId);\r\n }\r\n\r\n recordRowAdded(\r\n event: {\r\n tableId: string;\r\n rowId: number;\r\n cells?: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n },\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n this.pushAtomic(\r\n {\r\n kind: 'ROW_ADDED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n cells: event.cells ?? {},\r\n collection: event.collection,\r\n isSaveDescription: event.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n\r\n recordRowDeleted(\r\n event: {\r\n tableId: string;\r\n rowId: number;\r\n mode: 'soft' | 'hard';\r\n cells?: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n },\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n if (event.mode === 'hard' && (!event.cells || Object.keys(event.cells).length === 0)) {\r\n // Cannot restore a hard-removed row without a snapshot.\r\n return;\r\n }\r\n this.pushAtomic(\r\n {\r\n kind: 'ROW_DELETED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n mode: event.mode,\r\n cells: event.cells ?? {},\r\n collection: event.collection,\r\n isSaveDescription: event.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n\r\n recordMany(\r\n entries: AtomicUndoEntry[],\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n const filtered = entries.filter((e) =>\r\n e.kind === 'CELL_CHANGED' ? !isNoOpCell(e) : true,\r\n );\r\n if (filtered.length === 0) return;\r\n\r\n if (\r\n correlationId &&\r\n this.undoEntries.length > 0 &&\r\n this.undoEntries[this.undoEntries.length - 1].correlationId ===\r\n correlationId\r\n ) {\r\n this.undoEntries[this.undoEntries.length - 1].entries.push(...filtered);\r\n this.redoEntries = [];\r\n return;\r\n }\r\n\r\n this.undoEntries.push({ correlationId, entries: filtered });\r\n this.redoEntries = [];\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.undoEntries.length > 0;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.redoEntries.length > 0;\r\n }\r\n\r\n undoDepth(): number {\r\n return this.undoEntries.length;\r\n }\r\n\r\n redoDepth(): number {\r\n return this.redoEntries.length;\r\n }\r\n\r\n async undo(\r\n store: string,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<boolean> {\r\n const unit = this.undoEntries.pop();\r\n if (!unit) return false;\r\n\r\n this.applying = 'undo';\r\n try {\r\n for (let i = unit.entries.length - 1; i >= 0; i -= 1) {\r\n await this.applyCompensating(store, unit.entries[i], dispatch);\r\n }\r\n this.redoEntries.push(unit);\r\n return true;\r\n } finally {\r\n this.applying = null;\r\n }\r\n }\r\n\r\n async redo(\r\n store: string,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<boolean> {\r\n const unit = this.redoEntries.pop();\r\n if (!unit) return false;\r\n\r\n this.applying = 'redo';\r\n try {\r\n for (const entry of unit.entries) {\r\n await this.applyForward(store, entry, dispatch);\r\n }\r\n this.undoEntries.push(unit);\r\n return true;\r\n } finally {\r\n this.applying = null;\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.undoEntries = [];\r\n this.redoEntries = [];\r\n this.applying = null;\r\n }\r\n\r\n private pushAtomic(\r\n entry: AtomicUndoEntry,\r\n correlationId?: string,\r\n ): void {\r\n if (\r\n correlationId &&\r\n this.undoEntries.length > 0 &&\r\n this.undoEntries[this.undoEntries.length - 1].correlationId ===\r\n correlationId\r\n ) {\r\n this.undoEntries[this.undoEntries.length - 1].entries.push(entry);\r\n this.redoEntries = [];\r\n return;\r\n }\r\n\r\n this.undoEntries.push({ correlationId, entries: [entry] });\r\n this.redoEntries = [];\r\n }\r\n\r\n private async applyCompensating(\r\n store: string,\r\n entry: AtomicUndoEntry,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<void> {\r\n if (entry.kind === 'CELL_CHANGED') {\r\n await dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n columnId: entry.columnId,\r\n newValue: entry.previousValue,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === 'ROW_ADDED') {\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n return;\r\n }\r\n\r\n // ROW_DELETED undo: restore source\r\n if (entry.mode === 'soft') {\r\n // Domain toggles Deleted → Unchanged/Modified\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n return;\r\n }\r\n\r\n await dispatch({\r\n type: 'RESTORE_ADDED_ROW',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n cells: entry.cells,\r\n collection: entry.collection,\r\n isSaveDescription: entry.isSaveDescription,\r\n });\r\n }\r\n\r\n private async applyForward(\r\n store: string,\r\n entry: AtomicUndoEntry,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<void> {\r\n if (entry.kind === 'CELL_CHANGED') {\r\n await dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n columnId: entry.columnId,\r\n newValue: entry.newValue,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === 'ROW_ADDED') {\r\n await dispatch({\r\n type: 'RESTORE_ADDED_ROW',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n cells: entry.cells,\r\n collection: entry.collection,\r\n isSaveDescription: entry.isSaveDescription,\r\n });\r\n return;\r\n }\r\n\r\n // ROW_DELETED redo: delete again\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n }\r\n}\r\n","import { RowStateEnum } from '../../domain/value-objects';\r\nimport type { CollectionScope } from '../../domain/entities/Table';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport type {\r\n ExportSource,\r\n GridQueryPort,\r\n} from './GridPlugin';\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/**\r\n * Adapter: TableEngine → GridQueryPort for export plugins.\r\n */\r\nexport function createEngineGridQuery(engine: TableEngine): GridQueryPort {\r\n return {\r\n getSnapShot(collectionScope: CollectionScope = 'active') {\r\n return engine.getSnapShot(collectionScope);\r\n },\r\n\r\n getExportSource(collectionScope: CollectionScope = 'active'): ExportSource | null {\r\n const view = engine.getViewState();\r\n if (!view) return null;\r\n\r\n const columns = (\r\n view.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view.columns ?? [])\r\n )\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n .map((col) => ({\r\n fieldName: col.fieldName,\r\n fieldCaption: col.fieldCaption,\r\n fieldType: col.fieldType,\r\n order: col.order,\r\n }));\r\n\r\n const rows = (engine.getAllRows() ?? [])\r\n .filter((row) => {\r\n if (row.rowState.value === RowStateEnum.Deleted) return false;\r\n return Array.from(row.getCells().entries()).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n );\r\n })\r\n .map((row) => ({\r\n id: row.id.value,\r\n rowState: String(row.rowState.value),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([key, cell]) => [\r\n key,\r\n {\r\n value: cell.getValue(),\r\n display: cell.getDisplay(),\r\n },\r\n ]),\r\n ),\r\n }));\r\n\r\n // collectionScope is honored by getSnapShot; getAllRows is active-scoped today.\r\n void collectionScope;\r\n\r\n return { columns, rows };\r\n },\r\n };\r\n}\r\n","import type { EventStore } from '../ports/EventStore';\r\nimport type { GridSession } from '../session/GridSession';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type {\r\n ExportRequestedPayload,\r\n ImportRequestedPayload,\r\n} from '../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n GridQueryPort,\r\n PluginEventBus,\r\n} from './GridPlugin';\r\n\r\nexport type RequestExportOptions = {\r\n format: 'xlsx' | 'pdf';\r\n collectionScope?: ExportRequestedPayload['collectionScope'];\r\n correlationId?: string;\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n};\r\n\r\nexport type RequestImportOptions = {\r\n format: 'xlsx';\r\n data: Blob | ArrayBuffer | Uint8Array;\r\n collectionScope?: ImportRequestedPayload['collectionScope'];\r\n correlationId?: string;\r\n sheetName?: string;\r\n};\r\n\r\nexport type PluginHostDeps = {\r\n tableId: string;\r\n actorId: string;\r\n eventStore: EventStore;\r\n session: GridSession;\r\n query: GridQueryPort;\r\n};\r\n\r\nfunction createEventId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nasync function toUint8Array(\r\n data: Blob | ArrayBuffer | Uint8Array,\r\n): Promise<Uint8Array> {\r\n if (data instanceof Uint8Array) return data;\r\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\r\n return new Uint8Array(await data.arrayBuffer());\r\n}\r\n\r\n/**\r\n * Registers plugins and publishes plugin/view-stream events (e.g. EXPORT_REQUESTED).\r\n */\r\nexport class PluginHost {\r\n private readonly plugins: GridPlugin[] = [];\r\n private readonly disposers: Array<() => void> = [];\r\n private readonly importPayloads = new Map<string, Uint8Array>();\r\n private version = 0;\r\n\r\n constructor(private readonly deps: PluginHostDeps) {}\r\n\r\n private takeImportPayload(correlationId: string): Uint8Array | undefined {\r\n return this.importPayloads.get(correlationId);\r\n }\r\n\r\n private createBus(): PluginEventBus {\r\n const { eventStore, tableId, actorId } = this.deps;\r\n const viewStreamId = `table/${tableId}/view`;\r\n\r\n return {\r\n subscribeAll: (onEvent) => eventStore.subscribeAll(onEvent),\r\n publish: async (partial) => {\r\n this.version += 1;\r\n const event: GridEvent = {\r\n ...partial,\r\n eventId: partial.eventId || createEventId(),\r\n tableId: partial.tableId || tableId,\r\n streamId: partial.streamId || viewStreamId,\r\n version: partial.version || this.version,\r\n occurredAt: partial.occurredAt || Date.now(),\r\n actorId: partial.actorId || actorId,\r\n };\r\n await eventStore.append(event.streamId, [event], -1);\r\n },\r\n };\r\n }\r\n\r\n register(plugins: readonly GridPlugin[]): void {\r\n const ctx: GridPluginContext = {\r\n tableId: this.deps.tableId,\r\n bus: this.createBus(),\r\n session: this.deps.session,\r\n query: this.deps.query,\r\n eventStore: this.deps.eventStore,\r\n resolveImportData: (correlationId) => this.takeImportPayload(correlationId),\r\n };\r\n\r\n for (const plugin of plugins) {\r\n plugin.register(ctx);\r\n this.plugins.push(plugin);\r\n if (plugin.dispose) {\r\n this.disposers.push(() => plugin.dispose?.());\r\n }\r\n }\r\n }\r\n\r\n list(): readonly GridPlugin[] {\r\n return this.plugins;\r\n }\r\n\r\n async requestExport(options: RequestExportOptions): Promise<void> {\r\n const bus = this.createBus();\r\n const payload: ExportRequestedPayload = {\r\n format: options.format,\r\n collectionScope: options.collectionScope ?? 'active',\r\n fileName: options.fileName,\r\n sheetName: options.sheetName,\r\n direction: options.direction,\r\n };\r\n\r\n await bus.publish({\r\n eventId: createEventId(),\r\n type: 'EXPORT_REQUESTED',\r\n tableId: this.deps.tableId,\r\n streamId: `table/${this.deps.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: this.deps.actorId,\r\n correlationId: options.correlationId,\r\n payload,\r\n });\r\n }\r\n\r\n async requestImport(options: RequestImportOptions): Promise<void> {\r\n if (options.format !== 'xlsx') {\r\n throw new Error(`Unsupported import format: ${options.format}`);\r\n }\r\n\r\n const correlationId = options.correlationId ?? createEventId();\r\n const bytes = await toUint8Array(options.data);\r\n this.importPayloads.set(correlationId, bytes);\r\n\r\n if (!this.plugins.some((p) => p.name === 'excel-import')) {\r\n this.importPayloads.delete(correlationId);\r\n throw new Error('NO_IMPORT_PLUGIN');\r\n }\r\n\r\n const bus = this.createBus();\r\n const payload: ImportRequestedPayload = {\r\n format: 'xlsx',\r\n collectionScope: options.collectionScope ?? 'active',\r\n sheetName: options.sheetName,\r\n byteLength: bytes.byteLength,\r\n };\r\n\r\n const finished = new Promise<'ok' | string>((resolve) => {\r\n const unsub = this.deps.eventStore.subscribeAll((event) => {\r\n if (event.correlationId !== correlationId) return;\r\n if (event.type === 'XLSX_IMPORT_COMPLETED') {\r\n unsub();\r\n resolve('ok');\r\n }\r\n if (event.type === 'XLSX_IMPORT_FAILED') {\r\n unsub();\r\n const msg =\r\n (event.payload as { message?: string })?.message ?? 'IMPORT_FAILED';\r\n resolve(msg);\r\n }\r\n });\r\n });\r\n\r\n try {\r\n await bus.publish({\r\n eventId: createEventId(),\r\n type: 'IMPORT_REQUESTED',\r\n tableId: this.deps.tableId,\r\n streamId: `table/${this.deps.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: this.deps.actorId,\r\n correlationId,\r\n payload,\r\n });\r\n const outcome = await finished;\r\n if (outcome !== 'ok') {\r\n throw new Error(outcome);\r\n }\r\n } finally {\r\n this.importPayloads.delete(correlationId);\r\n }\r\n }\r\n\r\n dispose(): void {\r\n for (const dispose of this.disposers) dispose();\r\n this.disposers.length = 0;\r\n this.plugins.length = 0;\r\n this.importPayloads.clear();\r\n }\r\n}\r\n","// adapters/ui/UITableKeyboardHandler.ts\r\n\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { ViewIntentDispatcher } from '../../application/session/ViewIntent';\r\nimport { TableEngine } from '../../engine/tableEngine';\r\n\r\ntype KeydownCtx = {\r\n activeRowId: number | null;\r\n activeColumnId: string | null;\r\n};\r\n\r\n/**\r\n * Keyboard shortcuts emit ViewIntent through the session dispatcher.\r\n * Reads (pagination / selection) still come from Engine view state.\r\n */\r\nexport class UITableKeyboardHandler {\r\n constructor(\r\n private readonly engine: TableEngine,\r\n private readonly audit: AuditLogger,\r\n private readonly dispatchIntent: ViewIntentDispatcher,\r\n ) {}\r\n\r\n async handle(e: KeyboardEvent, ctx: KeydownCtx): Promise<void> {\r\n try {\r\n await this.handleInternal(e, ctx);\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'Unhandled error in keyboard handler',\r\n payload: { error, code: e.code, ctx },\r\n });\r\n }\r\n }\r\n\r\n private async handleInternal(e: KeyboardEvent, ctx: KeydownCtx): Promise<void> {\r\n const view = this.engine.getViewState();\r\n if (!view) return;\r\n\r\n const { canPrev, canNext, page } = view.pagination;\r\n const { altKey, shiftKey, ctrlKey, code } = e;\r\n const { activeRowId, activeColumnId } = ctx;\r\n const selectedRows = this.engine.getSelectedRows();\r\n\r\n switch (code) {\r\n case 'KeyN': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'ADD_EMPTY_ROW', autoActivate: true });\r\n }\r\n return;\r\n }\r\n\r\n case 'KeyD': {\r\n if (altKey && activeRowId != null) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'DUPLICATE_ROW', rowId: activeRowId });\r\n }\r\n return;\r\n }\r\n\r\n case 'Delete': {\r\n if (altKey && activeRowId) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'DELETE_ROW', rowId: activeRowId });\r\n }\r\n return;\r\n }\r\n\r\n case 'End': {\r\n if (shiftKey && ctrlKey && activeRowId != null) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'SELECT_FROM_ACTIVE_TO_LAST',\r\n anchorRowId: activeRowId,\r\n });\r\n return;\r\n }\r\n if (shiftKey && activeRowId != null) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'TOGGLE_ROW_SELECTION',\r\n rowId: activeRowId,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n case 'Space': {\r\n if (activeRowId != null && ctrlKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'TOGGLE_ROW_SELECTION',\r\n rowId: activeRowId,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n case 'NumpadEnter':\r\n case 'Enter': {\r\n e.preventDefault();\r\n if (activeRowId) {\r\n if (!activeColumnId) {\r\n await this.dispatchIntent({\r\n type: 'ACTIVATE_FIRST_CELL',\r\n rowId: activeRowId,\r\n });\r\n } else {\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: shiftKey ? 'prev' : 'next',\r\n });\r\n }\r\n }\r\n return;\r\n }\r\n\r\n case 'Tab': {\r\n if (activeRowId && activeColumnId) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: shiftKey ? 'prev' : 'next',\r\n });\r\n }\r\n return;\r\n }\r\n\r\n case 'ArrowLeft': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'COLLAPSE_ALL_ROWS' });\r\n return;\r\n }\r\n if (!activeRowId || !activeColumnId) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: 'next',\r\n });\r\n return;\r\n }\r\n\r\n case 'ArrowRight': {\r\n if (!activeRowId || !activeColumnId) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: 'prev',\r\n });\r\n return;\r\n }\r\n\r\n case 'ArrowDown': {\r\n if (altKey && selectedRows) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n direction: 'down',\r\n });\r\n return;\r\n }\r\n if (ctrlKey && activeRowId) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n direction: 'down',\r\n });\r\n return;\r\n }\r\n if (!activeRowId) return;\r\n if (!activeColumnId) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: 'down',\r\n });\r\n return;\r\n }\r\n\r\n case 'ArrowUp': {\r\n if (altKey && selectedRows) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n direction: 'up',\r\n });\r\n return;\r\n }\r\n if (ctrlKey && activeRowId) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n direction: 'up',\r\n });\r\n return;\r\n }\r\n if (!activeRowId) return;\r\n if (!activeColumnId) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n rowId: activeRowId,\r\n columnId: activeColumnId,\r\n direction: 'up',\r\n });\r\n return;\r\n }\r\n\r\n case 'PageUp': {\r\n if (!canPrev) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'CHANGE_PAGE', page: page - 1 });\r\n return;\r\n }\r\n\r\n case 'PageDown': {\r\n if (!canNext) return;\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'CHANGE_PAGE', page: page + 1 });\r\n return;\r\n }\r\n\r\n case 'KeyC': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'copy' });\r\n }\r\n return;\r\n }\r\n\r\n case 'KeyX': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'cut' });\r\n }\r\n return;\r\n }\r\n\r\n case 'KeyV': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'paste' });\r\n }\r\n return;\r\n }\r\n\r\n case 'KeyB': {\r\n if (altKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({\r\n type: 'SET_TABLE_ACTION',\r\n action: 'pasteInsert',\r\n });\r\n }\r\n return;\r\n }\r\n\r\n case 'Escape': {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: null });\r\n return;\r\n }\r\n\r\n case 'KeyZ': {\r\n if (ctrlKey && !shiftKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'UNDO' });\r\n return;\r\n }\r\n if (ctrlKey && shiftKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'REDO' });\r\n }\r\n return;\r\n }\r\n\r\n case 'KeyY': {\r\n if (ctrlKey) {\r\n e.preventDefault();\r\n await this.dispatchIntent({ type: 'REDO' });\r\n }\r\n return;\r\n }\r\n\r\n default:\r\n return;\r\n }\r\n }\r\n}\r\n","import type { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { CellUndoStack } from '../../application/undo/CellUndoStack';\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport type { ViewIntent } from '../../application/session/ViewIntent';\r\nimport type { CollectionScope } from '../../domain/entities/Table';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport type { VisibleRange } from '../../domain/value-objects/Viewport';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport type { TableSnapShot } from '../../engine/type';\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogProjection,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\nimport type {\r\n HistoryItem,\r\n HistoryPanelViewModel,\r\n HistoryQuery,\r\n} from '../history/HistoryPanelViewModel';\r\nimport { UITableKeyboardHandler } from '../ui/UITableKeyboardHandler';\r\n\r\nexport type CreateGridSessionDeps = {\r\n engine: TableEngine;\r\n store: string;\r\n tableKey: string;\r\n audit: AuditLogger;\r\n changelogProjection?: ChangelogProjection;\r\n historyPanelViewModel?: HistoryPanelViewModel;\r\n cellUndoStack?: CellUndoStack;\r\n /** Initial virtual viewport; defaults to 400px × 40px rows. */\r\n initialViewport?: Viewport;\r\n};\r\n\r\nexport class DefaultGridSession implements GridSession {\r\n private readonly keyboard: UITableKeyboardHandler;\r\n private viewport: Viewport;\r\n private readonly viewportListeners = new Set<() => void>();\r\n\r\n constructor(private readonly deps: CreateGridSessionDeps) {\r\n this.viewport =\r\n deps.initialViewport ?? new Viewport(0, 400, 40, 2);\r\n this.keyboard = new UITableKeyboardHandler(\r\n deps.engine,\r\n deps.audit,\r\n (intent) => this.dispatchViewIntent(intent),\r\n );\r\n }\r\n\r\n get store(): string {\r\n return this.deps.store;\r\n }\r\n\r\n get tableKey(): string {\r\n return this.deps.tableKey;\r\n }\r\n\r\n getEngine(): TableEngine {\r\n return this.deps.engine;\r\n }\r\n\r\n async dispatchViewIntent(intent: ViewIntent): Promise<void> {\r\n const { engine, store, tableKey, cellUndoStack } = this.deps;\r\n\r\n switch (intent.type) {\r\n case 'ADD_EMPTY_ROW':\r\n await engine.dispatch({\r\n type: 'ADD_EMPTY_ROW',\r\n store,\r\n tableKey,\r\n autoActivate: intent.autoActivate ?? true,\r\n });\r\n return;\r\n case 'DUPLICATE_ROW':\r\n await engine.dispatch({\r\n type: 'DUPLICATE_ROW',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'DELETE_ROW':\r\n await engine.dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'TOGGLE_ROW_SELECTION':\r\n await engine.dispatch({\r\n type: 'ROW_SELECTION_TOGGLED',\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'SELECT_FROM_ACTIVE_TO_LAST':\r\n await engine.dispatch({\r\n type: 'SELECT_FROM_ACTIVE_TO_LAST',\r\n tableKey,\r\n anchorRowId: intent.anchorRowId,\r\n });\r\n return;\r\n case 'ACTIVATE_FIRST_CELL':\r\n await engine.dispatch({\r\n type: 'ACTIVATE_FIRST_CELL',\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'MOVE_ACTIVE_CELL':\r\n await engine.dispatch({\r\n type: 'MOVE_ACTIVE_CELL',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n columnId: intent.columnId,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'MOVE_ACTIVE_CELL_VERTICAL':\r\n await engine.dispatch({\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n columnId: intent.columnId,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'MOVE_VERTICAL_SELECTED_ROWS':\r\n await engine.dispatch({\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n tableKey,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'MOVE_VERTICAL_ACTIVE_ROW':\r\n await engine.dispatch({\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n tableKey,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'COLLAPSE_ALL_ROWS':\r\n await engine.dispatch({ type: 'COLLAPSE_ALL_ROWS', tableKey });\r\n return;\r\n case 'CHANGE_PAGE':\r\n await engine.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store,\r\n tableKey,\r\n page: intent.page,\r\n });\r\n return;\r\n case 'CHANGE_PAGE_SIZE':\r\n await engine.dispatch({\r\n type: 'CHANGE_PAGE_SIZE',\r\n store,\r\n tableKey,\r\n pageSize: intent.pageSize,\r\n });\r\n return;\r\n case 'SET_TABLE_ACTION':\r\n await engine.dispatch({\r\n type: 'SET_TABLE_ACTION',\r\n store,\r\n tableKey,\r\n action: intent.action,\r\n });\r\n return;\r\n case 'SET_GRID_SEARCH':\r\n await engine.dispatch({\r\n type: 'SET_GRID_SEARCH',\r\n tableKey,\r\n search: intent.search,\r\n });\r\n return;\r\n case 'SET_MOBILE_EDITOR':\r\n await engine.dispatch({\r\n type: 'SET_MOBILE_EDITOR',\r\n tableKey,\r\n editor: intent.editor,\r\n });\r\n return;\r\n case 'CHANGE_VIEWPORT': {\r\n const next = new Viewport(\r\n intent.scrollOffset,\r\n intent.viewportSize ?? this.viewport.viewportSize,\r\n intent.rowHeight ?? this.viewport.rowHeight,\r\n intent.overscan ?? this.viewport.overscan,\r\n );\r\n if (!this.viewport.equals(next)) {\r\n this.viewport = next;\r\n this.notifyViewportListeners();\r\n }\r\n return;\r\n }\r\n case 'UNDO':\r\n if (!cellUndoStack) return;\r\n await cellUndoStack.undo(store, (command) => engine.dispatch(command));\r\n return;\r\n case 'REDO':\r\n if (!cellUndoStack) return;\r\n await cellUndoStack.redo(store, (command) => engine.dispatch(command));\r\n return;\r\n default: {\r\n const _exhaustive: never = intent;\r\n return _exhaustive;\r\n }\r\n }\r\n }\r\n\r\n async handleKeydown(\r\n event: KeyboardEvent,\r\n ctx: { activeRowId: number | null; activeColumnId: string | null },\r\n ): Promise<void> {\r\n await this.keyboard.handle(event, ctx);\r\n }\r\n\r\n getSnapShot(collectionScope: CollectionScope = 'active'): TableSnapShot | null {\r\n return this.deps.engine.getSnapShot(collectionScope);\r\n }\r\n\r\n getViewState() {\r\n return this.deps.engine.getViewState();\r\n }\r\n\r\n subscribe(cb: () => void): () => void {\r\n return this.deps.engine.subscribe(cb) ?? (() => {});\r\n }\r\n\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n let current = selector();\r\n const onChange = () => {\r\n const next = selector();\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n };\r\n const unsubEngine = this.deps.engine.subscribe(onChange) ?? (() => {});\r\n this.viewportListeners.add(onChange);\r\n return () => {\r\n unsubEngine();\r\n this.viewportListeners.delete(onChange);\r\n };\r\n }\r\n\r\n getViewport(): Viewport {\r\n return this.viewport;\r\n }\r\n\r\n getVisibleRange(totalRows?: number): VisibleRange {\r\n const count =\r\n totalRows ??\r\n this.deps.engine.getSnapShot('active')?.rows?.length ??\r\n 0;\r\n return ViewportCalculator.calculate(count, this.viewport);\r\n }\r\n\r\n projectVisibleRows<T>(rows: readonly T[], totalRows?: number): T[] {\r\n const range = this.getVisibleRange(totalRows ?? rows.length);\r\n return ViewportCalculator.projectRows(rows, range);\r\n }\r\n\r\n private notifyViewportListeners(): void {\r\n for (const listener of this.viewportListeners) listener();\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.deps.cellUndoStack?.canUndo() ?? false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.deps.cellUndoStack?.canRedo() ?? false;\r\n }\r\n\r\n async undo(): Promise<boolean> {\r\n if (!this.deps.cellUndoStack) return false;\r\n return this.deps.cellUndoStack.undo(this.deps.store, (command) =>\r\n this.deps.engine.dispatch(command),\r\n );\r\n }\r\n\r\n async redo(): Promise<boolean> {\r\n if (!this.deps.cellUndoStack) return false;\r\n return this.deps.cellUndoStack.redo(this.deps.store, (command) =>\r\n this.deps.engine.dispatch(command),\r\n );\r\n }\r\n\r\n getChangelog(filter: Omit<ChangelogQuery, 'tableId'> = {}): ChangelogEntry[] {\r\n if (!this.deps.changelogProjection) return [];\r\n return this.deps.changelogProjection.query({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getChangelogCount(filter: Omit<ChangelogQuery, 'tableId'> = {}): number {\r\n if (!this.deps.changelogProjection) return 0;\r\n return this.deps.changelogProjection.count({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n subscribeChangelog(\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter: Omit<ChangelogQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.deps.changelogProjection) return () => {};\r\n return this.deps.changelogProjection.subscribe(cb, {\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getHistoryItems(filter: Omit<HistoryQuery, 'tableId'> = {}): HistoryItem[] {\r\n if (!this.deps.historyPanelViewModel) return [];\r\n return this.deps.historyPanelViewModel.query({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getHistoryItemCount(filter: Omit<HistoryQuery, 'tableId'> = {}): number {\r\n if (!this.deps.historyPanelViewModel) return 0;\r\n return this.deps.historyPanelViewModel.count({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n subscribeHistoryItems(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: Omit<HistoryQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.deps.historyPanelViewModel) return () => {};\r\n return this.deps.historyPanelViewModel.subscribe(cb, {\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n}\r\n","import type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport type {\r\n ColumnDefinition,\r\n ColumnViewBinding,\r\n} from '../../domain/types/ColumnDefinition';\r\n\r\n/**\r\n * Maps host/legacy ColumnSchema into core ColumnDefinition + view bindings.\r\n * Domain/runtime should prefer ColumnDefinition; React renderers stay in bindings.\r\n */\r\nexport function toColumnDefinition(schema: ColumnSchema): ColumnDefinition {\r\n return {\r\n fieldName: schema.fieldName,\r\n fieldCaption: schema.fieldCaption,\r\n fieldType: schema.fieldType,\r\n fieldCollection: schema.fieldCollection,\r\n order: schema.order,\r\n editable: schema.editable,\r\n isUnique: schema.isUnique,\r\n hidden: schema.hidden,\r\n disable: schema.disable,\r\n noCache: schema.noCache,\r\n expandable: schema.expandable,\r\n rules: schema.rules,\r\n options: schema.options,\r\n visibility: schema.visibility,\r\n dynamicSource: schema.dynamicSource\r\n ? {\r\n endpoint: schema.dynamicSource.endpoint,\r\n dependsOn: schema.dynamicSource.dependsOn,\r\n dependOn: schema.dynamicSource.dependOn,\r\n params: schema.dynamicSource.params,\r\n }\r\n : undefined,\r\n computed: schema.computed\r\n ? { dependsOn: schema.computed.dependsOn }\r\n : undefined,\r\n selectOptions: schema.selectOptions,\r\n minWidth: schema.minWidth,\r\n labelValue: schema.labelValue,\r\n };\r\n}\r\n\r\nexport function toColumnViewBinding(schema: ColumnSchema): ColumnViewBinding {\r\n return {\r\n fieldName: schema.fieldName,\r\n className: schema.className,\r\n minWidth: schema.minWidth,\r\n style: schema.style,\r\n render: schema.returnDisplayValue as ColumnViewBinding['render'],\r\n displayFormat: schema.displayFormat,\r\n onChange: schema.onChange,\r\n indexOptions: schema.indexOptions,\r\n popUpWidth: schema.popUpWidth,\r\n dynamicSelectFilterOption: schema.dynamicSelectFilterOption,\r\n };\r\n}\r\n\r\nexport function mapColumnSchemas(schemas: ColumnSchema[]): {\r\n definitions: ColumnDefinition[];\r\n bindings: ColumnViewBinding[];\r\n} {\r\n return {\r\n definitions: schemas.map(toColumnDefinition),\r\n bindings: schemas.map(toColumnViewBinding),\r\n };\r\n}\r\n","// application/handlers/cellCommandsHandler.ts\r\n\r\nimport {\r\n ColumnSchema,\r\n FieldType,\r\n} from '../../bootstrap/type';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ColumnId,\r\n RowId,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport {\r\n ApplyDynamicProjectionCommand,\r\n ChangeCellDisplayValueCommand,\r\n ChangeCellValueCommand,\r\n SaveDescriptionCommand,\r\n} from '../commands';\r\nimport { TableEvent } from '../events';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { RemoteApi } from '../ports/RemoteApi';\r\nimport { TableRepository } from '../ports/TableRepository';\r\n\r\ntype DynamicConfig = {\r\n columnMeta: Map<string, ColumnSchema>;\r\n remoteApi: RemoteApi;\r\n};\r\n\r\n/* ─── shared helper ──────────────────────────────────────────────── */\r\n\r\nfunction logError(audit: AuditLogger, error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n } else if (error instanceof Error) {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n } else {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error, context },\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellValueHandler\r\n ====================================================== */\r\n\r\nexport class ChangeCellValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n /* 1. schema existence */\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 2. editable policy */\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 3. permission policy */\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 4. type validation */\r\n const validated = this.validateCellValue(schema.fieldType, command.newValue);\r\n /* 5. domain mutation */\r\n const domainEvent = table.changeCell(rowId, columnId, validated.value);\r\n // Keep existing display unless a dedicated display-change command updates it.\r\n // Writing the raw value here wipes select labels (e.g. account title).\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 6. application-level side effects */\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n newValue: command.newValue,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n validatedValue: command.newValue,\r\n });\r\n }\r\n\r\n /* 7. RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === rowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n /* 8. persist */\r\n await this.repo.save(command.store, table);\r\n\r\n /* 9. output event */\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n previousValue: domainEvent.previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers ─────────────────────────────────────────────────────── */\r\n\r\n private async applyRemoteVisibilityRules(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n newValue: unknown;\r\n /** When false (e.g. row activate / re-project), keep existing dependent cell values. */\r\n clearDependents?: boolean;\r\n }): Promise<void> {\r\n const {\r\n table,\r\n rowId,\r\n changedColumnId,\r\n newValue,\r\n clearDependents = true,\r\n } = input;\r\n\r\n const meta = this.dynamic?.columnMeta;\r\n if (!meta) return;\r\n const colKey = `${table.getActiveCollectionName() ?? 'default'}_${changedColumnId.value}`;\r\n const changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);\r\n const resolveOn = changedMeta?.resolveOn;\r\n if (!resolveOn) return;\r\n if (resolveOn.fieldName !== changedColumnId.value) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n if (newValue == null || newValue === '') return;\r\n const params =\r\n typeof resolveOn.buildParams === 'function'\r\n ? resolveOn.buildParams(rowValues)\r\n : { value: newValue };\r\n const response = await this.dynamic!.remoteApi.request({\r\n endpoint: resolveOn.endpoint,\r\n params,\r\n method: 'POST',\r\n });\r\n\r\n resolveOn.getResponse?.(response, row);\r\n const flags: Record<string, boolean> = resolveOn.mapFlags?.(response) ?? {};\r\n\r\n const toShow: ColumnSchema[] = [];\r\n const visibilityCondition: Record<string, boolean> = {};\r\n\r\n meta.forEach(colCfg => {\r\n const v = colCfg.visibility;\r\n\r\n if (\r\n v?.kind === 'whenRemoteFlag' &&\r\n v.sourceFieldName === changedColumnId.value\r\n ) {\r\n const colId = new ColumnId(colCfg.fieldName);\r\n const schema = table.getColumnSchema(colId);\r\n const flagValue = flags[v.flag] ?? false;\r\n\r\n visibilityCondition[v.flag] = flagValue;\r\n\r\n if (flagValue && schema) {\r\n toShow.push({ ...schema, hidden: false });\r\n }\r\n }\r\n\r\n const dependency = colCfg.dynamicSource?.dependsOn;\r\n if (\r\n clearDependents &&\r\n dependency &&\r\n dependency.includes(changedColumnId.value) &&\r\n !Object.hasOwn(visibilityCondition, colCfg.fieldName) &&\r\n colCfg.visibility?.kind !== 'whenTableType' &&\r\n colCfg.visibility?.kind !== 'whenCollection'\r\n ) {\r\n const cell = row.getCell(colCfg.fieldName);\r\n cell?.changeValue(null);\r\n cell?.changeDisplay(null);\r\n }\r\n });\r\n\r\n if (toShow.length > 0) {\r\n table.addColumns(toShow);\r\n }\r\n\r\n row.setVisibilityCondition(visibilityCondition);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) {\r\n throw new Error('Computed cycle detected');\r\n }\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n const newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(\r\n `Computed column \"${targetField}\" returned a Promise after validation`,\r\n );\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) {\r\n return { ok: true as const, value: value as any };\r\n }\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellDisplayValueHandler\r\n ====================================================== */\r\n\r\nexport class ChangeCellDisplayValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellDisplayValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n const domainEvent = table.changeDisplay(rowId, columnId, command.newValue);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_DISPLAY_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n };\r\n this.audit.log({ type: 'CELL_DISPLAY_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellDisplayValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n SaveDescriptionHandler\r\n ====================================================== */\r\n\r\nexport class SaveDescriptionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: SaveDescriptionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const domainEvent = table.saveDescription(rowId, command.flag);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, flag: command.flag },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'ROW_DESCRIPTION_SAVED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n description: command.flag,\r\n };\r\n this.audit.log({ type: 'INFORMATION', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `SaveDescriptionHandler[${command.tableKey}:${command.rowId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ApplyDynamicProjectionHandler\r\n ====================================================== */\r\n\r\nexport class ApplyDynamicProjectionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ApplyDynamicProjectionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const { store, tableKey, rowId, columnId } = command;\r\n const table = await this.repo.getById(store, tableKey);\r\n\r\n try {\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n throw new DomainError('ROW_NOT_FOUND', `Row ${rowId} not found`, { rowId });\r\n }\r\n\r\n const cell = row.getCell(columnId);\r\n if (!cell) {\r\n throw new DomainError('CELL_NOT_FOUND', `Cell ${columnId} not found`, { columnId });\r\n }\r\n\r\n const colValue = cell.getValue();\r\n const previousValue = colValue;\r\n const newRowId = new RowId(rowId);\r\n const newColumnId = new ColumnId(columnId);\r\n\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n newValue: colValue,\r\n clearDependents: false,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n validatedValue: colValue,\r\n });\r\n }\r\n\r\n /* RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === newRowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n await this.repo.save(store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: tableKey,\r\n rowId: newRowId.value,\r\n columnId: newColumnId.value,\r\n newValue: colValue,\r\n previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ApplyDynamicProjectionHandler[${tableKey}:${rowId}:${columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers (identical to ChangeCellValueHandler) ───────────────── */\r\n\r\n private async applyRemoteVisibilityRules(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n newValue: unknown;\r\n /** When false (e.g. row activate / re-project), keep existing dependent cell values. */\r\n clearDependents?: boolean;\r\n }): Promise<void> {\r\n const {\r\n table,\r\n rowId,\r\n changedColumnId,\r\n newValue,\r\n clearDependents = true,\r\n } = input;\r\n const meta = this.dynamic?.columnMeta;\r\n if (!meta) return;\r\n\r\n const colKey = `${table.getActiveCollectionName() ?? 'default'}_${changedColumnId.value}`;\r\n const changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);\r\n const resolveOn = changedMeta?.resolveOn;\r\n if (!resolveOn) return;\r\n if (resolveOn.fieldName !== changedColumnId.value) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n if (newValue == null || newValue === '') return;\r\n\r\n const params =\r\n typeof resolveOn.buildParams === 'function'\r\n ? resolveOn.buildParams(rowValues)\r\n : { value: newValue };\r\n const response = await this.dynamic!.remoteApi.request({\r\n endpoint: resolveOn.endpoint,\r\n params,\r\n method: 'POST',\r\n });\r\n\r\n resolveOn.getResponse?.(response, row);\r\n const flags: Record<string, boolean> = resolveOn.mapFlags?.(response) ?? {};\r\n\r\n const toShow: ColumnSchema[] = [];\r\n const visibilityCondition: Record<string, boolean> = {};\r\n\r\n meta.forEach(colCfg => {\r\n const v = colCfg.visibility;\r\n\r\n if (\r\n v?.kind === 'whenRemoteFlag' &&\r\n v.sourceFieldName === changedColumnId.value\r\n ) {\r\n const schema = table.getColumnSchema(new ColumnId(colCfg.fieldName));\r\n const flagValue = flags[v.flag] ?? false;\r\n visibilityCondition[v.flag] = flagValue;\r\n if (flagValue && schema) {\r\n toShow.push({ ...schema, hidden: false });\r\n }\r\n }\r\n\r\n const dependency = colCfg.dynamicSource?.dependsOn;\r\n if (\r\n clearDependents &&\r\n dependency &&\r\n dependency.includes(changedColumnId.value) &&\r\n !Object.hasOwn(visibilityCondition, colCfg.fieldName) &&\r\n colCfg.visibility?.kind !== 'whenTableType' &&\r\n colCfg.visibility?.kind !== 'whenCollection'\r\n ) {\r\n const cell = row.getCell(colCfg.fieldName);\r\n cell?.changeValue(null);\r\n cell?.changeDisplay(null);\r\n }\r\n });\r\n\r\n if (toShow.length > 0) {\r\n table.addColumns(toShow);\r\n }\r\n row.setVisibilityCondition(visibilityCondition);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) throw new Error('Computed cycle detected');\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n const newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(`Computed column \"${targetField}\" returned a Promise after validation`);\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) return { ok: true as const, value: value as any };\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}","// application/handlers/rowCommandsHandler.ts\r\n\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport { RowId } from '../../domain/value-objects';\r\nimport {\r\n AddEmptyRowCommand,\r\n AddNewRowsCommand,\r\n DeleteRowCommand,\r\n DuplicateRowCommand,\r\n PasteRowCommand,\r\n RestoreAddedRowCommand,\r\n RowReorderedCommand,\r\n} from '../commands';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { TableRepository } from '../ports/TableRepository';\r\n\r\n/* ======================================================\r\n Add New Row\r\n ====================================================== */\r\n\r\nexport class AddNewRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: AddEmptyRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to add a new row',\r\n { actor }\r\n );\r\n }\r\n const event = table.addNewRow();\r\n await this.repo.save(command.store, table);\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n return event;\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Add New Rows\r\n ====================================================== */\r\n\r\nexport class AddNewRowsCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: AddNewRowsCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\nif (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to add rows',\r\n { actor }\r\n );\r\n}\r\nconst events = table.addNewRows(command);\r\nawait this.repo.save(command.store, table);\r\n events.forEach(event => {\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId\r\n });\r\n });\r\n\r\n return events;\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n\r\n/* ======================================================\r\n Paste Row (clipboard clone via AppService)\r\n ====================================================== */\r\n\r\nexport class PasteRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: PasteRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to paste a row',\r\n { actor }\r\n );\r\n }\r\n const event = table.addRow(command.sourceRowId, command.placeAtRowId);\r\n await this.repo.save(command.store, table);\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId,\r\n });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details,\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error },\r\n });\r\n }\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Duplicate Row\r\n ====================================================== */\r\n\r\nexport class DuplicateRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: DuplicateRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canCopyRow?.({ actor, rowId: command.rowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to duplicate a row',\r\n { actor }\r\n );\r\n }\r\n const rowId = new RowId(command.rowId);\r\n const event = table.duplicateRow(rowId);\r\n await this.repo.save(command.store, table);\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Delete Row\r\n ====================================================== */\r\n\r\nexport class DeleteRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: DeleteRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canDeleteRow?.({ actor, rowId: command.rowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to delete this row',\r\n { actor }\r\n );\r\n }\r\n const rowId = new RowId(command.rowId);\r\n const event = table.deleteRow(rowId);\r\n\r\n if (!event) {\r\n throw new DomainError(\r\n 'ROW_NOT_FOUND',\r\n 'Row not found or already deleted',\r\n { rowId: rowId.value }\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n\r\n return event;\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Restore Added Row (redo identity)\r\n ====================================================== */\r\n\r\nexport class RestoreAddedRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: RestoreAddedRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to restore an added row',\r\n { actor }\r\n );\r\n }\r\n const event = table.restoreAddedRow({\r\n rowId: command.rowId,\r\n cells: command.cells,\r\n collection: command.collection,\r\n isSaveDescription: command.isSaveDescription,\r\n });\r\n await this.repo.save(command.store, table);\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId,\r\n });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details,\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error },\r\n });\r\n }\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Reorder Row\r\n ====================================================== */\r\nexport class ReorderRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: RowReorderedCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission?.canReorderRow?.({ actor, rowId: command.draggedRowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to reorder this row',\r\n { actor }\r\n );\r\n }\r\n const draggedRowId = new RowId(command.draggedRowId);\r\n const droppedRowId = new RowId(command.droppedRowId);\r\n const event = table.reorderRows(draggedRowId.value, droppedRowId.value, command.position);\r\n if (!event) {\r\n \r\n throw new DomainError(\r\n 'DRAG_OR_DROP_ROW_NOT_FOUND',\r\n `Drag row num is ${draggedRowId.value} && drop row num is ${droppedRowId.value} `,\r\n { draggedRowId: draggedRowId.value, droppedRowId: droppedRowId.value }\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n return event;\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n\r\n\r\n }\r\n}","// application/handlers/TableCommandHandler.ts\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ChangePageCommand,\r\n ChangePageSizeCommand,\r\n ChangeUnitLevelCommand,\r\n DeleteTableCommand,\r\n ResetTableCommand,\r\n SetActiveCollectionCommand,\r\n} from '../commands';\r\nimport { TableEvent } from '../events';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { RemoteApi } from '../ports/RemoteApi';\r\nimport { TableRepository } from '../ports/TableRepository';\r\n\r\ntype DynamicConfig = {\r\n columnMeta: Map<string, ColumnSchema>;\r\n remoteApi: RemoteApi;\r\n};\r\n\r\n/* ======================================================\r\n Change Unit Level\r\n ====================================================== */\r\n\r\nexport class ChangeUnitLevelHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeUnitLevelCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n\r\n try {\r\n\r\n table.addColumns([]);\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'UNIT_COLUMN_ADDED',\r\n tableId: command.tableKey,\r\n reason: 'UNIT_LEVEL_UPDATED',\r\n details: { level: command.level },\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.reason,\r\n payload: out.details\r\n });\r\n return [out];\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Change Page\r\n ====================================================== */\r\n\r\nexport class ChangePageCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger\r\n ) { }\r\n\r\n async execute(\r\n command: ChangePageCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n\r\n table.changePage(command.page);\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'PAGE_CHANGED',\r\n tableId: command.tableKey,\r\n page: command.page\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.page\r\n });\r\n return [out];\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Change Page size\r\n ====================================================== */\r\n\r\nexport class ChangePageSizeCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger\r\n ) { }\r\n\r\n async execute(\r\n command: ChangePageSizeCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n table.changePageSize(command.pageSize);\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'PAGE_SIZE_CHANGED',\r\n tableId: command.tableKey,\r\n pageSize: command.pageSize\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n });\r\n return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Delete Table \r\n ====================================================== */\r\n\r\nexport class DeleteTableCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n\r\n ) { }\r\n async execute(\r\n command: DeleteTableCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n this.repo.delete(command.store, command.tableKey)\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'TABLE_DELETED',\r\n tableId: command.tableKey,\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n });\r\n return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Reset Table \r\n ====================================================== */\r\n\r\nexport class ResetTableCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n\r\n ) { }\r\n async execute(\r\n command: ResetTableCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n this.repo.delete(command.store, command.tableKey)\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'TABLE_RESET',\r\n tableId: command.tableKey,\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n }); return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Reset Table \r\n ====================================================== */\r\n\r\nexport class SetActiveCollectionCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n ) { }\r\nprivate async applyVisibility(input: {\r\n table: Table;\r\n command: SetActiveCollectionCommand;\r\n}): Promise<void> {\r\n const { table, command } = input;\r\n\r\n const collection = table.getCollections().get(command.activeCollection);\r\n if (!collection) return;\r\n\r\n collection.getColumns().forEach(colCfg => {\r\n const visibility = colCfg.visibility;\r\n\r\n if (\r\n (visibility?.kind === \"whenCollection\" &&\r\n visibility.collection === command.activeCollection) ||\r\n (visibility?.kind === \"whenTableType\" &&\r\n visibility.tableType === command.activeCollection)\r\n ) {\r\n colCfg.hidden = false;\r\n }\r\n });\r\n}\r\n\r\n async execute(\r\n command: SetActiveCollectionCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n table.setActiveCollection(command.activeCollection)\r\n this.applyVisibility({table,command});\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'ACTIVE_COLLECTION_CHANGED',\r\n tableId: command.tableKey,\r\n };\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n }); return [out];\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}","// application/TableAppService.ts\r\n\r\nimport {\r\n Actor,\r\n ApplicationTableCommand,\r\n} from './commands';\r\nimport { CellChangedEvent, TableEvent } from './events';\r\nimport {\r\n ApplyDynamicProjectionHandler,\r\n ChangeCellDisplayValueHandler,\r\n ChangeCellValueHandler,\r\n SaveDescriptionHandler,\r\n} from './handlers/cellCommandsHandler';\r\nimport {\r\n AddNewRowCommandHandler,\r\n AddNewRowsCommandHandler,\r\n DeleteRowCommandHandler,\r\n DuplicateRowCommandHandler,\r\n PasteRowCommandHandler,\r\n ReorderRowCommandHandler,\r\n RestoreAddedRowCommandHandler,\r\n} from './handlers/rowCommandsHandler';\r\nimport {\r\n ChangePageCommandHandler,\r\n ChangePageSizeCommandHandler,\r\n SetActiveCollectionCommandHandler,\r\n ChangeUnitLevelHandler,\r\n DeleteTableCommandHandler,\r\n ResetTableCommandHandler,\r\n} from './handlers/tableCommandHandler';\r\nimport type { EventStore } from './ports/EventStore';\r\nimport type { TableRepository } from './ports/TableRepository';\r\nimport type { GridEvent } from '../domain/types/GridEvent';\r\nimport type { CellUndoStack, RowCellSnapshot } from './undo/CellUndoStack';\r\n\r\nexport class TableAppService {\r\n private eventStore?: EventStore;\r\n private undoStack?: CellUndoStack;\r\n private repo?: TableRepository;\r\n\r\n constructor(\r\n private readonly changeCellValue: ChangeCellValueHandler,\r\n private readonly changeCellDisplayValue: ChangeCellDisplayValueHandler,\r\n private readonly saveDescription: SaveDescriptionHandler,\r\n private readonly addEmptyRow: AddNewRowCommandHandler,\r\n private readonly addNewRows: AddNewRowsCommandHandler,\r\n private readonly duplicateRow: DuplicateRowCommandHandler,\r\n private readonly deleteRow: DeleteRowCommandHandler,\r\n private readonly reorderRow: ReorderRowCommandHandler,\r\n private readonly setUnitLevel: ChangeUnitLevelHandler,\r\n private readonly setPageSize: ChangePageSizeCommandHandler,\r\n private readonly setPage: ChangePageCommandHandler,\r\n private readonly setActiveCollection: SetActiveCollectionCommandHandler,\r\n private readonly deleteTable: DeleteTableCommandHandler,\r\n private readonly resetTable: ResetTableCommandHandler,\r\n private readonly applyDynamicProjection: ApplyDynamicProjectionHandler,\r\n private readonly restoreAddedRow?: RestoreAddedRowCommandHandler,\r\n private readonly pasteRow?: PasteRowCommandHandler,\r\n ) {}\r\n\r\n setEventStore(eventStore: EventStore): void {\r\n this.eventStore = eventStore;\r\n }\r\n\r\n setUndoStack(undoStack: CellUndoStack): void {\r\n this.undoStack = undoStack;\r\n }\r\n\r\n setRepository(repo: TableRepository): void {\r\n this.repo = repo;\r\n }\r\n\r\n async execute(command: ApplicationTableCommand, actor: Actor) {\r\n const correlationId =\r\n (command as { correlationId?: string }).correlationId ??\r\n this.createCorrelationId();\r\n\r\n const preDeleteSnapshot =\r\n command.type === 'ROW_DELETED'\r\n ? await this.captureRowSnapshot(\r\n command.store,\r\n command.tableKey,\r\n command.rowId,\r\n )\r\n : undefined;\r\n\r\n const result = await this.dispatch(command, actor);\r\n if (result) {\r\n await this.recordUndoableEvents(\r\n command,\r\n result,\r\n correlationId,\r\n preDeleteSnapshot,\r\n );\r\n }\r\n if (this.eventStore && result) {\r\n await this.appendToEventStore(command, result, correlationId);\r\n }\r\n return result;\r\n }\r\n\r\n private dispatch(command: ApplicationTableCommand, actor: Actor) {\r\n switch (command.type) {\r\n case 'CHANGE_CELL_VALUE':\r\n return this.changeCellValue.execute(command, actor);\r\n case 'SAVE_DESCRIPTION':\r\n return this.saveDescription.execute(command, actor);\r\n case 'APPLY_DYNAMIC_PROJECTION':\r\n return this.applyDynamicProjection.execute(command, actor);\r\n case 'CHANGE_CELL_DISPLAY_VALUE':\r\n return this.changeCellDisplayValue.execute(command, actor);\r\n case 'ADD_EMPTY_ROW':\r\n return this.addEmptyRow.execute(command, actor);\r\n case 'ADD_NEW_ROWS':\r\n return this.addNewRows.execute(command, actor);\r\n case 'DUPLICATE_ROW':\r\n return this.duplicateRow.execute(command, actor);\r\n case 'PASTE_ROW':\r\n if (!this.pasteRow) {\r\n throw new Error('PASTE_ROW handler is not configured');\r\n }\r\n return this.pasteRow.execute(command, actor);\r\n case 'ROW_DELETED':\r\n return this.deleteRow.execute(command, actor);\r\n case 'RESTORE_ADDED_ROW':\r\n if (!this.restoreAddedRow) {\r\n throw new Error('RESTORE_ADDED_ROW handler is not configured');\r\n }\r\n return this.restoreAddedRow.execute(command, actor);\r\n case 'TABLE_RESET':\r\n return this.resetTable.execute(command, actor);\r\n case 'TABLE_DELETED':\r\n return this.deleteTable.execute(command, actor);\r\n case 'ROW_REORDERED':\r\n return this.reorderRow.execute(command, actor);\r\n case 'SET_UNIT_LEVEL':\r\n return this.setUnitLevel.execute(command, actor);\r\n case 'CHANGE_PAGE_SIZE':\r\n return this.setPageSize.execute(command, actor);\r\n case 'CHANGE_PAGE':\r\n return this.setPage.execute(command, actor);\r\n case 'SET_ACTIVE_COLLECTION':\r\n return this.setActiveCollection.execute(command, actor);\r\n default:\r\n throw new Error(`Unhandled command: ${(command as any).type}`);\r\n }\r\n }\r\n\r\n private async recordUndoableEvents(\r\n command: ApplicationTableCommand,\r\n result: TableEvent[] | TableEvent | null | unknown,\r\n correlationId: string,\r\n preDeleteSnapshot?: {\r\n cells: Record<string, RowCellSnapshot>;\r\n collection: string;\r\n isSaveDescription: boolean;\r\n },\r\n ): Promise<void> {\r\n if (!this.undoStack) return;\r\n\r\n const events = this.normalizeResult(result);\r\n if (events.length === 0) return;\r\n\r\n const fallbackTableId = (command as { tableKey?: string }).tableKey ?? '';\r\n const store = (command as { store?: string }).store ?? '';\r\n\r\n for (const evt of events) {\r\n if (evt.type === 'CELL_CHANGED' && 'previousValue' in evt) {\r\n const cellEvt = evt as CellChangedEvent;\r\n this.undoStack.record(\r\n {\r\n ...cellEvt,\r\n tableId: cellEvt.tableId || fallbackTableId,\r\n },\r\n correlationId,\r\n );\r\n continue;\r\n }\r\n\r\n if (evt.type === 'ROW_ADDED' || evt.type === 'NEW_ROW_ADDED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n const tableId = evt.tableId || fallbackTableId;\r\n if (rowId == null || !tableId) continue;\r\n const snapshot = await this.captureRowSnapshot(store, tableId, rowId);\r\n this.undoStack.recordRowAdded(\r\n {\r\n tableId,\r\n rowId,\r\n cells: snapshot?.cells,\r\n collection: snapshot?.collection,\r\n isSaveDescription: snapshot?.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n continue;\r\n }\r\n\r\n if (evt.type === 'ROW_DELETED' || evt.type === 'NEW_ROW_REMOVED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n const tableId = evt.tableId || fallbackTableId;\r\n if (rowId == null || !tableId) continue;\r\n const mode = evt.type === 'NEW_ROW_REMOVED' ? 'hard' : 'soft';\r\n this.undoStack.recordRowDeleted(\r\n {\r\n tableId,\r\n rowId,\r\n mode,\r\n cells: preDeleteSnapshot?.cells,\r\n collection: preDeleteSnapshot?.collection,\r\n isSaveDescription: preDeleteSnapshot?.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private async captureRowSnapshot(\r\n store: string,\r\n tableId: string,\r\n rowId: number,\r\n ): Promise<\r\n | {\r\n cells: Record<string, RowCellSnapshot>;\r\n collection: string;\r\n isSaveDescription: boolean;\r\n }\r\n | undefined\r\n > {\r\n if (!this.repo || !store) return undefined;\r\n try {\r\n const table = await this.repo.getById(store, tableId);\r\n const row = table.getRow(rowId);\r\n if (!row) return undefined;\r\n const cells: Record<string, RowCellSnapshot> = {};\r\n for (const [key, cell] of row.getCells().entries()) {\r\n cells[key] = {\r\n value: cell.getValue(),\r\n display: cell.getDisplay(),\r\n originalValue: cell.getOriginalValue().value,\r\n };\r\n }\r\n return {\r\n cells,\r\n collection: row.getCollection(),\r\n isSaveDescription: row.isSaveDescription,\r\n };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n private async appendToEventStore(\r\n command: ApplicationTableCommand,\r\n result: TableEvent[] | TableEvent | null | unknown,\r\n correlationId: string,\r\n ): Promise<void> {\r\n if (!this.eventStore) return;\r\n\r\n const events = this.normalizeResult(result);\r\n if (events.length === 0) return;\r\n\r\n const tableId = (command as any).tableKey ?? '';\r\n const streamId = `table:${tableId}`;\r\n\r\n const gridEvents: GridEvent[] = events.map((evt) => ({\r\n eventId: `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\r\n type: evt.type,\r\n tableId: evt.tableId ?? tableId,\r\n streamId,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: 'system',\r\n correlationId,\r\n payload: this.toGridPayload(evt, tableId),\r\n }));\r\n\r\n await this.eventStore.append(streamId, gridEvents, -1);\r\n }\r\n\r\n private normalizeResult(result: unknown): TableEvent[] {\r\n if (!result) return [];\r\n if (Array.isArray(result)) return result;\r\n if (typeof result === 'object' && 'type' in (result as any)) {\r\n return [result as TableEvent];\r\n }\r\n return [];\r\n }\r\n\r\n private resolveRowId(rowId: unknown): number | null {\r\n if (typeof rowId === 'number' && Number.isFinite(rowId)) return rowId;\r\n if (typeof rowId === 'string' && rowId.trim() !== '') {\r\n const parsed = Number(rowId);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n if (\r\n typeof rowId === 'object' &&\r\n rowId !== null &&\r\n 'value' in rowId &&\r\n typeof (rowId as { value: unknown }).value === 'number'\r\n ) {\r\n return (rowId as { value: number }).value;\r\n }\r\n return null;\r\n }\r\n\r\n private toGridPayload(evt: TableEvent, fallbackTableId: string): unknown {\r\n if (evt.type === 'ROW_ADDED' || evt.type === 'NEW_ROW_ADDED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n return {\r\n type: evt.type,\r\n tableId: evt.tableId ?? fallbackTableId,\r\n rowId: rowId ?? String((evt as { rowId?: unknown }).rowId ?? ''),\r\n };\r\n }\r\n return evt;\r\n }\r\n\r\n private createCorrelationId(): string {\r\n return `cmd-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n}\r\n","// bootstrap/builders.ts\r\n\r\nimport {\r\n ApplyDynamicProjectionHandler,\r\n ChangeCellDisplayValueHandler,\r\n ChangeCellValueHandler,\r\n SaveDescriptionHandler,\r\n} from '../../application/handlers/cellCommandsHandler';\r\nimport {\r\n AddNewRowCommandHandler,\r\n AddNewRowsCommandHandler,\r\n DeleteRowCommandHandler,\r\n DuplicateRowCommandHandler,\r\n PasteRowCommandHandler,\r\n ReorderRowCommandHandler,\r\n RestoreAddedRowCommandHandler,\r\n} from '../../application/handlers/rowCommandsHandler';\r\nimport {\r\n ChangePageCommandHandler,\r\n ChangePageSizeCommandHandler,\r\n SetActiveCollectionCommandHandler,\r\n ChangeUnitLevelHandler,\r\n DeleteTableCommandHandler,\r\n ResetTableCommandHandler,\r\n} from '../../application/handlers/tableCommandHandler';\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { TableAppService } from '../../application/TableAppService';\r\nimport { Cell } from '../../domain/entities/Cell';\r\nimport { Collection } from '../../domain/entities/Collection';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport {\r\n ColumnSchema,\r\n CreateERPTableConfig,\r\n RowInput,\r\n} from '../type';\r\n\r\n/* ======================================================\r\n helpers\r\n ====================================================== */\r\n\r\nexport const isInitiallyHidden = (\r\n col: ColumnSchema,\r\n inputRows: RowInput[] | Row[],\r\n activeCollection: string = \"default\"\r\n): boolean => {\r\n // شرط ۱: همیشه نمایش داده بشه\r\n if (col.visibility.kind === \"always\") {\r\n return false;\r\n }\r\n\r\n // شرط ۴: ستون مختص این collection هست\r\n if (\r\n (col.visibility.kind === \"whenCollection\" &&\r\n col.visibility.collection === activeCollection) ||\r\n (col.visibility.kind === \"whenTableType\" &&\r\n col.visibility.tableType === activeCollection)\r\n ) {\r\n return false;\r\n }\r\n\r\n // شرط ۲ و ۳: بررسی مقدار و visibilityCondition\r\n const isVisibleByCondition = inputRows.some(r => {\r\n if (r instanceof Row) {\r\n const domainRow = r as Row;\r\n // شرط ۳: visibilityCondition با true\r\n if (domainRow.getVisibilityCondition()?.[col.fieldName] === true) {\r\n return true;\r\n }\r\n // شرط ۲: مقدار داره و activeCollection برابر default\r\n if (activeCollection === \"default\") {\r\n return !!domainRow.getCell(col.fieldName)?.getValue();\r\n }\r\n return false;\r\n } else {\r\n const inputRow = r as RowInput;\r\n // شرط ۲: مقدار داره و activeCollection برابر default\r\n if (activeCollection === \"default\") {\r\n return inputRow.values?.[col.fieldName] != null &&\r\n inputRow.values?.[col.fieldName] !== \"\";\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (isVisibleByCondition) {\r\n return false;\r\n }\r\n\r\n // در غیر این صورت مخفی باشه\r\n return true;\r\n};\r\n\r\n/* ======================================================\r\n builders\r\n ====================================================== */\r\n\r\nexport function buildColumns(\r\n columnsConfig: ColumnSchema[],\r\n rows: RowInput[],\r\n activeCollection?: string\r\n): {\r\n columns: Map<string, ColumnSchema>;\r\n columnMeta: Map<string, ColumnSchema>;\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>;\r\n} {\r\n const columns = new Map<string, ColumnSchema>();\r\n const columnMeta = new Map<string, ColumnSchema>();\r\n\r\n // collectionName => columns\r\n const collectionColumns = new Map<string, Map<string, ColumnSchema>>();\r\n\r\n const sortedColumns = [...columnsConfig].sort(\r\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\r\n );\r\n\r\n for (const col of sortedColumns) {\r\n const schema: ColumnSchema = {\r\n ...col,\r\n editable: col.computed\r\n ? false\r\n : col.fieldType === \"index\"\r\n ? false\r\n : col.editable ?? true,\r\n fieldCollection: col.fieldCollection ?? \"default\",\r\n expandable: col.fieldName === \"index\" && col.expandable,\r\n hidden: isInitiallyHidden(col, rows, activeCollection),\r\n };\r\n const collectionName = schema.fieldCollection ?? \"default\";\r\n const columnKey = `${col.fieldCollection ?? 'default'}_${col.fieldName}`;\r\n columns.set(columnKey, schema);\r\n columnMeta.set(columnKey, col);\r\n if (!collectionColumns.has(collectionName)) {\r\n collectionColumns.set(collectionName, new Map());\r\n }\r\n\r\n collectionColumns.get(collectionName)!.set(schema.fieldName, schema);\r\n }\r\n return {\r\n columns,\r\n columnMeta,\r\n collectionColumns,\r\n };\r\n}\r\n\r\nexport async function buildRows( collectionColumns: Map<string, Map<string, ColumnSchema>>,\r\n columnMeta: Map<string, ColumnSchema>,\r\n inputRows: RowInput[],\r\n repo: TableRepository,\r\n store: string,\r\n tableKey: string,\r\n remoteApi: RemoteApi,\r\n): Promise<{ rows: Map<number, Row>; table?: Table }> {\r\n let rowMap = new Map<number, Row>();\r\n // ---------- rows: ابتدا IndexedDB, fallback به ورودی ----------\r\n const exist = await repo.exists(store, tableKey)\r\n if (exist) {\r\n const persistedTable = await repo.getById(store, tableKey);\r\n rowMap = new Map<number, Row>(\r\n persistedTable.getRows().map(r => [r.id.value, r])\r\n );\r\n return { rows: rowMap, table: persistedTable };\r\n } else {\r\n const rows = inputRows.sort((a, b) => a.id - b.id)\r\n for (const [idx, r] of rows.entries()) {\r\n const rowId = new RowId(r.id);\r\n const cells = new Map<string, Cell>();\r\n const rowCollection = r.collection ?? r.rowType ?? \"default\";\r\n const columns = collectionColumns.get(rowCollection);\r\n if (!columns) {\r\n throw new Error(\r\n `Collection '${rowCollection}' not found`\r\n );\r\n }\r\n for (const [columnKey, schema] of columns) {\r\n const colKey = `${schema.fieldCollection ?? 'default'}_${schema.fieldName}`;\r\n const colId = schema.fieldName\r\n const meta = columnMeta.get(colKey);\r\n if (!meta) continue;\r\n const values = r.values ?? {};\r\n const incoming =\r\n meta.returnValue?.(values, colId) ??\r\n (values as Record<string, unknown>)?.[colId] ??\r\n null;\r\n const rowNum =\r\n (values as Record<string, unknown>)?.[\"RowNum\"];\r\n const description =\r\n meta.returnDisplayValue?.(values, colId) ?? undefined;\r\n let value =\r\n meta.fieldType === \"index\"\r\n ? (rowNum ?? idx + 1)\r\n : (incoming ?? null);\r\n\r\n let display =\r\n meta.fieldType === \"index\"\r\n ? (rowNum ?? idx + 1)\r\n : (description ?? incoming);\r\n // if (meta.returnDisplayValue) {\r\n // console.log(colId, rowCollection, meta.returnDisplayValue, meta.fieldCollection, columnMeta, description, display)\r\n // }\r\n\r\n // 6. computed override\r\n if (meta?.computed?.dependsOn) {\r\n value = (await meta.computed.compute(values, remoteApi)) as unknown as\r\n | {}\r\n | null;\r\n display = value;\r\n } else if (incoming != null && schema.displayFormat) {\r\n display = schema.displayFormat(incoming) as {} | null;\r\n }\r\n // 7. final cell creation\r\n cells.set(\r\n colId,\r\n new Cell(\r\n rowId,\r\n new ColumnId(colId),\r\n new CellValue(value),\r\n new CellValue(value),\r\n new CellDisplay(display)\r\n )\r\n );\r\n }\r\n const visibilityCondition = new Object() as Record<string, boolean>;\r\n const rowState =\r\n ((r.values ?? {})[\"RowState\"] as RowStateEnum | undefined) ??\r\n RowStateEnum.Unchanged;\r\n const uniqueId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n rowMap.set(\r\n uniqueId.value,\r\n new Row(\r\n rowId,\r\n cells,\r\n new RowState(rowState),\r\n new Set(),\r\n visibilityCondition,\r\n r.collection ?? r.rowType ?? rowCollection,\r\n false\r\n )\r\n );\r\n }\r\n return { rows: rowMap };\r\n }\r\n}\r\nexport function buildCollections(\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>,\r\n rows: Map<number, Row>\r\n): Map<string, Collection> {\r\n const collectionMap = new Map<string, Collection>();\r\n for (const [collectionName, columns] of collectionColumns) {\r\n const collectionRows = new Map<number, Row>();\r\n for (const [rowId, row] of rows) {\r\n if (row.collection !== collectionName)\r\n continue;\r\n const cells = new Map<string, Cell>();\r\n for (const [, column] of columns) {\r\n const cell = row.getCell(column.fieldName);\r\n if (cell) {\r\n cells.set(column.fieldName, cell);\r\n }\r\n }\r\n collectionRows.set(\r\n row.id.value,\r\n new Row(\r\n row.id,\r\n cells,\r\n row.rowState,\r\n new Set(row.changeFields),\r\n row.getVisibilityCondition(),\r\n collectionName,\r\n row.isSaveDescription\r\n )\r\n );\r\n }\r\n collectionMap.set(\r\n collectionName,\r\n new Collection(\r\n collectionName,\r\n collectionRows,\r\n columns\r\n )\r\n );\r\n }\r\n return collectionMap;\r\n}\r\n\r\n\r\n\r\n\r\nexport function createPermissionPolicy(\r\n config: CreateERPTableConfig,\r\n columnMeta: Map<string, ColumnSchema>,\r\n table: Table,\r\n repo: TableRepository,\r\n audit: AuditLogger\r\n): PermissionPolicy {\r\n const checkRoleAccess = (\r\n actor: Actor,\r\n allowRoles?: string[],\r\n denyRoles?: string[]\r\n ): boolean => {\r\n if (denyRoles?.some(r => actor.roles.includes(r))) {\r\n return false;\r\n }\r\n if (allowRoles) {\r\n return allowRoles.some(r => actor.roles.includes(r));\r\n }\r\n return true;\r\n };\r\n\r\n const resolveColumnAccess = (\r\n actor: Actor,\r\n rowId: number,\r\n columnId: string\r\n ): boolean => {\r\n const meta = columnMeta.get(columnId);\r\n if (!meta?.colAccess) return true;\r\n const row = table.getRow(rowId);\r\n if (!row) return false;\r\n const { allowRoles, denyRoles, rule } = meta.colAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n return rule({ actor, row, table });\r\n }\r\n return true;\r\n };\r\n\r\n const resolveRowAccess = (\r\n actor: Actor,\r\n rowId?: number\r\n ): boolean => {\r\n if (!rowId) {\r\n const rowAccess = config.rowAccess;\r\n if (!rowAccess) return true;\r\n const { allowRoles, denyRoles, rule } = rowAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n return rule({ actor, table });\r\n }\r\n return true;\r\n } else {\r\n const row = table.getRow(rowId);\r\n if (!row) return false;\r\n const rowAccess = config.rowAccess;\r\n if (!rowAccess) return true;\r\n const { allowRoles, denyRoles, rule } = rowAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n return rule({ actor, row, table });\r\n }\r\n return true;\r\n }\r\n };\r\n\r\n return {\r\n canChangeCell: ({ actor, rowId, columnId }) => resolveColumnAccess(actor, rowId, columnId),\r\n canEdit: ({ actor, rowId, columnId }) => resolveColumnAccess(actor, rowId, columnId),\r\n canAddRow: ({ actor }) => resolveRowAccess(actor),\r\n canCopyRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n canDeleteRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n canReorderRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n };\r\n}\r\n\r\nexport function createTableAppService(\r\n repo: TableRepository,\r\n audit: AuditLogger,\r\n permissionPolicy: PermissionPolicy,\r\n { columnMeta, remoteApi }: { columnMeta: Map<string, ColumnSchema>; remoteApi: RemoteApi },\r\n eventStore?: EventStore\r\n): TableAppService {\r\n const changeCellHandler = new ChangeCellValueHandler(repo, audit, permissionPolicy, { columnMeta, remoteApi });\r\n const applyDynamicProjection = new ApplyDynamicProjectionHandler(repo, audit, permissionPolicy, { columnMeta, remoteApi });\r\n const changeCellDisplayHandler = new ChangeCellDisplayValueHandler(repo, audit, permissionPolicy);\r\n const saveDescriptionHandler = new SaveDescriptionHandler(repo, audit, permissionPolicy);\r\n const addNewRowHandler = new AddNewRowCommandHandler(repo, audit, permissionPolicy);\r\n const addNewRowsHandler = new AddNewRowsCommandHandler(repo, audit, permissionPolicy);\r\n const duplicateRowHandler = new DuplicateRowCommandHandler(repo, audit, permissionPolicy);\r\n const pasteRowHandler = new PasteRowCommandHandler(repo, audit, permissionPolicy);\r\n const deleteRowHandler = new DeleteRowCommandHandler(repo, audit, permissionPolicy);\r\n const restoreAddedRowHandler = new RestoreAddedRowCommandHandler(\r\n repo,\r\n audit,\r\n permissionPolicy,\r\n );\r\n const deleteTableHandler = new DeleteTableCommandHandler(repo, audit, permissionPolicy);\r\n const resetTableHandler = new ResetTableCommandHandler(repo, audit, permissionPolicy);\r\n const reorderRowHandler = new ReorderRowCommandHandler(repo, audit, permissionPolicy);\r\n const unitLevelHandler = new ChangeUnitLevelHandler(repo, audit);\r\n const setPageSize = new ChangePageSizeCommandHandler(repo, audit);\r\n const setPage = new ChangePageCommandHandler(repo, audit);\r\n const setActiveCollection = new SetActiveCollectionCommandHandler(repo, audit);\r\n\r\n const appService = new TableAppService(\r\n changeCellHandler,\r\n changeCellDisplayHandler,\r\n saveDescriptionHandler,\r\n addNewRowHandler,\r\n addNewRowsHandler,\r\n duplicateRowHandler,\r\n deleteRowHandler,\r\n reorderRowHandler,\r\n unitLevelHandler,\r\n setPageSize,\r\n setPage,\r\n setActiveCollection,\r\n deleteTableHandler,\r\n resetTableHandler,\r\n applyDynamicProjection,\r\n restoreAddedRowHandler,\r\n pasteRowHandler,\r\n );\r\n\r\n appService.setRepository(repo);\r\n\r\n if (eventStore) {\r\n appService.setEventStore(eventStore);\r\n }\r\n\r\n return appService;\r\n}\r\n","// bootstrap/createERPTable.ts\r\n\r\nimport { Table } from '../domain/entities/Table';\r\nimport {\r\n Pagination,\r\n RowStateEnum,\r\n} from '../domain/value-objects';\r\nimport { TableEngine } from '../engine/tableEngine';\r\nimport {\r\n CachedTableRepository,\r\n} from '../infrastructure/Repositories/cachedTableRepository';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\nimport { FetchRemoteApi } from '../infrastructure/Repositories/fetchRemoteApi';\r\nimport { NoopRemoteApi } from '../infrastructure/Repositories/noopRemoteApi';\r\nimport { InMemoryEventStore } from '../infrastructure/eventStore/InMemoryEventStore';\r\nimport { IndexedDbEventStore } from '../infrastructure/eventStore/IndexedDbEventStore';\r\nimport { HistoryPanelViewModel } from '../infrastructure/history/HistoryPanelViewModel';\r\nimport { ChangelogProjection } from '../infrastructure/projections/ChangelogProjection';\r\nimport { UITableController } from '../infrastructure/ui/UITableController';\r\nimport { CellUndoStack } from '../application/undo/CellUndoStack';\r\nimport { createEngineGridQuery } from '../application/plugins/createEngineGridQuery';\r\nimport { PluginHost } from '../application/plugins/PluginHost';\r\nimport { DefaultGridSession } from '../infrastructure/session/DefaultGridSession';\r\nimport { mapColumnSchemas } from '../infrastructure/columns/mapColumnSchema';\r\nimport type { EventStore } from '../application/ports/EventStore';\r\nimport {\r\n buildCollections,\r\n buildColumns,\r\n buildRows,\r\n createPermissionPolicy,\r\n createTableAppService,\r\n isInitiallyHidden,\r\n} from './builders';\r\nimport {\r\n ColumnSchema,\r\n CreateERPTableConfig,\r\n CreateERPTableResult,\r\n RowInput,\r\n} from './type';\r\n\r\nasync function resolveEventStore(\r\n config: CreateERPTableConfig,\r\n): Promise<EventStore> {\r\n if (config.eventStore) return config.eventStore;\r\n // Browser: durable event log alongside CachedTableRepository → IndexedDB.\r\n if (typeof indexedDB !== 'undefined') {\r\n return IndexedDbEventStore.open(`erp-table-events:${config.store}`);\r\n }\r\n return new InMemoryEventStore();\r\n}\r\n\r\nfunction createInitialRows(\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>\r\n): RowInput[] {\r\n const rows: RowInput[] = [];\r\n for (const collectionName of collectionColumns.keys()) {\r\n rows.push({\r\n id: Date.now() + Math.floor(Math.random() * 1000000),\r\n collection: collectionName,\r\n values: {\r\n RowState: RowStateEnum.Added,\r\n },\r\n });\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nexport async function createERPTable(config: CreateERPTableConfig): Promise<CreateERPTableResult> {\r\n \r\n // ---------- infra ----------\r\n const repo = config.repo ?? new CachedTableRepository();\r\n const audit = config.audit ?? new ConsoleAuditLogger();\r\n const remoteApi =\r\n config.remoteApi ??\r\n (typeof window !== 'undefined' ? new FetchRemoteApi() : new NoopRemoteApi());\r\n const eventStore = await resolveEventStore(config);\r\n const changelogProjection = new ChangelogProjection(eventStore);\r\n const historyPanelViewModel = new HistoryPanelViewModel(changelogProjection);\r\n const cellUndoStack = new CellUndoStack();\r\n await changelogProjection.start();\r\n\r\n // ---------- محاسبه pageSize دقیقاً مثل نسخه اولیه ----------\r\n const page = 1;\r\n const pageSize = config.tableHeight\r\n ? Math.floor(config.tableHeight / 40)\r\n : config.recordPerPage ?? 10;\r\n // ---------- columns & rows (با چک repo) ----------\r\n const activeCollection = config.activeCollection ?? config.tableType;\r\n const buildResult = buildColumns(config.columns, config.rows, activeCollection);\r\n let { columns } = buildResult;\r\n const { columnMeta, collectionColumns } = buildResult;\r\n const normalizedRows: RowInput[] =\r\n config.rows.length\r\n ? config.rows\r\n : createInitialRows(collectionColumns) as RowInput[];\r\n const { rows, table: loadedTable } = await buildRows(\r\n collectionColumns,\r\n columnMeta,\r\n normalizedRows,\r\n repo,\r\n config.store,\r\n config.tableKey,\r\n remoteApi);\r\n const initialCollection = buildCollections(\r\n collectionColumns,\r\n rows\r\n );\r\n if (loadedTable) {\r\n columns = new Map<string, ColumnSchema>();\r\n const rowList = Array.from(rows.values());\r\n const collectionName = activeCollection ?? 'default';\r\n for (const [columnKey, col] of buildResult.columns) {\r\n columns.set(columnKey, {\r\n ...col,\r\n hidden: isInitiallyHidden(col, rowList, collectionName),\r\n });\r\n }\r\n }\r\n // ---------- table ----------\r\n const table = loadedTable || new Table(\r\n config.tableKey,\r\n initialCollection,\r\n new Pagination(page, pageSize, pageSize),\r\n null,\r\n activeCollection ?? 'default'\r\n );\r\n if (loadedTable) {\r\n table.setColumns(Array.from(columns.values()));\r\n table.setPagination(new Pagination(page, pageSize, pageSize)); await repo.save(config.store, table);\r\n } else {\r\n await repo.save(config.store, table);\r\n }\r\n // ---------- policies & app ----------\r\n const permissionPolicy = createPermissionPolicy(config, columnMeta, table, repo, audit);\r\n const app = createTableAppService(repo, audit, permissionPolicy, { columnMeta, remoteApi }, eventStore);\r\n app.setUndoStack(cellUndoStack);\r\n\r\n // ---------- engine & session & controller ----------\r\n const engine = new TableEngine(app, repo, config.actor, audit);\r\n const session = new DefaultGridSession({\r\n engine,\r\n store: config.store,\r\n tableKey: config.tableKey,\r\n audit,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n });\r\n const controller = new UITableController(\r\n engine,\r\n config.store,\r\n config.tableKey,\r\n audit,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n session,\r\n remoteApi,\r\n );\r\n const { definitions: columnDefinitions, bindings: columnBindings } =\r\n mapColumnSchemas(config.columns);\r\n await controller.dispatch({ type: 'TABLE_REGISTERED', storeName: config.store, table });\r\n\r\n const pluginHost = new PluginHost({\r\n tableId: config.tableKey,\r\n actorId: config.actor.userId,\r\n eventStore,\r\n session,\r\n query: createEngineGridQuery(engine),\r\n });\r\n if (config.plugins?.length) {\r\n pluginHost.register(config.plugins);\r\n }\r\n\r\n return {\r\n engine,\r\n controller,\r\n session,\r\n table,\r\n tableKey: config.tableKey,\r\n columnMeta,\r\n columnDefinitions,\r\n columnBindings,\r\n eventStore,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n pluginHost,\r\n };\r\n}\r\n","// hooks/useERPTable.ts\r\nimport {\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport type { GridSession } from '../application/session/GridSession';\r\nimport { createERPTable } from '../bootstrap';\r\nimport type { CreateERPTableConfig } from '../bootstrap/type';\r\nimport type { TableSnapShot } from '../engine/type';\r\nimport type {\r\n HistoryItem,\r\n HistoryQuery,\r\n} from '../infrastructure/history/HistoryPanelViewModel';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogQuery,\r\n} from '../infrastructure/projections/ChangelogProjection';\r\nimport {\r\n UITableController,\r\n} from '../infrastructure/ui/UITableController';\r\n\r\nexport type UseERPTableResult =\r\n | { ready: false }\r\n | {\r\n ready: true;\r\n controller: UITableController;\r\n session: GridSession;\r\n rows: TableSnapShot;\r\n changelog: ChangelogEntry[];\r\n changelogCount: number;\r\n historyItems: HistoryItem[];\r\n historyItemCount: number;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n getChangelog: (\r\n filter?: Omit<ChangelogQuery, 'tableId'>\r\n ) => ChangelogEntry[];\r\n getHistoryItems: (\r\n filter?: Omit<HistoryQuery, 'tableId'>\r\n ) => HistoryItem[];\r\n subscribeChangelog: (\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter?: Omit<ChangelogQuery, 'tableId'>\r\n ) => () => void;\r\n subscribeHistoryItems: (\r\n cb: (items: HistoryItem[]) => void,\r\n filter?: Omit<HistoryQuery, 'tableId'>\r\n ) => () => void;\r\n subscribeSelected: GridSession['subscribeSelected'];\r\n getViewport: GridSession['getViewport'];\r\n getVisibleRange: GridSession['getVisibleRange'];\r\n projectVisibleRows: GridSession['projectVisibleRows'];\r\n changeViewport: (input: {\r\n scrollOffset: number;\r\n viewportSize?: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n }) => Promise<void>;\r\n undo: () => Promise<boolean>;\r\n redo: () => Promise<boolean>;\r\n };\r\n\r\nexport function useERPTable(\r\n config: CreateERPTableConfig\r\n): UseERPTableResult {\r\n const [controller, setController] =\r\n useState<UITableController | null>(null);\r\n const [session, setSession] = useState<GridSession | null>(null);\r\n const [rows, setRows] = useState<TableSnapShot | null>(null);\r\n const [, setViewVersion] = useState(0);\r\n const [undoFlags, setUndoFlags] = useState({ canUndo: false, canRedo: false });\r\n const [historyItems, setHistoryItems] = useState<HistoryItem[]>([]);\r\n const [changelog, setChangelog] = useState<ChangelogEntry[]>([]);\r\n\r\n // ---------- bootstrap ----------\r\n useEffect(() => {\r\n let cancelled = false;\r\n setController(null);\r\n setSession(null);\r\n setRows(null);\r\n\r\n createERPTable(config).then((result: Awaited<ReturnType<typeof createERPTable>>) => {\r\n if (!cancelled) {\r\n setController(result.controller);\r\n setSession(result.session);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [config.tableKey, config.columns]);\r\n\r\n // Snapshot equality skips selection / active-row / expand because those live\r\n // on view state, not TableSnapShot. Bump viewVersion on every store tick so\r\n // checkboxes and toolbar counts re-render (same as the ERP host hook).\r\n useEffect(() => {\r\n if (!controller) return;\r\n\r\n let cancelled = false;\r\n const syncView = () => {\r\n if (cancelled) return;\r\n const snapshot = controller.getSnapShot('active');\r\n if (snapshot) setRows(snapshot);\r\n setViewVersion((version) => version + 1);\r\n };\r\n\r\n syncView();\r\n const unsubscribe = controller.subscribe(syncView);\r\n\r\n if (!unsubscribe) {\r\n const retryTimer = window.setTimeout(syncView, 0);\r\n return () => {\r\n cancelled = true;\r\n window.clearTimeout(retryTimer);\r\n };\r\n }\r\n\r\n return () => {\r\n cancelled = true;\r\n unsubscribe();\r\n };\r\n }, [controller]);\r\n\r\n // ---------- selector: undo flags (independent of row snapshot) ----------\r\n useEffect(() => {\r\n if (!controller) return;\r\n\r\n const readFlags = () => ({\r\n canUndo: controller.canUndo(),\r\n canRedo: controller.canRedo(),\r\n });\r\n\r\n setUndoFlags(readFlags());\r\n\r\n return controller.subscribeSelected(\r\n readFlags,\r\n setUndoFlags,\r\n (a: { canUndo: boolean; canRedo: boolean }, b: { canUndo: boolean; canRedo: boolean }) =>\r\n a.canUndo === b.canUndo && a.canRedo === b.canRedo,\r\n );\r\n }, [controller]);\r\n\r\n // ---------- history / changelog: dedicated projection subscriptions ----------\r\n useEffect(() => {\r\n if (!controller) return;\r\n setHistoryItems(controller.getHistoryItems());\r\n setChangelog(controller.getChangelog());\r\n const unsubHistory = controller.subscribeHistoryItems(setHistoryItems);\r\n const unsubChangelog = controller.subscribeChangelog(setChangelog);\r\n return () => {\r\n unsubHistory();\r\n unsubChangelog();\r\n };\r\n }, [controller]);\r\n\r\n if (!controller || !session || !controller.getViewState()) {\r\n return { ready: false };\r\n }\r\n\r\n return {\r\n ready: true,\r\n controller,\r\n session,\r\n rows: rows ?? (controller.getSnapShot('active') as TableSnapShot),\r\n changelog,\r\n changelogCount: changelog.length,\r\n historyItems,\r\n historyItemCount: historyItems.length,\r\n canUndo: undoFlags.canUndo,\r\n canRedo: undoFlags.canRedo,\r\n getChangelog: (filter) => controller.getChangelog(filter),\r\n getHistoryItems: (filter) => controller.getHistoryItems(filter),\r\n subscribeChangelog: (cb, filter) =>\r\n controller.subscribeChangelog(cb, filter),\r\n subscribeHistoryItems: (cb, filter) =>\r\n controller.subscribeHistoryItems(cb, filter),\r\n subscribeSelected: ((selector, listener, isEqual) =>\r\n controller.subscribeSelected(selector, listener, isEqual)) as GridSession['subscribeSelected'],\r\n getViewport: () => session.getViewport(),\r\n getVisibleRange: (totalRows: number) => session.getVisibleRange(totalRows),\r\n projectVisibleRows: <T,>(rows: T[], totalRows?: number) =>\r\n session.projectVisibleRows(rows, totalRows),\r\n changeViewport: (input: {\r\n scrollOffset: number;\r\n viewportSize?: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n }) =>\r\n session.dispatchViewIntent({ type: 'CHANGE_VIEWPORT', ...input }),\r\n undo: () => controller.undo(),\r\n redo: () => controller.redo(),\r\n };\r\n}\r\n","\"use client\";\r\nimport React, {\r\n ReactNode,\r\n useEffect,\r\n} from 'react';\r\n\r\nimport { injectERPTableStyles } from './styles/injectStyles';\r\nimport { CreateERPTableConfig } from '../bootstrap/type';\r\nimport { UITableController } from '../infrastructure/ui/UITableController';\r\nimport {\r\n ERPTableHostProvider,\r\n useMediaQuery,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n type ERPTableToastKind,\r\n} from './host';\r\nimport { DesktopTable } from './desktop/DesktopTable';\r\nimport { MobileTable } from './mobile/MobileTable';\r\nimport { IMultiSelectConfig } from './type';\r\nimport { useERPTable } from './useERPTable';\r\n\r\nexport interface ERPTableProps extends CreateERPTableConfig {\r\n onReady?: (controller: UITableController) => void;\r\n tableTitle?: ReactNode;\r\n header?: ReactNode;\r\n footer?: boolean | ReactNode;\r\n activeCollection?: string;\r\n tableHeight?: number;\r\n multiSelectConfig: IMultiSelectConfig;\r\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\r\n /**\r\n * Desktop virtual scroll. Default **false** to match ERP pagination.\r\n * Pass true to enable GridSession virtualization.\r\n */\r\n virtualization?: boolean;\r\n locale?: ERPTableLocale;\r\n direction?: 'rtl' | 'ltr';\r\n messages?: Partial<ERPTableMessages>;\r\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\r\n}\r\n\r\nexport function ERPTable(props: ERPTableProps) {\r\n injectERPTableStyles();\r\n const {\r\n columns,\r\n rowAccess,\r\n rows,\r\n actor,\r\n store,\r\n tableKey,\r\n onReady,\r\n tableTitle,\r\n header,\r\n footer,\r\n tableHeight,\r\n activeCollection,\r\n recordPerPage,\r\n multiSelectConfig,\r\n moreDetailComponent,\r\n virtualization,\r\n remoteApi,\r\n locale = 'fa',\r\n direction,\r\n messages,\r\n onToast,\r\n } = props;\r\n\r\n const result = useERPTable({\r\n store,\r\n tableKey,\r\n activeCollection,\r\n columns,\r\n rows,\r\n actor,\r\n rowAccess,\r\n tableHeight,\r\n recordPerPage,\r\n remoteApi,\r\n });\r\n\r\n useEffect(() => {\r\n if (!result.ready) return;\r\n const {controller} = result;\r\n\r\n const clickHandler = (e: MouseEvent) => {\r\n const target = e.target as HTMLElement;\r\n const button = target.closest(\"button\");\r\n if (button) {\r\n const {pageid, id} = button.dataset;\r\n if (tableKey === id || tableKey === pageid) {\r\n controller.dispose();\r\n }\r\n }\r\n };\r\n\r\n const handler = (e: KeyboardEvent) => {\r\n const target = e.target as HTMLElement;\r\n if (\r\n target.closest(\".ant-select\") ||\r\n target.closest(\".erp-table-select\")\r\n ) {\r\n if (\r\n e.code === \"ArrowUp\" ||\r\n e.code === \"ArrowDown\" ||\r\n e.code === \"Enter\" ||\r\n e.code === \"NumpadEnter\"\r\n ) {\r\n return;\r\n }\r\n }\r\n const activeRow = controller.getActiveRow();\r\n const activeCell = controller.getActiveCell();\r\n controller.dispatch({\r\n type: \"KEY_DOWN\",\r\n event: e,\r\n ctx: {\r\n activeRowId: activeRow,\r\n tableKey,\r\n activeColumnId: activeCell?.columnId ?? null,\r\n },\r\n });\r\n };\r\n\r\n window.addEventListener(\"keydown\", handler, true);\r\n window.addEventListener(\"click\", clickHandler, true);\r\n return () => {\r\n window.removeEventListener(\"click\", clickHandler, true);\r\n window.removeEventListener(\"keydown\", handler, true);\r\n };\r\n }, [result.ready, tableKey, result]);\r\n\r\n useEffect(() => {\r\n if (result.ready) {\r\n onReady?.(result.controller);\r\n }\r\n }, [result, onReady]);\r\n\r\n const {match: viewportMatch} = useMediaQuery(\"XLUP\");\r\n const isMobile = viewportMatch === false;\r\n\r\n if (!result.ready) return null;\r\n\r\n const sharedProps = {\r\n controller: result.controller,\r\n tableKey,\r\n tableTitle,\r\n header,\r\n footer,\r\n multiSelectConfig,\r\n };\r\n\r\n const table = isMobile ? (\r\n <MobileTable {...sharedProps} />\r\n ) : (\r\n <DesktopTable\r\n {...sharedProps}\r\n store={store}\r\n tableHeight={tableHeight}\r\n moreDetailComponent={moreDetailComponent}\r\n ready={result.ready}\r\n virtualization={virtualization}\r\n session={result.session}\r\n />\r\n );\r\n\r\n return (\r\n <ERPTableHostProvider\r\n locale={locale}\r\n direction={direction ?? (locale === 'fa' ? 'rtl' : 'ltr')}\r\n messages={messages}\r\n onToast={onToast}\r\n remoteApi={remoteApi ?? result.controller.getRemoteApi()}\r\n >\r\n <div className=\"erp-table\" dir={direction ?? (locale === 'fa' ? 'rtl' : 'ltr')} data-erp-table>\r\n {table}\r\n </div>\r\n </ERPTableHostProvider>\r\n );\r\n}\r\n","import type {\r\n AggregateSnapshot,\r\n SnapshotStore,\r\n} from '../../application/ports/SnapshotStore';\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\nexport type SnapshotStrategyOptions = {\r\n /** Take a snapshot every N appended domain events (default 200). */\r\n readonly everyNEvents?: number;\r\n};\r\n\r\n/**\r\n * After appends, periodically persists a snapshot of the selected payload.\r\n * load(stream) = latest snapshot + events with version > snapshot.version\r\n */\r\nexport class SnapshotStrategy<TPayload = unknown> {\r\n private readonly everyN: number;\r\n private counts = new Map<string, number>();\r\n\r\n constructor(\r\n private readonly snapshots: SnapshotStore<TPayload>,\r\n private readonly eventStore: EventStore,\r\n private readonly capture: (streamId: string) => Promise<TPayload> | TPayload,\r\n options: SnapshotStrategyOptions = {},\r\n ) {\r\n this.everyN = options.everyNEvents ?? 200;\r\n }\r\n\r\n /** Call after a successful EventStore.append for the stream. */\r\n async onAppend(streamId: string, tableId: string, appendedCount: number): Promise<void> {\r\n const next = (this.counts.get(streamId) ?? 0) + appendedCount;\r\n this.counts.set(streamId, next);\r\n\r\n if (next < this.everyN) return;\r\n\r\n const events = await this.eventStore.read(streamId);\r\n const version = events.length;\r\n const payload = await this.capture(streamId);\r\n\r\n await this.snapshots.save({\r\n tableId,\r\n streamId,\r\n version,\r\n takenAt: Date.now(),\r\n payload,\r\n });\r\n\r\n this.counts.set(streamId, 0);\r\n }\r\n\r\n async loadWithCatchUp(streamId: string): Promise<{\r\n snapshot: AggregateSnapshot<TPayload> | null;\r\n eventsAfter: GridEvent[];\r\n }> {\r\n const snapshot = await this.snapshots.loadLatest(streamId);\r\n const fromVersion = snapshot?.version ?? 0;\r\n const eventsAfter = await this.eventStore.read(streamId, fromVersion);\r\n return { snapshot, eventsAfter };\r\n }\r\n}\r\n","import type {\r\n AggregateSnapshot,\r\n SnapshotStore,\r\n} from '../../application/ports/SnapshotStore';\r\n\r\nexport class InMemorySnapshotStore<TPayload = unknown>\r\n implements SnapshotStore<TPayload>\r\n{\r\n private byStream = new Map<string, AggregateSnapshot<TPayload>>();\r\n\r\n async save(snapshot: AggregateSnapshot<TPayload>): Promise<void> {\r\n this.byStream.set(snapshot.streamId, snapshot);\r\n }\r\n\r\n async loadLatest(\r\n streamId: string,\r\n ): Promise<AggregateSnapshot<TPayload> | null> {\r\n return this.byStream.get(streamId) ?? null;\r\n }\r\n\r\n async clear(streamId: string): Promise<void> {\r\n this.byStream.delete(streamId);\r\n }\r\n}\r\n","/**\r\n * Plugin-facing event catalog (stable type tokens for subscribe / export plugins).\r\n * Keep in sync with `application/events` and `domain/types/GridEvent`.\r\n */\r\n\r\nexport type EventCatalogEntry = {\r\n readonly type: string;\r\n readonly category: 'cell' | 'row' | 'column' | 'table' | 'view' | 'dynamic' | 'error' | 'plugin';\r\n readonly undoable: boolean;\r\n readonly description: string;\r\n};\r\n\r\nexport const EVENT_CATALOG: readonly EventCatalogEntry[] = [\r\n {\r\n type: 'CELL_CHANGED',\r\n category: 'cell',\r\n undoable: true,\r\n description: 'Cell value changed; payload includes previousValue and newValue.',\r\n },\r\n {\r\n type: 'CELL_DISPLAY_CHANGED',\r\n category: 'cell',\r\n undoable: false,\r\n description: 'Display-only cell text changed.',\r\n },\r\n {\r\n type: 'DYNAMIC_PROJECTION_DONE',\r\n category: 'dynamic',\r\n undoable: false,\r\n description: 'Async/dynamic projection finished for a cell.',\r\n },\r\n {\r\n type: 'ROW_ADDED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'A new row was added to the active collection.',\r\n },\r\n {\r\n type: 'NEW_ROW_ADDED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'Alias/variant for newly inserted row with initial values.',\r\n },\r\n {\r\n type: 'ROW_DELETED',\r\n category: 'row',\r\n undoable: true,\r\n description:\r\n 'Soft delete for persisted rows; stacked for undo (toggle). Hard remove of Added rows uses NEW_ROW_REMOVED.',\r\n },\r\n {\r\n type: 'NEW_ROW_REMOVED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'Hard-removed Added row; undo restores identity via RESTORE_ADDED_ROW.',\r\n },\r\n {\r\n type: 'ROW_RESTORED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Soft-deleted or modified row restored.',\r\n },\r\n {\r\n type: 'ROW_REORDERED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Row index/order changed.',\r\n },\r\n {\r\n type: 'ROW_DESCRIPTION_SAVED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Row description flag saved.',\r\n },\r\n {\r\n type: 'COLUMN_REORDERED',\r\n category: 'column',\r\n undoable: false,\r\n description: 'Column order changed.',\r\n },\r\n {\r\n type: 'UNIT_COLUMN_ADDED',\r\n category: 'column',\r\n undoable: false,\r\n description: 'Unit-level column added dynamically.',\r\n },\r\n {\r\n type: 'PAGE_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Pagination page changed (view stream).',\r\n },\r\n {\r\n type: 'PAGE_SIZE_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Page size changed (view stream).',\r\n },\r\n {\r\n type: 'VIEWPORT_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Virtual scroll viewport moved; payload includes scrollOffset and visible range.',\r\n },\r\n {\r\n type: 'ACTIVE_COLLECTION_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Active collection switched.',\r\n },\r\n {\r\n type: 'TABLE_DELETED',\r\n category: 'table',\r\n undoable: false,\r\n description: 'Table removed from store.',\r\n },\r\n {\r\n type: 'TABLE_RESET',\r\n category: 'table',\r\n undoable: false,\r\n description: 'Table state reset.',\r\n },\r\n {\r\n type: 'DYNAMIC_DATA_REQUESTED',\r\n category: 'dynamic',\r\n undoable: false,\r\n description: 'Remote/dynamic data requested for a column.',\r\n },\r\n {\r\n type: 'VALIDATION_FAILED',\r\n category: 'error',\r\n undoable: false,\r\n description: 'Domain validation failed; state unchanged.',\r\n },\r\n {\r\n type: 'EXPORT_REQUESTED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Host/plugin requested export (pdf/xlsx); typically view stream.',\r\n },\r\n {\r\n type: 'XLSX_EXPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin finished building an .xlsx blob.',\r\n },\r\n {\r\n type: 'XLSX_EXPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin failed to export.',\r\n },\r\n {\r\n type: 'PDF_EXPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'PDF plugin finished rendering a document.',\r\n },\r\n {\r\n type: 'PDF_EXPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'PDF plugin failed to export.',\r\n },\r\n {\r\n type: 'IMPORT_REQUESTED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Host/plugin requested import (xlsx); typically view stream.',\r\n },\r\n {\r\n type: 'XLSX_IMPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin finished importing rows into the table.',\r\n },\r\n {\r\n type: 'XLSX_IMPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin failed to import.',\r\n },\r\n] as const;\r\n\r\nexport function getEventCatalogEntry(type: string): EventCatalogEntry | undefined {\r\n return EVENT_CATALOG.find((e) => e.type === type);\r\n}\r\n\r\nexport function listUndoableEventTypes(): string[] {\r\n return EVENT_CATALOG.filter((e) => e.undoable).map((e) => e.type);\r\n}\r\n","export type BenchmarkSample = {\r\n readonly name: string;\r\n readonly iterations: number;\r\n readonly totalMs: number;\r\n readonly avgMs: number;\r\n readonly maxMs: number;\r\n};\r\n\r\nexport type PerformanceBudget = {\r\n readonly name: string;\r\n /** Maximum allowed average milliseconds per iteration. */\r\n readonly maxAvgMs: number;\r\n /** Maximum allowed single-iteration milliseconds. */\r\n readonly maxMaxMs?: number;\r\n};\r\n\r\nexport type BenchmarkResult = {\r\n readonly sample: BenchmarkSample;\r\n readonly budget: PerformanceBudget;\r\n readonly ok: boolean;\r\n readonly reasons: string[];\r\n};\r\n\r\n/**\r\n * Tiny synchronous/async micro-benchmark helper for core hot paths.\r\n * Not a substitute for browser profiling — guards CI regressions.\r\n */\r\nexport async function runBenchmark(\r\n name: string,\r\n iterations: number,\r\n fn: () => void | Promise<void>,\r\n): Promise<BenchmarkSample> {\r\n // Warmup\r\n await fn();\r\n\r\n let totalMs = 0;\r\n let maxMs = 0;\r\n for (let i = 0; i < iterations; i += 1) {\r\n const start = performance.now();\r\n await fn();\r\n const elapsed = performance.now() - start;\r\n totalMs += elapsed;\r\n if (elapsed > maxMs) maxMs = elapsed;\r\n }\r\n\r\n return {\r\n name,\r\n iterations,\r\n totalMs,\r\n avgMs: totalMs / iterations,\r\n maxMs,\r\n };\r\n}\r\n\r\nexport function checkBudget(\r\n sample: BenchmarkSample,\r\n budget: PerformanceBudget,\r\n): BenchmarkResult {\r\n const reasons: string[] = [];\r\n if (sample.avgMs > budget.maxAvgMs) {\r\n reasons.push(\r\n `avg ${sample.avgMs.toFixed(3)}ms exceeds budget ${budget.maxAvgMs}ms`,\r\n );\r\n }\r\n if (budget.maxMaxMs != null && sample.maxMs > budget.maxMaxMs) {\r\n reasons.push(\r\n `max ${sample.maxMs.toFixed(3)}ms exceeds budget ${budget.maxMaxMs}ms`,\r\n );\r\n }\r\n return {\r\n sample,\r\n budget,\r\n ok: reasons.length === 0,\r\n reasons,\r\n };\r\n}\r\n\r\n/** Default budgets for Phase 4 CI guards (generous for CI variance). */\r\nexport const DEFAULT_PERFORMANCE_BUDGETS = {\r\n inMemoryAppend100: {\r\n name: 'inMemoryAppend100',\r\n maxAvgMs: 25,\r\n maxMaxMs: 80,\r\n },\r\n indexedDbAppend100: {\r\n name: 'indexedDbAppend100',\r\n maxAvgMs: 80,\r\n maxMaxMs: 200,\r\n },\r\n selectorNotifyNoop: {\r\n name: 'selectorNotifyNoop',\r\n maxAvgMs: 5,\r\n maxMaxMs: 20,\r\n },\r\n} as const satisfies Record<string, PerformanceBudget>;\r\n","/**\r\n * Sparse ordered index for large tables: O(1) id lookup + O(window) projection.\r\n * Keeps full row payloads in a Map; visible window never walks all rows.\r\n */\r\nexport class SparseRowIndex<T> {\r\n private readonly byId = new Map<number, T>();\r\n private orderedIds: number[] = [];\r\n\r\n constructor(entries: Iterable<readonly [number, T]> = []) {\r\n for (const [id, value] of entries) {\r\n this.byId.set(id, value);\r\n this.orderedIds.push(id);\r\n }\r\n }\r\n\r\n get size(): number {\r\n return this.orderedIds.length;\r\n }\r\n\r\n getOrderedIds(): readonly number[] {\r\n return this.orderedIds;\r\n }\r\n\r\n getById(id: number): T | undefined {\r\n return this.byId.get(id);\r\n }\r\n\r\n set(id: number, value: T): void {\r\n const existed = this.byId.has(id);\r\n this.byId.set(id, value);\r\n if (!existed) this.orderedIds.push(id);\r\n }\r\n\r\n /** Replace order without rebuilding payloads (e.g. after sort). */\r\n setOrder(orderedIds: readonly number[]): void {\r\n this.orderedIds = orderedIds.slice();\r\n }\r\n\r\n clear(): void {\r\n this.byId.clear();\r\n this.orderedIds = [];\r\n }\r\n\r\n /** Project only the visible window — O(window), not O(n). */\r\n projectVisible(range: {\r\n startIndex: number;\r\n endIndex: number;\r\n }): T[] {\r\n const out: T[] = [];\r\n const end = Math.min(range.endIndex, this.orderedIds.length);\r\n for (let i = range.startIndex; i < end; i += 1) {\r\n const row = this.byId.get(this.orderedIds[i]);\r\n if (row !== undefined) out.push(row);\r\n }\r\n return out;\r\n }\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useCallback, useRef } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { useVirtualWindow } from './useVirtualWindow';\r\n\r\nexport type VirtualListProps<T> = {\r\n session: GridSession;\r\n items: readonly T[];\r\n /** Scrollport height in pixels. */\r\n height: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n getItemKey?: (item: T, absoluteIndex: number) => string | number;\r\n renderItem: (item: T, absoluteIndex: number) => React.ReactNode;\r\n};\r\n\r\n/**\r\n * Thin React adapter for Core ViewportCalculator.\r\n * Renders spacers + absolute-positioned visible rows only.\r\n */\r\nexport function VirtualList<T>({\r\n session,\r\n items,\r\n height,\r\n rowHeight = 40,\r\n overscan = 2,\r\n className,\r\n style,\r\n getItemKey,\r\n renderItem,\r\n}: VirtualListProps<T>) {\r\n const scrollerRef = useRef<HTMLDivElement>(null);\r\n const {\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop,\r\n spacerBottom,\r\n totalHeight,\r\n onScroll,\r\n } = useVirtualWindow(session, items, {\r\n rowHeight,\r\n overscan,\r\n initialViewportSize: height,\r\n });\r\n\r\n // Keep session viewportSize aligned with the scrollport height.\r\n React.useEffect(() => {\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: session.getViewport().scrollOffset,\r\n viewportSize: height,\r\n rowHeight,\r\n overscan,\r\n });\r\n }, [session, height, rowHeight, overscan]);\r\n\r\n const handleScroll = useCallback(\r\n (event: React.UIEvent<HTMLDivElement>) => {\r\n const el = event.currentTarget;\r\n onScroll(el.scrollTop, el.clientHeight);\r\n },\r\n [onScroll],\r\n );\r\n\r\n return (\r\n <div\r\n ref={scrollerRef}\r\n data-erp-virtual-list\r\n className={className}\r\n style={{\r\n height,\r\n overflow: 'auto',\r\n position: 'relative',\r\n ...style,\r\n }}\r\n onScroll={handleScroll}\r\n >\r\n <div style={{ height: totalHeight, position: 'relative' }}>\r\n <div style={{ height: spacerTop }} aria-hidden />\r\n {visibleItems.map((item, i) => {\r\n const absoluteIndex = absoluteIndices[i] ?? i;\r\n const key = getItemKey\r\n ? getItemKey(item, absoluteIndex)\r\n : absoluteIndex;\r\n return (\r\n <div\r\n key={key}\r\n data-erp-virtual-row={absoluteIndex}\r\n style={{\r\n height: rowHeight,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {renderItem(item, absoluteIndex)}\r\n </div>\r\n );\r\n })}\r\n <div style={{ height: spacerBottom }} aria-hidden />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type {\r\n ExportRequestedPayload,\r\n GridEvent,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\n\r\nexport type ExcelExportPluginOptions = {\r\n /** Skip browser download (useful in tests / Node). */\r\n download?: boolean;\r\n onBlob?: (blob: Blob, meta: { fileName: string; rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to EXPORT_REQUESTED (format=xlsx); never mutates Domain.\r\n */\r\nexport class ExcelExportPlugin implements GridPlugin {\r\n readonly name = 'excel-export';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelExportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'EXPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ExportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_EXPORT_SOURCE');\r\n }\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const fileName =\r\n payload.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n const blob = buildXlsxBlob(table, {\r\n sheetName: payload.sheetName,\r\n direction: payload.direction ?? 'rtl',\r\n });\r\n\r\n const columnCount = table.columns.length + 1;\r\n const rowCount = table.rows.length;\r\n\r\n if (this.options.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n this.options.onBlob?.(blob, { fileName, rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-ok`,\r\n type: 'XLSX_EXPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-fail`,\r\n type: 'XLSX_EXPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: message === 'NO_COLUMNS' || message === 'NO_EXPORT_SOURCE'\r\n ? message\r\n : 'EXPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","import type {\r\n GridEvent,\r\n ImportRequestedPayload,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { applyImportedRows } from './applyImportedRows';\r\nimport { mapImportedSheet } from './mapImportedSheet';\r\nimport { parseXlsxBlob } from './parseXlsxBlob';\r\n\r\nexport type ExcelImportPluginOptions = {\r\n onImported?: (meta: { rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to IMPORT_REQUESTED (format=xlsx); mutates domain only via\r\n * session/engine commands (never touches Entity directly).\r\n */\r\nexport class ExcelImportPlugin implements GridPlugin {\r\n readonly name = 'excel-import';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelImportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'IMPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ImportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const correlationId = event.correlationId;\r\n if (!correlationId) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n const bytes = ctx.resolveImportData?.(correlationId);\r\n if (!bytes || bytes.byteLength === 0) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_IMPORT_TARGET');\r\n }\r\n\r\n const sheet = await parseXlsxBlob(bytes, {\r\n sheetName: payload.sheetName,\r\n });\r\n if (sheet.headers.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const mapped = mapImportedSheet(sheet, source.columns);\r\n if (mapped.columns.length === 0) {\r\n throw new Error('NO_COLUMN_MATCH');\r\n }\r\n\r\n const { rowCount } = await applyImportedRows(ctx.session, mapped.rows);\r\n const columnCount = mapped.columns.length;\r\n\r\n this.options.onImported?.({ rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-ok`,\r\n type: 'XLSX_IMPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n const known = new Set([\r\n 'NO_IMPORT_DATA',\r\n 'NO_IMPORT_TARGET',\r\n 'NO_COLUMNS',\r\n 'NO_COLUMN_MATCH',\r\n 'INVALID_XLSX',\r\n 'NO_SHEET',\r\n 'SHEET_NOT_FOUND',\r\n ]);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-fail`,\r\n type: 'XLSX_IMPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: known.has(message) ? message : 'IMPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","import type { ExportSource } from '../../../../application/plugins/GridPlugin';\r\nimport type { PdfRenderer } from '../../../../application/ports/PdfRenderer';\r\nimport { formatExportValue } from '../../excel/src/formatExportValue';\r\n\r\n/**\r\n * Minimal text PDF (no external lib) — Host can swap for jsPDF via PdfRenderer.\r\n */\r\nexport class TextPdfRenderer implements PdfRenderer {\r\n async render(\r\n source: ExportSource,\r\n options?: { title?: string },\r\n ): Promise<Blob> {\r\n const lines: string[] = [options?.title ?? 'Export'];\r\n const columns = source.columns.slice(0, 8);\r\n lines.push(columns.map((c) => c.fieldCaption ?? c.fieldName).join(' | '));\r\n\r\n for (const row of source.rows.slice(0, 40)) {\r\n lines.push(\r\n columns\r\n .map((col) => {\r\n const cell = row.cells[col.fieldName];\r\n const raw = cell?.display ?? cell?.value ?? '';\r\n return formatExportValue(raw, col.fieldType).slice(0, 24);\r\n })\r\n .join(' | '),\r\n );\r\n }\r\n\r\n const content = lines\r\n .map((line, i) => {\r\n const safe = line.replace(/[()\\\\]/g, ' ');\r\n const y = 750 - i * 14;\r\n return `BT /F1 10 Tf 40 ${y} Td (${safe}) Tj ET`;\r\n })\r\n .join('\\n');\r\n\r\n const stream = content;\r\n const objects = [\r\n '1 0 obj<< /Type /Catalog /Pages 2 0 R >>endobj\\n',\r\n '2 0 obj<< /Type /Pages /Kids [3 0 R] /Count 1 >>endobj\\n',\r\n '3 0 obj<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources<< /Font<< /F1 5 0 R >> >> >>endobj\\n',\r\n `4 0 obj<< /Length ${stream.length} >>stream\\n${stream}\\nendstream\\nendobj\\n`,\r\n '5 0 obj<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>endobj\\n',\r\n ];\r\n\r\n let body = '%PDF-1.1\\n';\r\n const offsets: number[] = [0];\r\n for (const obj of objects) {\r\n offsets.push(body.length);\r\n body += obj;\r\n }\r\n const xrefStart = body.length;\r\n body += `xref\\n0 ${objects.length + 1}\\n`;\r\n body += '0000000000 65535 f \\n';\r\n for (let i = 1; i <= objects.length; i += 1) {\r\n body += `${String(offsets[i]).padStart(10, '0')} 00000 n \\n`;\r\n }\r\n body += `trailer<< /Size ${objects.length + 1} /Root 1 0 R >>\\n`;\r\n body += `startxref\\n${xrefStart}\\n%%EOF\\n`;\r\n\r\n return new Blob([body], { type: 'application/pdf' });\r\n }\r\n}\r\n","import type {\r\n ExportRequestedPayload,\r\n GridEvent,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport type { PdfRenderer } from '../../../../application/ports/PdfRenderer';\r\nimport { TextPdfRenderer } from './TextPdfRenderer';\r\nimport { downloadBlob } from '../../excel/src/buildXlsxBlob';\r\n\r\nexport type PdfExportPluginOptions = {\r\n renderer?: PdfRenderer;\r\n download?: boolean;\r\n onBlob?: (blob: Blob, meta: { fileName: string; rowCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to EXPORT_REQUESTED (format=pdf); Domain stays untouched.\r\n */\r\nexport class PdfExportPlugin implements GridPlugin {\r\n readonly name = 'pdf-export';\r\n private unsub: (() => void) | null = null;\r\n private readonly renderer: PdfRenderer;\r\n\r\n constructor(private readonly options: PdfExportPluginOptions = {}) {\r\n this.renderer = options.renderer ?? new TextPdfRenderer();\r\n }\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'EXPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ExportRequestedPayload;\r\n if (payload.format !== 'pdf') return;\r\n\r\n try {\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_EXPORT_SOURCE');\r\n }\r\n\r\n const blob = await this.renderer.render(source, {\r\n title: payload.fileName ?? 'Export',\r\n direction: payload.direction,\r\n });\r\n\r\n const fileName =\r\n payload.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.pdf`;\r\n const rowCount = source.rows.length;\r\n\r\n if (this.options.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n this.options.onBlob?.(blob, { fileName, rowCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-pdf-ok`,\r\n type: 'PDF_EXPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'pdf' as const,\r\n rowCount,\r\n blobId: fileName,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-pdf-fail`,\r\n type: 'PDF_EXPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'pdf' as const,\r\n code: message === 'NO_EXPORT_SOURCE' ? message : 'EXPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../ui/hooks/useEngineSelector.ts","../ui/gridSearch/scrollToMatch.ts","../ui/hooks/useScrollToSearchMatch.ts","../ui/a11y/liveAnnouncements.ts","../ui/a11y/GridLiveRegion.tsx","../ui/primitives/chrome.tsx","../ui/primitives/Dropdown.tsx","../ui/primitives/Select.tsx","../ui/primitives/icons.tsx","../ui/primitives/Pagination.tsx","../ui/primitives/DatePicker.tsx","../ui/desktop/FillHandle.tsx","../ui/helper.ts","../ui/gridSearch/highlightText.tsx","../ui/cellRenderer/cellRenderContext.ts","../ui/cellRenderer/TextAreaCell.tsx","../ui/cellRenderer/cellRegistry.ts","../ui/cellRenderer/descriptionComponent/index.tsx","../ui/cellRenderer/ERPTableDynamicSelect.tsx","../ui/cellRenderer/index.tsx","../ui/desktop/indexCol.tsx","../ui/desktop/eRPTableRow.tsx","../ui/desktop/ERPTableBody.tsx","../ui/desktop/ERPTableFooter.tsx","../engine/columnReorder.ts","../engine/dataOps/columnMenu.ts","../ui/hooks/useRevalidateRevision.ts","../ui/gridSearch/utils.ts","../ui/filters/filterRegistry.ts","../ui/desktop/ColumnFilterPopover.tsx","../ui/desktop/ColumnGroupHeaderRows.tsx","../ui/desktop/ColumnMenuPopover.tsx","../ui/desktop/ColumnsPanelPopover.tsx","../ui/desktop/ColumnResizeHandle.tsx","../ui/desktop/ERPTableHeader.tsx","../engine/dataOps/pinnedRows.ts","../ui/desktop/ERPTablePinnedRows.tsx","../engine/equality.ts","../ui/virtual/virtualWindow.ts","../ui/virtual/useVirtualWindow.ts","../ui/desktop/ERPTableVirtualBody.tsx","../ui/a11y/ToolbarIconButton.tsx","../ui/export/PdfExportToolbarButton.tsx","../ui/export/ExcelImportToolbarButton.tsx","../ui/gridSearch/GridSearchPanel.tsx","../ui/gridSearch/GridSearchControl.tsx","../ui/multiSelectList/body.tsx","../ui/multiSelectList/header.tsx","../ui/multiSelectList/index.tsx","../ui/theme/ThemeToggleButton.tsx","../ui/desktop/groupActionButtons.tsx","../ui/desktop/pagination.tsx","../ui/desktop/resolveDesktopVirtualization.ts","../ui/desktop/useERPTableLayout.ts","../ui/overlays/resolveGridOverlay.ts","../ui/overlays/GridOverlays.tsx","../ui/desktop/DesktopTable.tsx","../ui/mobile/MobileActionButtons.tsx","../ui/mobile/MobileLoadMoreButton.tsx","../ui/mobile/buildDynamicSource.ts","../ui/mobile/MobileRowFormModal.tsx","../ui/mobile/MobileIndexCol.tsx","../ui/mobile/MobileTableRow.tsx","../ui/mobile/MobileTableBody.tsx","../ui/mobile/MobileTableHeader.tsx","../ui/mobile/scrollToTableEnd.ts","../ui/mobile/useScrollAfterMobileAdd.ts","../ui/mobile/MobileTable.tsx","../ui/keyboard/skipGridNavigation.ts","../ui/useERPTable.ts","../ui/host/assignRef.ts","../ui/index.tsx","../ui/styles/injectStyles.ts","../ui/history/GridHistoryPanel.tsx","../ui/offline/GridOfflineStatus.tsx","../infrastructure/perf/benchmark.ts","../ui/virtual/VirtualList.tsx"],"names":["useState","useRef","useEffect","useLayoutEffect","useTranslations","jsx","useThemePortalStyle","Fragment","jsxs","createPortal","trapTabKey","useId","lazy","Suspense","useDateAdapter","useERPTableTheme","DatePicker","resolveCellAddressFromPoint","formatLocaleNumber","date","translate","forwardRef","useLocale","useHostDependOn","getStaticDependValue","getDependFieldName","hasDependValue","buildDependencyBody","useRemoteQuery","useMemo","useLazyRemote","React","useERPTableHost","useNumberingSystem","display","useColumnWindowOrAll","resolveFillCorner","resolveCellRangePresentation","cellRangeEdgeAttr","cellRangeClassName","ariaDataRowIndex","ColumnWindowCells","columnPinCellProps","rangeProps","ariaColIndex","columnSizeStyle","createElement","gridCellA11y","ariaFooterRowIndex","isIndexColumn","resolveFilterUi","isHeaderColumnSortable","collectUniqueFilterValues","buildColumnGroupHeaderModel","canSetColumnVisible","clampColumnWidth","useDirection","maxColumnGroupDepth","isColumnFilterActive","ariaSortForColumn","sortPriorityForColumn","HEADER_SORT_CLICK_MAX_MOVE_PX","columnPinClassName","move","resolveGroupBlockReorder","shouldCommitHeaderSortClick","cycleSortModel","ARIA_HEADER_ROW_INDEX","ariaPinnedTopRowIndex","ariaPinnedBottomRowIndex","ViewportCalculator","SparseRowIndex","Viewport","ERPTableGroupRow","useHostToast","useMediaQuery","rows","isStockDarkTheme","exportActiveCollectionToExcel","pageSize","DEFAULT_ROW_HEIGHT","useCallback","gridCellDomId","ariaGridRowCount","ColumnWindowProvider","indexPinClassName","indexPinDataAttr","overlayStoredColumnWidth","createGridTableKey","createGrid","flattenColDefOrGroup","isPersistentStore","DEFAULT_MEMORY_STORE","themeDefault","resolveActiveTheme","useGridHostEvents","resolveDirection","ERPTableHostProvider","themeToStyle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,SAAS,qBAAA,CACd,UAAA,EACA,MAAA,EACA,OAAA,GAA6C,OAAO,EAAA,EACjD;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIA,eAAA,CAAS,MAAM,QAAQ,CAAA;AACjD,EAAA,MAAM,SAAA,GAAYC,cAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAaA,cAAO,OAAO,CAAA;AACjC,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,MAAM;AAC7C,MAAA,MAAM,IAAA,GAAO,UAAU,OAAA,EAAQ;AAC/B,MAAA,QAAA;AAAA,QAAS,CAAC,QAAA,KACR,UAAA,CAAW,QAAQ,QAAA,EAAU,IAAI,IAAI,QAAA,GAAW;AAAA,OAClD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM,WAAA,IAAc;AAAA,EAC7B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CACd,UAAA,EACA,QAAA,EACA,OAAA,GAA6C,OAAO,EAAA,EACjD;AACH,EAAA,OAAO,qBAAA;AAAA,IACL,UAAA;AAAA,IACA,MAAM,QAAA,CAAS,UAAA,CAAW,YAAA,EAAc,CAAA;AAAA,IACxC;AAAA,GACF;AACF;AAEO,SAAS,SAAA,CAAa,UAAa,IAAA,EAAkB;AAC1D,EAAA,OAAO,KAAK,SAAA,CAAU,QAAQ,CAAA,KAAM,IAAA,CAAK,UAAU,IAAI,CAAA;AACzD;AAEO,SAAS,mBAAmB,UAAA,EAA+B;AAChE,EAAA,OAAO,iBAAA;AAAA,IACL,UAAA;AAAA,IACA,CAAC,IAAA,KAAS,IAAA,EAAM,UAAA,IAAc,IAAA;AAAA,IAC9B;AAAA,GACF;AACF;AAEO,SAAS,qBAAqB,UAAA,EAA+B;AAClE,EAAA,OAAO,iBAAA;AAAA,IACL,UAAA;AAAA,IACA,CAAC,IAAA,KAAS,IAAA,EAAM,YAAA,IAAgB,IAAA;AAAA,IAChC;AAAA,GACF;AACF;;;ACzDA,IAAM,mBAAA,GAAsB,EAAA;AAErB,SAAS,oBAAA,CACd,QACA,KAAA,EACQ;AACR,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,YAAY,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,MAAM,QAAQ,CAAA,CAAA;AACnG;AAEA,SAAS,oBAAA,CACP,WACA,KAAA,EACoD;AACpD,EAAA,MAAM,QAAQ,SAAA,CAAU,aAAA;AAAA,IACtB,CAAA,eAAA,EAAkB,MAAM,KAAK,CAAA,EAAA;AAAA,GAC/B;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,SAAS,KAAA,CAAM,aAAA;AAAA,IACnB,CAAA,kBAAA,EAAqB,MAAM,QAAQ,CAAA,EAAA;AAAA,GACrC;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,qBAAA,CACP,UACA,aAAA,EACS;AACT,EAAA,OACE,QAAA,CAAS,QAAQ,aAAA,CAAc,IAAA,GAAO,uBACtC,QAAA,CAAS,KAAA,IAAS,cAAc,KAAA,GAAQ,mBAAA;AAE5C;AAEA,SAAS,mBAAA,CACP,SACA,aAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,OAAO,aAAA,CAAc,GAAA,GAAM,uBACnC,OAAA,CAAQ,MAAA,IAAU,cAAc,MAAA,GAAS,mBAAA;AAE7C;AAEO,SAAS,qBAAA,CACd,SAAA,EACA,IAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,KAAK,GAAA,CAAI,SAAA,CAAU,UAAA,GAAa,IAAI,IAAI,CAAA,EAAG;AAC7C,IAAA,SAAA,CAAU,UAAA,GAAa,IAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAK,GAAA,CAAI,SAAA,CAAU,SAAA,GAAY,GAAG,IAAI,CAAA,EAAG;AAC3C,IAAA,SAAA,CAAU,SAAA,GAAY,GAAA;AAAA,EACxB;AACF;AAEO,SAAS,kBAAA,CACd,WACA,KAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,SAAA,EAAW,KAAK,CAAA;AACtD,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,QAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,OAAO,qBAAA,EAAsB;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,EAAsB;AAC5C,EAAA,MAAM,aAAA,GAAgB,UAAU,qBAAA,EAAsB;AAEtD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,IAAI,CAAC,qBAAA,CAAsB,QAAA,EAAU,aAAa,CAAA,EAAG;AACnD,IAAA,MAAA,GAAA,CACG,QAAA,CAAS,OAAO,QAAA,CAAS,KAAA,IAAS,KAClC,aAAA,CAAc,IAAA,GAAO,cAAc,KAAA,IAAS,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAA,EAAS,aAAa,CAAA,EAAG;AAChD,IAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,GAAM,aAAA,CAAc,GAAA,GAAM,mBAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,IAAI,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,EAAG;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAA,CAAU,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAClE,EAAA,OAAO,IAAA;AACT;;;AClFA,IAAM,iBAAA,GAAoB,GAAA;AAMnB,SAAS,sBAAA,CACd,WACA,UAAA,EACA;AACA,EAAA,MAAM,UAAA,GAAa,mBAAmB,UAAU,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,IAClB,UAAA;AAAA,IACA,MAAM,WAAW,YAAA,EAAa;AAAA,IAC9B,MAAA,CAAO;AAAA,GACT;AACA,EAAA,MAAM,WAAA,GAAc,iBAAA;AAAA,IAClB,UAAA;AAAA,IACA,CAAC,IAAA,KAAS,IAAA,EAAM,UAAA,CAAW,IAAA,IAAQ,CAAA;AAAA,IACnC,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,cAAA,GAAiBD,cAIb,IAAI,CAAA;AACd,EAAA,MAAM,eAAA,GAAkBA,cAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAmC;AACzD,IAAA,IAAI,CAAC,UAAU,MAAA,CAAO,YAAA,GAAe,KAAK,CAAC,MAAA,CAAO,QAAQ,MAAA,EAAQ;AAChE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAgB;AACrC,IAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,cAAA,CAAe,OAAA,GAAU;AAAA,MACvB,GAAA;AAAA,MACA,MAAM,SAAA,CAAU,UAAA;AAAA,MAChB,KAAK,SAAA,CAAU;AAAA,KACjB;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,iBAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAC5B,IAAA,MAAM,QAAQ,cAAA,CAAe,OAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,EAAO;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA,CAAgB,OAAA,EAAS;AAE1C,IAAA,qBAAA,CAAsB,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,MAAA,KAA4C;AACvE,IAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,EAAO,OAAO,KAAA;AAEjC,IAAA,IAAI,WAAA,KAAgB,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA;AAExC,IAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,MAAA,EAAS,KAAK,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,SAAA,EAAW,KAAK,CAAA;AACnD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,aAAA,CAAc,GAAG,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAAE,sBAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,eAAA,CAAgB,OAAA,GAAU,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,eAAe,UAAU,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,oBAAA,CAAqB,UAAA,EAAY,KAAK,CAAA,GAAI,IAAA;AAE9D,IAAA,IAAI,GAAA,IAAO,cAAA,CAAe,OAAA,EAAS,GAAA,KAAQ,GAAA,EAAK;AAC9C,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AAEA,IAAA,mBAAA,CAAoB,UAAU,CAAA;AAC9B,IAAA,eAAA,EAAgB;AAAA,EAClB,GAAG,CAAC,UAAA,EAAY,aAAa,WAAA,EAAa,UAAA,EAAY,SAAS,CAAC,CAAA;AAEhE,EAAAD,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,MAAA,GAAS,sBAAsB,MAAM;AACnC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,MAAA,eAAA,EAAgB;AAEhB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,GAAS,sBAAsB,MAAM;AACnC,UAAA,mBAAA,CAAoB,UAAU,CAAA;AAC9B,UAAA,eAAA,EAAgB;AAAA,QAClB,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,IAC7B,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,aAAa,WAAA,EAAa,UAAA,EAAY,SAAS,CAAC,CAAA;AAEhE,EAAAA,iBAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,MAAM;AAC7C,MAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC7B,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA,CAAgB,OAAA,EAAS;AAE1C,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,eAAA,EAAgB;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAM,WAAA,IAAc;AAAA,EAC7B,CAAA,EAAG,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAC5B;;;AC7HO,SAAS,kBACd,QAAA,EACQ;AACR,EAAA,IAAI,CAAC,UAAU,OAAO,CAAA;AACtB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA;AAC/B;AAEO,SAAS,mBAAmB,WAAA,EAAqD;AACtF,EAAA,IAAI,CAAC,aAAa,OAAO,CAAA;AACzB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA;AAClC;AAEO,SAAS,kBAAA,CACd,SAAA,EACA,OAAA,EACA,CAAA,EACQ;AACR,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,kBAAkB,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,QAAQ,KAAK,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,GAAA,EAAK,YAAA,IAAgB,OAAA,CAAQ,KAAA;AAC5C,EAAA,OAAO,CAAA;AAAA,IACL,OAAA,CAAQ,IAAA,KAAS,KAAA,GAAQ,gBAAA,GAAmB,iBAAA;AAAA,IAC5C,EAAE,MAAA;AAAO,GACX;AACF;AAEO,SAAS,oBAAA,CACd,OAAA,EACA,KAAA,EACA,iBAAA,EACA,mBACA,CAAA,EACQ;AACR,EAAA,IAAI,iBAAA,KAAsB,CAAA,IAAK,CAAC,iBAAA,EAAmB;AACjD,IAAA,OAAO,EAAE,oBAAoB,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,CAAA,CAAE,mBAAA,EAAqB,EAAE,OAAA,EAAS,OAAO,CAAA;AAClD;AAEO,SAAS,uBAAA,CACd,OACA,CAAA,EACQ;AACR,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,CAAA,CAAE,uBAAuB,CAAA;AAChD,EAAA,OAAO,CAAA,CAAE,mBAAA,EAAqB,EAAE,KAAA,EAAO,CAAA;AACzC;AAEO,SAAS,uBAAA,CACd,SACA,CAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,CAAA,CAAE,wBAAwB,CAAA;AAC/C,EAAA,OAAO,CAAA,CAAE,sBAAA,EAAwB,EAAE,OAAA,EAAS,SAAS,CAAA;AACvD;AAEO,SAAS,gBAAgB,SAAA,EAA8B;AAC5D,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9D;AAEO,SAAS,iBAAA,CACd,aACA,eAAA,EACQ;AACR,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,IAAI,eAAe,CAAA,CAAA;AAC1D;ACtDO,SAAS,cAAA,CAAe,EAAE,UAAA,EAAW,EAAU;AACpD,EAAA,MAAM,IAAIE,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIJ,gBAAS,EAAE,CAAA;AACzC,EAAA,MAAM,MAAA,GAASC,cAAO,KAAK,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAWA,cAAO,EAAE,CAAA;AAC1B,EAAA,MAAM,UAAA,GAAaA,cAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,YAAA,GAAeA,cAAO,EAAE,CAAA;AAC9B,EAAA,MAAM,cAAA,GAAiBA,cAAO,EAAE,CAAA;AAEhC,EAAA,MAAM,QAAA,GAAW,iBAAA;AAAA,IACf,UAAA;AAAA,IACA,CAAC,IAAA,MAAU;AAAA,MACT,SAAA,EAAW,IAAA,EAAM,SAAA,IAAa,EAAC;AAAA,MAC/B,WAAA,EAAa,IAAA,EAAM,WAAA,IAAe,EAAC;AAAA,MACnC,eAAA,EAAiB,MAAM,eAAA,IAAmB,EAAA;AAAA,MAC1C,YAAA,EAAc,IAAA,EAAM,YAAA,IAAgB,EAAC;AAAA,MACrC,UAAU,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACzC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,cAAc,CAAA,CAAE;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,WAAA,EAAa,IAAA,EAAM,UAAA,CAAW,SAAA,IAAa;AAAA,KAC7C,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAAC,iBAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,iBAAA;AAAA,MACf,QAAA,CAAS,WAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AACA,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,QAAA,CAAS,YAAY,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,UAAA,EAAW,EAAG,UAAU,QAAA,CAAS,WAAA;AAE9D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,UAAA,CAAW,OAAA,GAAU,QAAA;AACrB,MAAA,YAAA,CAAa,OAAA,GAAU,aAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,KAAW,SAAS,OAAA,EAAS;AAC/B,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,UAAA;AAAA,QACE,kBAAA,CAAmB,QAAA,CAAS,SAAA,EAAW,QAAA,CAAS,SAAS,CAAC;AAAA,OAC5D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,KAAa,WAAW,OAAA,EAAS;AACnC,MAAA,UAAA,CAAW,OAAA,GAAU,QAAA;AACrB,MAAA,UAAA;AAAA,QACE,oBAAA;AAAA,UACE,QAAA,CAAS,WAAA;AAAA,UACT,SAAA;AAAA,UACA,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAAA,UACvC,OAAA,CAAQ,QAAA,CAAS,eAAA,CAAgB,IAAA,EAAM,CAAA;AAAA,UACvC;AAAA;AACF,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,KAAkB,aAAa,OAAA,EAAS;AAC1C,MAAA,YAAA,CAAa,OAAA,GAAU,aAAA;AACvB,MAAA,UAAA,CAAW,uBAAA,CAAwB,aAAA,EAAe,CAAC,CAAC,CAAA;AAAA,IACtD;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,CAAC,CAAC,CAAA;AAE5B,EAAAA,iBAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,WAAW,UAAA,EAAW;AAClC,IAAA,GAAA,CAAI,CAAC,GAAA,KAAQ;AACX,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,cAAA,CAAe,OAAA,GAAU,EAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,MAAA,CAAO,MAAA,EAAO,EAAG;AACrC,UAAA,KAAA,GAAQ,GAAA;AACR,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,OAAO,OAAA,IAAW,EAAA;AAC9B,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,cAAA,CAAe,OAAA,EAAS;AAC5C,MAAA,cAAA,CAAe,OAAA,GAAU,GAAA;AACzB,MAAA,UAAA,CAAW,uBAAA,CAAwB,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,QAAA,EAAU,CAAC,CAAC,CAAA;AAE5B,EAAA,uBACEG,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,sBAAA,EAAqB,EAAA;AAAA,MACrB,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,aAAA,EAAY,MAAA;AAAA,MAEX,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;ACnHO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAS,EAAU;AACxD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIL,gBAA0C,IAAI,CAAA;AACpE,EAAA,MAAM,cAAcM,qCAAA,CAAoB;AAAA,IACtC,QAAA,EAAU,OAAA;AAAA,IACV,MAAM,GAAA,EAAK,CAAA;AAAA,IACX,KAAK,GAAA,EAAK,CAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,CAAC,KAAA,EAAO,uBAAOD,cAAAA,CAAAE,uBAAG,QAAA,EAAS,CAAA;AAE/B,EAAA,uBACEC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,sBAAA;AAAA,MACV,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AACnD,QAAA,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,CAAA,EAAG,CAAA;AAAA,MAC3D,CAAA;AAAA,MACA,YAAA,EAAc,MAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MAE9B,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,GAAA,IAAO,OAAO,QAAA,KAAa,WAAA,GACxBC,qBAAA;AAAA,0BACEJ,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,WAAA;AAAA,cAEN,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACA,QAAA,CAAS;AAAA,SACX,GACA;AAAA;AAAA;AAAA,GACN;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,QAAA,EAAS,EAA2D;AACnG,EAAA,uBAAOA,cAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAe,QAAA,EAAS,CAAA;AAChD;AAYO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,GAAA;AAAA,EACR;AACF,CAAA,EAAe;AACb,EAAA,MAAM,eAAeC,qCAAA,EAAoB;AACzC,EAAA,MAAM,SAAA,GAAYL,cAAuB,IAAI,CAAA;AAE7C,EAAAC,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,oBAAoB,QAAA,CAAS,aAAA;AACnC,IAAA,MAAM,EAAA,GAAK,sBAAsB,MAAM;AACrC,MAAA,MAAM,UAAA,GAAa,UAAU,OAAA,EAAS,gBAAA;AAAA,QACpC;AAAA,OACF;AACA,MAAA,UAAA,GAAa,CAAC,GAAG,KAAA,EAAM;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACxB,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,UAAA,IAAa;AACb,QAAA;AAAA,MACF;AACA,MAAAQ,4BAAA,CAAW,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,iBAAA,EAAmB,KAAA,IAAQ;AAAA,IAC7B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAU,CAAC,CAAA;AAE5B,EAAA,IAAI,CAAC,WAAA,IAAe,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAE5D,EAAA,OAAOD,qBAAA;AAAA,oBACLJ,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,yBAAA;AAAA,QACV,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS,MAAM,UAAA,IAAa;AAAA,QAE5B,QAAA,kBAAAG,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,MAAA;AAAA,YACX,YAAA,EAAY,OAAO,UAAA,KAAe,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,YAC1D,SAAA,EAAU,iBAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,YACf,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAElC,QAAA,EAAA;AAAA,8BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,UAAA;AAAA,gCACDH,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,gCAClBA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAU,wBAAA;AAAA,oBACV,OAAA,EAAS,MAAM,UAAA,IAAa;AAAA,oBAC7B,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF,CAAA;AAAA,8BACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAyB,gBAAA,IAAoB,EAAE,IAAK,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA;AAC9E;AAAA,KACF;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAOG;AACD,EAAA,uBACEA,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAChD,OAAA,EAAS,CAAC,CAAC,OAAA;AAAA,MACX,QAAA;AAAA,MACA,YAAA,EAAY,SAAA;AAAA,MACZ,OAAA;AAAA,MACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,QAAA,GAAW,KAAK,CAAA;AAAA,MAClB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,IAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,QAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,CAAA,0DAAA,EAA6D,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACvF,cAAA,EAAc,IAAA;AAAA,MAEb;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,KAAKM,YAAA,EAAM;AACjB,EAAA,uBACEN,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,SAAA,EAAW,CAAA,uEAAA,EAA0E,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACpG,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB,WAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,IAAA,CAAK;AAAA,EACnB;AACF,CAAA,EAGG;AACD,EAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA4B,QAAA,EAAA,SAAA,EAAU,CAAA;AAC/D;ACzMO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAQ,EAAC;AAAA,EACT,QAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,EACZ,SAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIL,gBAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,eAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAClD,EAAA,MAAM,UAAA,GAAaC,cAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAYK,qCAAA,CAAoB;AAAA,IACpC,QAAA,EAAU,OAAA;AAAA,IACV,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,MAAM,GAAA,CAAI;AAAA,GACX,CAAA;AAED,EAAAJ,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,OAAA,EAAS;AAClC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAsB;AACtD,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,IAAA,IAAI,SAAA,KAAc,aAAA,EAAe,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,GAAA;AACrD,IAAA,IAAI,SAAA,KAAc,YAAA,EAAc,IAAA,GAAO,IAAA,CAAK,IAAA;AAC5C,IAAA,MAAA,CAAO,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACpD,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAY,SAAA,EACpB,QAAA,EAAA;AAAA,oBAAAH,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACnB,CAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IACC,IAAA,IAAQ,OAAO,QAAA,KAAa,WAAA,GACzBI,qBAAAA;AAAA,sBACEJ,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,mBAAA,EAAsB,iBAAA,IAAqB,EAAE,CAAA,CAAA;AAAA,UACxD,KAAA,EAAO,SAAA;AAAA,UAEN,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,YAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,cAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAuB,WAAU,6BAAA,EAAA,EAAxB,CAAA,EAAA,EAAK,KAAK,CAAA,CAA4C,CAAA;AAAA,YACzE;AACA,YAAA,uBACEG,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,0BAAA;AAAA,gBACV,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,SAAS,MAAM;AACb,kBAAA,IAAA,CAAK,OAAA,IAAU;AACf,kBAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,gBACf,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,kBACjB,KAAK,KAAA,mBAAQA,eAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,OAAM,CAAA,GAAU;AAAA;AAAA,eAAA;AAAA,cAVrC,IAAA,CAAK,GAAA,IAAO,MAAA,CAAO,KAAK;AAAA,aAW/B;AAAA,UAEJ,CAAC;AAAA;AAAA,OACH;AAAA,MACA,QAAA,CAAS;AAAA,KACX,GACA;AAAA,GAAA,EACN,CAAA;AAEJ;AChDA,IAAM,UAAA,GAAaO,WAAA,CAAK,MAAM,OAAO,2BAAc,CAAC,CAAA;AAE7C,SAAS,OAAO,KAAA,EAAoB;AACzC,EAAA,uBACEP,cAAAA;AAAA,IAACQ,eAAA;AAAA,IAAA;AAAA,MACC,0BACER,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAe,SAAA,EAAW,IAAI,QAAA,EAAU,EAAA,EAAI,GAAG,KAAA,CAAM,KAAA,EAAM;AAAA,UAC7E,WAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAGF,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO;AAAA;AAAA,GACzB;AAEJ;ACxDA,SAAS,YAAY,MAAA,EAAqB;AACxC,EAAA,OAAO,CAAC,MAAA,EAAQ,MAAA,GAAS,oBAAA,GAAuB,MAAA;AAClD;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,CAAA,EAAE,qHAAA;AAAA,UACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACjE,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,ghCAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,ijEAAA;AAAA,UACF,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,iBAAA,GAAoB,MAAA;AAAA,UAC/C,MAAM,MAAA,EAAQ;AAAA;AAAA;AAChB;AAAA,GACF;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC9D,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,yXAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,yBAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,uBAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,kBAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,4OAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY;AAAA;AAAA;AACd;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC/D,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,wMAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,iXAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,oBAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,sOAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,KAAA;AAAA,YACR,CAAA,EAAE,2kBAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ;AAAA;AAAA;AAClB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC5D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,mnBAAA;AAAA,UACF,MAAA,EAAQ,QAAQ,MAAA,IAAU,SAAA;AAAA,UAC1B,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,8FAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACxD,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,EAAA;AACjC,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,EAAA,EAAG,GAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,SAAA,EAAW,CAAA;AAAA,wBACnFA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,0SAAA;AAAA,YACF,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,KAAA,CAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACtD,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,EAAA;AACjC,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,EAAA,EAAG,GAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,SAAA,EAAW,CAAA;AAAA,wBACnFA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,0DAAA;AAAA,YACF,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,EAAA;AACjC,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,EAAA,EAAG,GAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,SAAA,EAAW,CAAA;AAAA,wBACnFA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,+CAAA;AAAA,YACF,MAAA,EAAO,MAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,MAAM,MAAA,EAAQ,IAAA;AAAA,YACd,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,iBAAA,GAAoB,MAAA;AAAA,YAC/C,CAAA,EAAE,+EAAA;AAAA,YACF,OAAA,EAAQ;AAAA;AAAA,SACV;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,MAAM,MAAA,EAAQ,IAAA;AAAA,YACd,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,iBAAA,GAAoB,MAAA;AAAA,YAC/C,CAAA,EAAE,kKAAA;AAAA,YAEF,QAAA,kBAAAA,cAAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,WAAA;AAAA,gBACd,IAAA,EAAK,QAAA;AAAA,gBACL,GAAA,EAAI,OAAA;AAAA,gBACJ,MAAA,EAAO,mBAAA;AAAA,gBACP,WAAA,EAAY;AAAA;AAAA;AACd;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC1D,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,OAAA;AAAA,YACH,EAAA,EAAG,OAAA;AAAA,YACH,CAAA,EAAE,OAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,0BAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA;AAChB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC5D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,mBAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC7D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,mBAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,oKAAA;AAAA,UACF,MAAA,EAAQ,QAAQ,MAAA,IAAU,SAAA;AAAA,UAC1B,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,aAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,gwCAAA;AAAA,YACF,SAAA,EAAW,CAAC,MAAA,EAAQ,MAAA,GAAS,mBAAA,GAAsB,MAAA;AAAA,YACnD,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,wEAAA;AAAA,YACF,SAAA,EAAW,CAAC,MAAA,EAAQ,MAAA,GAAS,oBAAA,GAAuB,MAAA;AAAA,YACpD,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB,WAAW,WAAA,CAAY,MAAM,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBAC1HA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAa,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACrHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAa,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACrHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAc,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACtHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAc,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACtHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,aAAY,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACpHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAe,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACvHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAe,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACvHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,aAAY,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,CAAA;AAAA,wBACpHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAc,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA,EAAG,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ;AAAA;AAAA;AAAA,GACxH;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,wBAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACrD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,oZAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACrD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,yHAAA;AAAA,YACF,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,kBAAA,GAAqB,MAAA;AAAA,YAChD,MAAM,MAAA,EAAQ;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,yHAAA;AAAA,YACF,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,kBAAA,GAAqB,MAAA;AAAA,YAChD,MAAM,MAAA,EAAQ;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,gHAAA;AAAA,YACF,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,kBAAA,GAAqB,MAAA;AAAA,YAChD,MAAM,MAAA,EAAQ;AAAA;AAAA,SAChB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,yHAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,yHAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,gHAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,66BAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,MAAA;AAAA,YACH,EAAA,EAAG,MAAA;AAAA,YACH,CAAA,EAAE,MAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,MAAM,MAAA,EAAQ,IAAA;AAAA,YACd,WAAW,CAAC,MAAA,EAAQ,UAAU,CAAC,MAAA,EAAQ,OAAO,8BAAA,GAAiC,MAAA;AAAA,YAC/E,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,oIAAA;AAAA,YACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,ibAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,CAAA,EAAE,qDAAA;AAAA,UACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,EAAA,EAAG,IAAA;AAAA,YACH,EAAA,EAAG,IAAA;AAAA,YACH,CAAA,EAAE,GAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,YAC7B,CAAA,EAAE,8HAAA;AAAA,YACF,QAAQ,MAAA,EAAQ,MAAA;AAAA,YAChB,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA;AAChB;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAc;AAC3D,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,ogBAAA;AAAA,UACF,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,UAC7B,QAAQ,MAAA,EAAQ,MAAA;AAAA,UAChB,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;ACvrBO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA,GAAkB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,EAC1C,eAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAU;AACR,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,CAAA,GACrD,eAAA,GACA,CAAC,MAAA,CAAO,QAAQ,CAAA,EAAG,GAAG,eAAe,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,KAAA,IAAS,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,CAAC,CAAA;AACxE,EAAA,MAAM,QAA+B,EAAC;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,KAAK,CAAA,EAAG;AACvC,IAAA,IAAI,UAAA,IAAc,CAAA,IAAK,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,IAAK,CAAA,EAAG;AAChF,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACd,WAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,MAAM,KAAA,EAAO;AAC5C,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,qBAAA,EAAwB,SAAA,IAAa,EAAE,CAAA,CAAA,EACpD,QAAA,EAAA;AAAA,IAAA,SAAA,GAAY,SAAA,CAAU,KAAK,CAAA,GAAI,IAAA;AAAA,oBAChCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,2BAAA;AAAA,UACV,UAAU,OAAA,IAAW,CAAA;AAAA,UACrB,OAAA,EAAS,MAAM,QAAA,GAAW,OAAA,GAAU,CAAC,CAAA;AAAA,UAEpC,QAAA,EAAA,QAAA,KACE,cAAc,KAAA,mBAAQA,eAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,IAAG,EAAG,CAAA,mBAAKA,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAA;AAAA;AAAA,OACjI;AAAA,MACC,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,CAAA,EAAG,CAAA,KACb,CAAA,KAAM,KAAA,mBACJA,cAAAA,CAAC,MAAA,EAAA,EAAoB,QAAA,EAAA,KAAA,EAAA,EAAV,CAAA,EAAA,EAAK,CAAC,CAAA,CAAO,oBAExBA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,CAAA,2BAAA,EAA8B,CAAA,KAAM,OAAA,GAAU,cAAc,EAAE,CAAA,CAAA;AAAA,YACzE,OAAA,EAAS,MAAM,QAAA,GAAW,CAAC,CAAA;AAAA,YAE1B,QAAA,EAAA,CAAA,CAAE,cAAA,CAAe,SAAA,KAAc,KAAA,GAAQ,UAAU,OAAO;AAAA,WAAA;AAAA,UALpD;AAAA;AAMP,OAEJ;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,2BAAA;AAAA,UACV,UAAU,OAAA,IAAW,UAAA;AAAA,UACrB,OAAA,EAAS,MAAM,QAAA,GAAW,OAAA,GAAU,CAAC,CAAA;AAAA,UAEpC,QAAA,EAAA,QAAA,KACE,cAAc,KAAA,mBAAQA,eAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,IAAG,EAAG,CAAA,mBAAKA,cAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAA;AAAA;AAAA;AACjI,KAAA,EACF,CAAA;AAAA,IACC,kCACCA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,QACtB,QAAA,EAAU,CAAC,CAAA,KAAM,gBAAA,GAAmB,GAAG,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAE5D,kBAAQ,GAAA,CAAI,CAAC,wBACZA,cAAAA,CAAC,YAAiB,KAAA,EAAO,GAAA,EACtB,iBAAO,GAAG,CAAA,CAAE,eAAe,SAAA,KAAc,KAAA,GAAQ,UAAU,OAAO,CAAA,EAAA,EADxD,GAEb,CACD;AAAA;AAAA,KACH,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACrFA,SAAS,iBAAiB,KAAA,EAAwB;AAChD,EAAA,MAAM,MAAM,+BAAA,CAAgC,IAAA,CAAK,MAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAClE,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,MAAM,OAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,CAAC,GAAG,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,GAAA;AACtE,EAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AACzE,EAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,QAAQ,CAAA,GAAI,GAAA;AAC7C;AAWO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,EAAS;AACX,CAAA,EAAU;AACR,EAAA,MAAM,cAAcS,gCAAA,EAAe;AACnC,EAAA,MAAM,UAAU,WAAA,IAAe,WAAA;AAC/B,EAAA,MAAM,QAAQC,kCAAA,EAAiB;AAC/B,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE1D,EAAA,uBACEV,cAAAA;AAAA,IAACW,kCAAA;AAAA,IAAA;AAAA,MACC,OACE,OAAO,KAAA,KAAU,YAAY,OAAO,KAAA,KAAU,WACzC,KAAA,GACD,IAAA;AAAA,MAEN,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,GAAW,IAAI,CAAA;AAAA,MACnC,WAAW,CAAA,gBAAA,EAAmB,QAAA,GAAW,gBAAgB,EAAE,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,MAC9E,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACvB,QAAA;AAAA,MACA,QAAA;AAAA,MACA,mBAAA,EAAqB,KAAA;AAAA,MACrB,cAAA,EAAgB,OAAO,SAAA,GAAY,MAAA;AAAA,MACnC,YAAA,EAAc,OAAA,CAAQ,EAAA,KAAO,SAAA,GAAY,WAAA,GAAc;AAAA;AAAA,GACzD;AAEJ;ACzDO,SAAS,UAAA,CAAW,EAAE,UAAA,EAAW,EAAoB;AAC1D,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAiD;AACtE,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA;AACvB,IAAA,MAAM,SAAS,KAAA,CAAM,aAAA;AACrB,IAAA,MAAA,CAAO,iBAAA,CAAkB,MAAM,SAAS,CAAA;AAExC,IAAA,MAAM,WAAA,GAAc,OAAO,EAAA,KAAqB;AAC9C,MAAA,IAAI,MAAA,CAAO,iBAAA,CAAkB,EAAA,CAAG,SAAS,CAAA,EAAG;AAC1C,QAAA,MAAA,CAAO,qBAAA,CAAsB,GAAG,SAAS,CAAA;AAAA,MAC3C;AACA,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAM,IAAA,GAAOC,6CAAA,CAA4B,EAAA,CAAG,OAAA,EAAS,GAAG,OAAO,CAAA;AAC/D,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,UAAA,CAAW,mBAAA;AAAA,QACf,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,QACnD;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,uBACEZ,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,iBAAA;AAAA,MACV,YAAA,EAAW,aAAA;AAAA,MACX,KAAA,EAAM,kCAAA;AAAA,MACN;AAAA;AAAA,GACF;AAEJ;;;ACxBO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,MAAM,SAAA,GACJ,8DAAA;AACF,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,CAAC,KAAA,KAAU,UAAU,MAAA,CAAO,KAAK,CAAC,CAAA,IAAK,KAAK,CAAA;AAC1E;AAEO,SAAS,mBAAA,CACd,GAAA,EACA,MAAA,GAAyB,IAAA,EACzB,eAAA,EACQ;AACR,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI,OAAO,EAAA;AACtC,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,OAAO,GAAG,CAAA;AAC1C,EAAA,OAAOa,qCAAmB,CAAA,EAAG;AAAA,IAC3B,MAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AACH;AAEO,SAAS,mBAAA,CACd,GAAA,EACA,MAAA,GAAyB,IAAA,EACzB,eAAA,EACQ;AACR,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI,OAAO,EAAA;AACtC,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,OAAO,GAAG,CAAA,CAAE,IAAA,EAAK,KAAM,EAAA,IAAM,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AACvE,IAAA,IAAI,kBAAkB,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG;AAC9C,MAAA,OAAOA,qCAAmB,CAAA,EAAG;AAAA,QAC3B,MAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;AAEO,SAAS,gBAAA,CACd,KACA,OAAA,EACe;AACf,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI,OAAO,IAAA;AACtC,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,MAAMC,KAAAA,GAAO,OAAA,CAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAC1C,IAAA,OAAOA,KAAAA,GAAO,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAOA,KAAI,CAAA,GAAI,IAAA;AAAA,EACnD;AACA,EAAA,MAAM,IAAA,GACJ,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,IAAA,CAAK,GAAG,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,IAAA;AACzC,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,IAAA;AAClC,EAAA,MAAM,KAAK,OAAA,EAAS,eAAA;AACpB,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,IAAA,GAAO,UAAU,OAAA,EAAS;AAAA,IAClE,QAAA,EAAU,MAAA,KAAW,IAAA,GAAO,SAAA,GAAY,SAAA;AAAA,IACxC,eAAA,EAAiB,EAAA;AAAA,IACjB,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AAChB;AAEO,IAAM,cAAc,CACzB,GAAA,EACA,MACA,MAAA,GAAyB,IAAA,EACzB,iBACA,WAAA,KACc;AACd,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAO,IAAA,KAAS,cAAA,GACZC,2BAAA,CAAU,2BAAA,EAA6B,MAAM,CAAA,GAC7C,EAAA;AAAA,EACN;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,mBAAA,CAAoB,GAAA,EAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IAEzD,KAAK,UAAA;AACH,MAAA,OAAO,MAAM,QAAA,GAAM,QAAA;AAAA,IAErB,KAAK,OAAA;AACH,MAAA,OAAO,mBAAA,CAAoB,GAAA,EAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IAEzD,KAAK,MAAA;AACH,MAAA,OAAO,iBAAiB,GAAA,EAAK,EAAE,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAA;AAAA,IAEvE;AACE,MAAA,OAAO,QAAA;AAAA;AAEb,CAAA;AChHA,SAAS,kBAAA,CACP,SACA,KAAA,EAC0C;AAC1C,EAAA,MAAM,SAAA,GAAY,QAAQ,WAAA,EAAY;AACtC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,aAAa,CAAC,KAAA,EAAO,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG;AAClD,IAAA,MAAM,MAAA,GAAS,UAAU,WAAA,EAAY;AACrC,IAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAA;AACtC,IAAA,IAAI,UAAU,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAA,EAAO;AAAA,EAC7D;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,wBAAA,CACd,IAAA,EACA,KAAA,EACA,SAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,GAAO,EAAA,GAAK,OAAO,IAAI,CAAA;AAC/C,EAAA,IAAI,SAAA,IAAa,KAAA,EAAO,IAAA,EAAK,EAAG;AAC9B,IAAA,OAAO,mBAAA,CAAoB,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,mBAAA,CACd,IAAA,EACA,KAAA,EACA,SAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,GAAO,EAAA,GAAK,OAAO,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,GAAG,OAAO,OAAA;AAEf,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,OAAA,EAAS,CAAC,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAO,OAAO,OAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,YAAY,2BAAA,GAA8B,gBAAA;AAE5D,EAAA,uBACEZ,eAAAA,CAAAD,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA;AAAA,oBAC7BF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EACd,QAAA,EAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,EACxD,CAAA;AAAA,IACC,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,MAAM,MAAM;AAAA,GAAA,EAC3C,CAAA;AAEJ;;;ACfO,SAAS,qBAAA,CACd,MACA,GAAA,EACyB;AACzB,EAAA,IAAI,OAAO,IAAA,EAAM,MAAA,KAAW,UAAA,EAAY;AACtC,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AACA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAM,IAAA,EAAO,KAAK,MAAA,CAAO,GAAG,KAAK,IAAA,EAAmB;AACpE;AC1CO,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,MAAM,gBAAgB,CAAC,EACrB,IAAI,oBAAA,IAAwB,GAAA,CAAI,aAAa,IAAA,EAAK,CAAA;AAEpD,EAAA,MAAM,OAAA,GACJ,CAAC,aAAA,KACA,GAAA,CAAI,SAAS,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,QAAA,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,IAAa,CAAC,GAAA,CAAI,UAAA;AACvC,EAAA,MAAM,OAAO,GAAA,CAAI,KAAA,IAAS,OAAO,EAAA,GAAK,MAAA,CAAO,IAAI,KAAK,CAAA;AAEtD,EAAA,IAAI,CAAC,WAAW,QAAA,EAAU;AACxB,IAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EACb,0BACG,wBAAA,CAAyB,IAAA,EAAM,GAAA,CAAI,WAAA,EAAa,IAAI,CAAA,GACpD,IAAA,KAAS,IAAI,IAAA,KAAS,MAAA,GAAS,WAAM,EAAA,CAAA,EAC3C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,wBAAA,EAAsB,IAAA;AAAA,MACtB,SAAA,EAAW,IAAI,IAAA,KAAS,MAAA;AAAA,MACxB,QAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,SAAA,EAAW,CAAA,uEAAA,EACT,GAAA,CAAI,SAAA,GAAY,uBAAuB,EACzC,CAAA,CAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,IAAI,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACvD,OAAA,EAAS,MAAM,GAAA,CAAI,UAAA;AAAW;AAAA,GAChC;AAEJ;;;ACtBO,SAAS,yBAAA,CACd,SAAA,EACA,UAAA,EACA,GAAA,EACyB;AACzB,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAC7B,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AACA,EAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,MAAO,MAAA,CAAO,GAAG,KAAK,IAAA,EAAmB;AAC/D;AAGO,IAAM,uBAAA,GAA4C;AAAA,EACvD,QAAA,EAAU;AACZ;AAEO,SAAS,oBACd,IAAA,EACkB;AAClB,EAAA,OAAO,EAAE,GAAG,uBAAA,EAAyB,GAAG,IAAA,EAAK;AAC/C;AAMO,SAAS,oBAAA,CACd,IAAA,EACA,UAAA,EACA,GAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,IAAA,EAAM,GAAG,CAAA;AAC9C,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,yBAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,oBAAoB,UAAU,CAAA;AAAA,IAC9B;AAAA,GACF;AACF;ACLO,IAAM,oBAAA,GAAuBgB,iBAAA,CAGlC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAChB,EAAA,MAAM,SAASC,2BAAA,EAAU;AACzB,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAE,oBAAA,IAAwB,aAAa,IAAA,EAAK,CAAA;AACnE,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAA,CAAK,iBAAiB,EAAC;AAItD,EAAA,MAAM,EAAE,cAAA,EAAgB,UAAA,EAAW,GAAIC,kCAAgB,QAAA,EAAU;AAAA,IAC/D,OAAA,EAAS;AAAA,GACV,CAAA;AACD,EAAA,MAAM,aAAA,GAAqC,CAAC,IAAA,KAC1CC,sCAAA,CAAqB,IAAI,CAAA,IAAK,UAAA,CAAWC,oCAAA,CAAmB,IAAI,CAAC,CAAA;AACnE,EAAA,MAAM,OAAA,GAAUC,gCAAA,CAAe,QAAA,EAAU,aAAa,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiBC,qCAAA,CAAoB,QAAA,EAAU,aAAa,CAAA;AAClE,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAIC,gCAAA,CAAuC;AAAA,IAChE,GAAA,EAAK,QAAA;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,GAAG,cAAA;AAAA,MACH,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,CAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,UAAA,EAAY,CAAA;AAAA,QACZ,eAAA,EAAiB;AAAA;AACnB,KACF;AAAA,IACA,MAAM,CAAC;AAAA,GACR,CAAA;AACD,EAAA,MAAM,KAAA,GAAQC,cAAA;AAAA,IACZ,MACE,QAAA,EAAU,IAAA,EAAM,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,MACpC,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,MACjB,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,SAAS,MAAM;AACb,QAAA,IAAA,CAAK,WAAW,QAAA,EAAU,GAAA,CAAI,IAAI,GAAA,EAAK,UAAA,EAAW,KAAK,IAAI,CAAA;AAC3D,QAAA,UAAA,EAAY,QAAA,CAAS;AAAA,UACnB,IAAA,EAAM,gBAAA;AAAA,UACN,OAAO,GAAA,CAAI,EAAA;AAAA,UACX,QAAA;AAAA,UACA,OAAO,IAAA,CAAK;AAAA,SACb,CAAA;AAAA,MACH;AAAA,KACF,CAAE,KAAK,EAAC;AAAA,IACV,CAAC,UAAU,IAAI;AAAA,GACjB;AACF,EAAA,MAAM,wBAAwB,MAAI;AAChC,IAAA,UAAA,EAAY,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,qBAAA;AAAA,MACN,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,IAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACX,CAAA;AACE,EAAA,uBACErB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,IAAA,aAAA,mBACCH,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,gCACT,SAAA,GAAY,oBAAA,GAAuB,EACrC,CAAA,CAAA,EAAI,IAAA,CAAK,aAAa,EAAE,CAAA,CAAA;AAAA,QACxB,OAAA,EAAS,MAAM,UAAA,EAAW;AAAA,QAEzB,QAAA,EAAA,wBAAA,CAAyB,KAAA,EAAO,WAAA,EAAa,IAAI;AAAA;AAAA,wBAGtDA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,GAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,aAAa,CAAC,QAAA;AAAA,QACxB,KAAA,EAAO,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,QACxC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB;AAAA;AAAA,+FAAA,EAE0C,KAAK,SAAS,CAAA,CAAA;AAAA,QACvG,SAAA,EAAW,KAAA;AAAA,QACX,WAAA,EAAa,SAAA;AAAA,QACb,UAAA,EAAY,SAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACnD,OAAA,EAAS,MAAM,UAAA;AAAW,OAAA;AAAA,MAZrB;AAAA,KAaP;AAAA,oBAGAA,cAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,MAAA,KAAW,IAAA,GAAO,aAAA,GAAgB,YAAA;AAAA,QAC7C,SAAA,EAAU,qGAAA;AAAA,QACV,KAAA;AAAA,QACA,iBAAA,EAAkB,4BAAA;AAAA,QAElB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,IAAG,kBAAA,EAClC,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,CAAA,EACR;AAAA;AAAA,KACF;AAAA,oBAEAA,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAOC,QAAA,kBAAAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AAET,cAAA,qBAAA,EAAsB;AAAA,YAE5B,CAAA;AAAA,YAEA,QAAA,kBAAAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ;AAAA,kBACN,KAAA,EAAO,EAAA;AAAA,kBACP,MAAA,EAAQ,EAAA;AAAA,kBACR,MAAA,EAAQ;AAAA;AACV;AAAA;AACF;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,oBAAA,CAAqB,WAAA,GAAc,sBAAA;ACrHnC,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,kBAAA,GAAqB,GAAA;AAE3B,IAAM,mBAAA,GAAsB,CAAC,IAAA,EAA4B,UAAA,KAAuB;AAC9E,EAAA,MAAM,UAAgC,EAAC;AACvC,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAgC;AAC9C,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IACE,MAAA,CAAO,IAAA,EAAM,KAAA,IAAS,EAAE,EAAE,QAAA,CAAS,UAAU,CAAA,IAC7C,MAAA,CAAO,MAAM,KAAA,IAAS,EAAE,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAC7C;AACA,QAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAA,CAAO,IAAI,CAAA;AACX,EAAA,OAAO,OAAA;AACT,CAAA;AAEO,IAAM,wBAAwD,CAAC;AAAA,EACpE,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,cAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,eAAA;AAAA,EACA,UAAA,GAAa,eAAA;AAAA,EACb,kBAAA,GAAqB,KAAA;AAAA,EACrB,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,EAAS,eAAA;AAAA,EACT,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIJ,eAAAA,CAA+B,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAS,CAAC,CAAA;AAE9C,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,UAAA;AAAA;AAAA,IAEA,SAAA,EAAW,UAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,gBAAgB,EAAC;AAErB,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA+B;AACrD,IAAA,IAAI,gBAAA,EAAkB,OAAO,gBAAA,CAAiB,MAAM,CAAA;AACpD,IAAA,OAAO,MAAA,CAAO,cAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,EAAE,MAAM,UAAA,EAAY,IAAI8B,+BAAA,EAAoC;AAC5E,EAAA,MAAM,EAAE,cAAA,EAAgB,aAAA,EAAe,OAAA,EAAQ,GAAIP,kCAAgB,QAAA,EAAU;AAAA,IAC3E,OAAA,EAAS,KAAA;AAAA,IACT,iBAAA,EAAmB;AAAA,GACpB,CAAA;AAED,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG,WAAA;AAAA,IACH,GAAG,cAAA;AAAA,IACH,YAAY,QAAA,GACR,EAAE,iBAAiB,iBAAA,EAAmB,UAAA,EAAY,YAAW,GAC7D,IAAA;AAAA,IACJ,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,WAAA;AAAA,IACvB,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI;AAAA,GACnD;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,aAAA,CAAc,CAAC,CAAA;AACf,IAAA,IAAI,QAAA,IAAY,CAAC,OAAA,EAAS;AAC1B,IAAA,KAAK,QAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,WAAW,CAAA;AAAA,EACjD,CAAA;AAEA,EAAArB,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACjB,IAAA,MAAM,cAAA,GAAuC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MACtE,KAAK,MAAA,CAAO,SAAA;AAAA,MACZ,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,OACE,UAAA,KAAe,aAAA,GACX,MAAA,CAAO,YAAA,GACP,eAAe,MAAM,CAAA;AAAA,MAC3B,KAAA,EAAO,eAAe,MAAM,CAAA;AAAA,MAC5B;AAAA,KACF,CAAE,CAAA;AACF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,UAAA,CAAW,cAAc,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,cAAc,CAAC,CAAA;AACjD,QAAA,IAAI,UAAU,kBAAA,EAAoB,QAAA,GAAW,cAAA,CAAe,CAAC,GAAG,KAAK,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,cAAc,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEf,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,YAAY,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,gBAAiB,CAAC,CAAA;AAAA,EAC1E,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,eAAA,IAAmB,OAAA,EAAS,eAAA,CAAgB,OAAO,CAAA;AACvD,IAAA,IAAI,kBAAA,EAAoB,QAAA,GAAW,OAAA,CAAQ,CAAC,GAAG,KAAK,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAE7B,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqC;AACzD,IAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,KAAiB,MAAA,CAAO,YAAY,MAAA,CAAO,YAAA;AACjE,IAAA,IAAI,QAAA,IAAY,MAAA,IAAU,CAAC,UAAA,EAAY;AACrC,MAAA,IAAA,EAAM,gBAAgB,iBAAA,IAAqB,aAAA,CAAc,CAAC,IAAA,KAAS,OAAO,CAAC,CAAA;AAAA,IAC7E;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB2B,eAAQ,MAAM;AACpC,IAAA,MAAM,SAAS,eAAA,IAAmB,OAAA;AAClC,IAAA,IAAI,CAAC,eAAe,OAAO,MAAA;AAC3B,IAAA,OAAO,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAA,EAAS,aAAa,CAAC,CAAA;AAE5C,EAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAY,GAAIA,eAAQ,MAAM;AACnD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,EAAE,aAAA,EAAe,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAM;AAAA,IAC9D;AACA,IAAA,MAAM,UAAU,eAAA,CAAgB,IAAA;AAAA,MAC9B,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,KAAK,CAAA,KAAM,OAAO,KAAK;AAAA,KACnD;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,EAAE,aAAA,EAAe,eAAA,EAAiB,WAAA,EAAa,QAAQ,KAAA,EAAM;AAAA,IACtE;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO;AAAA,QACL,aAAA,EAAe;AAAA,UACb,GAAG,eAAA;AAAA,UACH,EAAE,GAAA,EAAK,KAAA,EAA0B,OAAiC,KAAA,EAAO,UAAA,EAAY,OAAO,UAAA;AAAW,SACzG;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AACA,IAAA,OAAO,EAAE,aAAA,EAAe,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAM;AAAA,EAC9D,CAAA,EAAG,CAAC,eAAA,EAAiB,KAAA,EAAO,UAAU,CAAC,CAAA;AAEvC,EAAA3B,iBAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,aAAA,CAAc,CAAC,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,WAAA,GAAc2B,cAAAA;AAAA,IAClB,MAAO,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAI,IAAA;AAAA,IAC7C,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAA,GAAmB5B,cAAO,IAAI,CAAA;AACpC,EAAAC,iBAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,WAAW,MAAM;AAChC,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,KAAK,QAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,WAAW,CAAA;AAAA,MACjD;AAAA,IACF,GAAG,kBAAkB,CAAA;AACrB,IAAA,OAAO,MAAM,aAAa,QAAQ,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,WAAA,EAAa,aAAa,CAAC,CAAA;AAE/B,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,OAAA,OAAc,OAAA,CAAQ,EAAE,KAAK,QAAA,EAAU,IAAA,EAAM,WAAW,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAAH,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAW,CAAA,mBAAA,EAAsB,QAAA,GAAW,gBAAgB,EAAE,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,QACjF,KAAA,EAAO,WAAA;AAAA,QACP,QAAA;AAAA,QACA,UAAA,EAAU,IAAA;AAAA,QACV,YAAY,UAAA,IAAc,IAAA;AAAA,QAC1B,SAAA;AAAA,QACA,qBAAA;AAAA,QACA,WAAA;AAAA,QACA,aACE,WAAA,KACC,UAAA,GAAa,EAAE,gBAAgB,CAAA,GAAI,EAAE,qBAAqB,CAAA,CAAA;AAAA,QAE7D,YAAA,EAAc,CAAC,UAAA,qBACbA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,gBAAgB,eAAA,EAAiB,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,aAAA,EAAc;AAAA,YAEvG,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,UAAA,CAAW,KAAK,KAAA,EAAM;AAAA;AAAA,SAC/B;AAAA,QAEF,YAAA,EAAc,CAAC,KAAA,EAAO,MAAA,KAAW;AAC/B,UAAA,IAAI,YAAA,IAAgB,OAAO,YAAA,KAAiB,UAAA,EAAY;AACtD,YAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,UACnC;AACA,UAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,UAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,QAEpD,CAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,CAAC,YAAA,KAAiB;AAC1B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,YAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,OAAA,EAAS,YAAY,CAAA;AAC/D,YAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,cAAA,EAAgB;AAChD,cAAA,cAAA;AAAA,gBACE,aAAA,CAAc,CAAC,CAAA,CAAE,KAAA;AAAA,gBACjB,aAAA,CAAc,CAAC,CAAA,EAAG,KAAA;AAAA,gBAClB;AAAA,eACF;AACA,cAAA;AAAA,YACF;AAAA,UACF;AACA,UAAA,QAAA,GAAW,YAAY,CAAA;AAAA,QACzB,CAAA;AAAA,QACA,aAAA,EAAe,YAAA;AAAA,QACf,SAAS,MAAM;AACb,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,YAAA,aAAA,CAAc,CAAC,CAAA;AAAA,UACjB;AACA,UAAA,OAAA,IAAU;AAAA,QACZ,CAAA;AAAA,QACA,OAAA,EAAS,aAAA;AAAA,QACT,eAAA,EAAiB,aAAa,YAAA,GAAe;AAAA;AAAA,KAC/C;AAAA,IACC,WAAA,KAAgB,yBACfA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,UAAA,GAAa,cAAA,GAAiB,EAAE,CAAA,CAAA,EAAI,QAAA,GAAW,eAAe,aAAa,CAAA,CAAA;AAAA,QACzF,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,UAAA,EAAW;AAAA,QACvG,OAAA,EAAS,aAAA;AAAA,QAET,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,EAAG,EAAG;AAAA;AAAA;AAC7C,GAAA,EAEJ,CAAA;AAEJ,CAAA;AClRO,IAAM,YAAA,GAA4C,CAAC,KAAA,KACxD,KAAA,CAAM,IAAA,mBAAOA,cAAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,GAAK;AAEnE,IAAM,mBAAyE,CAAC;AAAA,EAC9E,QAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAc0B,uBAAAA,CAAM,MAAA,CAA8B,IAAI,CAAA;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAIC,iCAAA,EAAgB;AAC/C,EAAA,MAAM,kBAAkBC,oCAAA,EAAmB;AAC3C,EAAA,MAAM,cAAcnB,gCAAA,EAAe;AACnC,EAAA,MAAM,WAAA,GAAc,mBAAmB,UAAU,CAAA;AACjD,EAAA,MAAM,OAAA,GACJ,OAAO,GAAA,CAAI,mBAAA,CAAoB,QAAQ,MAAM,SAAA,IAC7C,GAAA,CAAI,mBAAA,CAAoB,QAAQ,CAAA,KAAM,KAAA;AACxC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,QAAQ,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,IAAI,QAAQ,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,UAAU,QAAA,EAAS;AACvD,EAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,UAAU,UAAA,EAAW;AAC7D,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,IAAI,QAAQ,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,IAAI,QAAQ,CAAA;AAC3D,EAAA,MAAM,aAAwB,UAAA,CAAW,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA,IAAK;AAAA,IACxE,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,EAAE,KAAA,EAAO,GAAA,CAAI,IAAI,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,OAAA,EAAS,EAAA;AAAG,GACtE;AACA,EAAA,MAAM,QAAA,GAAWiB,uBAAAA,CAAM,MAAA,CAAgC,IAAI,CAAA;AAC3D,EAAA,MAAM,mBAAA,GAAsB,CAC1B,QAAA,EACA,MAAA,KACG;AACH,IAAA,IAAA,CAAK,WAAW,QAAA,EAAU,GAAA,CAAI,IAAI,GAAA,EAAK,UAAA,EAAY,UAAU,MAAM,CAAA;AACnE,IAAA,UAAA,CAAW,QAAA,CAAS;AAAA,MAClB,IAAA,EAAM,gBAAA;AAAA,MACN,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAyB;AACtD,IAAA,UAAA,CAAW,QAAA,CAAS;AAAA,MAClB,IAAA,EAAM,wBAAA;AAAA,MACN,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,QAAA;AAAA,MACA,OAAO,KAAA,IAAS;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAyB;AAC3C,IAAA,UAAA,CAAW,QAAA,CAAS;AAAA,MAClB,IAAA,EAAM,gBAAA;AAAA,MACN,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,QAAA;AAAA,MACA,UAAU,CAAA,EAAG,QAAA;AAAA,MACb,OAAA,EAAS,OAAA,CAAQ,CAAA,EAAG,OAAA,IAAW,GAAG,OAAO;AAAA,KAC1C,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,EAAA,MAAM,UAAA,GAAa,KAAK,QAAA,KAAa,KAAA;AACrC,EAAA,MAAM,YAAY,GAAA,CAAI,QAAA,KAAA,QAAA;AACtB,EAAA,MAAM,oBAAA,GACJ,CAAC,CAAC,WAAA,IACF,YAAY,YAAA,IAAgB,CAAA,IAC5B,YAAY,OAAA,CAAQ,WAAA,CAAY,YAAY,CAAA,EAAG,KAAA,KAAU,IAAI,EAAA,IAC7D,WAAA,CAAY,QAAQ,WAAA,CAAY,YAAY,GAAG,QAAA,KAAa,QAAA;AAE9D,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAsB;AAC/C,IAAA,MAAM,MAAA,GAAS,WAAA;AAAA,MACb,QAAA;AAAA,MACA,IAAA,CAAK,SAAA;AAAA,MACL,MAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,wBAAA;AAAA,MACL,MAAA;AAAA,MACA,WAAA,EAAa,KAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAuB;AACxC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAEA,EAAA7B,iBAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,IAAA,KAAS,MAAA,IAAW,IAAA,KAAS,MAAA,IAAU,SAAA;AAC3D,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,MAAM;AACjC,QAAA,MAAM,EAAA,GAAK,YAAY,OAAA,EAAS,aAAA;AAAA,UAC9B;AAAA,SACF;AACA,QAAA,EAAA,EAAI,KAAA,EAAM;AAAA,MACZ,GAAG,CAAC,CAAA;AACJ,MAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,QAAA,CAAS,QAAQ,MAAA,EAAO;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,IAAA,EAAM,IAAI,CAAC,CAAA;AAC1B,EAAA,MAAM,iBAAA,GAAuC;AAAA,IAC3C,QAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,CAAC,CAAC,QAAA;AAAA,IACZ,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,WAAA,EAAa,KAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,QAAA,qBAC1BM,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,CAAA,0FAAA,EAA6F,IAAA,CAAK,SAAS;AAAA,QAAA,EAClH,IAAA,CAAK,SAAA,KAAc,UAAA,IAAc,IAAA,CAAK,SAAA,KAAc,WAAW,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,eAAe;AAAA,QAAA,EAC/H,oBAAA,GAAuB,2BAA2B,EAAE,CAAA,CAAA;AAAA,MAExD,QAAA,EAAA;AAAA,wBAAAH,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,iBAAA,CAAkB,QAAQ,CAAA,EAAE,CAAA;AAAA,QACvD,CAAC,UAAA,EAAY,OAAA,oBACZA,cAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,OAAA,EACrC,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EACC,0BAAAA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAC,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAS,EAAG,CAAA,EAChE,CAAA,EACF;AAAA;AAAA,KAAA;AAAA,IAXG;AAAA,GAaP;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,uBACEA,eAAC,MAAA,EAAA,EAAe,SAAA,EAAW,WAAW,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,QAAA,EAAA,IAAA,EAAA,EAA7C,GAEX,CAAA;AAAA,IAEJ;AACA,IAAA,uBACEA,eAAC,MAAA,EAAA,EAAe,SAAA,EAAW,eAAe,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,QAAA,EAAA,IAAA,EAAA,EAAjD,GAEX,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,IAAA,EAAM,UAAA,EAAY,iBAAiB,CAAA;AAC3E,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAM,cAAA,GAAiB,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA;AAC9C,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEE,GAAI,iBACD,EAAE,sBAAA,EAAwB,UAAS,GACnC,EAAE,2BAA2B,IAAA,EAAK;AAAA,QACtC,QAAA,EAAU,YAAY,EAAA,GAAK,QAAA;AAAA,QAC3B,WAAW,CAAA,wCAAA,EACT,IAAA,KAAS,UAAA,GAAa,aAAA,GAAgB,cACxC,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,IAAa,EAAE,IACtB,SAAA,GAAY,oBAAA,GAAuB,aACrC,CAAA,CAAA,EAAI,oBAAA,GAAuB,2BAA2B,EAAE,CAAA,CAAA;AAAA,QACxD,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,CAAC,CAAA;AAAA,QAC9B,CAAA;AAAA,QAEC,QAAA,EAAA,UAAA,CAAW;AAAA,OAAA;AAAA,MAdP;AAAA,KAeP;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO,kBAAA,CAAmB,WAAW,KAAK,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,cAAc,cAAA,EAAgB;AACrC,MAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAe,SAAA,EAAW,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA,EAC7D,QAAA,EAAA,KAAA,GAAQ,iBAAA,CAAkB,KAAK,CAAA,GAAI,QAD3B,GAEX,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAe,SAAA,EAAW,CAAA,QAAA,EAAW,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA,EACjD,QAAA,EAAA,iBAAA,CAAkB,KAAK,CAAA,EAAA,EADf,GAEX,CAAA;AAAA,IAEJ;AAAA,EACF,WACE,IAAA,KAAS,MAAA,KACR,CAAC,SAAA,IAAa,aAAa,oBAAA,CAAA,EAC5B;AACA,IAAA,uBACEA,cAAAA,CAAAE,mBAAAA,EAAA,EACE,QAAA,kBAAAF,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,QAAA;AAAA,QACA,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,CAAA;AAAA,6BAAA,EACU,KAAK,SAAS;AAAA,UAAA,EACjC,SAAA,GAAY,wBAAwB,aAAa;AAAA,UAAA,EACjD,oBAAA,GAAuB,2BAA2B,EAAE;AAAA,UAAA,CAAA;AAAA,QAEtD,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,UAAA,CAAW,CAAC,CAAA;AAAA,QACd,CAAA;AAAA,QACA,eAAe,MAAM;AACnB,UAAA,IAAI,CAAC,SAAA,IAAa,UAAA,EAAY,SAAA,EAAU;AAAA,QAC1C,CAAA;AAAA,QAEA,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,IAAA,EACjB,IAAA,CAAK,SAAA,KAAc,UAAA,IAAc,IAAA,CAAK,SAAA,KAAc,WAAW,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,eAAe,CAAA,CAAA;AAAA,YAEzH,QAAA,kBAAAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,cAAA,iBAAA,CAAkB,WAAW,KAAK,CAAA;AAAA,cAClC,CAAC,UAAA,EAAY,OAAA,oBACZH,cAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,OAAA,EACrC,QAAA,kBAAAA,cAAAA,CAAC,UACC,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,QAAQ,EAAC,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,QAAQ,SAAA;AAAS;AAAA,iBAErD,CAAA,EACF;AAAA,aAAA,EAEJ;AAAA;AAAA;AACF,OAAA;AAAA,MA/BK;AAAA,KAgCP,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAEC,GAAA,EAAK,QAAA;AAAA,UACL,OAAO,KAAA,KAAU,EAAA,IAAM,SAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,UACxD,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB;AAAA;AAAA;AAAA,wEAAA,EAGiB,KAAK,SAAS,CAAA,CAAA;AAAA,UAC9E,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,CAAC,CAAA,KACT,mBAAA;AAAA,YACE,CAAA,CAAE,OAAO,KAAA,KAAU,EAAA,GAAK,KAAK,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK;AAAA;AACpD,SAAA;AAAA,QAfG;AAAA,OAiBP;AAAA,IAEJ,KAAK,OAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAQ,SAAA;AAAA,UACR,GAAA,EAAK,CAAA;AAAA,UAEL,GAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB;AAAA;AAAA;AAAA;AAAA,QAAA,EAI/C,KAAK,SAAS,CAAA,CAAA;AAAA,UACd,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EACE,KAAA,KAAU,EAAA,IAAM,KAAA,IAAS,IAAA,GACrB,EAAA,GACA,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,OAAA,CAAQ,uBAAA,EAAyB,GAAG,CAAA;AAAA,UAErD,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAM,UAAA,GAAa,EAAE,MAAA,CAAO,KAAA;AAC5B,YAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AACxD,YAAA,IAAI,gBAAgB,EAAA,IAAM,CAAC,MAAM,MAAA,CAAO,WAAW,CAAC,CAAA,EAAG;AACrD,cAAA,mBAAA;AAAA,gBACE,WAAA,KAAgB,EAAA,GAAK,EAAA,GAAK,MAAA,CAAO,WAAW;AAAA,eAC9C;AACA,cAAA,qBAAA;AAAA,gBACE,gBAAgB,EAAA,GACZ,IAAA,GACA,GAAG,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA,CAAG,OAAA;AAAA,kBACvB,uBAAA;AAAA,kBACA;AAAA;AACF,eACN;AAAA,YACF;AAAA,UACF;AAAA,SAAA;AAAA,QAjCK;AAAA,OAkCP;AAAA,IAEJ,KAAK,MAAA;AACH,MAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,WAAA,EAAa,SAAA,EAAU,iBAC/B,QAAA,kBAAAA,cAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,UAE5B,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,KAAA,EACE,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,KACvB,MAAA,GACA,OAAO,KAAA,KAAU,QAAA,GACf,KAAA,GACA,IAAI,IAAA,CAAK,KAAe,EAAE,OAAA,EAAQ;AAAA,UAE1C,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,mBAAA,CAAoB,CAAC,CAAA;AAAA,UACvB;AAAA,SAAA;AAAA,QAXK;AAAA,OAYP,EACF,CAAA;AAAA,IAEJ,KAAK,UAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,yCAAA,CAAA;AAAA,UAE5B,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UAExB,SAAS,KAAA,KAAW,IAAA;AAAA,UACpB,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,mBAAA,CAAoB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,UACtC;AAAA,SAAA;AAAA,QANK;AAAA,OAOP;AAAA,IAEJ,KAAK,QAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,UAAU,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,YAC3C,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,OAAO,GAAA,CAAI;AAAA,WACb,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,WAAW,CAAA,MAAA,EAAS,SAAA,IAAa,oBAAoB,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AAAA,UACvE,KAAA;AAAA,UACA,OAAA,EAAS,MAAM,UAAA,EAAW;AAAA,UAC1B,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,YAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,YAAA,MAAM,MAAA,GAAS,CAAA;AACf,YAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,cAAA,qBAAA,CAAsB,OAAO,KAAK,CAAA;AAAA,YACpC,CAAA,MAAO;AACL,cAAA,qBAAA,CAAsB,EAAE,CAAA;AAAA,YAC1B;AACA,YAAA,IAAI,CAAA,EAAG;AACL,cAAA,UAAA,CAAW,QAAA,CAAS;AAAA,gBAClB,IAAA,EAAM,qBAAA;AAAA,gBACN,OAAO,GAAA,CAAI,EAAA;AAAA,gBACX,QAAA;AAAA,gBACA,SAAA,EAAW;AAAA,eACZ,CAAA;AAAA,YACH;AAAA,UACF;AAAA,SAAA;AAAA,QAzBK;AAAA,OA0BP;AAAA,IAEJ,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,cACJ,KAAA,IAAS,IAAA,IAAQ,UAAU,EAAA,GAAK,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAElD,MAAA,uBACEA,cAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,SAAS,IAAA,CAAK,OAAA;AAAA,UAEd,UAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,cAAA,EAAgB,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,YAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,YAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACrB,cAAA,IAAI,CAAA,EAAG;AACL,gBAAA,qBAAA,CAAsB,CAAC,CAAA;AAAA,cACzB,CAAA,MAAO;AACL,gBAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,cAC5B;AAAA,YACF;AAAA,UACF,CAAA;AAAA,UACA,WAAW,IAAA,KAAS,MAAA;AAAA,UACpB,uBAAuB,IAAA,CAAK,UAAA;AAAA,UAC5B,WAAA,EAAa,CAAC,IAAA,qBAASA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAU,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UACrD,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UAExB,KAAA,EAAO,WAAA;AAAA,UAGP,YAAY,OAAA,IAAW,IAAA,IAAQ,YAAY,EAAA,GAAK,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,UAClE,cAAc,IAAA,EAAM,aAAA;AAAA,UACpB,YAAA,EAAc,CAAC,KAAA,EAAO,MAAA,KAAW;AAC/B,YAAA,IAAI,MAAM,yBAAA,EAA2B;AACnC,cAAA,OAAO,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,MAAM,CAAA;AAAA,YACrD;AACA,YAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,YAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,YAAA,MAAM6B,QAAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,KAAW,IAAA,IACX,gBAAA,IAAoB,MAAA,IACpB,OAAQ,MAAA,CAAwC,cAAA,KAC9C,QAAA,GACG,OAAsC,cAAA,GACvC,EAAA;AACN,YAAA,OACE,OAAO,UAAU,QAAA,IACjBA,QAAAA,CAAQ,aAAY,CAAE,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,UAEtD,CAAA;AAAA,UACA,aAAA,EAAe,CAAC,MAAA,KAAW;AACzB,YAAA,MAAM,MAAA,GAAA,CAAU,UAAA,CAAW,UAAA,EAAW,IAAK,EAAC,EAAG,IAAA;AAAA,cAC7C,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,EAAG,QAAA,OAAe,MAAA,CAAO;AAAA,aACpD;AACA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,OAAO,CAAC,MAAA;AAAA,YACV;AACA,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AAAA,UACA,WAAW,CAAA,gDAAA,EAAmD,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,aAAa,oBAAoB,CAAA,UAAA,CAAA;AAAA,UACjH,OAAA,EAAS,MAAM,UAAA,EAAW;AAAA,UAC1B,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,YAAA,mBAAA,CAAoB,GAAG,CAAsB,CAAA;AAC7C,YAAA,MAAM,MAAA,GAAS,CAAA;AACf,YAAA,qBAAA,CAAsB,MAAA,EAAQ,SAAS,EAAE,CAAA;AACzC,YAAA,IAAI,CAAA,EAAG;AACL,cAAA,UAAA,CAAW,QAAA,CAAS;AAAA,gBAClB,IAAA,EAAM,qBAAA;AAAA,gBACN,OAAO,GAAA,CAAI,EAAA;AAAA,gBACX,QAAA;AAAA,gBACA,SAAA,EAAW;AAAA,eACZ,CAAA;AAAA,YACH;AAAA,UACF;AAAA,SAAA;AAAA,QAjEK,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,QAAQ,CAAA;AAAA,OAkE5B;AAAA,IAEJ;AAAA,IACA,KAAK,QAAA;AACH,MAAA,uBACE7B,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,QAAA;AAAA,UACA,SAAA,EAAW,CAAA,yCAAA,EAA4C,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,UACrE,OAAA,EAAS,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA;AAAA,UAE3B,QAAA,EAAA,MAAA,CAAO,OAAA,IAAW,KAAA,IAAS,EAAE,CAAA,IAAK;AAAA,SAAA;AAAA,QAL9B;AAAA,OAMP;AAAA,IAEJ,KAAK,aAAA;AACH,MAAA,uBACEA,cAAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA,EAAU,UAAA;AAAA,UACV,mBAAA;AAAA,UACA,GAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,GAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UAEA,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,KAAA,EAAO,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB;AAAA;AAAA,6EAAA,CAAA;AAAA,UAG/C,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAC,CAAA;AAAA,UACtC,OAAA,EAAS,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA;AAAA,UAC5B,IAAA;AAAA,UACA,aAAa,WAAA,EAAa,KAAA;AAAA,UAC1B;AAAA,SAAA;AAAA,QAdK;AAAA,OAeP;AAAA,IAEJ,KAAK,MAAA;AAAA,IACL;AACE,MAAA,uBACEA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAEC,GAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,aAAa,CAAC,UAAA;AAAA,UACxB,KAAA,EAAO,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB;AAAA;AAAA,+FAAA,EAEwC,KAAK,SAAS,CAAA,CAAA;AAAA,UACrG,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,SAAA;AAAA,UACR,UAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACnD,OAAA,EAAS,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC;AAAA,SAAA;AAAA,QAZvB;AAAA,OAaP;AAAA;AAGR,CAAA;AC/iBO,IAAM,WAAoC,CAAC;AAAA,EAChD,GAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,SAASkB,2BAAA,EAAU;AACzB,EAAA,MAAM,kBAAkBW,oCAAA,EAAmB;AAE3C,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,eAAe,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9D,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,UAAA,GAAc,KAAK,YAAA,GAAe,QAAA,EAAU,IAAI,EAAA,EAAI,GAAA,EAAK,UAAU,CAAA,IACvE,EAAC;AACH,EAAA,MAAM,KAAA,GAAwB;AAAA,IAC5B;AAAA,MACE,GAAA,EAAK,GAAA;AAAA,MACL,KAAA,kBACE5B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,OAAA,EAAS,aAAA,EACrC,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,MAEF,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,GAAA,EAAK,GAAA;AAAA,MACL,KAAA,kBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,OAAA,EAAS,YAAA,EACrC,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB,CAAA;AAAA,MAEF,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,IAAA,EAAM;AAAA,KACR;AAAA,IACA,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,uBAAuB,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA0C;AACjE,IAAA,IAAI,CAAC,EAAE,QAAA,IAAY,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAC1C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,QAAA,KAAA,QAAA;AACtB,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAErD,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB,CAAA,oEAAA,CAAA;AAAA,MAE/C,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,6BACAH,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAU,SAAA;AAAA,cACV,OAAA,EAAS,CAAC,CAAC,aAAA;AAAA,cACX,OAAA,EAAS,eAAA;AAAA,cACT,cAAY,CAAA,EAAG,CAAA,CAAE,mBAAmB,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAA;AAAA;AAAA,WAClD;AAAA,0BAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAAa,oCAAA,CAAmB,GAAA,GAAM,CAAA,EAAG,EAAE,MAAA,EAAQ,eAAA,EAAiB,CAAA,EAC1D,CAAA;AAAA,UAEC,IAAA,CAAK,gBAAA,IAAoB,CAAC,SAAA,oBACzBb,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,wDAAA;AAAA,cACV,SAAA,EAAW,KAAA;AAAA,cACX,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,gBAAA,MAAM,EAAA,GAAK,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AACvC,gBAAA,EAAA,EAAI,YAAA,CAAa,aAAa,MAAM,CAAA;AAAA,cACtC,CAAA;AAAA,cAEA,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,WAC/C;AAAA,UAGD,IAAA,CAAK,sCACJA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,eAAA,EAAgB;AAAA,cAClB,CAAA;AAAA,cACA,SAAA,EAAU,sCAAA;AAAA,cAET,QAAA,EAAA,CAAC,4BACAA,cAAAA,CAAC,eAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,IAAM,CAAA,mBAEhDA,eAAC,IAAA,EAAA,EAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,WAE7C;AAAA,UAGD,IAAA,CAAK,sCACJA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,eAAA;AAAA,cACT,SAAA,EAAW,CAAA,0BAAA,EACT,SAAA,GAAY,qBAAA,GAAwB,mBACtC,CAAA,CAAA,CAAA;AAAA,cACA,QAAA,EAAU,SAAA;AAAA,cAEV,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA;AAC7C,SAAA,EAEJ,CAAA;AAAA,QAEC,IAAA,CAAK,mBAAA,IAAuB,CAAC,SAAA,oBAC5BA,cAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,QAAA;AAAA,YACV,SAAA,EAAU,sBAAA;AAAA,YACV,KAAA;AAAA,YAEA,QAAA,kBAAAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAiB,OAAA,EAAS,CAAC,MAAM,CAAA,CAAE,cAAA,IAC9C,QAAA,kBAAAA,cAAAA,CAAC,QAAK,MAAA,EAAQ,EAAE,OAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAA,EAC3C;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ,CAAA;AC3HA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA,GAAiB,CAAA;AAAA,EACjB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA,EAAqB,mBAAA;AAAA,EACrB,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,SAAA,GAAY+B,sCAAA;AAAA,IAChB,KAAA,CAAM,WAAW,EAAC;AAAA,IAClB,KAAA,CAAM;AAAA,GACR;AACA,EAAA,MAAM,YAAA,GAAe,UAAU,UAAA,CAAW,MAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAInC,gBAAoC,IAAI,CAAA;AACxE,EAAA,MAAM,YAAY,GAAA,CAAI,QAAA,KAAA,QAAA;AACtB,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,YAAA,EAAa,EAAG,cAAc,EAAC;AAC7D,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,IAAW,EAAC,EACpC,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CACvB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACzB,EAAA,MAAM,UAAA,GAAaoC,mCAAA,CAAkB,UAAA,EAAY,WAAW,CAAA;AAE5D,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,MAAM,KAAA,GAAQC,8CAAA;AAAA,MACZ,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM;AAAA,MACzB;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAOC,oCAAkB,KAAK,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,SAAA,EAAWC,qCAAmB,KAAK,CAAA;AAAA,MACnC,qBAAA,EAAuB,KAAA,CAAM,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,MAChD,qBAAA,EAAuB;AAAA,KACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,UAAA,CAAW,UAAA,CAAW,IAAI,EAAA,EAAI;AAAA,MAC5B,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,UAAU,CAAA,CAAE;AAAA,KACb,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAqC;AAC5D,IAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,IAAA,IAAI,EAAA,CAAG,YAAY,IAAA,EAAM;AAEzB,IAAA,IAAI,CAAC,EAAE,QAAA,IAAY,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAC1C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CACtB,CAAA,EACA,KAAA,KACG;AACH,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,IAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAClD,IAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAA4C;AACvE,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AACnD,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAChC,IAAA,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,WAAW,OAAO,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA4C;AACnE,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,WAAW,eAAA,CAAgB,OAAA;AACjC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,GAAA,CAAI,EAAA,EAAI;AACtC,IAAA,UAAA,CAAW,QAAA,CAAS;AAAA,MAClB,IAAA,EAAM,eAAA;AAAA,MACN,YAAA,EAAc,QAAA;AAAA,MACd,cAAc,GAAA,CAAI,EAAA;AAAA,MAClB,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAA,CACH,UAAA,CAAW,kBAAA,IAAqB,EAAG,UAAU,CAAA,IAAK,CAAA;AAErD,EAAA,MAAM,QAAA,GAAWV,eAAQ,MAAM;AAC7B,IAAA,MAAM,UAAA,GAAa,WAAA,GAAc,CAAA,GAAI,gBAAA,GAAmB,eAAA;AAExD,IAAA,OAAO,CAAA;AAAA,MAAA,EACH,WAAA,GAAc,sBAAsB,mBAAmB;AAAA,MAAA,EACvD,aAAA,IAAiB,CAAC,SAAA,GAAY,aAAA,GAAgB,EAAE;AAAA,MAAA,EAEhD,SAAA,GACI,8CAAA,GACA,aAAA,GACE,EAAA,GACA,UACR;AAAA,MAAA,EACE,KAAA,GAAQ,8BAA8B,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAG9C,GAAG,CAAC,WAAA,EAAa,eAAe,SAAA,EAAW,WAAA,EAAa,KAAK,CAAC,CAAA;AAE9D,EAAA,uBACErB,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,eAAA,EAAemC,kCAAA,CAAiB,KAAA,EAAO,cAAc,CAAA;AAAA,QACrD,SAAA,EAAW,QAAA;AAAA,QACX,cAAY,GAAA,CAAI,EAAA;AAAA,QAChB,sBAAA,EAAsB,GAAA,CAAI,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,QAC7C,WAAA,EAAW,GAAA,CAAI,OAAA,GAAU,IAAA,GAAO,MAAA;AAAA,QAChC,KAAA,EAAO,aAAA,GAAgB,EAAE,kBAAA,EAAoB,IAAG,GAAI,MAAA;AAAA,QACpD,SAAA,EAAW,CAAC,GAAA,CAAI,OAAA;AAAA,QAChB,aAAa,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,IAAI,EAAE,CAAA;AAAA,QAC7C,UAAA,EAAY,mBAAA;AAAA,QACZ,MAAA,EAAQ,eAAA;AAAA,QACR,OAAA,EAAS,cAAA;AAAA,QACT,aAAA,EAAe,eAAA;AAAA,QAEf,QAAA,kBAAAnC,cAAAA;AAAA,UAACoC,mCAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,SAAA;AAAA,YACR,aAAA,EAAc,IAAA;AAAA,YACd,UAAA,EAAW,cAAA;AAAA,YACX,YAAA,EAAc,CAAC,CAAA,EAAG,gBAAA,KAAqB;AACvC,cAAA,MAAM,GAAA,GAAMC,oCAAA;AAAA,gBACV,CAAA;AAAA,gBACA,SAAA,CAAU,eAAA;AAAA,gBACV,SAAA,CAAU;AAAA,eACZ;AACA,cAAA,MAAM,IAAA,GAAqB;AAAA,gBACzB,GAAG,CAAA;AAAA,gBACH,kBAAA,EAAoB,EAAE,kBAAA,IAAsB,IAAA;AAAA,gBAC5C,kBAAA,EAAoB,EAAE,kBAAA,IAAsB,IAAA;AAAA,gBAC5C,gBAAA,EAAkB,EAAE,gBAAA,IAAoB,IAAA;AAAA,gBACxC,mBAAA,EAAqB,EAAE,mBAAA,IAAuB;AAAA,eAChD;AAEA,cAAA,IAAI,IAAI,OAAA,EAAS;AACf,gBAAA,MAAMC,WAAAA,GAAa,cAAA,CAAe,CAAA,CAAE,SAAS,CAAA;AAC7C,gBAAA,uBACEtC,cAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,UAAA;AAAA,oBACL,eAAA,EAAeuC,+BAAa,gBAAgB,CAAA;AAAA,oBAC5C,SAAA,EAAW,qCAAqC,GAAA,CAAI,SAAS,IAAID,WAAAA,CAAW,SAAS,GAAG,IAAA,EAAK;AAAA,oBAC7F,iBAAe,CAAA,CAAE,SAAA;AAAA,oBACjB,oBAAA,EAAoB,KAAA;AAAA,oBACpB,oBAAA,EAAoB,gBAAA;AAAA,oBACpB,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,oBACxC,qBAAA,EAAqBA,YAAW,qBAAqB,CAAA;AAAA,oBACrD,qBAAA,EAAqBA,YAAW,qBAAqB,CAAA;AAAA,oBACrD,KAAA,EAAO,EAAE,GAAGE,iCAAA,CAAgB,CAAA,EAAG,KAAA,CAAM,YAAA,EAAc,SAAA,CAAU,YAAY,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA,EAAM;AAAA,oBAEzF,QAAA,kBAAAxC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,mBAAA,EAAiB,IAAA,EACjD,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,CAAA,EAC1C;AAAA,mBAAA;AAAA,kBAdK,CAAA,CAAE;AAAA,iBAeT;AAAA,cAEJ;AAEA,cAAA,IAAI,CAAA,CAAE,SAAA,KAAc,OAAA,IAAW,CAAA,CAAE,cAAc,OAAA,EAAS;AACtD,gBAAA,MAAMsC,WAAAA,GAAa,cAAA,CAAe,CAAA,CAAE,SAAS,CAAA;AAC7C,gBAAA,uBACEG,oBAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,eAAA,EAAeF,+BAAa,gBAAgB,CAAA;AAAA,oBAC3C,GAAGG,+BAAa,QAAA,EAAU,GAAA,CAAI,IAAI,CAAA,CAAE,SAAA,EAAW,MAAM,UAAU,CAAA;AAAA,oBAChE,SAAA,EAAW,qCAAqC,GAAA,CAAI,SAAS,IAAIJ,WAAAA,CAAW,SAAS,GAAG,IAAA,EAAK;AAAA,oBAC7F,KAAK,CAAA,CAAE,SAAA;AAAA,oBACP,iBAAe,CAAA,CAAE,SAAA;AAAA,oBACjB,oBAAA,EAAoB,KAAA;AAAA,oBACpB,oBAAA,EAAoB,gBAAA;AAAA,oBACpB,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,oBACxC,qBAAA,EAAqBA,YAAW,qBAAqB,CAAA;AAAA,oBACrD,qBAAA,EAAqBA,YAAW,qBAAqB,CAAA;AAAA,oBACrD,KAAA,EAAO,EAAE,GAAGE,iCAAA,CAAgB,CAAA,EAAG,KAAA,CAAM,YAAA,EAAc,SAAA,CAAU,YAAY,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA;AAAM,mBAAA;AAAA,kCAEzFxC,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,KAAA;AAAA,sBACL,QAAA;AAAA,sBACA,GAAA;AAAA,sBACA,UAAA;AAAA,sBACA;AAAA;AAAA;AACF,iBACF;AAAA,cAEJ;AAEA,cAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAA,CAAE,SAAS,CAAA;AAC7C,cAAA,MAAM,iBACJ,UAAA,EAAY,QAAA,KAAa,KAAA,IACzB,UAAA,CAAW,UAAU,CAAA,CAAE,SAAA;AACzB,cAAA,uBACEG,eAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,UAAA;AAAA,kBACL,eAAA,EAAeoC,+BAAa,gBAAgB,CAAA;AAAA,kBAC3C,GAAGG,+BAAa,QAAA,EAAU,GAAA,CAAI,IAAI,CAAA,CAAE,SAAA,EAAW,MAAM,UAAU,CAAA;AAAA,kBAChE,SAAA,EAAW,8CAA8C,GAAA,CAAI,SAAS,IAAI,UAAA,CAAW,SAAS,GAAG,IAAA,EAAK;AAAA,kBACtG,iBAAe,CAAA,CAAE,SAAA;AAAA,kBACjB,oBAAA,EAAoB,KAAA;AAAA,kBACpB,oBAAA,EAAoB,gBAAA;AAAA,kBACpB,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,kBACxC,qBAAA,EAAqB,WAAW,qBAAqB,CAAA;AAAA,kBACrD,qBAAA,EAAqB,WAAW,qBAAqB,CAAA;AAAA,kBACrD,KAAA,EAAO,EAAE,GAAGF,iCAAA,CAAgB,CAAA,EAAG,KAAA,CAAM,YAAA,EAAc,SAAA,CAAU,YAAY,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA,EAAM;AAAA,kBAEzF,QAAA,EAAA;AAAA,oCAAAxC,cAAAA;AAAA,sBAAC,YAAA;AAAA,sBAAA;AAAA,wBACC,GAAA,EAAK,gBAAA;AAAA,wBACL,QAAA;AAAA,wBACA,GAAA;AAAA,wBACA,UAAU,CAAA,CAAE,SAAA;AAAA,wBACZ,IAAA;AAAA,wBACA,UAAA;AAAA,wBACA,QAAA,EAAU,EAAA;AAAA,wBACV,IAAA,EAAK;AAAA;AAAA,qBACP;AAAA,oBACC,cAAA,mBAAiBA,cAAAA,CAAC,UAAA,EAAA,EAAW,YAAwB,CAAA,GAAK;AAAA;AAAA,iBAAA;AAAA,gBAvBtD,CAAA,CAAE;AAAA,eAwBT;AAAA,YAEF;AAAA;AAAA;AACF;AAAA,KACF;AAAA,IAEC,IAAI,UAAA,oBACHA,eAAC,IAAA,EAAA,EAAG,IAAA,EAAK,OACP,QAAA,kBAAAA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,eAAA,EAAe,CAAA;AAAA,QACf,cAAA,EAAc,YAAA;AAAA,QAEb,gDACCA,cAAAA,CAAC,mBAAA,EAAA,EAAoB,IAAA,EAAM,KAAK,CAAA,mBAEhCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8FAAA,EACb,QAAA,kBAAAG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,UAAO,MAAA,EAAQ,EAAC,OAAO,EAAA,EAAI,MAAA,EAAQ,IAAE,EAAG,CAAA;AAAA,0BACzCA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EACb,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA,KAEJ,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,cAAc0B,uBAAAA,CAAM,IAAA,CAAK,oBAAA,EAAsB,CAAC,MAAM,IAAA,KAAS;AAC1E,EAAA,OACE,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,GAAA,IAClB,KAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IACpB,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,WAAA,IAC1B,IAAA,CAAK,eAAe,IAAA,CAAK,UAAA,IACzB,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,IACvB,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,IACzB,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,IACvB,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,SACpB,IAAA,CAAK,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,KAAA,CAAM,OAAA,IAClC,IAAA,CAAK,KAAA,CAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,YAAA,IACvC,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,KAAA,KAAU,IAAA,CAAK,MAAM,UAAA,EAAY,KAAA,IACxD,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,QAAA,KAAa,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,IAC3D,IAAA,CAAK,KAAA,CAAM,UAAA,KAAe,IAAA,CAAK,KAAA,CAAM,UAAA,IACrC,IAAA,CAAK,wBAAwB,IAAA,CAAK,mBAAA;AAEtC,CAAC,CAAA;AC/TD,IAAM,mBAAmBA,uBAAAA,CAAM,IAAA;AAAA,EAAK,MAClC,OAAO,iCAAoB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,gBAAA,EAAiB,CAAE;AAC5E,CAAA;AAUO,SAAS,YAAA,CAAa;AAAA,EAC3B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,GAAiB;AACnB,CAAA,EAAU;AACR,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,SAAA,GAAY9B,cAAsB,IAAI,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,YAAY,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AACxD,EAAA,MAAM,cAAc,SAAA,GAChB,IAAA,GACA,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA;AAAA,IACR,CAAC,CAAA,EAAG,CAAA,KACF,MAAA,CAAO,CAAA,CAAE,MAAM,OAAO,CAAA,EAAG,KAAA,IAAS,CAAC,IACnC,MAAA,CAAO,CAAA,CAAE,MAAM,OAAO,CAAA,EAAG,SAAS,CAAC;AAAA,GACvC;AAEJ,EAAA,uBACEI,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EAAiC,MAAK,UAAA,EACrD,QAAA,kBAAAA,cAAAA,CAACQ,eAAAA,EAAA,EAAS,QAAA,EAAU,IAAA,EACjB,sBAAY,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC/B,IAAA,MAAM,WACJ,KAAA,GAAA,CAAS,KAAA,CAAM,WAAW,IAAA,GAAO,CAAA,IAAK,MAAM,UAAA,CAAW,QAAA;AACzD,IAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAC3B,MAAA,uBACER,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,KAAA,EAAO,QAAA;AAAA,UACP,cAAA;AAAA,UACA,KAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAY,CAAC,CAAC,KAAA,CAAM,YAAA,GAAe,IAAI,EAAE,CAAA;AAAA,UACzC,UAAU,CAAC,CAAC,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE;AAAA,SAAA;AAAA,QARpC,GAAA,CAAI;AAAA,OASX;AAAA,IAEJ;AACA,IAAA,uBACEA,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,GAAA;AAAA,QACA,WAAA,EAAa,KAAA;AAAA,QACb,KAAA,EAAO,QAAA;AAAA,QACP,cAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA,EAAiB,SAAA;AAAA,QACjB,mBAAA,EAAqB,mBAAA;AAAA,QACrB,YAAY,CAAC,CAAC,KAAA,CAAM,YAAA,GAAe,IAAI,EAAE,CAAA;AAAA,QACzC,UAAU,CAAC,CAAC,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,QACzC,OAAO,CAAC,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,EAAE;AAAA,OAAA;AAAA,MAZ9B,GAAA,CAAI;AAAA,KAaX;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ;AC9CA,IAAM,mBAAA,GAAsC,CAAC,EAAE,EAAA,EAAI,WAAW,CAAA;AAE9D,SAAS,iBAAA,CACP,QACA,UAAA,EACuB;AACvB,EAAA,IAAI,OAAO,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,MAAM,OAAO,IAAA;AAC3D,EAAA,IAAI,cAAc,UAAA,CAAW,MAAA,GAAS,GAAG,OAAO,CAAC,GAAG,UAAU,CAAA;AAC9D,EAAA,OAAO,mBAAA;AACT;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,UAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA,GAAiB,CAAA;AAAA,EACjB,iBAAA,GAAoB;AACtB,CAAA,EAAU;AACR,EAAA,MAAM,SAASiB,2BAAA,EAAU;AACzB,EAAA,MAAM,IAAIlB,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,eAAAA,CAAkC,EAAE,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,IAAA,GAAO6B,cAAAA;AAAA,IACX,MAAM,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC1C,CAAC,QAAQ,UAAU;AAAA,GACrB;AAEA,EAAA3B,iBAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,WAAW,YAAA,EAAa;AACrC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,IAAA,IAAI,UAAA,CAAW,eAAc,EAAG;AAI9B,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,KAAK,OAAO,kCAAqB,CAAA,CAAE,KAAK,CAAC,EAAE,sBAAqB,KAAM;AACpE,QAAA,IAAI,CAAC,WAAW,GAAA,GAAM,oBAAA,CAAqB,YAAY,IAAA,CAAK,OAAA,IAAW,EAAC,EAAG,OAAO,CAAA;AAAA,MACpF,CAAC,CAAA;AACD,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,GAAA,IAAM;AAAA,MACR,CAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,UAAA,CAAW,eAAe,CAAA;AAClC,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,mBAAA,CAAoB,OAAO,CAAA;AAC1D,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,IAAc;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA;AAErB,EAAA,MAAM,SAAA,GAAYiC,sCAAA;AAAA,IAChB,KAAA,EAAO,WAAW,EAAC;AAAA,IACnB,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,SAAS,OAAO,IAAA;AACrC,EAAA,IAAI,OAAO,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,IAAA,EAAM;AAClD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAC5D,IAAA,MAAM,OAAO,cAAA,CAAe,MAAA;AAC5B,IAAA,MAAM,cAAA,GAAiBa,oCAAA;AAAA,MACrB,YAAA,IAAgB,MAAM,UAAA,CAAW,SAAA;AAAA,MACjC,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,uBACE3C,eAAC,OAAA,EAAA,EAAM,IAAA,EAAK,YAAW,SAAA,EAAU,kBAAA,EAAmB,iBAAA,EAAgB,EAAA,EAClE,QAAA,kBAAAA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,eAAA,EAAe,cAAA;AAAA,QACf,SAAA,EAAW,CAAA,0DAAA,CAAA;AAAA,QAEX,QAAA,kBAAAA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,eAAA,EAAe,CAAA;AAAA,YACf,cAAA,EAAc,IAAA;AAAA,YAEb,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,YAAA,GAAe2C,oCAAA;AAAA,IACnB,YAAA,IAAgB,MAAM,UAAA,CAAW,SAAA;AAAA,IACjC,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE3C,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,YAAW,SAAA,EAAU,kBAAA,EAAmB,iBAAA,EAAgB,EAAA,EACjE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,8BACjBA,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,KAAA;AAAA,MACL,iBAAe,YAAA,GAAe,SAAA;AAAA,MAC9B,uBAAqB,MAAA,CAAO,EAAA;AAAA,MAC5B,SAAA,EAAW,CAAA,2DAAA,CAAA;AAAA,MAEX,QAAA,kBAAAA,cAAAA;AAAA,QAACoC,mCAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,SAAA;AAAA,UACR,aAAA,EAAc,IAAA;AAAA,UACd,UAAA,EAAW,cAAA;AAAA,UACX,YAAA,EAAc,CAAC,CAAA,EAAG,KAAA,KAAU;AAC1B,YAAA,MAAM,GAAA,GAAMC,oCAAA;AAAA,cACV,CAAA;AAAA,cACA,SAAA,CAAU,eAAA;AAAA,cACV,SAAA,CAAU;AAAA,aACZ;AACA,YAAA,IAAI,OAAA,GAA2B,IAAA;AAC/B,YAAA,IAAIO,+BAAA,CAAc,CAAC,CAAA,EAAG;AACpB,cAAA,OAAA,GACE,OAAO,KAAA,KACN,MAAA,CAAO,OAAO,KAAA,IAAS,MAAA,CAAO,OAAO,SAAA,GAClC,CAAA,CAAE,qBAAqB,CAAA,GACvB,MAAA,CAAO,OAAO,KAAA,GACZ,CAAA,CAAE,mBAAmB,CAAA,GACpB,MAAA,CAAO,SAAS,MAAA,CAAO,EAAA,CAAA;AAAA,YAClC,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AACzB,cAAA,MAAM,QAAQ,UAAA,CAAW,iBAAA;AAAA,gBACvB,CAAA,CAAE,SAAA;AAAA,gBACF,MAAA,CAAO;AAAA,eACT;AACA,cAAA,OAAA,GACE,SAAS,IAAA,GACL,IAAA,GACA,YAAY,KAAA,EAAO,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,YAC9C,CAAA,MAAO;AACL,cAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA;AAC9B,cAAA,OAAA,GACE,SAAS,IAAA,GACL,IAAA,GACA,YAAY,KAAA,EAAO,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,YAC9C;AACA,YAAA,uBACE5C,cAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,UAAA;AAAA,gBACL,eAAA,EAAeuC,+BAAa,KAAK,CAAA;AAAA,gBACjC,WAAW,GAAA,CAAI,SAAA;AAAA,gBACf,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,gBACxC,KAAA,EAAO;AAAA,kBACL,GAAGC,iCAAA;AAAA,oBACD,CAAA;AAAA,oBACA,KAAA,CAAM,YAAA;AAAA,oBACN,SAAA,CAAU;AAAA,mBACZ;AAAA,kBACA,GAAG,GAAA,CAAI;AAAA,iBACT;AAAA,gBAEC,QAAA,EAAA;AAAA,eAAA;AAAA,cAdI,CAAA,CAAE;AAAA,aAeT;AAAA,UAEJ;AAAA;AAAA;AACF,KAAA;AAAA,IA7DK,MAAA,CAAO;AAAA,GA+Df,CAAA,EACH,CAAA;AAEJ;;;AC/LO,SAAS,oBAAA,CACd,OAAA,EACA,WAAA,EACA,SAAA,EACmD;AACnD,EAAA,MAAM,cAAc,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,WAAW,CAAA;AACxE,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AACpE,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,SAAA,GAAY,CAAA,IAAK,gBAAgB,SAAA,EAAW;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,QAAQ,SAAS,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM,OAAO,IAAA;AAC7B,EAAA,IAAII,gCAAc,MAAM,CAAA,IAAKA,+BAAA,CAAc,IAAI,GAAG,OAAO,IAAA;AACzD,EAAA,OAAO,EAAE,aAAa,SAAA,EAAU;AAClC;;;ACqBO,SAAS,uBACd,IAAA,EAC8B;AAC9B,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,MAAA,IAAU,IAAA;AAChE;AAEO,SAAS,mBAAmB,MAAA,EAA+B;AAChE,EAAA,MAAM,EAAA,GAAKC,kCAAgB,MAAM,CAAA;AACjC,EAAA,OAAO,EAAA,IAAM,IAAA;AACf;AAQO,SAAS,sBAAA,CACd,QACA,WAAA,EACS;AACT,EAAA,IAAI,CAACC,wCAAA,CAAuB,MAAM,CAAA,EAAG,OAAO,KAAA;AAC5C,EAAA,OAAO,CAAC,WAAA,IAAe,MAAA,CAAO,SAAA,EAAW,QAAA,KAAa,IAAA;AACxD;AAEO,SAAS,wBAAA,CACd,QACA,WAAA,EACS;AACT,EAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,GAAA,GAAM,OAAO,SAAA,EAAW,MAAA;AAC9B,EAAA,OAAO,GAAA,IAAO,QAAQ,GAAA,KAAQ,KAAA;AAChC;AAEO,SAAS,4BACd,GAAA,EACqB;AACrB,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,UAAA,EAAY,UAAA,EAAY,WAAW,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI,GAAA,CAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACvC,EAAA,IAAI,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACzC,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,WAAW,CAAA;AAAA,EACzD;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,YAAY,cAAc,CAAA;AACrC,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,sBAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACqB;AACrB,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,KAAgB,IAAA;AAC7C,EAAA,MAAM,GAAA,GAA8B;AAAA,IAElC,QAAA,EAAU,sBAAA,CAAuB,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpD,UAAA,EAAY,wBAAA,CAAyB,MAAA,EAAQ,WAAW,CAAA;AAAA,IACxD,QAAA,EAAU,CAACF,+BAAA,CAAc,MAAM,CAAA;AAAA,IAC/B,QAAA,EAAU,CAACA,+BAAA,CAAc,MAAM;AAAA,GACjC;AACA,EAAA,MAAM,QAAA,GAAW,4BAA4B,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,QAAQ,OAAO,QAAA;AACpB,EAAA,IAAI,OAAO,MAAA,KAAW,UAAA,EAAY,OAAO,OAAO,QAAQ,CAAA;AACxD,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,EAAA,EAAiC;AACtE,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,SAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,uBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,yBAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEO,SAAS,sBAAA,CACd,OAAA,EACA,KAAA,EACA,MAAA,EAC2C;AAC3C,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAA;AACjC;AC9IO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,4BAAA,GAA+B;AAGrC,SAAS,qBAAA,GAAgC;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIjD,gBAAS,CAAC,CAAA;AAC1C,EAAAE,iBAAU,MAAM;AACd,IAAA,MAAM,OAAO,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAC,qBAAA,EAAuB,4BAA4B,CAAA;AAClE,IAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,KAAM,OAAO,gBAAA,CAAiB,CAAA,EAAG,IAAI,CAAC,CAAA;AACrD,IAAA,OAAO,MAAM,MAAM,OAAA,CAAQ,CAAC,MAAM,MAAA,CAAO,mBAAA,CAAoB,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,QAAA;AACT;;;ACNO,SAAS,iBAAA,CACd,UAAA,EACA,QAAA,EACA,KAAA,EACmB;AACnB,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAC;AAEhB,EAAA,OAAO,UAAA,CAAW,uBAAA,CAAwB,QAAA,EAAU,CAAC,CAAA;AACvD;AAGO,SAAS,yBAAA,CACd,YACA,KAAA,EACQ;AACR,EAAA,OAAO,UAAA,CAAW,sBAAsB,KAAK,CAAA;AAC/C;AAEO,SAAS,0BAAA,CACd,aAAA,EACA,SAAA,EACA,YAAA,EACQ;AACR,EAAA,IAAI,aAAA,GAAgB,GAAG,OAAO,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,GAAgB,YAAY,IAAI,CAAA;AACrD;AAEO,SAAS,oBACd,QAAA,EACoB;AACpB,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnE,EAAA,OAAO,QAAA,CAAS,aAAA;AAAA,IACd,+CAA+C,OAAO,CAAA,EAAA;AAAA,GACxD;AACF;AAEO,SAAS,oBAAoB,EAAA,EAAiC;AACnE,EAAA,OAAO,EAAA,EAAI,QAAQ,iBAAA,KAAsB,IAAA;AAC3C;AAEA,SAAS,aAAA,CACP,YACA,KAAA,EACe;AACf,EAAA,MAAM,aAAA,GAAgB,yBAAA,CAA0B,UAAA,EAAY,KAAK,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,aAAA,GAAgB,CAAA,EAAG,OAAO,IAAA;AAExC,EAAA,OAAO,KAAK,IAAA,CAAA,CAAM,aAAA,GAAgB,CAAA,IAAK,KAAA,CAAM,WAAW,QAAQ,CAAA;AAClE;AAKA,eAAsB,SAAA,CACpB,YACA,KAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,QAAA,GAAW,WAAW,WAAA,EAAY;AACxC,EAAA,MAAM,UAAA,GAAa,oBAAoB,QAAQ,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,WAAW,UAAA,EAAW;AAEtC,EAAA,IAAI,mBAAA,CAAoB,UAAU,CAAA,IAAK,OAAA,EAAS;AAC9C,IAAA,MAAM,aAAA,GAAgB,yBAAA,CAA0B,UAAA,EAAY,KAAK,CAAA;AACjE,IAAA,IAAI,gBAAgB,CAAA,EAAG;AAEvB,IAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,IAAA,MAAM,YAAA,GAAe,0BAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAA,CAAS,SAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AAEA,IAAA,MAAM,QAAQ,kBAAA,CAAmB;AAAA,MAC/B,IAAA,EAAM,iBAAA;AAAA,MACN,YAAA;AAAA,MACA,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,UAAU,QAAA,CAAS;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,SAAA,GAAY,YAAA;AAAA,IACzB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAA,CAAW,iBAAgB,EAAG;AAGhC,IAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAM,OAAO,4BAAe,CAAA;AACzD,IAAA,UAAA,GAAa,MAAM,gBAAA,CAAiB,UAAA,EAAY,KAAA,EAAO,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,EAClF,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,aAAA,CAAc,YAAY,KAAK,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAA,KAAS,UAAA,EAAY;AACxC,IAAA,MAAM,WAAW,QAAA,CAAS,EAAE,MAAM,aAAA,EAAe,IAAA,EAAM,YAAY,CAAA;AAAA,EACrE;AACF;AAEA,eAAsB,eAAA,CACpB,YACA,KAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,SAAA,CAAU,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA;AACvC,EAAA,MAAM,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AACzE;;;ACtGO,SAAS,sBAAA,CACd,MACA,UAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY,OAAO,MAAA;AACjC,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,OAAO,OAAO,MAAA,KAAW,UAAA,GAAa,MAAA,GAAS,MAAA;AACjD;ACJA,IAAM,QAAA,GAA2B;AAAA,EAC/B,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,UAAA,GAA+B;AAAA,EACnC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,QAAA,GAA2B;AAAA,EAC/B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,UAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACa;AACb,EAAA,MAAM,GAAA,GAAoC,EAAE,GAAG,KAAA,EAAM;AACrD,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,GAAA,CAAI,KAAK,CAAA;AAAA,OAC7B,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA;AAClB,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,IAAIE,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIJ,eAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWC,cAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA;AAC5C,EAAA,MAAM,YAAYK,qCAAA,CAAoB;AAAA,IACpC,QAAA,EAAU,OAAA;AAAA,IACV,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAAJ,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,SAAA,CAAU,OAAA,EAAS;AACjC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,IAAA,MAAA,CAAO,EAAE,KAAK,IAAA,CAAK,MAAA,GAAS,GAAG,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACzC,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACxC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,IAAA,EAAM,YAAA,EAAc,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,YAAA,GAAe2B,eAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,KAAA,SAAc,EAAC;AACrC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,EAAW,IAAK,EAAC;AACzC,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,KAAK,CAAA;AACtC,IAAA,OAAOuB,2CAAA,CAA0B,GAAA,EAAK,MAAA,CAAO,SAAA,EAAW;AAAA,MACtD,QAAA,EAAU,CAAC,KAAA,EAAO,KAAA,KAChB,UAAA,CAAW,QAAQ,KAAA,EAAO,KAAK,CAAA,EAAG,QAAA,EAAS,IAAK;AAAA,KACnD,CAAA;AAAA,EACH,GAAG,CAAC,IAAA,EAAM,MAAM,UAAA,EAAY,MAAA,CAAO,SAAS,CAAC,CAAA;AAE7C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAErD,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA8B;AAC3C,IAAA,UAAA,CAAW,eAAe,UAAA,CAAW,WAAA,EAAa,MAAA,CAAO,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,UAAA,GAAa,CAAA,OAAA,EAAU,UAAU,KAAK,IAAA,IAAQ,QAAA;AAElE,EAAA,OAAO3C,qBAAAA;AAAA,oBACLD,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,oBAAA;AAAA,QACV,yBAAA,EAAyB,WAAA;AAAA,QACzB,uBAAqB,MAAA,CAAO,SAAA;AAAA,QAC5B,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,QAC9B,KAAA,EAAO,SAAA;AAAA,QAEN,QAAA,EAAA;AAAA,UAAA,eAAA,mBACCH,cAAAA,CAAC,KAAA,EAAA,EAAI,wBAAA,EAAwB,YAC1B,QAAA,EAAA,eAAA,CAAgB;AAAA,YACf,MAAA;AAAA,YACA,OAAO,MAAA,CAAO,SAAA;AAAA,YACd,WAAA;AAAA,YACA,OAAA;AAAA,YACA,MAAA,EAAQ,YAAA;AAAA,YACR,UAAA;AAAA,YACA,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,cAAA,KAAA,CAAM,IAAI,CAAA;AACV,cAAA,YAAA,CAAa,KAAK,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,KAAA,EAAO,MAAM,YAAA,CAAa,KAAK;AAAA,WAChC,GACH,CAAA,GACE,IAAA;AAAA,UACH,CAAC,eAAA,IAAmB,IAAA,KAAS,MAAA,mBAC5BA,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,KAAA,CAAM,CAAC,CAAA;AACP,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM,IAAI,CAAA;AACV,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB;AAAA;AAAA,WACF,GACE,IAAA;AAAA,UACH,CAAC,eAAA,IAAmB,IAAA,KAAS,QAAA,mBAC5BA,cAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,KAAA,CAAM,CAAC,CAAA;AACP,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM,IAAI,CAAA;AACV,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB;AAAA;AAAA,WACF,GACE,IAAA;AAAA,UACH,CAAC,eAAA,IAAmB,IAAA,KAAS,MAAA,mBAC5BA,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,KAAA,CAAM,CAAC,CAAA;AACP,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM,IAAI,CAAA;AACV,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB;AAAA;AAAA,WACF,GACE,IAAA;AAAA,UACH,CAAC,eAAA,IAAmB,IAAA,KAAS,SAAA,mBAC5BA,cAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,KAAA,CAAM,CAAC,CAAA;AACP,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM,IAAI,CAAA;AACV,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB;AAAA;AAAA,WACF,GACE,IAAA;AAAA,UACH,CAAC,eAAA,IAAmB,IAAA,KAAS,KAAA,mBAC5BA,cAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,YAAA;AAAA,cACR,OAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,KAAA,CAAM,CAAC,CAAA;AACP,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,KAAA,CAAM,IAAI,CAAA;AACV,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB;AAAA;AAAA,WACF,GACE;AAAA;AAAA;AAAA,KACN;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,UACJ,OAAA,IAAW,YAAA,IAAgB,WAAW,OAAA,CAAQ,UAAA,KAAe,SACzD,OAAA,GACA,IAAA;AACN,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIJ,eAAAA,CAAuB,OAAA,EAAS,QAAQ,UAAU,CAAA;AAC1E,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAIA,gBAAS,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,EAAE,CAAC,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,UAAA;AAEhD,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,UAAA,EAAY,MAAA;AAAA,UACZ,IAAA;AAAA,UACA,MAAA,EAAQ,aAAa,MAAA,GAAS;AAAA,SAC/B,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAqB,CAAA;AAAA,YACvD,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,YAE7B,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACbA,cAAAA,CAAC,QAAA,EAAA,EAAgB,KAAA,EAAO,EAAA,EACrB,QAAA,EAAA,EAAA,EAAA,EADU,EAEb,CACD;AAAA;AAAA,SACH;AAAA,QACC,6BACCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzC,uBAAA,EAAsB;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,wBACJG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,gBAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EACvD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,UACJ,OAAA,IAAW,YAAA,IAAgB,WAAW,OAAA,CAAQ,UAAA,KAAe,WACzD,OAAA,GACA,IAAA;AACN,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIJ,eAAAA,CAAyB,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAC1E,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAIA,gBAAS,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,EAAE,CAAC,CAAA;AAClE,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,gBAAS,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,EAAE,CAAC,CAAA;AACxE,EAAA,MAAM,aAAa,IAAA,KAAS,OAAA;AAC5B,EAAA,MAAM,UAAU,IAAA,KAAS,SAAA;AAEzB,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,UAAA,EAAY,QAAA;AAAA,UACZ,IAAA;AAAA,UACA,MAAA,EAAQ,aAAa,MAAA,GAAS,MAAA;AAAA,UAC9B,QAAA,EAAU,UAAU,QAAA,GAAW;AAAA,SAChC,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAuB,CAAA;AAAA,YAExD,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,qBACfA,cAAAA,CAAC,QAAA,EAAA,EAAgB,KAAA,EAAO,EAAA,EACrB,QAAA,EAAA,EAAA,EAAA,EADU,EAEb,CACD;AAAA;AAAA,SACH;AAAA,QACC,6BACCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzC,uBAAA,EAAsB;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,QACH,0BACCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,uBAAA,EAAsB;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,wBACJG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,gBAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EACvD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,UACJ,OAAA,IAAW,YAAA,IAAgB,WAAW,OAAA,CAAQ,UAAA,KAAe,SACzD,OAAA,GACA,IAAA;AACN,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIJ,eAAAA,CAAuB,OAAA,EAAS,QAAQ,QAAQ,CAAA;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAAA;AAAA,IAC9B,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,OAAA,EAAS,UAAU,EAAE;AAAA,GACnD;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAAA;AAAA,IAC1B,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,OAAA,EAAS,YAAY,EAAE;AAAA,GACnD;AACA,EAAA,MAAM,YAAY,IAAA,KAAS,OAAA;AAC3B,EAAA,MAAM,UAAU,IAAA,KAAS,SAAA;AAEzB,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,UAAA,EAAY,MAAA;AAAA,UACZ,IAAA;AAAA,UACA,QAAA,EAAU,YAAY,QAAA,GAAW,MAAA;AAAA,UACjC,MAAA,EAAQ,UAAU,MAAA,GAAS;AAAA,SAC5B,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAqB,CAAA;AAAA,YAEtD,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACbA,cAAAA,CAAC,QAAA,EAAA,EAAgB,KAAA,EAAO,EAAA,EACrB,QAAA,EAAA,EAAA,EAAA,EADU,EAEb,CACD;AAAA;AAAA,SACH;AAAA,QACC,4BACCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,uBAAA,EAAsB;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,QACH,0BACCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzC,uBAAA,EAAsB;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,wBACJG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,gBAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EACvD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,OAAA,GACJ,WAAW,YAAA,IAAgB,OAAA,IAAW,QAAQ,UAAA,KAAe,SAAA,GACzD,QAAQ,IAAA,GACR,KAAA;AACN,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,gBAA0B,OAAO,CAAA;AAEzD,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,MACzC,CAAA;AAAA,MAEE,QAAA,EAAA;AAAA,QAAA,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,CAAY,GAAA,CAAI,CAAC,EAAA,qBACxCA,eAAAA,CAAC,OAAA,EAAA,EAAe,SAAA,EAAU,kBAAA,EACxB,QAAA,EAAA;AAAA,0BAAAH,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,aAAA;AAAA,cACL,SAAS,IAAA,KAAS,EAAA;AAAA,cAClB,QAAA,EAAU,MAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,cAC1B,uBAAA,EAAuB,WAAW,EAAE,CAAA;AAAA;AAAA,WACtC;AAAA,UACC;AAAA,SAAA,EAAA,EARS,EASZ,CACD,CAAA;AAAA,wBACDG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,gBAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EACvD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,OAAA,GACJ,OAAA,IAAW,YAAA,IAAgB,OAAA,IAAW,OAAA,CAAQ,UAAA,KAAe,KAAA,GACzD,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA,GAClD,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,gBAAS,OAAO,CAAA;AAEhD,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,CAAQ;AAAA,UACN,UAAA,EAAY,KAAA;AAAA,UACZ,IAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAC;AAAA,SAC3D,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,uBAAA,EAAsB,OACxD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA;AAC1B,UAAA,MAAM,QAAQ,CAAA,IAAK,IAAA,IAAQ,MAAM,EAAA,GAAK,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1D,UAAA,uBACEG,eAAAA,CAAC,OAAA,EAAA,EAA0B,SAAA,EAAU,kBAAA,EACnC,QAAA,EAAA;AAAA,4BAAAH,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,gBACzB,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,oBAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,oBAAA,IAAI,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,yBAC7B,IAAA,CAAK,OAAO,GAAG,CAAA;AACpB,oBAAA,OAAO,IAAA;AAAA,kBACT,CAAC,CAAA;AAAA,gBACH;AAAA;AAAA,aACF;AAAA,YACC;AAAA,WAAA,EAAA,EAbS,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAcvB,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,wBACAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,gBAAA,EAC7B,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EACvD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACrhBA,SAAS,YAAA,CACP,OAAA,EACA,YAAA,EACA,YAAA,EACQ;AACR,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ;AAClC,IAAA,MAAM,IAAA,GAAOwC,iCAAA,CAAgB,GAAA,EAAK,YAAA,EAAc,YAAY,CAAA;AAC5D,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA;AAAA,EACpB,GAAG,CAAC,CAAA;AACN;AAEA,SAAS,gBACP,IAAA,EACA,OAAA,EACA,YAAA,EACA,YAAA,EACA,eACA,gBAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,EAAS,YAAA,EAAc,YAAY,CAAA;AAC9D,EAAA,uBACExC,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,cAAA;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,gBAAc,IAAA,CAAK,OAAA;AAAA,MACnB,sBAAoB,IAAA,CAAK,OAAA;AAAA,MACzB,SAAA,EAAU,+FAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAAA,MAChC,SAAA,EAAW,QAAQ,gBAAgB,CAAA;AAAA,MACnC,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,QAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,IAAA,CAAK,OAAO,CAAA;AACjD,QAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAC/B,QAAA,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAAA,MAChD,CAAA;AAAA,MAEA,QAAA,kBAAAG,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,qDAAA;AAAA,UACV,eAAA,EAAe,CAAC,IAAA,CAAK,SAAA;AAAA,UACrB,YAAA,EAAY,IAAA,CAAK,SAAA,GAAY,cAAA,GAAiB,gBAAA;AAAA,UAC9C,kBAAA,EAAgB,IAAA;AAAA,UAChB,OAAA,EAAS,MAAM,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA;AAAA,UAEzC,QAAA,EAAA;AAAA,4BAAAH,eAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAE,QAAA,EAAA,IAAA,CAAK,SAAA,GAAY,WAAM,QAAA,EAAI,CAAA;AAAA,4BAC9CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,UAAA,EAAW;AAAA;AAAA;AAAA;AACzB,KAAA;AAAA,IAzBK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA;AAAA,GA0BpC;AAEJ;AAEA,SAAS,mBACP,WAAA,EACA,KAAA,EACA,UACA,YAAA,EACA,YAAA,EACA,eACA,gBAAA,EACmB;AACnB,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC5D,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,KAAK,CAAC,CAAA,KAAM,EAAE,SAAA,KAAc,CAAC,CAAC,CAAA,CACrD,MAAA,CAAO,CAAC,CAAA,KAAyB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC9C,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,CAAU,CAAC,CAAA,KAAM,EAAE,SAAA,KAAc,UAAA,CAAW,CAAC,CAAA,CAAG,SAAS,CAAA;AACtF,IAAA,OAAO,YAAY,QAAA,EAAU;AAC3B,MAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,MAAA,MAAM,OAAA,GAAUwC,iCAAA,CAAgB,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA;AAClE,MAAA,KAAA,CAAM,IAAA;AAAA,wBACJxC,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,cAAA;AAAA,YACL,aAAA,EAAW,IAAA;AAAA,YACX,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,MAAA;AAAO,WAAA;AAAA,UAH9E,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA;AAAA;AAIvC,OACF;AACA,MAAA,SAAA,IAAa,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,CAAC,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAEnD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,eAAA;AAAA,QACE,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,WAAW,MAAA,EAAO;AAAA,QACtC,UAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,SAAA,IAAa,UAAA,CAAW,MAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,SAAA,GAAY,YAAY,MAAA,EAAQ;AACrC,IAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,IAAA,MAAM,OAAA,GAAUwC,iCAAA,CAAgB,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA;AAClE,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJxC,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,cAAA;AAAA,UACL,aAAA,EAAW,IAAA;AAAA,UACX,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,MAAA;AAAO,SAAA;AAAA,QAH9E,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA;AAAA;AAI5C,KACF;AACA,IAAA,SAAA,IAAa,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,UAAU,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQgD,6CAAA,CAA4B,OAAA,EAAS,eAAe,CAAA;AAClE,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,eAAe,SAAA,CAAU,YAAA;AAE/B,EAAA,uBACEhD,cAAAA,CAAAE,mBAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,KAAK,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,qBACzBC,eAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,KAAA;AAAA,MACL,iBAAe,KAAA,GAAQ,CAAA;AAAA,MACvB,SAAA,EAAU,iCAAA;AAAA,MACV,0BAAA,EAA0B,KAAA;AAAA,MAEzB,QAAA,EAAA;AAAA,QAAA,kBAAA;AAAA,UACC,SAAA,CAAU,WAAA;AAAA,UACV,KAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,YAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,SAAA,CAAU,WAAA,GAAc,CAAA,mBACvBH,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,IAAA,EAAK,cAAA;AAAA,YACL,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,CAAU,WAAA,EAAa,QAAA,EAAU,SAAA,CAAU,WAAA,EAAa,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,MAAA;AAAO;AAAA,SACrG,GACE,IAAA;AAAA,QACH,kBAAA;AAAA,UACC,SAAA,CAAU,UAAA;AAAA,UACV,KAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,YAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,SAAA,CAAU,SAAA,GAAY,CAAA,mBACrBA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,IAAA,EAAK,cAAA;AAAA,YACL,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,CAAU,SAAA,EAAW,QAAA,EAAU,SAAA,CAAU,SAAA,EAAW,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,MAAA;AAAO;AAAA,SACjG,GACE,IAAA;AAAA,QACH,kBAAA;AAAA,UACC,SAAA,CAAU,SAAA;AAAA,UACV,KAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,YAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA;AACF;AAAA,KAAA;AAAA,IA9CK,aAAa,KAAK,CAAA;AAAA,GAgD1B,CAAA,EACH,CAAA;AAEJ;ACpKA,SAAS,SAAA,CACP,OACA,MAAA,EACA,UAAA,EACA,WACA,cAAA,EACA,YAAA,EACA,oBACA,CAAA,EACW;AACX,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA;AACrB,EAAA,MAAM,OAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,KAAK,CAAA,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,CAAA;AAC1D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,sBAAA,CAAuB,IAAI,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,GAAA,EAAK,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,QACxB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAA,EAAQ,MAAM,cAAA,GAAiB,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO;AAAA,OACpE,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,IAAI,OAAO,WAAA,EAAa;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,EAAA;AAAA,MACL,KAAA,EAAO,CAAA,CAAE,sBAAA,CAAuB,EAAE,CAAC,CAAA;AAAA,MACnC,QAAQ,MAAM;AACZ,QAAA,QAAQ,EAAA;AAAI,UACV,KAAK,SAAA;AACH,YAAA,UAAA,CAAW,YAAA,CAAa,sBAAA,CAAuB,SAAA,EAAW,KAAA,EAAO,KAAK,CAAC,CAAA;AACvE,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,UAAA,CAAW,YAAA,CAAa,sBAAA,CAAuB,SAAA,EAAW,KAAA,EAAO,MAAM,CAAC,CAAA;AACxE,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,UAAA,CAAW,YAAA,CAAa,sBAAA,CAAuB,SAAA,EAAW,KAAA,EAAO,MAAM,CAAC,CAAA;AACxE,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,YAAA,IAAe;AACf,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACxC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,UAAA,CAAW,eAAA,CAAgB,OAAO,OAAO,CAAA;AACzC,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,UAAA,CAAW,eAAA,CAAgB,OAAO,KAAK,CAAA;AACvC,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,UAAA,CAAW,eAAA,CAAgB,OAAO,IAAI,CAAA;AACtC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,UAAA,CAAW,eAAA,CAAgB,CAAC,KAAK,CAAC,CAAA;AAClC,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,kBAAA,IAAqB;AACrB,YAAA;AAEA;AACJ,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,OAAA,GAAUH,cAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAID,eAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,cAAcM,qCAAA,CAAoB;AAAA,IACtC,QAAA,EAAU,OAAA;AAAA,IACV,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,WAAW,aAAA,EAAc;AAC7C,EAAA,MAAM,KAAA,GAAQuB,cAAAA;AAAA,IACZ,MAAM,sBAAA,CAAuB,MAAA,EAAQ,WAAA,EAAa,EAAE,aAAa,CAAA;AAAA,IACjE,CAAC,MAAA,EAAQ,WAAA,EAAa,WAAW;AAAA,GACnC;AAEA,EAAA,MAAM,IAAA,GAAOA,cAAAA;AAAA,IACX,MACE,SAAA;AAAA,MACE,KAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACF;AAAA,MACE,KAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAKvD,EAAA3B,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,SAAA,CAAU,OAAA,EAAS;AACjC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,IAAA,MAAA,CAAO,EAAE,KAAK,IAAA,CAAK,MAAA,GAAS,GAAG,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAChD,IAAA,aAAA,CAAc,CAAC,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,QAAQ,OAAA,IAAWQ,4BAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,EAAG;AACrD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,aAAA,CAAc,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,WAAW,MAAM,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAC9B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,aAAA,CAAc,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,IAAI,UAAA,CAAW,MAAA,IAAU,WAAW,MAAM,CAAA;AAAA,MACtE,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,GAAA,GAAM,WAAW,UAAU,CAAA;AACjC,QAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,QAAA,EAAU;AACxB,UAAA,GAAA,CAAI,MAAA,EAAO;AACX,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,GAAG,CAAC,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,YAAY,CAAC,CAAA;AAE/C,EAAAR,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,EAAA,GAAK,sBAAsB,MAAM;AACrC,MAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,EAAS,aAAA;AAAA,QAC/B;AAAA,OACF;AACA,MAAA,OAAA,EAAS,KAAA,EAAM;AAAA,IACjB,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACvC,MAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACzC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,IAAA,EAAM,YAAA,EAAc,SAAS,CAAC,CAAA;AAElC,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAErD,EAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,EAAA,OAAOO,qBAAAA;AAAA,oBACLJ,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,2BAAA;AAAA,QACV,qBAAmB,MAAA,CAAO,SAAA;AAAA,QAC1B,KAAA,EAAO,WAAA;AAAA,QAEN,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,UAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,YAAA,uBACEA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,WAAA;AAAA,gBACL,SAAA,EAAU,yBAAA;AAAA,gBACV,6BAAA,EAA2B;AAAA,eAAA;AAAA,cAHtB,GAAA,CAAI;AAAA,aAIX;AAAA,UAEJ;AACA,UAAA,YAAA,IAAgB,CAAA;AAChB,UAAA,MAAM,GAAA,GAAM,YAAA;AACZ,UAAA,MAAM,UAAU,GAAA,KAAQ,UAAA;AACxB,UAAA,uBACEA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,UAAA;AAAA,cACL,0BAAwB,GAAA,CAAI,GAAA;AAAA,cAC5B,SAAA,EAAW,CAAA,kBAAA,EAAqB,OAAA,GAAU,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,cAC5D,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,QAAA,EAAU,UAAU,CAAA,GAAI,EAAA;AAAA,cACxB,YAAA,EAAc,MAAM,aAAA,CAAc,GAAG,CAAA;AAAA,cACrC,SAAS,MAAM;AACb,gBAAA,IAAI,IAAI,QAAA,EAAU;AAClB,gBAAA,GAAA,CAAI,MAAA,EAAO;AACX,gBAAA,YAAA,CAAa,KAAK,CAAA;AAAA,cACpB,CAAA;AAAA,cAEC,QAAA,EAAA,GAAA,CAAI;AAAA,aAAA;AAAA,YAdA,GAAA,CAAI;AAAA,WAeX;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AC5QO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,QAAA,GAAWH,cAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAID,eAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAClD,EAAA,MAAM,cAAcM,qCAAA,CAAoB;AAAA,IACtC,QAAA,EAAU,OAAA;AAAA,IACV,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC2C,+BAAA,CAAc,CAAC,CAAC,CAAA;AAEzD,EAAA/C,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,SAAA,CAAU,OAAA,EAAS;AACjC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,IAAA,MAAA,CAAO,EAAE,KAAK,IAAA,CAAK,MAAA,GAAS,GAAG,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,SAAS,OAAA,IAAWQ,4BAAA,CAAW,QAAA,CAAS,OAAA,EAAS,CAAC,CAAA,EAAG;AACvD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,EAAAR,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACxC,MAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACzC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,IAAA,EAAM,YAAA,EAAc,SAAS,CAAC,CAAA;AAElC,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAErD,EAAA,OAAOO,qBAAAA;AAAA,oBACLD,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,QACvC,SAAA,EAAU,0DAAA;AAAA,QACV,4BAAA,EAA0B,IAAA;AAAA,QAC1B,KAAA,EAAO,WAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAAH,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,0BAC5EA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EAA8B,MAAK,SAAA,EAC9C,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ;AACtB,YAAA,MAAM,OAAA,GAAU,CAAC,GAAA,CAAI,MAAA;AACrB,YAAA,MAAM,SAASiD,qCAAA,CAAoB,GAAA,EAAK,IAAI,CAAA,CAAE,EAAA,KAAO,SAAS,CAAC,OAAA;AAC/D,YAAA,uBACEjD,cAAAA,CAAC,IAAA,EAAA,EAAuB,IAAA,EAAK,QAAA,EAAS,eAAA,EAAe,OAAA,EACnD,QAAA,kBAAAG,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,4BAAA,EACf,QAAA,EAAA;AAAA,8BAAAH,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,QAAA,EAAU,MAAA;AAAA,kBACV,6BAA2B,GAAA,CAAI,SAAA;AAAA,kBAC/B,UAAU,MAAM;AACd,oBAAA,UAAA,CAAW,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,CAAC,OAAO,CAAA;AAAA,kBACrD;AAAA;AAAA,eACF;AAAA,8BACAA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,YAAA,EAAa;AAAA,aAAA,EAC1B,CAAA,EAAA,EAZO,IAAI,SAab,CAAA;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AC9FO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,IAAA,GAAOJ,cAAkD,IAAI,CAAA;AAEnE,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAqB,SAAA,KAAsB;AAC1D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,kBAAkB,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,sBAAsB,SAAS,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,WAAA;AAAA,MACL,kBAAA,EAAiB,UAAA;AAAA,MACjB,YAAA,EAAW,eAAA;AAAA,MACX,qBAAA,EAAqB,QAAA;AAAA,MACrB,SAAA,EAAU,gBAAA;AAAA,MACV,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpB,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,CAAA,CAAE,aAAA,CAAc,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAC7C,QAAA,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAS,QAAQ,YAAA,EAAa;AACzD,QAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,kBAAkB,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,QAAA,MAAM,KAAA,GACJ,SAAA,KAAc,KAAA,GACV,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAE,OAAA,GACxB,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA;AAC/B,QAAA,QAAA,CAASkD,mCAAiB,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MAChE,CAAA;AAAA,MACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,QAAA,OAAA,CAAQ,CAAA,CAAE,aAAA,EAAe,CAAA,CAAE,SAAS,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,eAAA,EAAiB,CAAC,CAAA,KAAM;AACtB,QAAA,OAAA,CAAQ,CAAA,CAAE,aAAA,EAAe,CAAA,CAAE,SAAS,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,sBAAsB,MAAM;AAC1B,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,kBAAkB,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,UAAA,IAAa;AAAA,MACf;AAAA;AAAA,GACF;AAEJ;ACpBA,SAAS,0BAA0B,MAAA,EAAqC;AACtE,EAAA,IAAI,EAAE,MAAA,YAAkB,OAAA,CAAA,EAAU,OAAO,KAAA;AACzC,EAAA,OAAO,OAAA;AAAA,IACL,MAAA,CAAO,OAAA;AAAA,MACL;AAAA;AACF,GACF;AACF;AAEA,SAAS,mBAAA,CACP,OACA,KAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,YAAA,IAAgB,QAAQ,OAAO,EAAA;AAC/C,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,SAAe,MAAA,CAAO,KAAA,CAAM,UAAU,EAAE,CAAA;AACjE,EAAA,IAAI,MAAM,UAAA,KAAe,QAAA,SAAiB,MAAA,CAAO,KAAA,CAAM,UAAU,EAAE,CAAA;AACnE,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAQ;AAC/B,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,UAAU,EAAE,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,mBAAA,CACP,KAAA,EACA,GAAA,EACA,GAAA,EACa;AACb,EAAA,MAAM,EAAA,GAAKL,kCAAgB,GAAG,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAqC,EAAE,GAAG,KAAA,EAAM;AACtD,EAAA,IAAI,CAAC,MAAM,EAAA,CAAG,IAAA,KAAS,aAAa,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AACrD,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI;AAAA,MACpB,UAAA,EAAY,QAAA;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI;AAAA,MACpB,UAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI;AAAA,MACpB,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,GAAA,GAAM,SAAS,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,GAAA,GAAM,OAAA,GAAU;AAAA,KACpF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI;AAAA,MACpB,UAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB;AACF,CAAA,EAAU;AACR,EAAA,MAAM,YAAYM,8BAAA,EAAa;AAC/B,EAAA,MAAM,IAAIpD,iCAAA,EAAgB;AAC1B,EAAA,MAAM,OAAO4B,iCAAA,EAAgB;AAC7B,EAAA,MAAM,OAAA,GAAU,oBAAoB,IAAA,CAAK,gBAAA;AACzC,EAAA,MAAM,kBAAkB,IAAA,CAAK,eAAA;AAC7B,EAAA,MAAM,qBAAqB,IAAA,CAAK,kBAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AAEtC,EAAA,MAAM,WAAA,GAAc,WAAW,aAAA,EAAc;AAC7C,EAAA,MAAM,eAAA,GAAkB/B,cAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,eAAA,GAAkBA,cAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,gBAAA,GAAmBA,cAAwC,IAAI,CAAA;AACrE,EAAA,MAAM,oBAAA,GAAuBA,cAAO,KAAK,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgBA,aAAAA,CAAiD,EAAE,CAAA;AACzE,EAAA,MAAM,WAAA,GAAcA,aAAAA,CAAiD,EAAE,CAAA;AACvE,EAAA,MAAM,qBAAA,GAAwBA,cAAiC,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,gBAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAC1CA,eAAAA,CAAmC;AAAA,IACjC,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,sBAAY,GAAA;AAAI,GACjB,CAAA;AAEH,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AAEjD,EAAAE,iBAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,WAAW,UAAA,EAAW;AACzC,IAAA,UAAA,CAAW,CAAC,GAAA,KAAQ;AAClB,MAAA,mBAAA,CAAoB,GAAG,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,UAAA;AAAA,IACA,OAAO,UAAA,EAAY,QAAA;AAAA,IACnB,OAAO,UAAA,EAAY,KAAA;AAAA,IACnB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,KAAA,EAAO,OAAA,IAAW,EAAC;AAC1C,EAAA,MAAM,eAAA,GAAkB,KAAA,EAAO,qBAAA,IAAyB,EAAC;AACzD,EAAA,MAAM,SAAA,GAAYiC,sCAAA,CAAqB,cAAA,EAAgB,KAAA,EAAO,YAAY,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAasB,sCAAoB,cAAc,CAAA;AAErD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,SAAS,OAAO,IAAA;AAErC,EAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAoB,CAAC,EAAE,MAAM,CAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,EAAC;AACtC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,IAAe,EAAC;AAC1C,EAAA,MAAM,wBAAA,GAA2B,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1C,CAAC,GAAA,KAAQ,CAAC,CAAC,KAAA,CAAM,YAAA,CAAa,IAAI,EAAE;AAAA,GACtC;AACA,EAAA,MAAM,6BAA6B,MAAM;AACvC,IAAA,UAAA,CAAW,QAAA,CAAS,EAAC,IAAA,EAAM,0BAAA,EAA2B,CAAA;AAAA,EACxD,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,EAAW,IAAK,EAAC;AAC5C,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,KAAK,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAA,CAAM,gBAAA,CAAiB,MAAA,wBAAc,GAAA,EAAI,EAAG,OAAA,EAAS,CAAA,CAAE,GAAA;AAAA,IACzE,CAAC,CAAC,GAAA,EAAK,KAAK,GAAG,UAAA,KAAe;AAC5B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,KAAA,IAAS,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA;AAEpE,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,WAAW,QAAA,EAAS;AAAA,QAEzB,uBACEpD,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sCAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,qBAAA,CAAsB,MAAM,KAAK,CAAA;AAAA,YACnC,CAAA;AAAA,YAEC,QAAA,EAAA,CAAA,EAAG,CAAA,CAAE,yBAAyB,CAAC,IAAI,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,4BAA4B,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,GAAA,EAAM,MAAM,OAAO,CAAA;AAAA;AAAA;AAClH,OAEJ;AAAA,IACF;AAAA,GACF;AACA,EAAA,MAAM,OAAO,cAAA,CAAe,MAAA;AAE5B,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,EAAmB,KAAA,KAAkB;AAC/D,IAAA,MAAM,OAAOwC,iCAAA,CAAgB,GAAA,EAAK,KAAA,CAAM,YAAA,EAAc,UAAU,YAAY,CAAA;AAC5E,IAAA,MAAM,yBACJxC,cAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,UAAU,GAAA,CAAI,SAAA;AAAA,QACd,cAAc,IAAA,CAAK,KAAA;AAAA,QACnB,MAAA,EAAQ,GAAA;AAAA,QACR,SAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,KAAK,WAAW,QAAA,CAAS;AAAA,YACvB,IAAA,EAAM,kBAAA;AAAA,YACN,UAAU,GAAA,CAAI,SAAA;AAAA,YACd;AAAA,WACD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,YAAY,MAAM,UAAA,CAAW,gBAAgB,CAAC,GAAA,CAAI,SAAS,CAAC;AAAA;AAAA,KAC9D;AAEF,IAAA,MAAM,MAAMqC,oCAAA,CAAmB,GAAA,EAAK,SAAA,CAAU,eAAA,EAAiB,UAAU,aAAa,CAAA;AACtF,IAAA,IAAIO,+BAAA,CAAc,GAAG,CAAA,EAAG;AACtB,MAAA,uBACEzC,eAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,cAAA;AAAA,UACL,eAAA,EAAeoC,+BAAa,KAAK,CAAA;AAAA,UACjC,KAAA,EAAO,EAAC,GAAG,GAAA,CAAI,OAAO,GAAG,IAAA,EAAM,GAAG,GAAA,CAAI,KAAA,EAAK;AAAA,UAC3C,WAAW,CAAA,2DAAA,EAA8D,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,aAAa,EAAE,CAAA,CAAA;AAAA,UAC7G,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,UAExC,QAAA,EAAA;AAAA,4BAAApC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAH,cAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,wBAAA;AAAA,kBACT,OAAA,EAAS,0BAAA;AAAA,kBACT,YAAA,EAAY,EAAE,gBAAgB;AAAA;AAAA,eAChC;AAAA,cAEC,GAAA,CAAI;AAAA,aAAA,EACP,CAAA;AAAA,YACC;AAAA;AAAA,SAAA;AAAA,QAhBI,GAAA,CAAI;AAAA,OAiBX;AAAA,IAEJ;AAEA,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,GAAA,EAAK,WAAW,CAAA;AACxD,IAAA,MAAM,WAAW,wBAAA,CAAyB,GAAA,EAAK,WAAW,CAAA,GACtD6C,iCAAA,CAAgB,GAAG,CAAA,GACnB,IAAA;AACJ,IAAA,MAAM,YAAA,GACJ,UAAU,IAAA,KAAS,QAAA,GACf,uBAAuB,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA,GAC7C,MAAA;AACN,IAAA,MAAM,aACJ,QAAA,IAAY,IAAA,KACX,QAAA,CAAS,IAAA,KAAS,aAAa,YAAA,IAAgB,IAAA,CAAA;AAClD,IAAA,MAAM,YAAA,GAAeQ,sCAAA,CAAqB,WAAA,EAAa,GAAA,CAAI,SAAS,CAAA;AACpE,IAAA,MAAM,WAAW,QAAA,GACbC,mCAAA,CAAkB,SAAA,EAAW,GAAA,CAAI,SAAS,CAAA,GAC1C,MAAA;AACJ,IAAA,MAAM,QAAA,GAAWC,uCAAA,CAAsB,SAAA,EAAW,GAAA,CAAI,SAAS,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,QAAA,IAAY,IAAA,IAAQ,SAAA,CAAU,MAAA,GAAS,CAAA;AAE5D,IAAA,uBACEpD,eAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,cAAA;AAAA,QACL,eAAA,EAAeoC,+BAAa,KAAK,CAAA;AAAA,QACjC,WAAA,EAAW,QAAA;AAAA,QACX,KAAA,EAAO,EAAC,GAAG,GAAA,CAAI,OAAO,GAAG,IAAA,EAAM,GAAG,GAAA,CAAI,KAAA,EAAK;AAAA,QAC3C,WAAW,CAAA,iDAAA,EAAoD,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,aAAa,EAAE,CAAA,CAAA;AAAA,QACnG,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,QACxC,qBAAmB,GAAA,CAAI,SAAA;AAAA,QACvB,mBAAA,EAAmB,SAAA,KAAc,GAAA,CAAI,SAAA,GAAY,IAAI,SAAA,GAAY,MAAA;AAAA,QACjE,mBAAA,EAAmB,WAAW,MAAA,GAAS,MAAA;AAAA,QACvC,qBAAA,EAAqB,aAAa,MAAA,GAAS,MAAA;AAAA,QAC3C,wBAAA,EAAwB,eAAe,MAAA,GAAS,MAAA;AAAA,QAChD,wBAAA,EACE,QAAA,EAAU,IAAA,KAAS,QAAA,GAAW,SAAS,IAAA,GAAO,MAAA;AAAA,QAEhD,uBAAA,EAAuBiB,+CAAA;AAAA,QACvB,SAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAe,iBAAA;AAAA,QACf,aAAA,EAAe,gBAAA;AAAA,QACf,SAAS,CAAC,CAAA,KAAM,iBAAiB,CAAA,EAAG,GAAA,CAAI,WAAW,QAAQ,CAAA;AAAA,QAC3D,aAAa,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,IAAI,SAAS,CAAA;AAAA,QACpD,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAC5B,UAAA,eAAA,CAAgB,IAAI,SAAS,CAAA;AAAA,QAC/B,CAAA;AAAA,QACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,UAAA,eAAA;AAAA,YACE,GAAA,CAAI,SAAA;AAAA,YACJ,CAAA,CAAE,aAAA;AAAA,YACF,CAAA,CAAE;AAAA,WACJ;AAAA,QACF,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAArD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,4BAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,cAAI,YAAA,EAAa,CAAA;AAAA,YACtD,2BACCG,eAAAA,CAAC,UAAK,SAAA,EAAU,oBAAA,EAAqB,eAAW,IAAA,EAC7C,QAAA,EAAA;AAAA,cAAA,QAAA,KAAa,8BACZH,cAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EAAmC,oBAAC,CAAA,GAClD,IAAA;AAAA,cACH,QAAA,KAAa,+BACZA,cAAAA,CAAC,UAAK,SAAA,EAAU,mCAAA,EAAoC,oBAAC,CAAA,GACnD,IAAA;AAAA,cACH,+BACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAqB,oBAAS,CAAA,GAC5C;AAAA,aAAA,EACN,CAAA,GACE,IAAA;AAAA,YACH,6BACCA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAW,CAAA,mBAAA,EAAsB,YAAA,GAAe,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,gBACjE,uBAAqB,GAAA,CAAI,SAAA;AAAA,gBACzB,kBAAA,EAAgB,IAAA;AAAA,gBAChB,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,gBAC9B,eAAA,EAAe,kBAAkB,GAAA,CAAI,SAAA;AAAA,gBACrC,OAAO,YAAA,GAAe,CAAA,CAAE,sBAAsB,CAAA,GAAI,EAAE,gBAAgB,CAAA;AAAA,gBACpE,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,kBAAA,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,EAAA;AAAA,gBACzC,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,cAAA,CAAe,IAAI,CAAA;AACnB,kBAAA,gBAAA;AAAA,oBAAiB,CAAC,GAAA,KAChB,GAAA,KAAQ,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,CAAI;AAAA,mBACrC;AAAA,gBACF,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED,GACE,IAAA;AAAA,4BACJA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,kBAAA;AAAA,gBACV,yBAAuB,GAAA,CAAI,SAAA;AAAA,gBAC3B,kBAAA,EAAgB,IAAA;AAAA,gBAChB,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,gBAC/B,eAAA,EAAc,MAAA;AAAA,gBACd,eAAA,EAAe,gBAAgB,GAAA,CAAI,SAAA;AAAA,gBACnC,KAAA,EAAO,EAAE,iBAAiB,CAAA;AAAA,gBAC1B,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,kBAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,EAAA;AACrC,kBAAA,IAAI,gBAAA,IAAoB,WAAA,KAAgB,GAAA,CAAI,SAAA,EAAW;AACrD,oBAAA,qBAAA,CAAsB,OAAA,GAAU,EAAA;AAAA,kBAClC;AAAA,gBACF,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,kBAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,kBAAA,cAAA;AAAA,oBAAe,CAAC,GAAA,KACd,GAAA,KAAQ,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,CAAI;AAAA,mBACrC;AAAA,gBACF,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,UACC,WAAA,KAAgB,GAAA,CAAI,SAAA,mBACnBA,cAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,GAAA;AAAA,cACR,UAAA;AAAA,cACA,SAAA;AAAA,cACA,WAAA;AAAA,cACA,WAAA,EAAa,eAAA;AAAA,cACb,cAAA,EAAgB,kBAAA;AAAA,cAChB,IAAA,EAAI,IAAA;AAAA,cACJ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,gBAAA,IAAI,CAAC,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAAA,cAChC,CAAA;AAAA,cACA,SAAA,EAAW;AAAA,gBACT,IAAI,OAAA,GAAU;AACZ,kBAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,gBAC/C;AAAA,eACF;AAAA,cACA,cAAc,MAAM;AAClB,gBAAA,cAAA,CAAe,IAAI,CAAA;AACnB,gBAAA,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAAA,cAChC,CAAA;AAAA,cACA,oBAAoB,MAAM;AACxB,gBAAA,qBAAA,CAAsB,OAAA,GACpB,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AACxC,gBAAA,cAAA,CAAe,IAAI,CAAA;AACnB,gBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,cAC1B;AAAA;AAAA,WACF,GACE,IAAA;AAAA,UACH,UAAA,IAAc,QAAA,IAAY,aAAA,KAAkB,GAAA,CAAI,4BAC/CA,cAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,GAAA;AAAA,cACR,IAAA,EAAM,QAAA,CAAS,IAAA,KAAS,SAAA,GAAY,SAAS,IAAA,GAAO,MAAA;AAAA,cACpD,UAAA,EACE,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,SAAS,IAAA,GAAO,MAAA;AAAA,cAE/C,YAAA,EACE,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,SAAS,MAAA,GAAS,MAAA;AAAA,cAEjD,eAAA,EAAiB,YAAA;AAAA,cACjB,WAAA;AAAA,cACA,UAAA;AAAA,cACA,IAAA,EAAI,IAAA;AAAA,cACJ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,gBAAA,IAAI,CAAC,IAAA,EAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,cAClC,CAAA;AAAA,cACA,SAAA,EAAW;AAAA,gBACT,IAAI,OAAA,GAAU;AACZ,kBAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,gBACjD;AAAA;AACF;AAAA,WACF,GACE,IAAA;AAAA,UACH;AAAA;AAAA,OAAA;AAAA,MA7JI,GAAA,CAAI;AAAA,KA8JX;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,0BAAA,GAA6B,CAAC,GAAA,EAAmB,KAAA,KAAkB;AACvE,IAAA,MAAM,OAAOwC,iCAAA,CAAgB,GAAA,EAAK,KAAA,CAAM,YAAA,EAAc,UAAU,YAAY,CAAA;AAC5E,IAAA,MAAM,KAAK,wBAAA,CAAyB,GAAA,EAAK,WAAW,CAAA,GAAIK,iCAAA,CAAgB,GAAG,CAAA,GAAI,IAAA;AAC/E,IAAA,IAAID,gCAAc,GAAG,CAAA,IAAK,CAAC,EAAA,IAAM,EAAA,CAAG,SAAS,SAAA,EAAW;AACtD,MAAA,uBACE5C,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,cAAA;AAAA,UACL,eAAA,EAAeuC,+BAAa,KAAK,CAAA;AAAA,UACjC,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAW,CAAA,yBAAA,EAA4BkB,oCAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,SAAA;AAAA,QAJzD,CAAA,GAAA,EAAM,IAAI,SAAS,CAAA;AAAA,OAK1B;AAAA,IAEJ;AACA,IAAA,uBACEzD,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,cAAA;AAAA,QACL,eAAA,EAAeuC,+BAAa,KAAK,CAAA;AAAA,QACjC,KAAA,EAAO,IAAA;AAAA,QACP,SAAA,EAAW,CAAA,yBAAA,EAA4BkB,oCAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAAA,QAE9D,QAAA,kBAAAzD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,2BAAA;AAAA,YACV,kCAAgC,GAAA,CAAI,SAAA;AAAA,YACpC,wBAAsB,EAAA,CAAG,IAAA;AAAA,YACzB,cAAY,CAAA,EAAG,CAAA,CAAE,gBAAgB,CAAC,CAAA,CAAA,EAAI,IAAI,YAAY,CAAA,CAAA;AAAA,YACtD,KAAA,EAAO,mBAAA,CAAoB,WAAA,EAAa,GAAA,CAAI,SAAS,CAAA;AAAA,YACrD,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,UAAA,CAAW,cAAA;AAAA,gBACT,mBAAA,CAAoB,WAAA,EAAa,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK;AAAA,eACtD;AAAA,YACF;AAAA;AAAA;AACF,OAAA;AAAA,MAjBK,CAAA,GAAA,EAAM,IAAI,SAAS,CAAA;AAAA,KAkB1B;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CACtB,CAAA,EACA,SAAA,KACG;AACH,IAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAC/B,IAAA,eAAA,CAAgB,OAAA,GAAU,SAAA;AAC1B,IAAA,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,SAAS,CAAA;AAC9C,IAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,SAAA,KAAsB;AAC7C,IAAA,YAAA,CAAa,CAAC,OAAA,KAAa,OAAA,KAAY,SAAA,GAAY,UAAU,SAAU,CAAA;AAAA,EACzE,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CACtB,SAAA,EACA,aAAA,EACA,aAAA,KACG;AACH,IAAA,IAAI,aAAA,YAAyB,IAAA,IAAQ,aAAA,CAAc,QAAA,CAAS,aAAa,CAAA,EAAG;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,CAAC,OAAA,KAAa,OAAA,KAAY,SAAA,GAAY,OAAO,OAAQ,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,KAAsB;AACxC,IAAA,MAAM,cAAc,eAAA,CAAgB,OAAA;AACpC,IAAA,MAAM,cAAc,eAAA,CAAgB,OAAA;AACpC,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM0D,KAAAA,GAAOC,0CAAA,CAAyB,cAAA,EAAgB,WAAA,EAAa,SAAS,CAAA;AAC5E,MAAA,IAAI,CAACD,KAAAA,EAAM;AACX,MAAA,KAAK,WAAW,QAAA,CAAS;AAAA,QACvB,IAAA,EAAM,kBAAA;AAAA,QACN,aAAaA,KAAAA,CAAK,WAAA;AAAA,QAClB,WAAWA,KAAAA,CAAK;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,cAAA,EAAgB,WAAA,EAAa,SAAS,CAAA;AACxE,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAK,WAAW,QAAA,CAAS;AAAA,MACvB,IAAA,EAAM,kBAAA;AAAA,MACN,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAgD;AACzE,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,IAAA,gBAAA,CAAiB,UAAU,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AACxD,IAAA,oBAAA,CAAqB,OAAA,GAAU,KAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAgD;AACxE,IAAA,MAAM,SAAS,gBAAA,CAAiB,OAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,OAAO,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA;AACrE,IAAA,IAAI,CAACE,6CAAA,CAA4B,OAAO,CAAA,EAAG;AACzC,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,IACjC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CACvB,CAAA,EACA,SAAA,EACA,QAAA,KACG;AACH,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAI,yBAAA,CAA0B,CAAA,CAAE,MAAM,CAAA,EAAG;AACzC,IAAA,IAAI,qBAAqB,OAAA,EAAS;AAClC,IAAA,MAAM,SAAS,gBAAA,CAAiB,OAAA;AAChC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,OAAO,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA;AACrE,MAAA,IAAI,CAACA,6CAAA,CAA4B,OAAO,CAAA,EAAG;AAAA,IAC7C;AACA,IAAA,MAAM,IAAA,GAAOC,iCAAe,SAAA,EAAW,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,CAAE,UAAU,CAAA;AACvE,IAAA,UAAA,CAAW,aAAa,IAAI,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,uBACE1D,gBAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAoB,IAAA,EAAK,UAAA,EAAW,gBAAc,SAAA,EAChE,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,CAAC,gBAAA,CAAiB,KAAA,oBACjBH,cAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAU,kDAAA;AAAA,QACV,KAAA;AAAA,QAEA,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA,KAC3D;AAAA,oBAEFA,cAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,cAAA;AAAA,QACZ,SAAA;AAAA,QACA,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,eAAA;AAAA,QACA,aAAA,EAAe,CAAC,OAAA,KAAY,UAAA,CAAW,kBAAkB,OAAO,CAAA;AAAA,QAChE,gBAAA,EAAkB,CAAC,OAAA,KAAY;AAC7B,UAAA,eAAA,CAAgB,OAAA,GAAU,OAAA;AAAA,QAC5B;AAAA;AAAA,KACF;AAAA,oBACAA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,iBAAe8D,uCAAA,GAAwB,UAAA;AAAA,QACvC,KAAA,EAAO,EAAC,mBAAA,EAAqB,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAA,EAAmB;AAAA,QAC9D,SAAA,EAAW,CAAA,iDAAA,CAAA;AAAA,QACX,wBACE,SAAA,CAAU,WAAA,CAAY,SACtB,SAAA,CAAU,sBAAA,GACV,UAAU,SAAA,CAAU,MAAA;AAAA,QAGtB,QAAA,kBAAA9D,cAAAA;AAAA,UAACoC,mCAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,SAAA;AAAA,YACR,aAAA,EAAc,IAAA;AAAA,YACd,UAAA,EAAW,cAAA;AAAA,YACX,YAAA,EAAc;AAAA;AAAA;AAChB;AAAA,KACF;AAAA,oBACApC,cAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,cAAA;AAAA,QACT,UAAA;AAAA,QACA,IAAA,EAAM,gBAAA;AAAA,QACN,YAAA,EAAc,mBAAA;AAAA,QACd,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,IACC,iCACCA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU,yBAAA;AAAA,QACV,0BAAA,EAAyB,MAAA;AAAA,QAEzB,QAAA,kBAAAA,cAAAA;AAAA,UAACoC,mCAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,SAAA;AAAA,YACR,aAAA,EAAc,IAAA;AAAA,YACd,UAAA,EAAW,cAAA;AAAA,YACX,YAAA,EAAc;AAAA;AAAA;AAChB;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;AC1mBO,SAAS,sBAAA,CACd,KACA,MAAA,EACS;AACT,EAAA,IAAIQ,+BAAA,CAAc,MAAM,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AACnD,EAAA,MAAM,QAAQ,MAAA,CAAO,SAAA;AACrB,EAAA,IAAI,SAAU,GAAA,EAAiC;AAC7C,IAAA,OAAQ,IAAgC,KAAK,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;ACaA,SAAS,cAAA,CAAqB;AAAA,EAC5B,GAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,SAAA,GAAYd,sCAAA,CAAqB,OAAA,EAAS,YAAY,CAAA;AAC5D,EAAA,uBACE9B,cAAAA;AAAA,IAACoC,mCAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,SAAA;AAAA,MACR,aAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAW,cAAA;AAAA,MACX,YAAA,EAAc,CAAC,CAAA,EAAG,KAAA,KAAU;AAC1B,QAAA,MAAM,GAAA,GAAMC,oCAAA;AAAA,UACV,CAAA;AAAA,UACA,SAAA,CAAU,eAAA;AAAA,UACV,SAAA,CAAU;AAAA,SACZ;AACA,QAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,GAAA,EAAK,CAAC,CAAA;AACzC,QAAA,uBACErC,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,UAAA;AAAA,YACL,eAAA,EAAeuC,+BAAa,KAAK,CAAA;AAAA,YACjC,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,YACxC,KAAA,EAAO;AAAA,cACL,GAAGC,iCAAA,CAAgB,CAAA,EAAG,YAAA,EAAc,UAAU,YAAY,CAAA;AAAA,cAC1D,GAAG,GAAA,CAAI;AAAA,aACT;AAAA,YAEC,QAAA,EAAA,WAAA,CAAY,GAAA,EAAK,CAAA,CAAE,SAAA,EAAW,MAAM;AAAA,WAAA;AAAA,UAVhC,CAAA,CAAE;AAAA,SAWT;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,kBAAA,CAAyB;AAAA,EACvC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,SAASvB,2BAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,WAAW,YAAA,EAAa;AACrC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEvC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AACjC,EAAA,MAAM,QAAQ,IAAA,KAAS,KAAA;AACvB,EAAA,MAAM,SAAA,GAAY,QACd,sCAAA,GACA,yCAAA;AAEJ,EAAA,uBACEjB,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,SAAA;AAAA,MACA,qBAAA,EAAqB,QAAQ,EAAA,GAAK,MAAA;AAAA,MAClC,wBAAA,EAAwB,QAAQ,MAAA,GAAY,EAAA;AAAA,MAE3C,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,YAAA,GACJ,SAAS,KAAA,GACL+D,uCAAA,CAAsB,KAAK,CAAA,GAC3BC,0CAAA,CAAyB,KAAA,EAAO,YAAA,EAAc,cAAc,CAAA;AAClE,QAAA,uBACEhE,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,KAAA;AAAA,YACL,eAAA,EAAe,YAAA;AAAA,YACf,qBAAA,EAAqB,IAAA;AAAA,YACrB,SAAA,EAAU,gBAAA;AAAA,YAEV,QAAA,kBAAAA,cAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,OAAA;AAAA,gBACA,cAAc,IAAA,CAAK,YAAA;AAAA,gBACnB;AAAA;AAAA;AACF,WAAA;AAAA,UAXK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,SAY9B;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;;;AC9GO,SAAS,eAAA,CAAgB,GAAY,CAAA,EAAqB;AAC/D,EAAA,IAAI,MAAA,CAAO,EAAA,CAAG,CAAA,EAAG,CAAC,GAAG,OAAO,IAAA;AAC5B,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,KAAM,CAAA;AACzC,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI;AACF,IAAA,OAAO,KAAK,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACLO,SAAS,kBAAA,CACd,OACA,QAAA,EACuB;AACvB,EAAA,MAAM,KAAA,GAAQiE,oCAAA,CAAmB,SAAA,CAAU,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACjE,EAAA,MAAM,YAAA,GAAeA,oCAAA,CAAmB,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AAChE,EAAA,MAAM,eAAA,GAAkBA,oCAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAW,KAAA,CAAM,WAAA;AAAA,IACjB,cAAc,KAAA,CAAM,SAAA;AAAA,IACpB,aAAa,KAAA,CAAM;AAAA,GACrB;AACF;AAGO,SAAS,4BAAA,CACd,OACA,QAAA,EACuB;AACvB,EAAA,MAAM,KAAA,GAAQA,oCAAA,CAAmB,SAAA,CAAU,KAAA,CAAM,MAAM,QAAQ,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,cAAA,CAAe,KAAK,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkBA,oCAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAW,KAAA,CAAM,WAAA;AAAA,IACjB,cAAc,KAAA,CAAM,SAAA;AAAA,IACpB,aAAa,KAAA,CAAM;AAAA,GACrB;AACF;AAEO,SAAS,iBACd,KAAA,EAC4B;AAC5B,EAAA,OAAO,KAAA,YAAiBC,gCAAA;AAC1B;AAEO,SAAS,4BAAA,CACd,OACA,QAAA,EACuB;AACvB,EAAA,OAAO,gBAAA,CAAiB,KAAK,CAAA,GACzB,4BAAA,CAA6B,OAAO,QAAQ,CAAA,GAC5C,kBAAA,CAAmB,KAAA,EAAO,QAAQ,CAAA;AACxC;AAiBO,SAAS,iBAAiB,KAAA,EAA6B;AAC5D,EAAA,OAAO,CAAA,EAAG,MAAM,UAAU,CAAA,CAAA,EAAI,MAAM,QAAQ,CAAA,CAAA,EAAI,MAAM,WAAW,CAAA,CAAA;AACnE;;;ACjEO,SAAS,gBAAA,CACd,OAAA,EACA,KAAA,EACA,OAAA,EAK2B;AAC3B,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,EAAA;AACxC,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AACtC,EAAA,MAAM,mBAAA,GAAsB,SAAS,mBAAA,IAAuB,GAAA;AAE5D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIvE,eAAAA;AAAA,IAAgC,MACpE,4BAAA;AAAA,MACE,KAAA;AAAA,MACA,OAAA,EAAS,aAAY,IACnB,IAAIwE,2BAAS,CAAA,EAAG,mBAAA,EAAqB,WAAW,QAAQ;AAAA;AAC5D,GACF;AAEA,EAAAtE,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,cAAA;AAAA,QACE,4BAAA;AAAA,UACE,KAAA;AAAA,UACA,IAAIsE,0BAAA,CAAS,CAAA,EAAG,mBAAA,EAAqB,WAAW,QAAQ;AAAA;AAC1D,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,IAAA,GAAO,4BAAA,CAA6B,KAAA,EAAO,OAAA,CAAQ,aAAa,CAAA;AACtE,MAAA,cAAA;AAAA,QAAe,CAAC,IAAA,KACd,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,KAAM,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,IAC5D,IAAA,CAAK,YAAA,CAAa,WAAW,IAAA,CAAK,YAAA,CAAa,MAAA,IAC/C,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,CAAC,IAAA,EAAM,MAAM,MAAA,CAAO,EAAA,CAAG,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAC,IACtE,IAAA,GACA;AAAA,OACN;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,EAAK;AAEL,IAAA,OAAO,OAAA,CAAQ,iBAAA;AAAA,MACb,MAAM;AACJ,QAAA,MAAM,EAAA,GAAK,QAAQ,WAAA,EAAY;AAC/B,QAAA,MAAM,YAAY,gBAAA,CAAiB,KAAK,IACpC,OAAA,CAAQ,aAAA,KACR,KAAA,CAAM,MAAA;AAGV,QAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAK,CAAA,GAAI,MAAM,QAAA,GAAW,CAAA;AACjE,QAAA,OAAO;AAAA,UACL,cAAc,EAAA,CAAG,YAAA;AAAA,UACjB,cAAc,EAAA,CAAG,YAAA;AAAA,UACjB,WAAW,EAAA,CAAG,SAAA;AAAA,UACd,UAAU,EAAA,CAAG,QAAA;AAAA,UACb,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,OAAO,SAAA,EAAW,QAAA,EAAU,mBAAmB,CAAC,CAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,EAAmB,YAAA,KAA0B;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,KAAK,QAAQ,kBAAA,CAAmB;AAAA,MAC9B,IAAA,EAAM,iBAAA;AAAA,MACN,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,MACnC,YAAA,EAAc,YAAA;AAAA,MACd,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,WAAA;AAAA,IACH;AAAA,GACF;AACF;ACtFA,IAAMC,oBAAmB1C,uBAAAA,CAAM,IAAA;AAAA,EAAK,MAClC,OAAO,iCAAoB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,gBAAA,EAAiB,CAAE;AAC5E,CAAA;AAEA,IAAM,kBAAA,GAAqB,EAAA;AAmBpB,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA,GAAY,kBAAA;AAAA,EACZ,QAAA,GAAW,CAAA;AAAA,EACX,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,GAAiB;AACnB,CAAA,EAAU;AACR,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,SAAA,GAAY9B,cAAsB,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,EAAU,CAAE,aAAA,EAAc;AAErD,EAAA,MAAM;AAAA,IACJ,YAAA,EAAc,UAAA;AAAA,IACd,eAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,GAAI,gBAAA,CAAiB,OAAA,EAAS,UAAA,EAAY;AAAA,IACxC,SAAA;AAAA,IACA,QAAA;AAAA,IACA,mBAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,UAAA,CAClB,GAAA,CAAI,CAAC,OAAO,UAAA,CAAW,UAAA,CAAW,EAAE,CAAC,CAAA,CACrC,MAAA,CAAO,CAAC,GAAA,KAAsB,OAAO,IAAI,CAAA;AAE5C,EAAAC,iBAAU,MAAM;AACd,IAAA,KAAK,QAAQ,kBAAA,CAAmB;AAAA,MAC9B,IAAA,EAAM,iBAAA;AAAA,MACN,YAAA,EAAc,OAAA,CAAQ,WAAA,EAAY,CAAE,YAAA;AAAA,MACpC,YAAA,EAAc,cAAA;AAAA,MACd,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAW,QAAQ,CAAC,CAAA;AAEjD,EAAAA,iBAAU,MAAM;AACd,IAAA,MAAM,KAAK,eAAA,CAAgB,OAAA;AAC3B,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,QAAA,CAAS,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,YAAY,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAE9B,EAAA,MAAM,SAAA,GAAYiC,sCAAA;AAAA,IAChB,KAAA,EAAO,WAAW,EAAC;AAAA,IACnB,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAwB,MAAA,KAAmB;AAC/D,IAAA,IAAI,MAAA,IAAU,GAAG,OAAO,IAAA;AACxB,IAAA,uBACE9B,eAAC,IAAA,EAAA,EAAG,aAAA,EAAW,MAAC,IAAA,EAAK,cAAA,EAAe,yBAAA,EAAyB,IAAA,EAC3D,QAAA,kBAAAA,cAAAA;AAAA,MAACoC,mCAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,SAAA;AAAA,QACR,aAAA,EAAc,IAAA;AAAA,QACd,UAAA,EAAW,cAAA;AAAA,QACX,WAAA,EAAa,EAAE,GAAG,WAAA,EAAa,MAAA,EAAO;AAAA,QACtC,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAA,MAAM,GAAA,GAAMC,oCAAA;AAAA,YACV,CAAA;AAAA,YACA,SAAA,CAAU,eAAA;AAAA,YACV,SAAA,CAAU;AAAA,WACZ;AACA,UAAA,uBACArC,cAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,cAAA;AAAA,cACL,WAAW,GAAA,CAAI,SAAA;AAAA,cACf,kBAAA,EAAkB,IAAI,kBAAkB,CAAA;AAAA,cACxC,KAAA,EAAO;AAAA,gBACL,GAAG,WAAA;AAAA,gBACH,MAAA;AAAA,gBACA,GAAGwC,iCAAA,CAAgB,CAAA,EAAG,KAAA,CAAM,YAAA,EAAc,UAAU,YAAY,CAAA;AAAA,gBAChE,GAAG,GAAA,CAAI;AAAA;AACT,aAAA;AAAA,YATK,CAAA,CAAE;AAAA,WAUT;AAAA,QACA;AAAA;AAAA,KACJ,EACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACErC,gBAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kCAAiC,uBAAA,EAAqB,IAAA,EAAC,MAAK,UAAA,EAC1E,QAAA,EAAA;AAAA,IAAA,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,oBAE9BH,cAAAA,CAAC0B,uBAAAA,CAAM,QAAA,EAAN,EAAe,QAAA,EAAU,IAAA,EACvB,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAC5B,MAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,CAAC,CAAA,IAAK,CAAA;AAC5C,MAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAC3B,QAAA,uBACE1B,cAAAA;AAAA,UAACoE,iBAAAA;AAAA,UAAA;AAAA,YAEC,GAAA;AAAA,YACA,KAAA,EAAO,aAAA;AAAA,YACP,cAAA;AAAA,YACA,KAAA;AAAA,YACA,UAAA;AAAA,YACA,QAAA;AAAA,YACA,YAAY,CAAC,CAAC,KAAA,CAAM,YAAA,GAAe,IAAI,EAAE,CAAA;AAAA,YACzC,UAAU,CAAC,CAAC,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE;AAAA,WAAA;AAAA,UARpC,GAAA,CAAI;AAAA,SASX;AAAA,MAEJ;AACA,MAAA,uBACEpE,cAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,WAAA,EAAa,aAAA;AAAA,UACb,KAAA,EAAO,aAAA;AAAA,UACP,cAAA;AAAA,UACA,KAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,eAAA,EAAiB,SAAA;AAAA,UACjB,mBAAA,EAAqB,mBAAA;AAAA,UACrB,YAAY,CAAC,CAAC,KAAA,CAAM,YAAA,GAAe,IAAI,EAAE,CAAA;AAAA,UACzC,UAAU,CAAC,CAAC,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,UACzC,OAAO,CAAC,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,EAAE;AAAA,SAAA;AAAA,QAZ9B,GAAA,CAAI;AAAA,OAaX;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAEC,YAAA,CAAa,UAAU,YAAY;AAAA,GAAA,EACtC,CAAA;AAEJ;AC1KO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAU;AACR,EAAA,uBACEA,cAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,OACpB,QAAA,kBAAAA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,WAAW,CAAA,oEAAA,EACT,QAAA,GAAW,eAAe,EAC5B,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,MACnB,OAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AChCA,IAAM,iBAAA,GAAoB,YAAA;AASnB,SAAS,sBAAA,CAAuB,EAAE,UAAA,EAAW,EAAU;AAC5D,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,YAAYoD,8BAAA,EAAa;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAIkB,8BAAA,EAAa;AACxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI1E,gBAAS,KAAK,CAAA;AAEtC,EAAA,IAAI,CAAC,UAAA,EAAY,GAAA,CAAI,iBAAiB,GAAG,OAAO,IAAA;AAEhD,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,CAAc;AAAA,QAC7B,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA;AAAA,QACA,QAAA,EAAU,CAAA,OAAA,EAAA,iBAAU,IAAI,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,IAAA;AAAA,OAC1D,CAAA;AACD,MAAA,OAAA,CAAQ,CAAA,CAAE,4BAA4B,CAAC,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,CAAA,CAAE,0BAA0B,CAAC,CAAA;AAAA,IACrC,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,uBACEK,cAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,MAC9B,QAAA,EAAU,IAAA;AAAA,MACV,qBAAA,EAAoB,EAAA;AAAA,MACpB,SAAA,EAAW,OAAO,wBAAA,GAA2B,EAAA;AAAA,MAC7C,SAAS,MAAM;AACb,QAAA,KAAK,YAAA,EAAa;AAAA,MACpB,CAAA;AAAA,MAEC,iCACCA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,kBAAWA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,OAC1D,mBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,GAEhD;AAEJ;ACtDA,IAAM,mBAAA,GAAsB,cAAA;AAC5B,IAAM,WAAA,GACJ,yEAAA;AASK,SAAS,wBAAA,CAAyB,EAAE,UAAA,EAAW,EAAU;AAC9D,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAIsE,8BAAA,EAAa;AACxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI1E,gBAAS,KAAK,CAAA;AACtC,EAAA,MAAM,QAAA,GAAWC,cAAyB,IAAI,CAAA;AAE9C,EAAA,IAAI,CAAC,UAAA,EAAY,GAAA,CAAI,mBAAmB,GAAG,OAAO,IAAA;AAElD,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,KAAe;AACzC,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,aAAA,CAAc,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAC7D,MAAA,OAAA,CAAQ,CAAA,CAAE,gCAAgC,CAAC,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,CAAA,CAAE,8BAA8B,CAAC,CAAA;AAAA,IACzC,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,uBACEO,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,cAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,QAClC,QAAA,EAAU,IAAA;AAAA,QACV,sBAAA,EAAqB,EAAA;AAAA,QACrB,SAAA,EAAW,OAAO,wBAAA,GAA2B,EAAA;AAAA,QAC7C,SAAS,MAAM;AACb,UAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,QAC1B,CAAA;AAAA,QAEC,iCACCA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,SAAA,kBAAWA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAC1D,mBAEAA,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,KAEpD;AAAA,oBACAA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAM,IAAA;AAAA,QACN,4BAAA,EAA2B,EAAA;AAAA,QAC3B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACnC,UAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,EAAA;AACrB,UAAA,IAAI,IAAA,EAAM,KAAK,YAAA,CAAa,IAAI,CAAA;AAAA,QAClC;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACxDA,IAAM,0BAAA,GAA6B,GAAA;AAS5B,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAIuE,gCAAc,MAAM,CAAA;AACrD,EAAA,MAAM,WAAW,aAAA,KAAkB,KAAA;AACnC,EAAA,MAAM,WAAA,GAAc,mBAAmB,UAAU,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI3E,gBAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAWC,cAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWA,cAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAYK,qCAAA,EAAoB;AAEtC,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,OAAA,GAAUuB,cAAAA;AAAA,IACd,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,EAAC,EAAG,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,SAAA,KAAc,OAAO,CAAA;AAAA,IACnF,CAAC,OAAO,OAAO;AAAA,GACjB;AAEA,EAAA,MAAM,aAAA,GAAgBA,cAAAA;AAAA,IACpB,MACE,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAClB,OAAO,GAAA,CAAI,SAAA;AAAA,MACX,KAAA,EAAO,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI;AAAA,KACjC,CAAE,CAAA;AAAA,IACJ,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,eAAA,GACJ,eACA,WAAA,EAAa,QAAA,KAAa,YAC1B,WAAA,EAAa,KAAA,KAAU,MAAM,IAAA,EAAK;AAEpC,EAAA,MAAM,YAAA,GAAe,eAAA,GAAkB,WAAA,EAAa,OAAA,CAAQ,UAAU,CAAA,GAAI,CAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,eAAA,GAAkB,WAAA,EAAa,YAAA,IAAgB,EAAA,GAAK,EAAA;AAC9E,EAAA,MAAM,cAAc,YAAA,GAAe,CAAA;AAEnC,EAAA3B,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAAE,SAAS,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAAC,uBAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,IAAU,QAAA,IAAY,CAAC,UAAU,OAAA,EAAS;AAE/C,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAS,qBAAA,EAAsB;AACtD,MAAA,WAAA,CAAY;AAAA,QACV,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,GAAA,EAAK,KAAK,GAAA,GAAM;AAAA,OACjB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,cAAA,EAAe;AACf,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,cAAA,EAAgB,IAAI,CAAA;AAEtD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,cAAA,EAAgB,IAAI,CAAA;AAAA,IAC3D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAC,CAAA;AAEhC,EAAAD,iBAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,QAAA,CAAS,SAAS,QAAA,CAAS,MAAM,KAAK,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7E,QAAA;AAAA,MACF;AACA,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,MAAM;AACpC,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,CAAC,CAAA;AAEJ,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AACzB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,OAAO,UAAA,GAAa,CAAA,KAAM;AAC1C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAIhC,IAAA,MAAM,UAAU,UAAA,CAAW,aAAA,IAAgB,GACvC,MAAA,CACE,MAAM,OAAO,4BAAe,CAAA,EAC5B,sBAAA,CAAuB,YAAY,QAAA,EAAU,YAAY,IAC3D,iBAAA,CAAkB,UAAA,EAAY,UAAU,YAAY,CAAA;AACxD,IAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,MAAM,WAAW,QAAA,CAAS;AAAA,QACxB,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,cAAc,OAAA,EAAS,EAAC,EAAG,YAAA,EAAc,EAAA;AAAG,OACxE,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,YAAY,CAAC,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAClE,IAAA,MAAM,WAAW,QAAA,CAAS;AAAA,MACxB,IAAA,EAAM,oBAAA;AAAA,MACN,QAAQ,EAAE,QAAA,EAAU,OAAO,YAAA,EAAc,OAAA,EAAS,cAAc,KAAA;AAAM,KACvE,CAAA;AACD,IAAA,MAAM,eAAA,CAAgB,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAsB;AAC7C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,EAAa,QAAQ,MAAA,EAAQ;AAElD,IAAA,MAAM,SAAA,GAAA,CACH,YAAY,YAAA,GAAe,SAAA,GAAY,YAAY,OAAA,CAAQ,MAAA,IAC5D,YAAY,OAAA,CAAQ,MAAA;AACtB,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,WAAA,EAAa,cAAc,SAAA,EAAU;AAC5D,IAAA,MAAM,WAAW,QAAA,CAAS;AAAA,MACxB,IAAA,EAAM,oBAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,eAAA,CAAgB,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EAChE,CAAA;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAEvD,EAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,GACnB,EAAA,GACA,eAAe,CAAA,GACb,CAAA,CAAE,qBAAA,EAAuB,EAAE,KAAA,EAAO,YAAA,EAAc,CAAA,GAChD,EAAE,wBAAwB,CAAA;AAEhC,EAAA,MAAM,kBACJ,YAAA,GAAe,CAAA,IAAK,iBAAA,IAAqB,CAAA,GACrC,EAAE,wBAAA,EAA0B;AAAA,IAC1B,SAAS,iBAAA,GAAoB,CAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,GACR,CAAA,GACD,EAAA;AAEN,EAAA,MAAM,YAAA,mBACJM,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,OAAO,QAAA,IAAY,MAAA;AAAA,QACnB,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAa,EAAE,gBAAgB,CAAA;AAAA,QAC/B,iBAAA,EAAmB,CAAC,OAAA,KAAyB,OAAA,CAAQ,iBAAiB,QAAA,CAAS,IAAA;AAAA,QAC/E,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,WAAA,CAAY,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAC/B,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA;AAAA,KACF;AAAA,oBAEAA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAa,EAAE,gBAAgB,CAAA;AAAA,QAC/B,SAAA,EAAU,gGAAA;AAAA,QACV,UAAU,CAAA,KAAA,KAAS;AACjB,UAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB,CAAA;AAAA,QACA,WAAW,CAAA,KAAA,KAAS;AAClB,UAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,YAAA,KAAK,UAAU,CAAC,CAAA;AAAA,UAClB;AAAA,QACF;AAAA;AAAA,KACF;AAAA,oBAEAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,6DAAA;AAAA,UACV,OAAA,EAAS,MAAM,KAAK,SAAA,CAAU,CAAC,CAAA;AAAA,UAE9B,YAAE,gBAAgB;AAAA;AAAA,OACrB;AAAA,sBAEAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,UACvB,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,UAC5B,SAAA,EAAU,6GAAA;AAAA,UACV,UAAU,CAAC,WAAA;AAAA,UACX,OAAA,EAAS,MAAM,KAAK,SAAA,CAAU,EAAE,CAAA;AAAA,UAEhC,QAAA,kBAAAA,eAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,OAClD;AAAA,sBAEAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,UACvB,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,UAC5B,SAAA,EAAU,6GAAA;AAAA,UACV,UAAU,CAAC,WAAA;AAAA,UACX,OAAA,EAAS,MAAM,KAAK,SAAA,CAAU,CAAC,CAAA;AAAA,UAE/B,QAAA,kBAAAA,eAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA;AACnD,KAAA,EACF,CAAA;AAAA,IAEC,gCACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,qCAAA,EAAuC,yBAAc,CAAA,GACnE,IAAA;AAAA,IAEH,kCACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,iDAAA,EAAmD,2BAAgB,CAAA,GACjF;AAAA,GAAA,EACN,CAAA;AAGF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAOI,qBAAAA;AAAA,sBACLJ,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO;AAAA,YACL,GAAG,SAAA;AAAA,YACH,QAAA,EAAU,OAAA;AAAA,YACV,GAAA,EAAK,CAAA;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,KAAA,EAAO,CAAA;AAAA,YACP,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,0BAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,SAAA,EAAU,kFAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAOI,qBAAAA;AAAA,oBACLJ,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,GAAG,SAAA;AAAA,UACH,QAAA,EAAU,OAAA;AAAA,UACV,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,SAAA,EAAW,mBAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,SAAA,EAAU,8FAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;ACxRO,SAAS,iBAAA,CAAkB,EAAE,UAAA,EAAW,EAA2B;AACxE,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIJ,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,eAAA,GAAkBC,cAAuB,IAAI,CAAA;AAEnD,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA+C;AACnE,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,MAC3D;AACA,MAAA,OAAO,CAAC,IAAA;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,KAAK,eAAA,EAC7B,QAAA,EAAA;AAAA,oBAAAH,cAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,SAAA,EAAW,aAAa,gBAAA,GAAmB,EAAA;AAAA,QAC3C,OAAA,EAAS,YAAA;AAAA,QAET,QAAA,kBAAAA,eAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,KAChD;AAAA,oBACAA,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAW,eAAA;AAAA,QACX,OAAA,EAAS;AAAA;AAAA;AACX,GAAA,EACF,CAAA;AAEJ;ACjCO,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAeiB,2BAAA;AACf,EAAUlB,iCAAA;AACV,EAAA,uBACCC,cAAAA,CAAC,OAAA,EAAA,EACD,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAQ,CAAA;AAC1B,IAAA,MAAM,EAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA;AAE/E,IAAA,uBACEA,eAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,eAC5B,QAAA,EAAA,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,IAAI,CAAA,CAAE,IAAI,CAAC,GAAA,EAAK,wBACrDG,eAAAA,CAAC,IAAA,EAAA,EAAa,SAAA,EAAU,qBAAA,EACrB,QAAA,EAAA;AAAA,MAAA,GAAA,KAAQ,qBACPH,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,UAC5B,OAAA,EAAS,MAAM,WAAA,CAAY,GAAG;AAAA;AAAA,OAChC;AAAA,MAGD,YAAY,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA,EAAE,IAAI,SAAS;AAAA,KAAA,EAAA,EARtC,GAST,CACD,CAAA,EAAA,EAZM,MAAA,CAAO,EAAE,CAalB,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAGA;ACtCO,SAAS,qBAAA,CAAsB;AAAA,EACpC,UAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,gBACJ,IAAA,CAAK,MAAA,GAAS,KACd,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM;AAChB,IAAA,MAAM,KAAA,GAAQ,EAAE,QAAQ,CAAA;AACxB,IAAA,MAAM,EAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,GAC1C,KAAA,GACA,MAAA,CAAO,KAAK,CAAA;AAClB,IAAA,OAAO,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,EAC5B,CAAC,CAAA;AAEH,EAAA,uBACEA,eAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBACf,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA,UAAA,CAAW,OAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,IAAI,EAAE,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACrDA,cAAAA,CAAC,QAAe,SAAA,EAAU,gCAAA,EACvB,cAAI,SAAA,IAAa,OAAA,mBAChBA,cAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAS,aAAA,EAAe,OAAA,EAAS,WAAA,EAAa,oBAE9DA,cAAAA,CAAAE,qBAAA,EAAG,QAAA,EAAA,GAAA,CAAI,cAAa,CAAA,EAAA,EAJf,KAMT,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AC9BA,SAAS,QAAQ,KAAA,EAA6C;AAC5D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,WACjD,KAAA,GACA,MAAA;AACN;AAQe,SAAR,eAAA,CAAiC;AAAA,EACtC,iBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAU,cAAA,EAAgB,KAAA,EAAO,YAAW,GAChE,iBAAA;AACF,EAAee,2BAAA;AACf,EAAA,MAAM,YAAYkC,8BAAA,EAAa;AAC/B,EAAA,MAAM,IAAIpD,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIJ,gBAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,eAAAA,iBAEtC,IAAI,KAAK,CAAA;AACX,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,EAAE,CAAA;AACjD,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,GAAG,aAAY,GAAI,YAAA;AAC3D,EAAA,MAAM,EAAE,cAAA,EAAgB,OAAA,EAAQ,GAAIuB,kCAAgB,QAAA,EAAU;AAAA,IAC5D,OAAA,EAAS,OAAA,CAAQ,iBAAA,CAAkB,gBAAgB;AAAA,GACpD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG,WAAA;AAAA,IACH,GAAG,cAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,eAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,IACA,gBAAA,EAAkB,WAAA;AAAA,IAClB,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,WAAA;AAAA,IACvB,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,IAAI;AAAA,GAC3D;AACA,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIK,gCAAA,CAA0C;AAAA,IACzD,GAAA,EAAK,QAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,MAAM,CAAC;AAAA,GACR,CAAA;AAOD,EAAA,MAAM,IAAA,GAAOC,eAAQ,MAAM;AACzB,IAAA,OAAO,IAAA,EAAM,QAAQ,EAAC;AAAA,EACxB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAiC;AAClD,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAChC,IAAA,IAAI,OAAO,MAAA,EAAW;AACtB,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAE3B,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAA+B;AAC7D,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9B,MAAA,OAAO,EAAA,KAAO,MAAA,IAAa,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAE3B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAA+B;AAC3C,UAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9B,UAAA,IAAI,EAAA,KAAO,MAAA,EAAW,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,QACxC,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAA+B;AAC3C,UAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9B,UAAA,IAAI,EAAA,KAAO,MAAA,EAAW,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,QACxC,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACjD,IAAA,MAAM+C,QAAO,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,GAAA,KACzB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACxC,QAAA,MAAM,MAAA,GAAS,kBAAkB,UAAA,CAAW,IAAA;AAAA,UAC1C,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAA,KAAc;AAAA,SAC7B;AACA,QAAA,OAAO;AAAA,UACL,GAAA;AAAA,UACA,OAAO,MAAA,EAAQ,WAAA,GAAc,OAAO,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA;AAAA,UAC5D,SAAS,MAAA,EAAQ,kBAAA,GACb,OAAO,kBAAA,CAAmB,GAAA,EAAK,GAAG,CAAA,GAClC;AAAA,SACN;AAAA,MACF,CAAC;AAAA,KACH;AACA,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,gBAAgB,IAAA,EAAAA,KAAAA,EAAM,gBAAgB,CAAA;AAClE,IAAA,KAAA,GAAQ,QAAQ,CAAA;AAChB,IAAA,gBAAA,EAAiB;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,EAAe,IAAA,KAAiB;AAC5D,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,aAAA,CAAc,CAAC,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA1E,iBAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,MAAA,aAAA,CAAc,CAAC,CAAA;AAAA,IACjB,GAAG,GAAG,CAAA;AAEN,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChB,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAqC,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC7E,WAAA,EAAa,EAAE,gBAAgB,CAAA;AAAA,UAC/B,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAG,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wBAAA,EACf,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,UAAA;AAAA,YACA,QAAA;AAAA,YACA,IAAA;AAAA,YACA,YAAA;AAAA,YACA,WAAA,EAAa;AAAA;AAAA,SACf;AAAA,wBAEAA,cAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,QAAA;AAAA,YACA,UAAA;AAAA,YACA,YAAA;AAAA,YACA,WAAA,EAAa;AAAA;AAAA;AACf,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,uEAAA;AAAA,UACV,OAAA,EAAS,SAAA;AAAA,UAER,YAAE,aAAa;AAAA;AAAA,OAClB;AAAA,sBAEAA,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,QAAA,kBACEA,cAAAA,CAAC,YAAA,EAAA,EAAa,WAAU,uBAAA,EACrB,QAAA,EAAA,SAAA,KAAc,KAAA,mBAAQA,eAAC,YAAA,EAAA,EAAa,CAAA,mBAAKA,cAAAA,CAAC,eAAY,CAAA,EACzD,CAAA;AAAA,UAEF,QAAA,kBACEA,cAAAA,CAAC,YAAA,EAAA,EAAa,WAAU,eAAA,EACrB,QAAA,EAAA,SAAA,KAAc,KAAA,mBAAQA,eAAC,WAAA,EAAA,EAAY,CAAA,mBAAKA,cAAAA,CAAC,gBAAa,CAAA,EACzD,CAAA;AAAA,UAEF,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU,eAAA;AAAA,UACV,KAAA,EAAO,MAAM,UAAA,IAAc,CAAA;AAAA,UAC3B,gBAAA,EAAkB,oBAAA;AAAA,UAClB,QAAA,EAAU,gBAAA;AAAA,UAEV,SAAA,EAAW,KAAA;AAAA,UACX,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASb,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC7NO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,KAAA,EAAO,aAAA,KAAkB4B,iCAAA,EAAgB;AAC3E,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,IAAe,CAAC,aAAA,IAAiB,CAAC,OAAO,OAAO,IAAA;AAEpE,EAAA,MAAM,MAAA,GAAS6C,mCAAiB,KAAK,CAAA;AACrC,EAAA,MAAM,QAAQ,MAAA,GAAS,CAAA,CAAE,oBAAoB,CAAA,GAAI,EAAE,mBAAmB,CAAA;AAEtE,EAAA,uBACExE,cAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,uBAAA,EAAsB,EAAA;AAAA,MACtB,cAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAS,aAAA;AAAA,MAER,QAAA,EAAA,MAAA,mBACCA,cAAAA,CAAC,OAAA,EAAA,EAAQ,QAAQ,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,IAAM,CAAA,mBAE5CA,eAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,GAEjD;AAEJ;ACWO,IAAM,qBAAwD,CAAC;AAAA,EACpE,UAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,YAAYoD,8BAAA,EAAa;AAC/B,EAAA,MAAM,SAASlC,2BAAA,EAAU;AACzB,EAAA,MAAM,kBAAkBW,oCAAA,EAAmB;AAC3C,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAIyC,8BAAA,EAAa;AACxC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI1E,gBAAkB,KAAK,CAAA;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAe,WAAW,eAAA,EAAgB;AAChD,EAAA,MAAM,QAAQ,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,YAAY,EAAE,MAAA,GAAS,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,cAAc,KAAA,EAAO,MAAA;AAE3B,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,sBAAsB,YAAY;AACtC,IAAA,IAAI,WAAA,EAAa;AACjB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM8E,gDAA8B,UAAA,EAAY;AAAA,QAC9C,SAAA;AAAA,QACA,cAAA,EAAgB,EAAE,aAAa;AAAA,OAChC,CAAA;AACD,MAAA,OAAA,CAAQ,CAAA,CAAE,8BAA8B,CAAC,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,CAAA,CAAE,4BAA4B,CAAC,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,MAAA,KAAyB;AACxD,IAAA,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,QAAQ,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,wBAAA,EAA0B,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAA,CACH,WAAA,IAAe,MAAA,IAAU,WAAA,IAAe,UAAU,KAAA,IAAS,CAAA;AAE9D,EAAA,uBACEtE,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,8CAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,MAE/B,QAAA,EAAA;AAAA,wBAAAH,eAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,EAAE,mBAAmB,CAAA,EAAG,SAAS,YAAA,EACzD,QAAA,kBAAAA,cAAAA,CAAC,QAAA,EAAA,EAAS,QAAQ,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,IAAM,CAAA,EAC/C,CAAA;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,YACvB,UAAU,KAAA,IAAS,CAAA;AAAA,YACnB,SAAS,MAAM;AACb,cAAA,uBAAA,CAAwB,MAAM,CAAA;AAAA,YAChC,CAAA;AAAA,YAEA,QAAA,kBAAAA,eAAC,gBAAA,EAAA,EAAiB,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SACvD;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,YACtB,UAAU,KAAA,IAAS,CAAA;AAAA,YACnB,SAAS,MAAM;AACb,cAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,YAC/B,CAAA;AAAA,YAEA,QAAA,kBAAAA,eAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAC9C;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,YACxB,UAAU,CAAC,QAAA;AAAA,YACX,SAAS,MAAM;AACb,cAAA,uBAAA,CAAwB,OAAO,CAAA;AAAA,YACjC,CAAA;AAAA,YAEA,QAAA,kBAAAA,eAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SACpD;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,YACzB,UAAU,KAAA,IAAS,CAAA;AAAA,YACnB,OAAA,EAAS,wBAAA;AAAA,YAET,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAC/C;AAAA,QAEC,iBAAA,oBACCG,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAF,cAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,cACjC,sBAAA,EAAqB,EAAA;AAAA,cACrB,SAAS,MAAM;AACb,gBAAA,cAAA,CAAe,IAAI,CAAA;AAAA,cACrB,CAAA;AAAA,cAEA,QAAA,kBAAAA,eAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,WACrD;AAAA,0BACAA,cAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACW,gBAAA,EAAkB,YAAA;AAAA,cAClB,KAAA,EAAQ,GAAA;AAAA,cAClB,UAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,cACtC,UAAA,kBAAYA,cAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAA;AAAA,cAC/D,UAAA,EAAY,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,cACtC,WAAA,EAAa,WAAA;AAAA,cACb,yBACEA,cAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,UAAA;AAAA,kBACA,iBAAA;AAAA,kBACA,kBAAkB,MAAM;AAAE,oBAAA,cAAA,CAAe,KAAK,CAAA;AAAA,kBAAG;AAAA;AAAA;AACnD;AAAA;AAEJ,SAAA,EACF,CAAA;AAAA,wBAGFA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,YACzB,OAAA,EAAS,mBAAA;AAAA,YAET,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAO,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAC7C;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,YAChC,QAAA,EAAU,WAAA;AAAA,YACV,SAAA,EAAW,cAAc,wBAAA,GAA2B,EAAA;AAAA,YACpD,SAAS,MAAM;AACb,cAAA,KAAK,mBAAA,EAAoB;AAAA,YAC3B,CAAA;AAAA,YAEC,wCACCA,cAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,SAAA,kBAAWA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,aAC1D,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAM,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAE9C;AAAA,wBAEAA,cAAAA,CAAC,wBAAA,EAAA,EAAyB,UAAA,EAAwB,CAAA;AAAA,wBAElDA,cAAAA,CAAC,sBAAA,EAAA,EAAuB,UAAA,EAAwB,CAAA;AAAA,wBAEhDA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,UAAA,EAAwB,CAAA;AAAA,wBAE3CA,eAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBAEnBG,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,kBAAkB,CAAA;AAAA,UAAG,GAAA;AAAA,UACvBU,oCAAA,CAAmB,KAAA,EAAO,EAAE,MAAA,EAAQ,iBAAiB;AAAA,SAAA,EACxD;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;AChMe,SAAR,kBAAA,CAAoC;AAAA,EACzC,UAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,SAASI,2BAAA,EAAU;AACzB,EAAA,MAAM,kBAAkBW,oCAAA,EAAmB;AAC3C,EAAA,MAAM,YAAYuB,8BAAA,EAAa;AAC/B,EAAA,MAAM,IAAIpD,iCAAA,EAAgB;AAC1B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,SAAA,KAAc,KAAA,CAAM,UAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAc;AACtC,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,GAAG,CAAA;AAAA,EACtD,CAAA;AACA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,EAAe2E,SAAAA,KAAqB;AAChE,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,QAAA,EAAUA,WAAU,CAAA;AAAA,EACtE,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KACX7D,oCAAA,CAAmB,CAAA,EAAG,EAAE,MAAA,EAAQ,eAAA,EAAiB,WAAA,EAAa,IAAA,EAAM,CAAA;AAEtE,EAAA,uBACEb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,cAAc,KAAA,mBAAQA,eAAC,YAAA,EAAA,EAAa,CAAA,mBAAKA,cAAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,MAChE,QAAA,EAAU,cAAc,KAAA,mBAAQA,eAAC,WAAA,EAAA,EAAY,CAAA,mBAAKA,cAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,MAChE,YAAA,kBAAcA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,MACvB,YAAA,kBAAcA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,MACvB,QAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB,IAAA;AAAA,MACjB,gBAAA,EAAkB,oBAAA;AAAA,MAClB,iBAAiB,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,MAE9C,MAAA,EAAQ,EAAE,cAAA,EAAgB,EAAA,EAAG;AAAA,MAC7B,WAAW,CAAC,KAAA,qBACVG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oEAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,KAAK,CAAA,EAAE,CAAA;AAAA,wBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE,CAAA;AAAA,wBAC3BA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAAA,wBACvBA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EAAE;AAAA,OAAA,EAC3B,CAAA;AAAA,MAEF,QAAA,EAAU,gBAAA;AAAA,MACV;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;AC5DO,SAAS,4BAAA,CACd,gBACA,OAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI,cAAA,KAAmB,OAAO,OAAO,KAAA;AACrC,EAAA,OAAO,IAAA;AACT;ACNA,IAAM2E,mBAAAA,GAAqB,EAAA;AAC3B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,gBAAA,GAAmB,GAAA;AAalB,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,YAAA,GAAe,IAAA;AAAA,EACf,SAAA,GAAYA;AACd,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIhF,gBAAwB,IAAI,CAAA;AAEhE,EAAA,MAAM,iBAAA,GAAoBiF,mBAAY,MAAM;AAC1C,IAAA,IAAI,eAAe,IAAA,EAAM;AAEzB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,qBAAA,EAAsB,CAAE,GAAA;AACzC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,mBAAA;AAC7C,IAAA,aAAA,CAAc,KAAK,GAAA,CAAI,gBAAA,EAAkB,KAAK,KAAA,CAAM,SAAS,CAAC,CAAC,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,EAAA/E,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,eAAe,IAAA,EAAM;AAEzB,IAAA,MAAM,KAAA,GAAQ,sBAAsB,iBAAiB,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,iBAAiB,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,EAAS,aAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAA,GAAS,IAAI,cAAA,CAAe,iBAAiB,CAAA,GAAI,IAAA;AAClE,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AACtD,MAAA,QAAA,EAAU,UAAA,EAAW;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,KAAK,CAAC,CAAA;AAE1C,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,oBAAA,GAAuB,CAAC,MAAA,KAAmB;AAC/C,MAAA,IAAI,MAAA,GAAS,YAAY,CAAA,EAAG;AAE5B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,mBAAmB,CAAA;AACzD,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,QAAA,GAAW,SAAS,CAAC,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AAEtC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,CAAW,QAAA,KAAa,QAAA,EAAU;AACnD,QAAA,KAAK,WAAW,QAAA,CAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,UAAU,CAAA;AAAA,MACjE;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,oBAAA,CAAqB,WAAW,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AAEtB,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,YAAA,IAAgB,CAAC,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,cAAA,EAAe;AACf,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,cAAc,CAAA;AAClD,IAAA,QAAA,CAAS,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAEhC,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,aAAa,UAAA,EAAY,YAAA,EAAc,SAAS,CAAC,CAAA;AAE1E,EAAA,OAAO;AAAA,IACL,YAAY,WAAA,IAAe;AAAA,GAC7B;AACF;;;AClGO,SAAS,kBAAA,CACd,SACA,QAAA,EACiB;AACjB,EAAA,IAAI,SAAS,OAAO,SAAA;AACpB,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,QAAA;AAC1B,EAAA,OAAO,IAAA;AACT;ACaA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,MAAM,IAAIE,iCAAA,EAAgB;AAC1B,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,4BAAyB,SAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,YAAS,MAAA,EAAQ,EAAE,OAAO,EAAA,EAAI,MAAA,EAAQ,IAAG,EAAG,CAAA;AAAA,oBAC7CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EAAE;AAAA,GAAA,EAC9B,CAAA;AAEJ;AAEA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,4BAAyB,QAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,UAAO,MAAA,EAAQ,EAAE,OAAO,EAAA,EAAI,MAAA,EAAQ,IAAG,EAAG,CAAA;AAAA,oBAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE;AAAA,GAAA,EAC7B,CAAA;AAEJ;AAKO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,EAAS,QAAQ,CAAA;AACjD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,GAAA,GAA0B;AAAA,IAC9B,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,IACxB,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,IAAA,GAAO,0BACL,uBAAA,CAAwB,GAAG,CAAA,mBAE3BA,eAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,EAE3B,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,yBACL,sBAAA,CAAuB,GAAG,CAAA,mBAE1BA,eAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,EAE1B;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,kBAAA,EAAkB,IAAA;AAAA,MAClB,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAW,IAAA,KAAS,SAAA,GAAY,IAAA,GAAO,MAAA;AAAA,MAEtC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AC3BO,SAAS,YAAA,CAA6B;AAAA,EAC3C,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,OAAA,GAAU,KAAA;AAAA,EACV,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,OAAA,GAAUJ,cAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUA,cAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,aACJ,CAAC,UAAA,CAAW,eAAc,IAC1B,4BAAA,CAA6B,gBAAgB,OAAO,CAAA;AACtD,EAAA,MAAM,SAAA,GAAYc,kCAAA,EAAiB,CAAE,MAAA,CAAO,SAAA;AAE5C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,iBAAA,CAAkB;AAAA,IACvC,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAc,CAAC,UAAA;AAAA,IACf;AAAA,GACD,CAAA;AACD,EAAA,MAAM,kBAAA,GAAqB,eAAe,UAAA,IAAc,GAAA;AAExD,EAAA,sBAAA,CAAuB,SAAS,UAAU,CAAA;AAE1C,EAAA,MAAM,IAAA,GAAO,WAAW,YAAA,EAAa;AACrC,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,YAAA,GAAe,cAAc,OAAA,GAC/B,OAAA,CAAQ,eAAc,GACtB,IAAA,EAAM,WAAW,SAAA,IAAa,CAAA;AAClC,EAAA,MAAM,cAAA,GAAiB,kBAAkB,MAAA,IAAU,CAAA;AACnD,EAAA,MAAM,iBAAA,GAAoB,qBAAqB,MAAA,IAAU,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM,CAAA;AAChC,EAAA,MAAM,cAAA,GACJ,OAAO,MAAA,KAAW,SAAA,IAAa,MAAA,GAC3B,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,EAAY,MAAA,IAAU,CAAC,CAAA,GACnC,YACE,CAAA,GACA,CAAA;AACR,EAAA,MAAM,gBAAA,GAAmB,IAAA,EAAM,UAAA,GAC3BmE,+BAAA,CAAc,QAAA,EAAU,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GACvE,MAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO;AAAA,GAC/C;AAEA,EAAAhF,iBAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA;AAAA,QACT,yBAAA;AAAA,QACA,CAAA,EAAG,KAAA,CAAM,qBAAA,EAAsB,CAAE,MAAM,CAAA,EAAA;AAAA,OACzC;AAAA,IACF;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA;AAAA,QACT,4BAAA;AAAA,QACA,CAAA,EAAG,KAAA,CAAM,qBAAA,EAAsB,CAAE,MAAM,CAAA,EAAA;AAAA,OACzC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,4BAAA,EAA8B,KAAK,CAAA;AAAA,IAC5D;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,cAAA,EAAgB,mBAAmB,SAAA,EAAW,IAAA,EAAM,OAAO,CAAC,CAAA;AAEhF,EAAA,uBACEM,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAU,2EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,kBAAe,UAAA,EAAwB,CAAA;AAAA,QACvC,UAAA;AAAA,wBACDG,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,OAAA;AAAA,YACL,uBAAA,EAAqB,IAAA;AAAA,YACrB,oBAAA,EAAoB,QAAA;AAAA,YACpB,yBAAA,EAAyB,aAAa,IAAA,GAAO,KAAA;AAAA,YAC7C,SAAA,EAAU,+CAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAQ,kBAAA,IAAsB,MAAA;AAAA,cAC9B,KAAA,EAAO,MAAA;AAAA,cACP,cAAA,EAAgB;AAAA,aAClB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,cAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,OAAA;AAAA,kBACA,QAAA,EAAU,YAAA;AAAA,kBACV,uBAAA;AAAA,kBACA;AAAA;AAAA,eACF;AAAA,8BACAA,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,kBAAA;AAAA,kBACV,IAAA,EAAM,aAAa,UAAA,GAAa,MAAA;AAAA,kBAChC,QAAA,EAAU,CAAA;AAAA,kBACV,iBAAe,QAAA,IAAY,MAAA;AAAA,kBAC3B,eAAA,EACE8E,kCAAA;AAAA,oBACE,YAAA;AAAA,oBACA,cAAA;AAAA,oBACA,cAAA;AAAA,oBACA;AAAA,mBACF,IAAK,MAAA;AAAA,kBAEP,uBAAA,EAAuB,gBAAA;AAAA,kBACvB,mBAAA,EAAiB,IAAA;AAAA,kBACjB,qBAAA,EAAoB,EAAA;AAAA,kBACpB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oBAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AAClC,oBAAA,IAAI,UAAA,CAAW,eAAc,EAAG;AAChC,oBAAA,MAAM,QAAA,GAAW,MAAM,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAC9D,oBAAA,MAAM,QAAA,GAAA,CAAY,IAAA,EAAM,OAAA,IAAW,EAAC,EAAG,IAAA;AAAA,sBACrC,CAAC,MAAM,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,SAAA,KAAc,OAAA,IAAW,CAAA,CAAE,SAAA,KAAc;AAAA,qBACjE;AACA,oBAAA,IAAI,YAAY,QAAA,EAAU;AACxB,sBAAA,KAAK,WAAW,QAAA,CAAS;AAAA,wBACvB,IAAA,EAAM,gBAAA;AAAA,wBACN,OAAO,QAAA,CAAS,EAAA;AAAA,wBAChB,UAAU,QAAA,CAAS;AAAA,uBACpB,CAAA;AAAA,oBACH;AAAA,kBACF,CAAA;AAAA,kBAEA,QAAA,kBAAA3E,eAAAA;AAAA,oBAAC4E,sCAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,OAAA;AAAA,sBACX,OAAA,EAAS,IAAA,EAAM,OAAA,IAAW,EAAC;AAAA,sBAC3B,cAAc,IAAA,EAAM,YAAA;AAAA,sBACpB,qBAAA,EAAuB,CAAC,CAAA,KAAM,UAAA,CAAW,uBAAuB,CAAC,CAAA;AAAA,sBAEnE,QAAA,EAAA;AAAA,wCAAA/E,cAAAA;AAAA,0BAAC,cAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,QAAA;AAAA,4BACA,MAAA;AAAA,4BACA;AAAA;AAAA,yBACF;AAAA,wBACC,cAAA,GAAiB,CAAA,IAAK,gBAAA,mBACrBA,cAAAA;AAAA,0BAAC,kBAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,KAAA;AAAA,4BACL,IAAA,EAAM,gBAAA;AAAA,4BACN,UAAA;AAAA,4BACA,YAAA;AAAA,4BACA;AAAA;AAAA,yBACF,GACE,IAAA;AAAA,wBACH,UAAA,IAAc,0BACbA,cAAAA;AAAA,0BAAC,mBAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,OAAA;AAAA,4BACA,QAAA;AAAA,4BACA,eAAA,EAAiB,OAAA;AAAA,4BACjB,cAAA,EAAgB,kBAAA;AAAA,4BAChB,SAAA;AAAA,4BACA,mBAAA;AAAA,4BACA;AAAA;AAAA,4CAGFA,cAAAA;AAAA,0BAAC,YAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,QAAA;AAAA,4BACA,mBAAA;AAAA,4BACA;AAAA;AAAA,yBACF;AAAA,wBAED,iBAAA,GAAoB,CAAA,IAAK,mBAAA,mBACxBA,cAAAA;AAAA,0BAAC,kBAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,QAAA;AAAA,4BACL,IAAA,EAAM,mBAAA;AAAA,4BACN,UAAA;AAAA,4BACA,YAAA;AAAA,4BACA;AAAA;AAAA,yBACF,GACE,IAAA;AAAA,wBACH,0BACCA,cAAAA;AAAA,0BAAC,cAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,MAAA;AAAA,4BACA,UAAA;AAAA,4BACA,YAAA;AAAA,4BACA,cAAA;AAAA,4BACA;AAAA;AAAA;AACF;AAAA;AAAA;AAEF;AAAA;AACF;AAAA;AAAA,SACF;AAAA,wBACAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,cAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,UAAA;AAAA,cACA,iBAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UACC,CAAC,6BACAA,cAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,UAAA;AAAA,cACA,KAAA;AAAA,cACA;AAAA;AAAA,8BAGFG,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+BAAA;AAAA,cACV,4BAAA,EAA0B,IAAA;AAAA,cAEzB,QAAA,EAAA;AAAA,gBAAA,OAAA,EAAS,eAAc,IAAK,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA;AACjC,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACzQO,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,IAAIJ,iCAAA,EAAgB;AAC1B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIJ,gBAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,YAAA,GAAe,WAAW,eAAA,EAAgB;AAChD,EAAA,MAAM,QAAQ,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,YAAY,EAAE,MAAA,GAAS,CAAA;AAChE,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,sBAAsB,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,wBAAA,EAA0B,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,uBACEQ,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qCAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,MAE/B,QAAA,EAAA;AAAA,wBAAAH,eAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,EAAE,mBAAmB,CAAA,EAAG,SAAS,YAAA,EACzD,QAAA,kBAAAA,cAAAA,CAAC,QAAA,EAAA,EAAS,QAAQ,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,IAAM,CAAA,EAC/C,CAAA;AAAA,wBAEAA,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,YACzB,UAAU,KAAA,IAAS,CAAA;AAAA,YACnB,OAAA,EAAS,wBAAA;AAAA,YAET,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SAC/C;AAAA,QAEC,iBAAA,oBACCG,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAF,cAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,cACjC,sBAAA,EAAqB,EAAA;AAAA,cACrB,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,cAElC,QAAA,kBAAAA,eAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,WACrD;AAAA,0BACAA,cAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,gBAAA,EAAkB,sBAAA;AAAA,cAClB,UAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,cACtC,UAAA,kBAAYA,cAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAA;AAAA,cAC/D,UAAA,EAAY,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,cACtC,WAAA,EAAa,WAAA;AAAA,cACb,yBACEA,cAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,UAAA;AAAA,kBACA,iBAAA;AAAA,kBACA,gBAAA,EAAkB,MAAM,cAAA,CAAe,KAAK;AAAA;AAAA;AAC9C;AAAA;AAEJ,SAAA,EACF,CAAA;AAAA,wBAGFA,cAAAA,CAAC,wBAAA,EAAA,EAAyB,UAAA,EAAwB,CAAA;AAAA,wBAElDA,cAAAA,CAAC,sBAAA,EAAA,EAAuB,UAAA,EAAwB,CAAA;AAAA,wBAEhDA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,UAAA,EAAwB,CAAA;AAAA,wBAE3CA,eAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBAEnBG,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,kBAAkB,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE;AAAA,SAAA,EAC3B;AAAA;AAAA;AAAA,GACF;AAEJ;ACvFO,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAU;AACR,EAAA,MAAM,IAAIJ,iCAAA,EAAgB;AAC1B,EAAA,MAAM,SAASkB,2BAAA,EAAU;AACzB,EAAA,MAAM,kBAAkBW,oCAAA,EAAmB;AAC3C,EAAA,MAAM,OAAA,GAAUf,qCAAmB,YAAA,EAAc;AAAA,IAC/C,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,QAAQA,oCAAA,CAAmB,SAAA,EAAW,EAAE,MAAA,EAAQ,iBAAiB,CAAA;AAEvE,EAAA,uBACEb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEACb,QAAA,kBAAAA,cAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,QAAA;AAAA,MACT,IAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAU,qBAAA;AAAA,MACV,OAAA;AAAA,MAEC,QAAA,EAAA,CAAA,CAAE,kBAAA,EAAoB,EAAE,OAAA,EAAS,OAAO;AAAA;AAAA,GAC3C,EACF,CAAA;AAEJ;;;ACrCO,SAAS,wBAAA,CACd,eACA,GAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,eAAe,OAAO,aAAA;AAE3B,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,MAAK,GAAI,aAAA;AAEzC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,IACzC,SAAA;AAAA,IACA,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,SAAS,GAAG,KAAA,IAAS;AAAA,GACxC,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,SAAA;AAAA,IACA,UAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI;AAAA,GAC1C;AACF;AAEO,SAAS,uBAAA,CACd,KACA,GAAA,EACc;AACd,EAAA,IAAI,CAAC,GAAA,CAAI,aAAA,EAAe,OAAO,GAAA;AAE/B,EAAA,OAAO;AAAA,IACL,GAAG,GAAA;AAAA,IACH,aAAA,EAAe,wBAAA,CAAyB,GAAA,CAAI,aAAA,EAAe,GAAG;AAAA,GAChE;AACF;ACnBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAE1B,EAAA,MAAM,aAAa,MAAoB;AACrC,IAAA,OAAO,UAAA,CAAW,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIJ,gBAAuB,UAAU,CAAA;AAEvD,EAAAE,iBAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAA,CAAO,YAAY,CAAA;AAAA,IACrB,CAAA;AAEA,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA;AAChD,IAAA,OAAO,MAAM,WAAA,IAAc;AAAA,EAC7B,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,KAAK,CAAC,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAc2B,eAAQ,MAAM;AAChC,IAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,EAAC;AAC7B,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAA;AAAA,MACnB,CAAC,MACC,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,SAAA,KAAc,OAAA,IAAW,CAAA,CAAE,SAAA,KAAc;AAAA,KAC5D;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,GAAG,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,QAAA,KAAA,QAAA,gBAAmC;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GACJ,OAAO,IAAA,KAAS,KAAA,GAAQ,EAAE,mBAAmB,CAAA,GAAI,EAAE,iBAAiB,CAAA;AAEtE,EAAA,uBACExB,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,OAAA;AAAA,MACZ,OAAA,kBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,SAAI,SAAA,EAAU,8DAAA,EACZ,sBAAY,GAAA,CAAI,CAAC,KAAK,GAAA,KAAQ;AAC7B,UAAA,MAAM,OAAA,GACJ,OAAO,GAAA,CAAI,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,KAAM,SAAA,IAClD,GAAA,CAAI,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,KAAM,KAAA;AAE7C,UAAA,IAAI,SAAS,OAAO,IAAA;AAEpB,UAAA,MAAM,IAAA,GAAqB,uBAAA;AAAA,YACzB;AAAA,cACE,GAAG,GAAA;AAAA,cACH,kBAAA,EAAoB,IAAI,kBAAA,IAAsB,IAAA;AAAA,cAC9C,kBAAA,EAAoB,IAAI,kBAAA,IAAsB,IAAA;AAAA,cAC9C,gBAAA,EAAkB,IAAI,gBAAA,IAAoB,IAAA;AAAA,cAC1C,mBAAA,EAAqB,IAAI,mBAAA,IAAuB;AAAA,aAClD;AAAA,YACA;AAAA,WACF;AAEA,UAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAwB,SAAA,EAAU,qBAAA,EAChC,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,SAAA,KAAc,8BACjBH,cAAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EACb,cAAI,YAAA,EACP,CAAA;AAAA,4BAEFA,cAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBAEC,GAAA;AAAA,gBACA,QAAA;AAAA,gBACA,GAAA;AAAA,gBACA,UAAU,GAAA,CAAI,SAAA;AAAA,gBACd,IAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA,EAAU,EAAA;AAAA,gBACV,IAAA,EAAM,GAAA,CAAI,QAAA,KAAa,KAAA,GAAQ,MAAA,GAAS;AAAA,eAAA;AAAA,cARnC,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA;AAAA;AASjC,WAAA,EAAA,EAhBQ,IAAI,SAiBd,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,gHAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YAER,YAAE,aAAa;AAAA;AAAA,SAClB,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GAEJ;AAEJ;ACnGO,SAAS,cAAA,CAAe;AAAA,EAC7B,GAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,SAASkB,2BAAA,EAAU;AACzB,EAAA,MAAM,kBAAkBW,oCAAA,EAAmB;AAE3C,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,UAAA,CAAW,SAAS,EAAE,IAAA,EAAM,eAAe,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA0C;AACjE,IAAA,IAAI,CAAC,EAAE,QAAA,IAAY,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAC1C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,QAAA,KAAA,QAAA;AACtB,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAErD,EAAA,uBACE5B,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,SAAA,IAAa,oBAAoB,CAAA,oEAAA,CAAA;AAAA,MAE/C,QAAA,kBAAAG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,CAAC,6BACAH,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAC,aAAA;AAAA,YACX,OAAA,EAAS,eAAA;AAAA,YACT,cAAY,CAAA,EAAG,CAAA,CAAE,mBAAmB,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAA;AAAA;AAAA,SAClD;AAAA,wBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAAa,oCAAA,CAAmB,GAAA,GAAM,CAAA,EAAG,EAAE,MAAA,EAAQ,eAAA,EAAiB,CAAA,EAC1D,CAAA;AAAA,QAEC,CAAC,6BACAb,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,KAAK,WAAW,QAAA,CAAS;AAAA,gBACvB,IAAA,EAAM,qBAAA;AAAA,gBACN,OAAO,GAAA,CAAI;AAAA,eACZ,CAAA;AAAA,YACH,CAAA;AAAA,YACA,SAAA,EAAU,mBAAA;AAAA,YACV,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,YAE5B,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA,SACjD;AAAA,QAGD,IAAA,CAAK,sCACJA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,eAAA,EAAgB;AAAA,YAClB,CAAA;AAAA,YACA,SAAA,EAAU,kBAAA;AAAA,YAET,QAAA,EAAA,CAAC,4BACAA,cAAAA,CAAC,eAAY,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,IAAM,CAAA,mBAEhDA,eAAC,IAAA,EAAA,EAAK,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAG;AAAA;AAAA;AAE7C,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AC/EA,SAAS,uBAAA,CAAwB;AAAA,EAC/B,GAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV,KAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,YAAA,EAAa,EAAG,YAAA;AAChD,EAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA;AAAA,IAC7B,CAAC,CAAA,KAAoB,CAAC,CAAA,CAAE;AAAA,GAC1B;AACA,EAAA,MAAM,YAAY,GAAA,CAAI,QAAA,KAAA,QAAA;AAEtB,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,IAAA,UAAA,CAAW,UAAA,CAAW,IAAI,EAAA,EAAI;AAAA,MAC5B,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,UAAU,CAAA,CAAE;AAAA,KACb,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,QAAA,GAAWwB,eAAQ,MAAM;AAC7B,IAAA,OAAO,CAAA;AAAA,MAAA,EACH,WAAA,GAAc,sBAAsB,mBAAmB;AAAA,MAAA,EACvD,aAAA,IAAiB,CAAC,SAAA,GAAY,aAAA,GAAgB,EAAE;AAAA,MAAA,EAEhD,SAAA,GACI,8CAAA,GACA,aAAA,GACE,EAAA,GACA,eACR;AAAA,MAAA,EACE,KAAA,GAAQ,8BAA8B,EAAE;AAAA,iBAAA,CAAA;AAAA,EAE9C,GAAG,CAAC,WAAA,EAAa,aAAA,EAAe,SAAA,EAAW,KAAK,CAAC,CAAA;AAEjD,EAAA,uBACExB,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,KAAA;AAAA,MACL,eAAA,EAAemC,mCAAiB,KAAK,CAAA;AAAA,MACrC,SAAA,EAAW,QAAA;AAAA,MACX,cAAY,GAAA,CAAI,EAAA;AAAA,MAChB,OAAA,EAAS,cAAA;AAAA,MAER,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAiB,GAAA,KAAgB;AACpD,QAAA,MAAM,IAAA,GAAqB;AAAA,UACzB,GAAG,CAAA;AAAA,UACH,kBAAA,EAAoB,EAAE,kBAAA,IAAsB,IAAA;AAAA,UAC5C,kBAAA,EAAoB,EAAE,kBAAA,IAAsB,IAAA;AAAA,UAC5C,gBAAA,EAAkB,EAAE,gBAAA,IAAoB,IAAA;AAAA,UACxC,mBAAA,EAAqB,EAAE,mBAAA,IAAuB;AAAA,SAChD;AAEA,QAAA,IAAI,CAAA,CAAE,cAAc,OAAA,EAAS;AAC3B,UAAA,uBACEnC,cAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,WAAA,EAAcgF,mCAAA,CAAkB,CAAC,CAAC,CAAA,CAAA;AAAA,cAE7C,IAAA,EAAK,UAAA;AAAA,cACL,eAAA,EAAezC,+BAAa,GAAG,CAAA;AAAA,cAC9B,GAAGG,8BAAA,CAAa,QAAA,EAAU,IAAI,EAAA,EAAI,CAAA,CAAE,WAAW,UAAU,CAAA;AAAA,cAC1D,iBAAe,CAAA,CAAE,SAAA;AAAA,cACjB,kBAAA,EAAkBuC,mCAAiB,CAAC,CAAA;AAAA,cACpC,KAAA,EAAOC,0CAAA,CAAyB,CAAA,EAAG,YAAA,EAAc,EAAE,CAAA;AAAA,cAEnD,QAAA,kBAAAlF,cAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,KAAA;AAAA,kBACL,GAAA;AAAA,kBACA,UAAA;AAAA,kBACA;AAAA;AAAA;AACF,aAAA;AAAA,YAbK,CAAA,CAAE;AAAA,WAcT;AAAA,QAEJ;AAEA,QAAA,uBACEA,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,UAAA;AAAA,YACL,eAAA,EAAeuC,+BAAa,GAAG,CAAA;AAAA,YAC9B,GAAGG,8BAAA,CAAa,QAAA,EAAU,IAAI,EAAA,EAAI,CAAA,CAAE,WAAW,UAAU,CAAA;AAAA,YAC1D,SAAA,EAAU,YAAA;AAAA,YACV,iBAAe,CAAA,CAAE,SAAA;AAAA,YACjB,KAAA,EAAOwC,0CAAA,CAAyB,CAAA,EAAG,YAAA,EAAc,EAAE,CAAA;AAAA,YAEnD,QAAA,kBAAAlF,cAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,QAAA;AAAA,gBACA,GAAA;AAAA,gBACA,UAAU,CAAA,CAAE,SAAA;AAAA,gBACZ,IAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA,EAAU,EAAA;AAAA,gBACV,IAAA,EAAK;AAAA;AAAA;AACP,WAAA;AAAA,UAjBK,CAAA,CAAE;AAAA,SAkBT;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,iBAAiB0B,uBAAAA,CAAM,IAAA;AAAA,EAClC,uBAAA;AAAA,EACA,CAAC,MAAM,IAAA,KAAS;AACd,IAAA,OACE,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,GAAA,IAClB,KAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IACpB,IAAA,CAAK,YAAY,IAAA,CAAK,OAAA,IACtB,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,IACzB,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,QAAA,IACvB,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,SACpB,IAAA,CAAK,UAAA,EAAY,KAAA,KAAU,IAAA,CAAK,YAAY,KAAA,IAC5C,IAAA,CAAK,UAAA,EAAY,QAAA,KAAa,KAAK,UAAA,EAAY,QAAA;AAAA,EAEnD;AACF,CAAA;ACnIO,SAAS,eAAA,CAAgB;AAAA,EAC9B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,YAAA,EAAa,EAAG,UAAA,IAAc,IAAA;AAC5D,EAAA,uBACE1B,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gCAAA,EAAiC,IAAA,EAAK,UAAA,EACpD,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACdA,cAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MAEC,GAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAY,CAAC,CAAC,UAAA,CAAW,aAAA,CAAc,IAAI,EAAE,CAAA;AAAA,MAC7C,UAAU,CAAC,CAAC,UAAA,CAAW,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,MACzC,OAAO,CAAC,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,EAAE,CAAA;AAAA,MACnC;AAAA,KAAA;AAAA,IATK,GAAA,CAAI;AAAA,GAWZ,CAAA,EACH,CAAA;AAEJ;AChBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,UAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,IAAID,iCAAA,EAAgB;AAC1B,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,EAAa;AACtC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAC1CJ,eAAAA,CAAmC;AAAA,IACjC,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,sBAAY,GAAA;AAAI,GACjB,CAAA;AAEH,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AAEjD,EAAAE,iBAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,WAAW,UAAA,EAAW;AACzC,IAAA,UAAA,CAAW,CAAC,GAAA,KAAQ;AAClB,MAAA,mBAAA,CAAoB,GAAG,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,UAAA;AAAA,IACA,OAAO,UAAA,EAAY,QAAA;AAAA,IACnB,OAAO,UAAA,EAAY,KAAA;AAAA,IACnB;AAAA,GACD,CAAA;AAED,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,SAAS,OAAO,IAAA;AAErC,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAC5D,EAAA,MAAM,wBAAA,GAA2B,MAAM,IAAA,CAAK,KAAA;AAAA,IAC1C,CAAC,GAAA,KAAQ,CAAC,CAAC,KAAA,CAAM,YAAA,CAAa,IAAI,EAAE;AAAA,GACtC;AACA,EAAA,MAAM,6BAA6B,MAAM;AACvC,IAAA,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,0BAAA,EAA4B,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,EAAW,IAAK,EAAC;AAC5C,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,KAAK,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAA,CAAM,gBAAA,CAAiB,MAAA,wBAAc,GAAA,EAAI,EAAG,OAAA,EAAS,CAAA,CAAE,GAAA;AAAA,IACzE,CAAC,CAAC,GAAA,EAAK,KAAK,GAAG,UAAA,KAAe;AAC5B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,KAAA,IAAS,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA;AAEpE,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,WAAW,QAAA,EAAS;AAAA,QACzB,uBACEG,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sCAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,qBAAA,CAAsB,MAAM,KAAK,CAAA;AAAA,YACnC,CAAA;AAAA,YAEC,QAAA,EAAA,CAAA,EAAG,CAAA,CAAE,yBAAyB,CAAC,IAAI,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,4BAA4B,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,GAAA,EAAM,MAAM,OAAO,CAAA;AAAA;AAAA;AAClH,OAEJ;AAAA,IACF;AAAA,GACF;AAEA,EAAA,uBACEG,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mBAAA,EAAoB,MAAK,UAAA,EACvC,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IACA,CAAC,gBAAA,CAAiB,KAAA,oBACjBH,cAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAU,kDAAA;AAAA,QACV,KAAA;AAAA,QAEA,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA,KAC3D;AAAA,oBAEFA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,KAAA;AAAA,QACL,eAAA,EAAe8D,uCAAA;AAAA,QACf,SAAA,EAAU,iDAAA;AAAA,QAET,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AAClC,UAAA,IAAI,GAAA,CAAI,cAAc,OAAA,EAAS;AAC7B,YAAA,uBACE3D,eAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,cAAA;AAAA,gBACL,eAAA,EAAeoC,+BAAa,KAAK,CAAA;AAAA,gBACjC,KAAA,EAAO;AAAA,kBACL,GAAG,GAAA,CAAI,KAAA;AAAA,kBACP,GAAG2C,2CAAyB,GAAA,EAAK,KAAA,CAAM,cAAc,EAAE,KAAA,EAAO,KAAK;AAAA,iBACrE;AAAA,gBACA,SAAA,EAAW,oDAAoDF,mCAAA,CAAkB,GAAG,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,aAAa,EAAE,CAAA,CAAA;AAAA,gBAC5G,kBAAA,EAAkBC,mCAAiB,GAAG,CAAA;AAAA,gBAEtC,QAAA,EAAA;AAAA,kCAAAjF,cAAAA;AAAA,oBAAC,cAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,wBAAA;AAAA,sBACT,OAAA,EAAS,0BAAA;AAAA,sBACT,YAAA,EAAY,EAAE,gBAAgB;AAAA;AAAA,mBAChC;AAAA,kBACC,GAAA,CAAI;AAAA;AAAA,eAAA;AAAA,cAfA,GAAA,CAAI;AAAA,aAgBX;AAAA,UAEJ;AAEA,UAAA,uBACEA,cAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,cAAA;AAAA,cACL,eAAA,EAAeuC,+BAAa,KAAK,CAAA;AAAA,cACjC,KAAA,EAAO;AAAA,gBACL,GAAG,GAAA,CAAI,KAAA;AAAA,gBACP,GAAG2C,0CAAA,CAAyB,GAAA,EAAK,KAAA,CAAM,YAAA,EAAc;AAAA,kBACnD,UAAU,GAAA,CAAI;AAAA,iBACf;AAAA,eACH;AAAA,cACA,SAAA,EAAW,CAAA,wCAAA,EAA2C,GAAA,CAAI,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,cAExE,QAAA,EAAA,GAAA,CAAI;AAAA,aAAA;AAAA,YAXA,GAAA,CAAI;AAAA,WAYX;AAAA,QAEJ,CAAC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;AChJO,SAAS,gBAAA,CACd,WACA,KAAA,EACM;AACN,EAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,EAAA,SAAA,CAAU,aAAa,IAAA,CAAK,GAAA;AAAA,IAC1B,CAAA;AAAA,IACA,SAAA,CAAU,cAAc,SAAA,CAAU;AAAA,GACpC;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,GACV,SAAA,CAAU,aAAA,CAA2B,CAAA,eAAA,EAAkB,KAAK,CAAA,EAAA,CAAI,CAAA,GAChE,SAAA,CAAU,aAAA,CAA2B,qBAAqB,CAAA;AAE9D,EAAA,KAAA,EAAO,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AACjF;;;ACVO,SAAS,uBAAA,CACd,SAAA,EACA,UAAA,EACA,aAAA,EACA;AACA,EAAA,MAAM,YAAA,GAAe,qBAAqB,UAAU,CAAA;AACpD,EAAA,MAAM,iBAAA,GAAoBtF,cAAO,YAAY,CAAA;AAE7C,EAAAC,iBAAU,MAAM;AACd,IAAA,MAAM,iBAAiB,iBAAA,CAAkB,OAAA;AACzC,IAAA,iBAAA,CAAkB,OAAA,GAAU,YAAA;AAE5B,IAAA,IAAI,cAAA,EAAgB,IAAA,KAAS,KAAA,IAAS,YAAA,EAAc;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,EAAc;AAEd,IAAA,MAAM,QAAQ,cAAA,CAAe,KAAA;AAC7B,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,gBAAA,CAAiB,SAAA,CAAU,SAAS,KAAK,CAAA;AACzC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,gBAAA,CAAiB,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,YAAA,EAAc,aAAA,EAAe,SAAS,CAAC,CAAA;AAC7C;ACSO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,uBAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,SAAA,GAAYD,cAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAY,WAAW,kBAAA,EAAmB;AAChD,EAAA,MAAM,YAAA,GAAe,YAAY,YAAA,IAAgB,IAAA;AACjD,EAAAC,iBAAU,MAAM;AACd,IAAA,UAAA,CAAW,sBAAA,EAAuB;AAAA,EACpC,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,sBAAA,CAAuB,WAAW,UAAU,CAAA;AAC5C,EAAA,uBAAA;AAAA,IAAwB,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,MAC7C,WAAW,mBAAA;AAAoB,GACjC;AAEA,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,MAAM,SAAA,GAAY,WAAW,YAAA,EAAa;AAC1C,EAAA,MAAM,gBAAA,GAAmB,WAAW,UAAA,GAChCgF,+BAAA;AAAA,IACE,QAAA;AAAA,IACA,UAAU,UAAA,CAAW,KAAA;AAAA,IACrB,UAAU,UAAA,CAAW;AAAA,GACvB,GACA,MAAA;AAEJ,EAAA,uBACE1E,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,kBAAe,UAAA,EAAwB,CAAA;AAAA,oBACxCG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACb,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,wBACtCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,UAAA;AAAA,YACA,iBAAA;AAAA,YACA;AAAA;AAAA,SACF,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAG,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,uBAAA,EAAqB,IAAA;AAAA,UACrB,SAAA,EAAU,uEAAA;AAAA,UACV,KAAA,EAAO,EAAE,cAAA,EAAgB,MAAA,EAAQ,WAAW,GAAA,EAAI;AAAA,UAEhD,QAAA,EAAA;AAAA,4BAAAH,cAAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,OAAA;AAAA,gBACA,UAAU,UAAA,CAAW,SAAA;AAAA,gBACrB,uBAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,4BACAG,eAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,WAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,QAAA,EAAU,CAAA;AAAA,gBACV,eAAA,EACE,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,IAAU,MAAA;AAAA,gBAExD,iBACE2E,kCAAA,CAAiB,UAAA,CAAW,WAAW,OAAA,CAAQ,MAAM,CAAC,CAAA,IACtD,MAAA;AAAA,gBAEF,uBAAA,EAAuB,gBAAA;AAAA,gBACvB,qBAAA,EAAoB,EAAA;AAAA,gBACpB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe;AAClC,kBAAA,IAAI,UAAA,CAAW,eAAc,EAAG;AAChC,kBAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA;AAClC,kBAAA,MAAM,QAAA,GAAW,WAAW,OAAA,CAAQ,IAAA;AAAA,oBAClC,CAAC,MACC,CAAC,CAAA,CAAE,UACH,CAAA,CAAE,SAAA,KAAc,OAAA,IAChB,CAAA,CAAE,SAAA,KAAc;AAAA,mBACpB;AACA,kBAAA,IAAI,YAAY,QAAA,EAAU;AACxB,oBAAA,KAAK,WAAW,QAAA,CAAS;AAAA,sBACvB,IAAA,EAAM,gBAAA;AAAA,sBACN,OAAO,QAAA,CAAS,EAAA;AAAA,sBAChB,UAAU,QAAA,CAAS;AAAA,qBACpB,CAAA;AAAA,kBACH;AAAA,gBACF,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA9E,cAAAA,CAAC,iBAAA,EAAA,EAAkB,UAAA,EAAwB,MAAA,EAAgB,CAAA;AAAA,kCAC3DA,cAAAA;AAAA,oBAAC,eAAA;AAAA,oBAAA;AAAA,sBACC,UAAA;AAAA,sBACA,QAAA;AAAA,sBACA,MAAM,UAAA,CAAW,IAAA;AAAA,sBACjB,SAAS,UAAA,CAAW;AAAA;AAAA,mBACtB;AAAA,kBACC,0BACCA,cAAAA;AAAA,oBAAC,cAAA;AAAA,oBAAA;AAAA,sBACC,UAAA;AAAA,sBACA,MAAA;AAAA,sBACA,cAAc,UAAA,CAAW;AAAA;AAAA;AAC3B;AAAA;AAAA;AAEJ;AAAA;AAAA,OACF;AAAA,MAEC,UAAA,CAAW,2BACVA,cAAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,SAEE,YAAW;AACT,YAAA,MAAM,WAAW,kBAAA,EAAmB;AACpC,YAAA,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,UACpC,CAAA;AAAA,UAIF,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,WAAW,UAAA,CAAW;AAAA;AAAA;AACxB,KAAA,EAEJ,CAAA;AAAA,IAEC,gCACCA,cAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA,EAAQ,YAAA;AAAA,QACR,SAAS,MAAM;AACb,UAAA,KAAK,UAAA,CAAW,QAAA,CAAS,EAAE,IAAA,EAAM,0BAA0B,CAAA;AAAA,QAC7D;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;;;ACrLA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAOD,SAAS,cAAc,MAAA,EAAgD;AACrE,EAAA,IAAI,CAAC,MAAA,IAAU,OAAQ,MAAA,CAAkC,YAAY,UAAA,EAAY;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,eAAe,EAAA,EAA0B;AAChD,EAAA,OAAO,OAAA;AAAA,IACL,EAAA,CAAG,OAAA,CAAQ,aAAa,CAAA,IACtB,EAAA,CAAG,QAAQ,sBAAsB,CAAA,IACjC,EAAA,CAAG,OAAA,CAAQ,kBAAkB,CAAA,IAC7B,GAAG,OAAA,CAAQ,mBAAmB,CAAA,IAC9B,EAAA,CAAG,YAAA,GAAe,MAAM,MAAM,QAAA,IAC9B,EAAA,CAAG,YAAA,GAAe,MAAM,CAAA,KAAM;AAAA,GAClC;AACF;AAQO,SAAS,kBAAkB,CAAA,EAKtB;AAEV,EAAA,IAAI,OAAO,CAAA,CAAE,gBAAA,KAAqB,cAAc,CAAA,CAAE,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,CAAE,QAAQ,OAAO,IAAA;AACrB,EAAA,OACE,CAAA,CAAE,OAAA,KACD,CAAA,CAAE,IAAA,KAAS,OAAA,IACV,CAAA,CAAE,IAAA,KAAS,SAAA,IACX,CAAA,CAAE,IAAA,KAAS,WAAA,IACX,CAAA,CAAE,IAAA,KAAS,KAAA,CAAA;AAEjB;AAMO,SAAS,wBAAA,CACd,QACA,IAAA,EACS;AACT,EAAA,MAAM,EAAA,GAAK,cAAc,MAAM,CAAA;AAC/B,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,EAAA,IAAI,cAAA,CAAe,EAAE,CAAA,EAAG;AACtB,IAAA,OAAO,eAAA,CAAgB,IAAI,IAAI,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,0BAA0B,CAAA,EAAG;AAC1C,IAAA,OAAO,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,mBAAA,CACd,QACA,IAAA,EACc;AACd,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,EAAE,MAAA,YAAkB,UAAU,OAAO,MAAA;AAC3E,EAAA,IACE,OAAO,aAAa,WAAA,KACnB,MAAA,KAAW,SAAS,IAAA,IAAQ,MAAA,KAAW,SAAS,eAAA,CAAA,EACjD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA;AAC9C,EAAA,IAAI,KAAA,IAAS,KAAA,KAAU,IAAA,EAAM,OAAO,YAAA;AACpC,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,OAAO,SAAA;AACnC,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,kDAAkD,CAAA,EAAG,OAAO,SAAA;AAC/E,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,6CAA6C,CAAA,EAAG,OAAO,MAAA;AAC1E,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,kCAAkC,CAAA,KAAM,QAAQ,OAAO,MAAA;AAC1E,EAAA,OAAO,SAAA;AACT;AC9BO,SAAS,QACd,MAAA,EACqB;AACrB,EAAA,MAAM,eAAA,GAAkBJ,cAA2B,MAAS,CAAA;AAC5D,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,eAAA,CAAgB,UAAU,MAAA,CAAO,QAAA;AAAA,EACnC,CAAA,MAAA,IAAW,CAAC,eAAA,CAAgB,OAAA,EAAS;AACnC,IAAA,eAAA,CAAgB,UAAUuF,oCAAA,EAAmB;AAAA,EAC/C;AACA,EAAA,MAAM,WAAW,eAAA,CAAgB,OAAA;AAEjC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAC9BxF,gBAAmC,IAAI,CAAA;AACzC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,gBAA+B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAA6B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAA4B,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAA+B,IAAI,CAAA;AAC3D,EAAA,MAAM,GAAG,cAAc,CAAA,GAAIA,gBAAS,CAAC,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,CAAA;AAC7E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAAA,CAAwB,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAAA,CAA2B,EAAE,CAAA;AAI/D,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,KAAgB,WAAA;AACxC,EAAA,MAAM,QAAA,GAAW,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA;AAGrC,EAAA,MAAM,SAAA,GAAYC,cAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAGpB,EAAA,MAAM,WAAA,GAAcA,aAAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,CAAA;AAO3D,EAAAC,iBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,KAAA,GAAuC,IAAA;AAC3C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAEZ,IAAA,IAAI,UAAU,OAAO,MAAA;AAErB,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,KAAK,QAAA,CAAS,KAAK,MAAM;AACvB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,OAAOuF,4BAAA,CAAiB,EAAE,GAAG,SAAA,CAAU,OAAA,EAAS,UAAU,CAAA;AAChE,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,KAAW;AAC/B,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAC/B,QAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AACjB,QAAA,UAAA,CAAW,OAAO,OAAO,CAAA;AACzB,QAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAC/B,QAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,QAAA;AAAA,MACF;AAKA,MAAA,WAAA,CAAY,UAAU,QAAA,CAAS,IAAA;AAAA,QAAK,MAClC,KAAK,KAAA,CAAM,IAAA;AAAA,UACT,CAAC,WACC,QAAA,GACI,MAAA,CAAO,WAAW,OAAA,EAAQ,GAC1B,MAAA,CAAO,UAAA,CAAW,gBAAA,EAAiB;AAAA,UACzC,MAAM;AAAA;AACR,OACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,KAAK,CAAC,CAAA;AAKlF,EAAAvF,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW;AACjD,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,SAAA,CAAU,OAAA;AAC3C,IAAA,UAAA,CAAW,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE/B,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,MAAA,CAAO,UAAA,EAAY;AACvC,IAAA,KAAA,MAAW,GAAA,IAAOwF,sCAAA,CAAqB,MAAA,CAAO,UAAU,CAAA,EAAG;AACzD,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAW;AAC5B,MAAA,MAAM,QACJ,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,IAAY,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,GAChD,GAAA,CAAI,QACJ,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GACnB,IAAI,KAAA,GACJ,IAAA;AACR,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,UAAA,CAAW,gBAAA,CAAiB,KAAA,EAAO,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,UAAU,CAAC,CAAA;AAElC,EAAAxF,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,eAAA,KAAoB,MAAA,EAAW;AACzD,IAAA,UAAA,CAAW,kBAAA,CAAmB,OAAO,eAAe,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,eAAe,CAAC,CAAA;AAEvC,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW;AACjD,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GACtB,CAAC,MAAA,CAAO,OAAO,CAAA,GACf,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA;AACxB,IAAA,UAAA,CAAW,mBAAmB,IAAI,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAE/B,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,oBAAA,KAAyB,MAAA,EAAW;AAC9D,IAAA,UAAA,CAAW,uBAAA,CAAwB,OAAO,oBAAoB,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,CAAO,oBAAoB,CAAC,CAAA;AAK5C,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,SAAA,EAAW;AAGf,MAAA,IAAI,CAAC,UAAA,CAAW,aAAA,EAAc,EAAG;AAC/B,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,WAAA,CAAY,QAAQ,CAAA;AAChD,QAAA,IAAI,QAAA,UAAkB,QAAQ,CAAA;AAAA,MAChC;AACA,MAAA,cAAA,CAAe,CAAC,OAAA,KAAY,OAAA,GAAU,CAAC,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,QAAA,EAAS;AACT,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,QAAQ,CAAA;AAEjD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,CAAC,CAAA;AAChD,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,MAAA,CAAO,aAAa,UAAU,CAAA;AAAA,MAChC,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,YAAY,OAAO;AAAA,MACvB,OAAA,EAAS,WAAW,OAAA,EAAQ;AAAA,MAC5B,OAAA,EAAS,WAAW,OAAA;AAAQ,KAC9B,CAAA;AAEA,IAAA,YAAA,CAAa,WAAW,CAAA;AAExB,IAAA,OAAO,UAAA,CAAW,iBAAA;AAAA,MAChB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAC,GAA2C,CAAA,KAC1C,CAAA,CAAE,YAAY,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE;AAAA,KAC/C;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,eAAA,CAAgB,UAAA,CAAW,iBAAiB,CAAA;AAC5C,IAAA,YAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AACtC,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,qBAAA,CAAsB,eAAe,CAAA;AACrE,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,kBAAA,CAAmB,YAAY,CAAA;AACjE,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,EAAa;AACb,MAAA,cAAA,EAAe;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,IAAc,CAAC,GAAA,IAAO,CAAC,OAAA,IAAW,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,cAAa,EAAG;AAC/F,IAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,EACxB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,UAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAOyF,mCAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,GAAI,OAAO,KAAA,GAAQC,sCAAA;AAAA,IACxD,QAAA;AAAA,IACA,IAAA,EAAM,IAAA,IAAS,UAAA,CAAW,WAAA,CAAY,QAAQ,CAAA;AAAA,IAC9C,SAAA;AAAA,IACA,gBAAgB,SAAA,CAAU,MAAA;AAAA,IAC1B,YAAA;AAAA,IACA,kBAAkB,YAAA,CAAa,MAAA;AAAA,IAC/B,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,YAAA,EAAc,CAAC,MAAA,KAAW,UAAA,CAAW,aAAa,MAAM,CAAA;AAAA,IACxD,eAAA,EAAiB,CAAC,MAAA,KAAW,UAAA,CAAW,gBAAgB,MAAM,CAAA;AAAA,IAC9D,oBAAoB,CAAC,EAAA,EAAI,WACvB,UAAA,CAAW,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAAA,IAC1C,uBAAuB,CAAC,EAAA,EAAI,WAC1B,UAAA,CAAW,qBAAA,CAAsB,IAAI,MAAM,CAAA;AAAA,IAC7C,iBAAA,GAAoB,CAAC,QAAA,EAAU,QAAA,EAAU,YACvC,UAAA,CAAW,iBAAA,CAAkB,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA,CAAA;AAAA,IAC1D,WAAA,EAAa,MAAM,OAAA,CAAQ,WAAA,EAAY;AAAA,IACvC,eAAA,EAAiB,CAAC,SAAA,KAAuB,OAAA,CAAQ,gBAAgB,SAAS,CAAA;AAAA,IAC1E,oBAAoB,CAAKhB,KAAAA,EAAW,cAClC,OAAA,CAAQ,kBAAA,CAAmBA,OAAM,SAAS,CAAA;AAAA,IAC5C,aAAA,EAAe,MAAM,OAAA,CAAQ,aAAA,EAAc;AAAA,IAC3C,oBAAA,EAAsB,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AAAA,IACzD,cAAA,EAAgB,CAAC,KAAA,KAMf,OAAA,CAAQ,kBAAA,CAAmB,EAAE,IAAA,EAAM,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAAA,IAClE,IAAA,EAAM,MAAM,UAAA,CAAW,IAAA,EAAK;AAAA,IAC5B,IAAA,EAAM,MAAM,UAAA,CAAW,IAAA;AAAK,GAC9B;AACF;AAGO,IAAM,WAAA,GAAc;;;AC3UpB,SAAS,SAAA,CAAa,KAAyB,KAAA,EAAgB;AACpE,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,IAAA,GAAA,CAAI,KAAK,CAAA;AACT,IAAA;AAAA,EACF;AACA,EAAC,IAAuB,OAAA,GAAU,KAAA;AACpC;ACyNO,SAAS,SAAyB,KAAA,EAA4B;AACnE,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA,GAAS,IAAA;AAAA,IACT,SAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,GAAc,IAAA;AAAA,IACd,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA,GAAiB,KAAA;AAAA,IACjB,OAAA,GAAU,KAAA;AAAA,IACV,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,MAAM,OAAA,GAAU3E,cAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,cAAA,GAAiBA,cAAqB,IAAI,CAAA;AAChD,EAAA,MAAM,eAAA,GAAkBgF,kBAAAA,CAAY,CAAC,CAAA,KAA4B;AAC/D,IAAA,cAAA,CAAe,UAAU,CAAA,CAAE,WAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAiB,SAAA,IAAaY,8BAAA;AACpC,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,MAAM,CAAA;AACzD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI7F,eAAAA;AAAA,IAAS,MAC3C6E,mCAAiB,cAAc;AAAA,GACjC;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,aAAY,GAAIhD,cAAAA;AAAA,IACpD,MACEiE,oCAAA,CAAmB;AAAA,MACjB,SAAA,EAAW,cAAA;AAAA,MACX;AAAA,KACD,CAAA;AAAA,IACH,CAAC,gBAAgB,UAAU;AAAA,GAC7B;AAEA,EAAA5F,iBAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACjB,IAAA,aAAA,CAAc2E,kCAAA,CAAiB,cAAc,CAAC,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,EAAa,cAAc,CAAC,CAAA;AAE9C,EAAA,MAAM,aAAA,GAAgBI,mBAAY,MAAM;AACtC,IAAA,aAAA,CAAc,CAAC,KAAA,KAAU,CAAC,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,SAAS,OAAA,CAAc;AAAA,IAC3B,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,cAAc,MAAA,CAAO;AAAA,GACjC,CAAA;AAED,EAAA/E,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,MAAA,CAAO,WAAW,kBAAA,CAAmB;AAAA,MACnC,kBAAA;AAAA,MACA,sBAAA;AAAA,MACA,iBAAA;AAAA,MACA,uBAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,IACnC,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,MAAM,EAAC,YAAU,GAAI,MAAA;AAErB,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAkB;AACtC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AACtC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,EAAC,MAAA,EAAQ,EAAA,EAAE,GAAI,MAAA,CAAO,OAAA;AAC5B,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,EAAA,IAAM,MAAA,CAAO,aAAa,MAAA,EAAQ;AACxD,UAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AAIpC,MAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,CAAA,CAAE,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC3D,MAAA,IAAI,UAAU,YAAA,EAAc;AAC5B,MAAA,MAAM,QAAA,GAAW,kBAAkB,CAAC,CAAA;AACpC,MAAA,IAAI,KAAA,KAAU,SAAA,IAAa,CAAC,QAAA,EAAU;AAGtC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpB,WAAW,wBAAA,CAAyB,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AACrD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,WAAW,YAAA,EAAa;AAC1C,MAAA,MAAM,UAAA,GAAa,WAAW,aAAA,EAAc;AAC5C,MAAA,KAAK,WAAW,QAAA,CAAS;AAAA,QACvB,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,GAAA,EAAK;AAAA,UACH,WAAA,EAAa,SAAA;AAAA,UACb,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,cAAA,EAAgB,YAAY,QAAA,IAAY;AAAA;AAC1C,OACD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AACtD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,KAAA,EAAO,MAAM,CAAC,CAAA;AAKzB,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,IAAA;AAC3D,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,QAAA,KAAa,WAAA,EAAa;AACzD,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAiB;AACnC,MAAA,MAAA,CAAO,WAAW,MAAM;AACtB,QAAA,IAAI,cAAA,CAAe,YAAY,KAAA,EAAO;AACtC,QAAA,KAAK,gBAAgB,cAAA,EAAe;AAAA,MACtC,GAAG,CAAC,CAAA;AAAA,IACN,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,UAAA,EAAY,IAAI,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,UAAA,EAAY,IAAI,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,UAAA,EAAY,IAAI,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,UAAA,EAAY,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA6F,mCAAA,CAAkB;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,IAC/C,UAAA,EAAY,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,IAAA;AAAA,IAC/C,QAAA,EAAU,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,QAAA,GAAW,EAAA;AAAA,IAC3C,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB9F,cAAO,KAAK,CAAA;AACrC,EAAAC,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,gBAAA,GAAmB;AAAA,MACjB,OAAA,EAAS,CAAC,GAAG,OAAO,CAAA;AAAA,MACpB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,GAAG,CAAC,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE5C,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,SAAA,CAAU,QAAQ,GAAG,CAAA;AACrB,IAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAC3B,IAAA,WAAA,GAAc,EAAE,KAAK,CAAA;AACrB,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrC,GAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAC,CAAA;AAEzC,EAAA,MAAM,EAAC,KAAA,EAAO,aAAA,EAAa,GAAIyE,gCAAc,MAAM,CAAA;AACnD,EAAA,MAAM,WAAW,aAAA,KAAkB,KAAA;AAEnC,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAE1B,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,OAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,2BACZtE,cAAAA,CAAC,eAAa,GAAG,WAAA,EAAa,oBAE9BA,cAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAA;AAAA,MACA,mBAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,cAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,cAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAGF,EAAA,MAAM,GAAA,GAAM2F,kCAAA,CAAiB,MAAA,EAAQ,SAAS,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAYnB,kCAAA,CAAiB,aAAa,CAAA,GAAI,MAAA,GAAS,OAAA;AAE7D,EAAA,uBACExE,cAAAA;AAAA,IAAC4F,sCAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,eAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,UAAA,CAAW,YAAA,EAAa;AAAA,MACvD,KAAA,EAAO,aAAA;AAAA,MACP,WAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA,EAAe,cAAc,MAAA,GAAY,aAAA;AAAA,MACzC,UAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAA5F,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAU,oBAAA;AAAA,UACV,GAAA;AAAA,UACA,cAAA,EAAgB,eAAA;AAAA,UAChB,oBAAA,EAAsB,eAAA;AAAA,UACtB,eAAA,EAAa,IAAA;AAAA,UACb,gBAAA,EAAc,IAAA;AAAA,UACd,gBAAA,EAAgB,SAAA;AAAA,UAChB,uBAAA,EAAuB,cAAc,MAAA,GAAS,OAAA;AAAA,UAC9C,KAAA,EAAO6F,+BAAa,aAAa,CAAA;AAAA,UAEhC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;AAGO,IAAM,QAAA,GAAW;;;ACzgBxB,IAAM,QAAA,GAAW,wBAAA;AAEjB,IAAM,GAAA,GAAM,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { TableViewState } from '../../engine/type';\r\n\r\nexport function useControllerSelector<T>(\r\n controller: UITableController,\r\n getter: () => T,\r\n isEqual: (previous: T, next: T) => boolean = Object.is,\r\n): T {\r\n const [value, setValue] = useState(() => getter());\r\n const getterRef = useRef(getter);\r\n const isEqualRef = useRef(isEqual);\r\n getterRef.current = getter;\r\n isEqualRef.current = isEqual;\r\n\r\n useEffect(() => {\r\n const unsubscribe = controller.subscribe(() => {\r\n const next = getterRef.current();\r\n setValue((previous) =>\r\n isEqualRef.current(previous, next) ? previous : next,\r\n );\r\n });\r\n\r\n return () => unsubscribe?.();\r\n }, [controller]);\r\n\r\n return value;\r\n}\r\n\r\nexport function useEngineSelector<T>(\r\n controller: UITableController,\r\n selector: (view: TableViewState | null | undefined) => T,\r\n isEqual: (previous: T, next: T) => boolean = Object.is,\r\n): T {\r\n return useControllerSelector(\r\n controller,\r\n () => selector(controller.getViewState()),\r\n isEqual,\r\n );\r\n}\r\n\r\nexport function jsonEqual<T>(previous: T, next: T): boolean {\r\n return JSON.stringify(previous) === JSON.stringify(next);\r\n}\r\n\r\nexport function useGridSearchState(controller: UITableController) {\r\n return useEngineSelector(\r\n controller,\r\n (view) => view?.gridSearch ?? null,\r\n jsonEqual,\r\n );\r\n}\r\n\r\nexport function useMobileEditorState(controller: UITableController) {\r\n return useEngineSelector(\r\n controller,\r\n (view) => view?.mobileEditor ?? null,\r\n jsonEqual,\r\n );\r\n}\r\n","import type { GridSearchState } from '../../engine/type';\r\nimport { GridSearchMatch } from './types';\r\n\r\nconst SCROLL_EDGE_PADDING = 12;\r\n\r\nexport function buildSearchScrollKey(\r\n search: NonNullable<GridSearchState>,\r\n match: GridSearchMatch,\r\n): string {\r\n return `${search.columnId}:${search.query}:${search.currentIndex}:${match.rowId}:${match.columnId}`;\r\n}\r\n\r\nfunction findMatchInContainer(\r\n container: HTMLElement,\r\n match: GridSearchMatch,\r\n): { rowEl: HTMLElement; cellEl: HTMLElement } | null {\r\n const rowEl = container.querySelector<HTMLElement>(\r\n `tr[data-rowid=\"${match.rowId}\"]`,\r\n );\r\n if (!rowEl) return null;\r\n\r\n const cellEl = rowEl.querySelector<HTMLElement>(\r\n `td[data-columnid=\"${match.columnId}\"]`,\r\n );\r\n if (!cellEl) return null;\r\n\r\n return { rowEl, cellEl };\r\n}\r\n\r\nfunction isHorizontallyVisible(\r\n cellRect: DOMRect,\r\n containerRect: DOMRect,\r\n): boolean {\r\n return (\r\n cellRect.left >= containerRect.left + SCROLL_EDGE_PADDING &&\r\n cellRect.right <= containerRect.right - SCROLL_EDGE_PADDING\r\n );\r\n}\r\n\r\nfunction isVerticallyVisible(\r\n rowRect: DOMRect,\r\n containerRect: DOMRect,\r\n): boolean {\r\n return (\r\n rowRect.top >= containerRect.top + SCROLL_EDGE_PADDING &&\r\n rowRect.bottom <= containerRect.bottom - SCROLL_EDGE_PADDING\r\n );\r\n}\r\n\r\nexport function restoreScrollPosition(\r\n container: HTMLElement,\r\n left: number,\r\n top: number,\r\n): void {\r\n if (Math.abs(container.scrollLeft - left) > 1) {\r\n container.scrollLeft = left;\r\n }\r\n if (Math.abs(container.scrollTop - top) > 1) {\r\n container.scrollTop = top;\r\n }\r\n}\r\n\r\nexport function applyScrollToMatch(\r\n container: HTMLElement,\r\n match: GridSearchMatch,\r\n): boolean {\r\n const elements = findMatchInContainer(container, match);\r\n if (!elements) return false;\r\n\r\n const { rowEl, cellEl } = elements;\r\n const cellRect = cellEl.getBoundingClientRect();\r\n const rowRect = rowEl.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n\r\n let deltaX = 0;\r\n let deltaY = 0;\r\n\r\n if (!isHorizontallyVisible(cellRect, containerRect)) {\r\n deltaX =\r\n (cellRect.left + cellRect.right) / 2 -\r\n (containerRect.left + containerRect.right) / 2;\r\n }\r\n\r\n if (!isVerticallyVisible(rowRect, containerRect)) {\r\n deltaY = rowRect.top - containerRect.top - SCROLL_EDGE_PADDING;\r\n }\r\n\r\n if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) {\r\n return true;\r\n }\r\n\r\n container.scrollBy({ left: deltaX, top: deltaY, behavior: 'auto' });\r\n return true;\r\n}\r\n","import { RefObject, useEffect, useLayoutEffect, useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { GridSearchState } from '../../engine/type';\r\nimport { useEngineSelector, useGridSearchState } from './useEngineSelector';\r\nimport {\r\n applyScrollToMatch,\r\n buildSearchScrollKey,\r\n restoreScrollPosition,\r\n} from '../gridSearch/scrollToMatch';\r\n\r\nconst RESTORE_WINDOW_MS = 800;\r\n\r\nfunction jsonEqual<T>(previous: T, next: T): boolean {\r\n return JSON.stringify(previous) === JSON.stringify(next);\r\n}\r\n\r\nexport function useScrollToSearchMatch(\r\n scrollRef: RefObject<HTMLElement | null>,\r\n controller: UITableController,\r\n) {\r\n const gridSearch = useGridSearchState(controller);\r\n const activeRowId = useEngineSelector(\r\n controller,\r\n () => controller.getActiveRow(),\r\n Object.is,\r\n );\r\n const currentPage = useEngineSelector(\r\n controller,\r\n (view) => view?.pagination.page ?? 1,\r\n Object.is,\r\n );\r\n\r\n const savedScrollRef = useRef<{\r\n key: string;\r\n left: number;\r\n top: number;\r\n } | null>(null);\r\n const restoreUntilRef = useRef(0);\r\n\r\n const getActiveMatch = (search: GridSearchState | null) => {\r\n if (!search || search.currentIndex < 0 || !search.matches.length) {\r\n return null;\r\n }\r\n return search.matches[search.currentIndex];\r\n };\r\n\r\n const persistScroll = (key: string) => {\r\n const container = scrollRef.current;\r\n if (!container) return;\r\n\r\n savedScrollRef.current = {\r\n key,\r\n left: container.scrollLeft,\r\n top: container.scrollTop,\r\n };\r\n restoreUntilRef.current = Date.now() + RESTORE_WINDOW_MS;\r\n };\r\n\r\n const restoreIfNeeded = () => {\r\n const container = scrollRef.current;\r\n const saved = savedScrollRef.current;\r\n if (!container || !saved) return;\r\n if (Date.now() > restoreUntilRef.current) return;\r\n\r\n restoreScrollPosition(container, saved.left, saved.top);\r\n };\r\n\r\n const scrollToActiveMatch = (search: GridSearchState | null): boolean => {\r\n const container = scrollRef.current;\r\n const match = getActiveMatch(search);\r\n if (!container || !match) return false;\r\n\r\n if (activeRowId !== match.rowId) return false;\r\n\r\n const key = buildSearchScrollKey(search!, match);\r\n const applied = applyScrollToMatch(container, match);\r\n if (applied) {\r\n persistScroll(key);\r\n }\r\n return applied;\r\n };\r\n\r\n useLayoutEffect(() => {\r\n if (!gridSearch) {\r\n savedScrollRef.current = null;\r\n restoreUntilRef.current = 0;\r\n return;\r\n }\r\n\r\n const match = getActiveMatch(gridSearch);\r\n const key = match ? buildSearchScrollKey(gridSearch, match) : null;\r\n\r\n if (key && savedScrollRef.current?.key === key) {\r\n restoreIfNeeded();\r\n } else {\r\n savedScrollRef.current = null;\r\n }\r\n\r\n scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n }, [gridSearch, activeRowId, currentPage, controller, scrollRef]);\r\n\r\n useEffect(() => {\r\n if (!gridSearch) return;\r\n\r\n let frame1 = 0;\r\n let frame2 = 0;\r\n\r\n frame1 = requestAnimationFrame(() => {\r\n restoreIfNeeded();\r\n const applied = scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n\r\n if (!applied) {\r\n frame2 = requestAnimationFrame(() => {\r\n scrollToActiveMatch(gridSearch);\r\n restoreIfNeeded();\r\n });\r\n }\r\n });\r\n\r\n return () => {\r\n cancelAnimationFrame(frame1);\r\n cancelAnimationFrame(frame2);\r\n };\r\n }, [gridSearch, activeRowId, currentPage, controller, scrollRef]);\r\n\r\n useEffect(() => {\r\n const unsubscribe = controller.subscribe(() => {\r\n if (!savedScrollRef.current) return;\r\n if (Date.now() > restoreUntilRef.current) return;\r\n\r\n requestAnimationFrame(() => {\r\n restoreIfNeeded();\r\n });\r\n });\r\n\r\n return () => unsubscribe?.();\r\n }, [controller, scrollRef]);\r\n}\r\n","/**\r\n * Pure live-region announcement builders (PR-125).\r\n * No React — unit-tested; UI formats via `messages`.\r\n */\r\n\r\nimport type { FilterModel } from '../../engine/dataOps/filterModel';\r\nimport type { SortModel } from '../../engine/dataOps/sortModel';\r\n\r\nexport type TranslateFn = (\r\n key: string,\r\n vars?: Record<string, string | number>,\r\n) => string;\r\n\r\nexport type ColumnLabel = { fieldName: string; fieldCaption: string };\r\n\r\nexport function countSelectedRows(\r\n selected: Record<number, true> | null | undefined,\r\n): number {\r\n if (!selected) return 0;\r\n return Object.keys(selected).length;\r\n}\r\n\r\nexport function countActiveFilters(filterModel: FilterModel | null | undefined): number {\r\n if (!filterModel) return 0;\r\n return Object.keys(filterModel).length;\r\n}\r\n\r\nexport function announceSortChange(\r\n sortModel: SortModel,\r\n columns: readonly ColumnLabel[],\r\n t: TranslateFn,\r\n): string {\r\n if (!sortModel.length) return t('a11y.sortCleared');\r\n const primary = sortModel[0]!;\r\n const col = columns.find((c) => c.fieldName === primary.colId);\r\n const column = col?.fieldCaption || primary.colId;\r\n return t(\r\n primary.sort === 'asc' ? 'a11y.sortedAsc' : 'a11y.sortedDesc',\r\n { column },\r\n );\r\n}\r\n\r\nexport function announceFilterChange(\r\n visible: number,\r\n total: number,\r\n activeFilterCount: number,\r\n quickFilterActive: boolean,\r\n t: TranslateFn,\r\n): string {\r\n if (activeFilterCount === 0 && !quickFilterActive) {\r\n return t('a11y.filterCleared');\r\n }\r\n return t('a11y.filterResult', { visible, total });\r\n}\r\n\r\nexport function announceSelectionChange(\r\n count: number,\r\n t: TranslateFn,\r\n): string {\r\n if (count <= 0) return t('a11y.selectionCleared');\r\n return t('a11y.rowsSelected', { count });\r\n}\r\n\r\nexport function announceValidationError(\r\n message: string,\r\n t: TranslateFn,\r\n): string {\r\n const trimmed = message.trim();\r\n if (!trimmed) return t('a11y.validationGeneric');\r\n return t('a11y.validationError', { message: trimmed });\r\n}\r\n\r\nexport function sortFingerprint(sortModel: SortModel): string {\r\n return sortModel.map((s) => `${s.colId}:${s.sort}`).join('|');\r\n}\r\n\r\nexport function filterFingerprint(\r\n filterModel: FilterModel,\r\n quickFilterText: string,\r\n): string {\r\n return `${JSON.stringify(filterModel)}|${quickFilterText}`;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\n\r\nimport type { CellError } from '../../engine/type';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { jsonEqual, useEngineSelector } from '../hooks/useEngineSelector';\r\nimport { useTranslations } from '../host';\r\nimport {\r\n announceFilterChange,\r\n announceSelectionChange,\r\n announceSortChange,\r\n announceValidationError,\r\n countActiveFilters,\r\n countSelectedRows,\r\n filterFingerprint,\r\n sortFingerprint,\r\n} from './liveAnnouncements';\r\n\r\ntype Props = {\r\n controller: UITableController;\r\n};\r\n\r\n/**\r\n * Polite aria-live region for sort / filter / selection / validation (PR-125).\r\n * Visually hidden; text comes from `messages`.\r\n */\r\nexport function GridLiveRegion({ controller }: Props) {\r\n const t = useTranslations();\r\n const [message, setMessage] = useState('');\r\n const primed = useRef(false);\r\n const prevSort = useRef('');\r\n const prevFilter = useRef('');\r\n const prevSelected = useRef(-1);\r\n const prevValidation = useRef('');\r\n\r\n const snapshot = useEngineSelector(\r\n controller,\r\n (view) => ({\r\n sortModel: view?.sortModel ?? [],\r\n filterModel: view?.filterModel ?? {},\r\n quickFilterText: view?.quickFilterText ?? '',\r\n selectedRows: view?.selectedRows ?? {},\r\n columns: (view?.columns ?? []).map((c) => ({\r\n fieldName: c.fieldName,\r\n fieldCaption: c.fieldCaption,\r\n })),\r\n visibleRows: view?.pagination.totalRows ?? 0,\r\n }),\r\n jsonEqual,\r\n );\r\n\r\n useEffect(() => {\r\n const sortFp = sortFingerprint(snapshot.sortModel);\r\n const filterFp = filterFingerprint(\r\n snapshot.filterModel,\r\n snapshot.quickFilterText,\r\n );\r\n const selectedCount = countSelectedRows(snapshot.selectedRows);\r\n const totalRows = controller.getAllRows()?.length ?? snapshot.visibleRows;\r\n\r\n if (!primed.current) {\r\n primed.current = true;\r\n prevSort.current = sortFp;\r\n prevFilter.current = filterFp;\r\n prevSelected.current = selectedCount;\r\n return;\r\n }\r\n\r\n if (sortFp !== prevSort.current) {\r\n prevSort.current = sortFp;\r\n setMessage(\r\n announceSortChange(snapshot.sortModel, snapshot.columns, t),\r\n );\r\n return;\r\n }\r\n\r\n if (filterFp !== prevFilter.current) {\r\n prevFilter.current = filterFp;\r\n setMessage(\r\n announceFilterChange(\r\n snapshot.visibleRows,\r\n totalRows,\r\n countActiveFilters(snapshot.filterModel),\r\n Boolean(snapshot.quickFilterText.trim()),\r\n t,\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n if (selectedCount !== prevSelected.current) {\r\n prevSelected.current = selectedCount;\r\n setMessage(announceSelectionChange(selectedCount, t));\r\n }\r\n }, [snapshot, controller, t]);\r\n\r\n useEffect(() => {\r\n const run = controller.validation();\r\n run((res) => {\r\n if (res.valid) {\r\n prevValidation.current = '';\r\n return;\r\n }\r\n let first: CellError | undefined;\r\n if (res.errors) {\r\n for (const err of res.errors.values()) {\r\n first = err;\r\n break;\r\n }\r\n }\r\n const msg = first?.message ?? '';\r\n if (!msg || msg === prevValidation.current) return;\r\n prevValidation.current = msg;\r\n setMessage(announceValidationError(msg, t));\r\n });\r\n }, [controller, snapshot, t]);\r\n\r\n return (\r\n <div\r\n className=\"pdg-live-region\"\r\n data-pdg-live-region=\"\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n >\r\n {message}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useId, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport { trapTabKey } from '../../infrastructure/ui/focusTrap';\r\nimport { useThemePortalStyle } from '../host';\r\n\r\ntype Props = {\r\n title?: React.ReactNode;\r\n children: React.ReactNode;\r\n className?: string;\r\n};\r\n\r\nexport function CustomTooltip({ title, children }: Props) {\r\n const [pos, setPos] = useState<{ x: number; y: number } | null>(null);\r\n const portalStyle = useThemePortalStyle({\r\n position: 'fixed',\r\n left: pos?.x,\r\n top: pos?.y,\r\n transform: 'translate(-50%, -100%)',\r\n });\r\n\r\n if (!title) return <>{children}</>;\r\n\r\n return (\r\n <span\r\n className=\"relative inline-flex\"\r\n onMouseEnter={(e) => {\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n setPos({ x: rect.left + rect.width / 2, y: rect.top - 6 });\r\n }}\r\n onMouseLeave={() => setPos(null)}\r\n >\r\n {children}\r\n {pos && typeof document !== 'undefined'\r\n ? createPortal(\r\n <span\r\n className=\"erp-table-tooltip\"\r\n style={portalStyle}\r\n >\r\n {title}\r\n </span>,\r\n document.body,\r\n )\r\n : null}\r\n </span>\r\n );\r\n}\r\n\r\nexport function Tooltip({ title, children }: { title?: React.ReactNode; children: React.ReactNode }) {\r\n return <CustomTooltip title={title}>{children}</CustomTooltip>;\r\n}\r\n\r\ntype ModalProps = {\r\n isModalOpen?: boolean;\r\n closeModal?: () => void;\r\n headerName?: React.ReactNode;\r\n headerIcon?: React.ReactNode;\r\n content?: React.ReactNode;\r\n width?: number;\r\n contentClassName?: string;\r\n};\r\n\r\nexport function CustomModal({\r\n isModalOpen,\r\n closeModal,\r\n headerName,\r\n headerIcon,\r\n content,\r\n width = 720,\r\n contentClassName,\r\n}: ModalProps) {\r\n const overlayStyle = useThemePortalStyle();\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!isModalOpen) return;\r\n const previouslyFocused = document.activeElement as HTMLElement | null;\r\n const id = requestAnimationFrame(() => {\r\n const focusables = dialogRef.current?.querySelectorAll<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n focusables?.[0]?.focus();\r\n });\r\n const onKey = (e: KeyboardEvent) => {\r\n if (!dialogRef.current) return;\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n closeModal?.();\r\n return;\r\n }\r\n trapTabKey(dialogRef.current, e);\r\n };\r\n document.addEventListener('keydown', onKey);\r\n return () => {\r\n cancelAnimationFrame(id);\r\n document.removeEventListener('keydown', onKey);\r\n previouslyFocused?.focus?.();\r\n };\r\n }, [isModalOpen, closeModal]);\r\n\r\n if (!isModalOpen || typeof document === 'undefined') return null;\r\n\r\n return createPortal(\r\n <div\r\n className=\"erp-table-modal-overlay\"\r\n style={overlayStyle}\r\n onClick={() => closeModal?.()}\r\n >\r\n <div\r\n ref={dialogRef}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label={typeof headerName === 'string' ? headerName : undefined}\r\n className=\"erp-table-modal\"\r\n style={{ width }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"erp-table-modal__header\">\r\n {headerIcon}\r\n <span>{headerName}</span>\r\n <button\r\n type=\"button\"\r\n className=\"erp-table-modal__close\"\r\n onClick={() => closeModal?.()}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <div className={`erp-table-modal__body ${contentClassName ?? ''}`}>{content}</div>\r\n </div>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nexport function CustomCheckbox({\r\n checked,\r\n disabled,\r\n onClick,\r\n onChange,\r\n className,\r\n 'aria-label': ariaLabel,\r\n}: {\r\n checked?: boolean;\r\n disabled?: boolean;\r\n onClick?: (e: React.MouseEvent<HTMLInputElement>) => void;\r\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n className?: string;\r\n 'aria-label'?: string;\r\n}) {\r\n return (\r\n <input\r\n type=\"checkbox\"\r\n className={`erp-table-checkbox ${className ?? ''}`}\r\n checked={!!checked}\r\n disabled={disabled}\r\n aria-label={ariaLabel}\r\n onClick={onClick}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport function CustomButton({\r\n children,\r\n className,\r\n onClick,\r\n htmlType = 'button',\r\n type,\r\n disabled,\r\n}: {\r\n children?: React.ReactNode;\r\n className?: string;\r\n onClick?: () => void;\r\n htmlType?: 'button' | 'submit' | 'reset';\r\n type?: string;\r\n disabled?: boolean;\r\n}) {\r\n return (\r\n <button\r\n type={htmlType}\r\n disabled={disabled}\r\n onClick={onClick}\r\n className={`flex justify-center items-center px-2 py-1 border rounded ${className ?? ''}`}\r\n data-variant={type}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nexport function InputText({\r\n value,\r\n onChange,\r\n placeholder,\r\n className,\r\n}: {\r\n value?: string;\r\n onChange?: (e: { target: { value: string } }) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}) {\r\n const id = useId();\r\n return (\r\n <input\r\n id={id}\r\n className={`px-3 py-2 border border-gray-gray5 rounded w-full text-sm outline-none ${className ?? ''}`}\r\n value={value ?? ''}\r\n placeholder={placeholder}\r\n onChange={onChange}\r\n />\r\n );\r\n}\r\n\r\nexport function Spin({\r\n indicator,\r\n}: {\r\n size?: string;\r\n indicator?: React.ReactNode;\r\n}) {\r\n return <span className=\"inline-flex animate-spin\">{indicator}</span>;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport { useThemePortalStyle } from '../host';\r\n\r\nexport type DropdownItem = {\r\n key?: string;\r\n label?: React.ReactNode;\r\n extra?: React.ReactNode;\r\n type?: 'divider' | 'item' | string;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n};\r\n\r\ntype DropdownProps = {\r\n items?: DropdownItem[];\r\n children: React.ReactNode;\r\n placement?: 'bottom' | 'bottomLeft' | 'bottomRight' | string;\r\n className?: string;\r\n dropdownClassName?: string;\r\n};\r\n\r\nexport function CustomDropdownButton({\r\n items = [],\r\n children,\r\n placement = 'bottom',\r\n className,\r\n dropdownClassName,\r\n}: DropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const triggerRef = useRef<HTMLDivElement>(null);\r\n const menuStyle = useThemePortalStyle({\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n });\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n let left = rect.left;\r\n if (placement === 'bottomRight') left = rect.right - 180;\r\n if (placement === 'bottomLeft') left = rect.left;\r\n setPos({ top: rect.bottom + 4, left });\r\n }, [open, placement]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n if (triggerRef.current?.contains(e.target as Node)) return;\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open]);\r\n\r\n return (\r\n <div ref={triggerRef} className={className}>\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpen((v) => !v);\r\n }}\r\n >\r\n {children}\r\n </span>\r\n {open && typeof document !== 'undefined'\r\n ? createPortal(\r\n <div\r\n className={`erp-table-dropdown ${dropdownClassName ?? ''}`}\r\n style={menuStyle}\r\n >\r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return <div key={`d-${index}`} className=\"erp-table-dropdown__divider\" />;\r\n }\r\n return (\r\n <button\r\n key={item.key ?? String(index)}\r\n type=\"button\"\r\n className=\"erp-table-dropdown__item\"\r\n disabled={item.disabled}\r\n onClick={() => {\r\n item.onClick?.();\r\n setOpen(false);\r\n }}\r\n >\r\n <span>{item.label}</span>\r\n {item.extra ? <span>{item.extra}</span> : null}\r\n </button>\r\n );\r\n })}\r\n </div>,\r\n document.body,\r\n )\r\n : null}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { Suspense, lazy } from 'react';\r\n\r\n/**\r\n * Public Select. The implementation and its antd-derived stylesheet are a lazy\r\n * chunk (`SelectImpl`) so they stay out of the main bundle budget.\r\n */\r\nexport type SelectOption = {\r\n value?: string | number;\r\n label?: React.ReactNode;\r\n title?: string;\r\n option?: unknown;\r\n disabled?: boolean;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport type SelectProps = {\r\n className?: string;\r\n style?: React.CSSProperties;\r\n value?: unknown;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n showSearch?: boolean;\r\n allowClear?: boolean;\r\n placeholder?: React.ReactNode;\r\n options?: SelectOption[];\r\n size?: 'small' | 'middle' | 'large';\r\n status?: 'error' | 'warning';\r\n filterOption?: (input: string, option: SelectOption) => boolean;\r\n onChange?: (value: unknown, option?: unknown) => void;\r\n onClick?: () => void;\r\n onSearch?: (value: string) => void;\r\n onClear?: () => void;\r\n onFocus?: () => void;\r\n onBlur?: () => void;\r\n onPopupScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\r\n popupMatchSelectWidth?: number | boolean;\r\n popupRender?: (menu: React.ReactNode) => React.ReactNode;\r\n autoFocus?: boolean;\r\n optionRender?: (\r\n originNode: { data: SelectOption },\r\n info?: { data: SelectOption },\r\n ) => React.ReactNode;\r\n notFoundContent?: React.ReactNode;\r\n getPopupContainer?: (trigger: HTMLElement) => HTMLElement;\r\n optionFilterProp?: string;\r\n labelInValue?: boolean;\r\n /** Windowed option list (antd default: on; only kicks in when options overflow `listHeight`). */\r\n virtual?: boolean;\r\n listHeight?: number;\r\n listItemHeight?: number;\r\n};\r\n\r\n\r\nconst SelectImpl = lazy(() => import('./SelectImpl'));\r\n\r\nexport function Select(props: SelectProps) {\r\n return (\r\n <Suspense\r\n fallback={\r\n <div\r\n className={props.className}\r\n style={{ display: 'inline-flex', minHeight: 32, minWidth: 64, ...props.style }}\r\n aria-busy=\"true\"\r\n />\r\n }\r\n >\r\n <SelectImpl {...props} />\r\n </Suspense>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport type IconConfig = {\r\n width?: number;\r\n height?: number;\r\n stroke?: string;\r\n fill?: string;\r\n strokeWidth?: number;\r\n};\r\n\r\ntype IconProps = {\r\n config?: IconConfig;\r\n className?: string;\r\n};\r\n\r\nfunction strokeClass(config?: IconConfig) {\r\n return !config?.stroke ? 'stroke-gray-gray10' : undefined;\r\n}\r\n\r\nexport function PlusIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 60 60\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M30 44.9996L30 29.1157M30 29.1157C30 29.1157 30 14.9996 29.9999 13.9996M30 29.1157L46 29.1157M30 29.1157L14 29.1157\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"3\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function GuaranteeReceive({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10.8327 2.50072C10.7531 2.5 10.6638 2.5 10.5616 2.5H6.83285C5.89942 2.5 5.43237 2.5 5.07585 2.68166C4.76224 2.84144 4.50746 3.09623 4.34767 3.40983C4.16602 3.76635 4.16602 4.23341 4.16602 5.16683V14.8335C4.16602 15.7669 4.16602 16.2334 4.34767 16.5899C4.50746 16.9035 4.76224 17.1587 5.07585 17.3185C5.43202 17.5 5.89852 17.5 6.83013 17.5L13.1686 17.5C14.1002 17.5 14.566 17.5 14.9222 17.3185C15.2358 17.1587 15.4914 16.9035 15.6512 16.5899C15.8327 16.2337 15.8327 15.7679 15.8327 14.8363V7.7714C15.8327 7.66913 15.8327 7.57967 15.8319 7.5M10.8327 2.50072C11.0707 2.50289 11.2213 2.51154 11.3651 2.54605C11.5351 2.58688 11.6976 2.65439 11.8467 2.74577C12.0148 2.8488 12.1592 2.99318 12.4473 3.28125L15.0518 5.88582C15.3401 6.17407 15.4834 6.3178 15.5865 6.48599C15.6779 6.63512 15.7455 6.79771 15.7863 6.96777C15.8208 7.11147 15.8296 7.26209 15.8319 7.5M10.8327 2.50072V4.83333C10.8327 5.76675 10.8327 6.23314 11.0143 6.58966C11.1741 6.90326 11.4289 7.15873 11.7425 7.31852C12.0987 7.5 12.5652 7.5 13.4968 7.5H15.8319M15.8319 7.5H15.8328\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CutIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 32 32\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M5.75 17.531h-0.125c-1.313 0-2.719 0.625-3.781 1.656-1.094 1-1.844 2.344-1.844 3.688 0 1.531 1.094 2.469 2.594 2.469 1.281 0 2.719-0.656 3.813-1.656 1.063-1.031 1.813-2.344 1.813-3.688 0-0.156 0-0.375-0.031-0.531l1-0.875 9.813 5.031c0.156 0.063 0.313 0.125 0.469 0.125 0.219 0 0.625-0.125 1.063-0.188 0.406-0.094 0.844-0.188 1.094-0.219 0.438-0.063 0.781-0.469 0.781-0.906 0-0.313-0.156-0.594-0.438-0.781l-8.156-5.656 8.156-5.656c0.281-0.188 0.438-0.469 0.438-0.781 0-0.438-0.344-0.875-0.781-0.938-0.125 0-0.281-0.031-0.469-0.094-0.375-0.094-0.875-0.156-1.25-0.219s-0.656-0.063-0.906 0.063c-0.063 0.031-0.25 0.125-0.594 0.281-0.313 0.156-0.719 0.375-1.188 0.625s-1 0.5-1.563 0.813c-0.563 0.281-1.219 0.594-1.781 0.906-1.188 0.594-2.344 1.188-3.219 1.625-0.438 0.219-0.813 0.438-1.094 0.563-0.25 0.125-0.375 0.219-0.375 0.219l-1-0.906c0.031-0.156 0.031-0.344 0.031-0.5 0-1.344-0.75-2.688-1.813-3.688-1.094-1-2.531-1.656-3.813-1.656-1.5 0-2.594 0.938-2.594 2.469 0 1.313 0.75 2.656 1.875 3.688 1.125 1.063 2.563 1.75 3.875 1.656 0.125 0.188 0.406 0.438 0.688 0.688s0.531 0.531 0.719 0.719v0.25c-0.188 0.188-0.406 0.406-0.719 0.688-0.281 0.25-0.531 0.531-0.688 0.719zM2.313 9.125v-0.094c0.094-0.031 0.188-0.031 0.281-0.031 0.75 0 1.563 0.469 2.094 0.906 0.25 0.219 0.563 0.594 0.781 0.969 0.25 0.375 0.469 0.813 0.469 1.156v0.063c-0.156 0.031-0.25 0.031-0.313 0.031-0.75 0-1.5-0.469-2.063-0.938-0.219-0.219-0.563-0.531-0.813-0.906s-0.438-0.813-0.438-1.156zM6.844 17.75l1.281-1.25-0.063-1.5 11.406-5.813 2 0.375-11.875 8.188-0.531-0.281-1.25 1.125c-0.219-0.344-0.563-0.625-0.969-0.844zM7.25 14.625l-0.406-0.438c0.406-0.156 0.75-0.438 0.969-0.781l0.5 0.438c-0.469 0.219-0.875 0.344-1.063 0.781zM8.688 16c0 0.5 0.406 0.906 0.906 0.906 0.531 0 0.938-0.406 0.938-0.906 0-0.531-0.406-0.938-0.906-0.938-0.563 0-0.938 0.406-0.938 0.938zM10.563 18.219l2.406-1.656 8.5 5.875-2 0.375zM2.344 22.875c0-0.688 0.469-1.469 1.156-2.031s1.5-1 2.125-1c0.094 0 0.188 0.031 0.25 0.031v0.063c0.031 0 0.031 0.031 0.031 0.063 0 0.688-0.469 1.438-1.156 2s-1.469 1-2.156 1h-0.125c-0.031-0.031-0.063-0.031-0.125-0.031v-0.094z\"\r\n className={!config?.fill ? 'fill-gray-gray8' : undefined}\r\n fill={config?.fill}\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ClipboardIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M13.3333 3.33594C15.1459 3.34603 16.1274 3.4264 16.7678 4.06672C17.5 4.79896 17.5 5.97747 17.5 8.33449V13.3345C17.5 15.6915 17.5 16.87 16.7678 17.6023C16.0355 18.3345 14.857 18.3345 12.5 18.3345H7.5C5.14298 18.3345 3.96447 18.3345 3.23223 17.6023C2.5 16.87 2.5 15.6915 2.5 13.3345V8.33449C2.5 5.97747 2.5 4.79896 3.23223 4.06672C3.87255 3.4264 4.85414 3.34603 6.66667 3.33594\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M6.66797 11.668H13.3346\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M5.83203 8.75H14.1654\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M7.5 14.582H12.5\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M6.66797 2.91797C6.66797 2.22761 7.22761 1.66797 7.91797 1.66797H12.0846C12.775 1.66797 13.3346 2.22761 13.3346 2.91797V3.7513C13.3346 4.44166 12.775 5.0013 12.0846 5.0013H7.91797C7.22761 5.0013 6.66797 4.44166 6.66797 3.7513V2.91797Z\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ClipboardCheck({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 52 52\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M44 2.5H19C16.4 2.5 14.3 4.6 14.3 7.2V8C14.3 8.5 14.6 8.8 15.1 8.8H37.8C40.4 8.8 42.5 10.9 42.5 13.5V37.8C42.5 38.3 42.8 38.6 43.3 38.6H44C46.6 38.6 48.7 36.5 48.7 33.9V7.2C48.7 4.6 46.6 2.5 44 2.5Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"none\"\r\n />\r\n <path\r\n d=\"M33 13.5H8C5.4 13.5 3.3 15.6 3.3 18.2V44.8C3.3 47.4 5.4 49.5 8 49.5H33C35.6 49.5 37.8 47.4 37.8 44.8V18.2C37.8 15.6 35.6 13.5 33 13.5ZM31 26.8L19 38.8C18.5 39.3 18 39.5 17.4 39.5C16.9 39.5 16.2 39.3 15.8 38.8L10 33C9.5 32.5 9.5 31.8 10 31.4L11.6 29.8C12.1 29.3 12.8 29.3 13.2 29.8L17.4 34L27.7 23.7C28.2 23.2 28.9 23.2 29.3 23.7L30.9 25.3C31.4 25.6 31.4 26.4 31 26.8Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n fill=\"#000\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function TrashBin({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 18 18\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M15.3751 4.5H2.625\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n d=\"M14.125 6.375L13.78 11.5493C13.6473 13.5405 13.5809 14.5361 12.9322 15.1431C12.2834 15.75 11.2856 15.75 9.29001 15.75H8.70999C6.71439 15.75 5.71659 15.75 5.06783 15.1431C4.41907 14.5361 4.3527 13.5405 4.21996 11.5493L3.875 6.375\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n />\r\n <path\r\n opacity=\"0.5\"\r\n d=\"M4.875 4.5C4.91691 4.5 4.93786 4.5 4.95686 4.49952C5.57444 4.48387 6.11927 4.09118 6.32941 3.51024C6.33588 3.49237 6.3425 3.47249 6.35576 3.43273L6.42857 3.21429C6.49073 3.02781 6.52181 2.93457 6.56304 2.8554C6.72751 2.53955 7.03181 2.32023 7.38346 2.26407C7.4716 2.25 7.56988 2.25 7.76645 2.25H10.2336C10.4301 2.25 10.5284 2.25 10.6165 2.26407C10.9682 2.32023 11.2725 2.53955 11.437 2.8554C11.4782 2.93457 11.5093 3.02781 11.5714 3.21429L11.6442 3.43273C11.6575 3.47244 11.6641 3.49238 11.6706 3.51024C11.8807 4.09118 12.4256 4.48387 13.0431 4.49952C13.0621 4.5 13.0831 4.5 13.125 4.5\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RedTrashBin({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 30 30\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M17.5 12.5V21.25M12.5 12.5V21.25M7.5 7.5V22.25C7.5 23.6501 7.5 24.3497 7.77248 24.8845C8.01217 25.3549 8.39434 25.7381 8.86475 25.9778C9.399 26.25 10.0987 26.25 11.4961 26.25H18.5039C19.9013 26.25 20.6 26.25 21.1342 25.9778C21.6046 25.7381 21.9881 25.3549 22.2278 24.8845C22.5 24.3502 22.5 23.6513 22.5 22.2539V7.5M7.5 7.5H10M7.5 7.5H5M10 7.5H20M10 7.5C10 6.33515 10 5.75301 10.1903 5.29358C10.444 4.68101 10.9304 4.19404 11.543 3.9403C12.0024 3.75 12.5851 3.75 13.75 3.75H16.25C17.4149 3.75 17.9973 3.75 18.4567 3.9403C19.0693 4.19404 19.5558 4.68101 19.8096 5.29358C19.9999 5.75301 20 6.33515 20 7.5M20 7.5H22.5M22.5 7.5H25\"\r\n stroke={config?.stroke ?? '#DC3545'}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Layers({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 30 30\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M26.25 15L15 22.5L3.75 15M26.25 20L15 27.5L3.75 20M26.25 10L15 17.5L3.75 10L15 2.5L26.25 10Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PdfIcon({ config, className }: IconProps) {\r\n const width = config?.width ?? 18;\r\n const height = config?.height ?? 18;\r\n return (\r\n <svg\r\n className={className}\r\n width={width}\r\n height={height}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <rect x=\"4\" y=\"2.5\" width=\"16\" height=\"19\" rx=\"2\" fill={config?.fill ?? '#b91c1c'} />\r\n <path\r\n d=\"M8 15.2V8.8h1.7c1.15 0 1.85.62 1.85 1.55 0 .92-.7 1.52-1.85 1.52H9.15v3.33H8Zm1.15-4.4h.5c.52 0 .82-.28.82-.68 0-.4-.3-.67-.82-.67h-.5v1.35Zm4.05 4.4V8.8h2.35c1.55 0 2.5.88 2.5 2.2 0 1.33-.95 2.22-2.5 2.22h-1.2v1.98h-1.15Zm1.15-3.05h1.1c.72 0 1.18-.4 1.18-1.05 0-.66-.46-1.04-1.18-1.04h-1.1v2.09Z\"\r\n fill=\"#fff\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Excel({ config, className }: IconProps) {\r\n const width = config?.width ?? 18;\r\n const height = config?.height ?? 18;\r\n return (\r\n <svg\r\n className={className}\r\n width={width}\r\n height={height}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <rect x=\"3\" y=\"2.5\" width=\"18\" height=\"19\" rx=\"2\" fill={config?.fill ?? '#217346'} />\r\n <path\r\n d=\"M8 7.4h2.15l1.85 4.55L13.85 7.4H16L13.1 14.6h-2.2L8 7.4Z\"\r\n fill=\"#fff\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ExcelImport({ config, className }: IconProps) {\r\n const width = config?.width ?? 18;\r\n const height = config?.height ?? 18;\r\n return (\r\n <svg\r\n className={className}\r\n width={width}\r\n height={height}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <rect x=\"3\" y=\"2.5\" width=\"18\" height=\"19\" rx=\"2\" fill={config?.fill ?? '#217346'} />\r\n <path\r\n d=\"M12 7v7.5M8.8 12.2 12 15.4l3.2-3.2M7.5 17.5h9\"\r\n stroke=\"#fff\"\r\n strokeWidth=\"1.6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SpinIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path\r\n fill={config?.fill}\r\n className={!config?.fill ? 'fill-gray-gray6' : undefined}\r\n d=\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\"\r\n opacity=\".25\"\r\n />\r\n <path\r\n fill={config?.fill}\r\n className={!config?.fill ? 'fill-gray-gray7' : undefined}\r\n d=\"M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z\"\r\n >\r\n <animateTransform\r\n attributeName=\"transform\"\r\n type=\"rotate\"\r\n dur=\"0.75s\"\r\n values=\"0 12 12;360 12 12\"\r\n repeatCount=\"indefinite\"\r\n />\r\n </path>\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Magnifier({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 18 18\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <circle\r\n cx=\"8.625\"\r\n cy=\"8.625\"\r\n r=\"7.125\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n d=\"M13.875 13.875L16.5 16.5\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function LeftChevron({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M14 16L10 12L14 8\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RightChevron({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 8L14 12L10 16\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function InfoIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M12 11V16M12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21ZM12.0498 8V8.1L11.9502 8.1002V8H12.0498Z\"\r\n stroke={config?.stroke ?? '#086EDC'}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function NoData({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 60}\r\n height={config?.height ?? 60}\r\n viewBox=\"0 0 145 145\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M103.121 123.752L91.7249 112.357M89.3776 20.631C88.7208 20.625 87.982 20.625 87.1387 20.625H56.3763C48.6756 20.625 44.8224 20.625 41.8811 22.1237C39.2939 23.4419 37.1919 25.5439 35.8737 28.1311C34.375 31.0724 34.375 34.9256 34.375 42.6263V122.376C34.375 130.077 34.375 133.925 35.8737 136.867C37.1919 139.454 39.2939 141.56 41.8811 142.878C44.8195 144.375 48.6681 144.375 56.3539 144.375L108.646 144.375C116.332 144.375 120.175 144.375 123.113 142.878C125.701 141.56 127.81 139.454 129.128 136.867C130.625 133.928 130.625 130.085 130.625 122.4V64.1141C130.625 63.2708 130.624 62.5318 130.618 61.875M89.3776 20.631C91.3401 20.6489 92.5768 20.7217 93.7625 21.0064C95.1655 21.3432 96.5102 21.8987 97.7405 22.6526C99.1276 23.5026 100.319 24.6937 102.695 27.0703L124.183 48.558C126.561 50.9361 127.743 52.1219 128.594 53.5095C129.348 54.7397 129.905 56.0811 130.242 57.4841C130.527 58.6698 130.6 59.9125 130.618 61.875M89.3776 20.631L89.375 39.8764C89.375 47.5772 89.375 51.426 90.8737 54.3673C92.1919 56.9546 94.2939 59.0595 96.8811 60.3778C99.8195 61.875 103.668 61.875 111.354 61.875H130.618M79.0625 116.875C69.5701 116.875 61.875 109.18 61.875 99.6875C61.875 90.1951 69.5701 82.5 79.0625 82.5C88.5549 82.5 96.25 90.1951 96.25 99.6875C96.25 109.18 88.5549 116.875 79.0625 116.875Z\"\r\n className={!config?.stroke ? 'stroke-gray-gray6' : undefined}\r\n stroke={config?.stroke}\r\n strokeWidth=\"6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M84.5 105.5L79 100M79 100L73.5 94.5M79 100L84.5 94.5M79 100L73.5 105.5\"\r\n className={!config?.stroke ? 'stroke-gray-gray85' : undefined}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function DragIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 21 22\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path d=\"M10.5 2L10.5 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M11 2L14 5\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M1 11L4 14\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M17 8L20 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M7 17L10 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M10 2L7 5\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M14 17L11 20\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M20 11L17 14\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M4 8L1 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n <path d=\"M1 11L20 11\" className={strokeClass(config)} stroke={config?.stroke} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Expand({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 19H5V14M14 5H19V10\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Undo({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 8H5V3M5.29102 16.3569C6.22284 17.7918 7.59014 18.8902 9.19218 19.4907C10.7942 20.0913 12.547 20.1624 14.1925 19.6937C15.8379 19.225 17.2893 18.2413 18.3344 16.8867C19.3795 15.5321 19.963 13.878 19.9989 12.1675C20.0347 10.4569 19.5211 8.78001 18.5337 7.38281C17.5462 5.98561 16.1366 4.942 14.5122 4.40479C12.8878 3.86757 11.1341 3.86499 9.5083 4.39795C7.88252 4.93091 6.47059 5.97095 5.47949 7.36556\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Dots({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M11 18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18C13 17.4477 12.5523 17 12 17C11.4477 17 11 17.4477 11 18Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 6C11 6.55228 11.4477 7 12 7C12.5523 7 13 6.55228 13 6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6Z\"\r\n className={!config?.fill ? 'fill-gray-gray10' : undefined}\r\n fill={config?.fill}\r\n />\r\n <path\r\n d=\"M11 18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18C13 17.4477 12.5523 17 12 17C11.4477 17 11 17.4477 11 18Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 6C11 6.55228 11.4477 7 12 7C12.5523 7 13 6.55228 13 6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6Z\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SavePlus({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M17 21.0002L7 21M17 21.0002L17.8031 21C18.921 21 19.48 21 19.9074 20.7822C20.2837 20.5905 20.5905 20.2843 20.7822 19.908C21 19.4806 21 18.921 21 17.8031V9.21955C21 8.77072 21 8.54521 20.9521 8.33105C20.9095 8.14 20.8393 7.95652 20.7432 7.78595C20.6366 7.59674 20.487 7.43055 20.1929 7.10378L17.4377 4.04241C17.0969 3.66374 16.9242 3.47181 16.7168 3.33398C16.5303 3.21 16.3242 3.11858 16.1073 3.06287C15.8625 3 15.5998 3 15.075 3H6.2002C5.08009 3 4.51962 3 4.0918 3.21799C3.71547 3.40973 3.40973 3.71547 3.21799 4.0918C3 4.51962 3 5.08009 3 6.2002V17.8002C3 18.9203 3 19.4796 3.21799 19.9074C3.40973 20.2837 3.71547 20.5905 4.0918 20.7822C4.5192 21 5.07899 21 6.19691 21H7M17 21.0002V17.1969C17 16.079 17 15.5192 16.7822 15.0918C16.5905 14.7155 16.2837 14.4097 15.9074 14.218C15.4796 14 14.9203 14 13.8002 14H10.2002C9.08009 14 8.51962 14 8.0918 14.218C7.71547 14.4097 7.40973 14.7155 7.21799 15.0918C7 15.5196 7 16.0801 7 17.2002V21M15 7H9\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <circle\r\n cx=\"18.5\"\r\n cy=\"18.5\"\r\n r=\"4.75\"\r\n stroke={config?.stroke}\r\n fill={config?.fill}\r\n className={!config?.stroke && !config?.fill ? 'fill-white stroke-gray-gray3' : undefined}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n d=\"M18.5 20.7498L18.5 18.3673M18.5 18.3673C18.5 18.3673 18.5 16.2498 18.5 16.0998M18.5 18.3673L20.9 18.3673M18.5 18.3673L16.1 18.3673\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"0.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function Reload({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 24 24\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M10 16H5V21M14 8H19V3M4.58301 9.0034C5.14369 7.61566 6.08244 6.41304 7.29255 5.53223C8.50266 4.65141 9.93686 4.12752 11.4298 4.02051C12.9227 3.9135 14.4147 4.2274 15.7381 4.92661C17.0615 5.62582 18.1612 6.68254 18.9141 7.97612M19.4176 14.9971C18.8569 16.3848 17.9181 17.5874 16.708 18.4682C15.4979 19.3491 14.0652 19.8723 12.5723 19.9793C11.0794 20.0863 9.58606 19.7725 8.2627 19.0732C6.93933 18.374 5.83882 17.3175 5.08594 16.0239\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function MoonIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M21 14.3A8.5 8.5 0 0 1 9.7 3 7.5 7.5 0 1 0 21 14.3Z\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SunIcon({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n width={config?.width ?? 18}\r\n height={config?.height ?? 18}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <circle\r\n className={strokeClass(config)}\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"4\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n />\r\n <path\r\n className={strokeClass(config)}\r\n d=\"M12 3v1.5M12 19.5V21M4.93 4.93l1.06 1.06M17.99 17.99l1.06 1.06M3 12h1.5M19.5 12H21M4.93 19.07l1.06-1.06M17.99 6.01l1.06-1.06\"\r\n stroke={config?.stroke}\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function EditPencil({ config, className }: IconProps) {\r\n return (\r\n <svg\r\n className={className}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={config?.width ?? 16}\r\n height={config?.height ?? 16}\r\n viewBox=\"0 0 20 20\"\r\n fill={config?.fill ?? 'none'}\r\n aria-hidden\r\n >\r\n <path\r\n d=\"M3.3335 16.6668H16.6668M3.3335 16.6668V13.3334L10.0002 6.66676M3.3335 16.6668L6.66683 16.6667L13.3335 10.0001M10.0002 6.66676L12.3907 4.27622L12.3921 4.2748C12.7212 3.94573 12.886 3.7809 13.076 3.71917C13.2434 3.66479 13.4237 3.66479 13.5911 3.71917C13.7809 3.78086 13.9456 3.9455 14.2742 4.2741L15.724 5.72393C16.054 6.05394 16.2191 6.21903 16.2809 6.4093C16.3353 6.57667 16.3353 6.75696 16.2809 6.92433C16.2191 7.11447 16.0543 7.2793 15.7247 7.60884L15.724 7.60955L13.3335 10.0001M10.0002 6.66676L13.3335 10.0001\"\r\n className={strokeClass(config)}\r\n stroke={config?.stroke}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\n\r\nimport { LeftChevron, RightChevron } from './icons';\r\nimport { CustomButton } from './chrome';\r\n\r\ntype Props = {\r\n current: number;\r\n pageSize: number;\r\n total: number;\r\n onChange?: (page: number) => void;\r\n onShowSizeChange?: (page: number, pageSize: number) => void;\r\n pageSizeOptions?: string[];\r\n showSizeChanger?: boolean;\r\n showTotal?: (total: number) => React.ReactNode;\r\n prevIcon?: React.ReactNode;\r\n nextIcon?: React.ReactNode;\r\n jumpNextIcon?: React.ReactNode;\r\n jumpPrevIcon?: React.ReactNode;\r\n locale?: { items_per_page?: string };\r\n showTitle?: boolean;\r\n className?: string;\r\n direction?: 'rtl' | 'ltr';\r\n};\r\n\r\nexport function Pagination({\r\n current,\r\n pageSize,\r\n total,\r\n onChange,\r\n onShowSizeChange,\r\n pageSizeOptions = ['10', '20', '50', '100'],\r\n showSizeChanger,\r\n showTotal,\r\n prevIcon,\r\n nextIcon,\r\n className,\r\n direction = 'rtl',\r\n}: Props) {\r\n const options = pageSizeOptions.includes(String(pageSize))\r\n ? pageSizeOptions\r\n : [String(pageSize), ...pageSizeOptions];\r\n const totalPages = Math.max(1, Math.ceil((total || 0) / (pageSize || 1)));\r\n const pages: Array<number | 'gap'> = [];\r\n for (let i = 1; i <= totalPages; i += 1) {\r\n if (totalPages <= 7 || i === 1 || i === totalPages || Math.abs(i - current) <= 1) {\r\n pages.push(i);\r\n } else if (pages[pages.length - 1] !== 'gap') {\r\n pages.push('gap');\r\n }\r\n }\r\n\r\n return (\r\n <div className={`erp-table-pagination ${className ?? ''}`}>\r\n {showTotal ? showTotal(total) : null}\r\n <div className=\"erp-table-pagination__pages\">\r\n <button\r\n type=\"button\"\r\n className=\"erp-table-pagination__nav\"\r\n disabled={current <= 1}\r\n onClick={() => onChange?.(current - 1)}\r\n >\r\n {prevIcon ??\r\n (direction === 'rtl' ? <RightChevron config={{ width: 14, height: 14 }} /> : <LeftChevron config={{ width: 14, height: 14 }} />)}\r\n </button>\r\n {pages.map((p, i) =>\r\n p === 'gap' ? (\r\n <span key={`g-${i}`}>...</span>\r\n ) : (\r\n <button\r\n key={p}\r\n type=\"button\"\r\n className={`erp-table-pagination__page ${p === current ? 'is-active' : ''}`}\r\n onClick={() => onChange?.(p)}\r\n >\r\n {p.toLocaleString(direction === 'rtl' ? 'fa-IR' : 'en-US')}\r\n </button>\r\n ),\r\n )}\r\n <button\r\n type=\"button\"\r\n className=\"erp-table-pagination__nav\"\r\n disabled={current >= totalPages}\r\n onClick={() => onChange?.(current + 1)}\r\n >\r\n {nextIcon ??\r\n (direction === 'rtl' ? <LeftChevron config={{ width: 14, height: 14 }} /> : <RightChevron config={{ width: 14, height: 14 }} />)}\r\n </button>\r\n </div>\r\n {showSizeChanger ? (\r\n <select\r\n value={String(pageSize)}\r\n onChange={(e) => onShowSizeChange?.(1, Number(e.target.value))}\r\n >\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {Number(opt).toLocaleString(direction === 'rtl' ? 'fa-IR' : 'en-US')}\r\n </option>\r\n ))}\r\n </select>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport { CustomButton };\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\nimport { DatePicker, type DatePickerValue } from 'react-persian-range-picker';\r\n\r\nimport type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport { useDateAdapter, useERPTableTheme } from '../host';\r\n\r\ntype Props = {\r\n value?: unknown;\r\n onChange?: (value: unknown) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n showMask?: boolean;\r\n /** Optional override; defaults to host `dateAdapter` (decides jalali / gregorian). */\r\n adapter?: DateAdapter;\r\n};\r\n\r\n/** Dark surfaces get the same muted highlight the arianERP host passes. */\r\nfunction isDarkBackground(color: string): boolean {\r\n const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color.trim())?.[1];\r\n if (!hex) return false;\r\n const full = hex.length === 3 ? [...hex].map((c) => c + c).join('') : hex;\r\n const [r, g, b] = [0, 2, 4].map((i) => parseInt(full.slice(i, i + 2), 16));\r\n return 0.299 * r + 0.587 * g + 0.114 * b < 128;\r\n}\r\n\r\n/**\r\n * Date cell editor. Renders `DatePicker` from `react-persian-range-picker`\r\n * (required peer dependency) — the same component the arianERP host uses.\r\n * Calendar type follows the host {@link DateAdapter}: `jalali` for the\r\n * default `fa` locale, `gregorian` otherwise.\r\n *\r\n * Value contract (unchanged): timestamp in ms in, timestamp in ms (or\r\n * `null` when cleared) out.\r\n */\r\nexport function NewDatePicker({\r\n value,\r\n onChange,\r\n disabled,\r\n className,\r\n showMask,\r\n adapter: adapterProp,\r\n}: Props) {\r\n const hostAdapter = useDateAdapter();\r\n const adapter = adapterProp ?? hostAdapter;\r\n const theme = useERPTableTheme();\r\n const dark = isDarkBackground(theme.params.backgroundColor);\r\n\r\n return (\r\n <DatePicker\r\n value={\r\n typeof value === 'number' || typeof value === 'string'\r\n ? (value as DatePickerValue)\r\n : null\r\n }\r\n onChange={(next) => onChange?.(next)}\r\n className={`pdg-date-picker ${disabled ? 'is-disabled' : ''} ${className ?? ''}`}\r\n Style={{ width: '100%' }}\r\n showMask={showMask}\r\n disabled={disabled}\r\n isTodaySelectPreset={false}\r\n highlightColor={dark ? '#676767' : undefined}\r\n calendarType={adapter.id === 'gregory' ? 'gregorian' : 'jalali'}\r\n />\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nimport { resolveCellAddressFromPoint } from '../../infrastructure/ui/gridFillHandle';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\ntype FillHandleProps = {\r\n controller: UITableController;\r\n};\r\n\r\nexport function FillHandle({ controller }: FillHandleProps) {\r\n const onPointerDown = (event: React.PointerEvent<HTMLButtonElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const copyOnly = event.ctrlKey;\r\n const handle = event.currentTarget;\r\n handle.setPointerCapture(event.pointerId);\r\n\r\n const onPointerUp = async (ev: PointerEvent) => {\r\n if (handle.hasPointerCapture(ev.pointerId)) {\r\n handle.releasePointerCapture(ev.pointerId);\r\n }\r\n window.removeEventListener('pointerup', onPointerUp);\r\n const cell = resolveCellAddressFromPoint(ev.clientX, ev.clientY);\r\n if (!cell) return;\r\n await controller.applyFillHandleDrag(\r\n { rowIndex: cell.rowIndex, colIndex: cell.colIndex },\r\n copyOnly,\r\n );\r\n };\r\n\r\n window.addEventListener('pointerup', onPointerUp);\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"pdg-fill-handle\"\r\n aria-label=\"Fill handle\"\r\n title=\"Drag to fill. Ctrl+drag to copy.\"\r\n onPointerDown={onPointerDown}\r\n />\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\n\r\nimport type { DateAdapter } from '../application/ports/DateAdapter';\r\nimport { FieldType } from '../bootstrap/type';\r\nimport {\r\n formatLocaleNumber,\r\n translate,\r\n type ERPTableLocale,\r\n type NumberingSystem,\r\n} from './host/messages';\r\n\r\nexport type FormatLocaleOptions = {\r\n locale?: ERPTableLocale;\r\n numberingSystem?: NumberingSystem;\r\n dateAdapter?: DateAdapter;\r\n};\r\n\r\n/** @deprecated Digits come from Intl numberingSystem (PR-127). Kept for search highlight. */\r\nexport function toFaDigits(value: string): string {\r\n const FA_DIGITS =\r\n '\\u06F0\\u06F1\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u06F7\\u06F8\\u06F9';\r\n return value.replace(/\\d/g, (digit) => FA_DIGITS[Number(digit)] ?? digit);\r\n}\r\n\r\nexport function formatGroupedNumber(\r\n val: unknown,\r\n locale: ERPTableLocale = 'fa',\r\n numberingSystem?: NumberingSystem,\r\n): string {\r\n if (val == null || val === '') return '';\r\n const n = Number(val);\r\n if (!Number.isFinite(n)) return String(val);\r\n return formatLocaleNumber(n, {\r\n locale,\r\n numberingSystem,\r\n useGrouping: true,\r\n });\r\n}\r\n\r\nexport function formatDisplayNumber(\r\n val: unknown,\r\n locale: ERPTableLocale = 'fa',\r\n numberingSystem?: NumberingSystem,\r\n): string {\r\n if (val == null || val === '') return '';\r\n const n = Number(val);\r\n if (Number.isFinite(n) && String(val).trim() !== '' && !Number.isNaN(n)) {\r\n if (/^-?\\d+(\\.\\d+)?$/.test(String(val).trim())) {\r\n return formatLocaleNumber(n, {\r\n locale,\r\n numberingSystem,\r\n useGrouping: false,\r\n });\r\n }\r\n }\r\n return String(val);\r\n}\r\n\r\nexport function formatJalaliDate(\r\n val: unknown,\r\n options?: FormatLocaleOptions,\r\n): string | null {\r\n if (val == null || val === '') return null;\r\n if (options?.dateAdapter) {\r\n const date = options.dateAdapter.parse(val);\r\n return date ? options.dateAdapter.format(date) : null;\r\n }\r\n const date =\r\n typeof val === 'number' ? new Date(val) : new Date(String(val));\r\n if (Number.isNaN(date.getTime())) return null;\r\n const locale = options?.locale ?? 'fa';\r\n const ns = options?.numberingSystem;\r\n return new Intl.DateTimeFormat(locale === 'fa' ? 'fa-IR' : 'en-US', {\r\n calendar: locale === 'fa' ? 'persian' : 'gregory',\r\n numberingSystem: ns,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n }).format(date);\r\n}\r\n\r\nexport const valueParser = (\r\n val: unknown,\r\n type: FieldType,\r\n locale: ERPTableLocale = 'fa',\r\n numberingSystem?: NumberingSystem,\r\n dateAdapter?: DateAdapter,\r\n): ReactNode => {\r\n if (val == null) {\r\n return type === 'selectOption'\r\n ? translate('general.selectPlaceholder', locale)\r\n : '';\r\n }\r\n\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'number':\r\n case 'select':\r\n case 'selectOption':\r\n case 'static':\r\n return formatDisplayNumber(val, locale, numberingSystem);\r\n\r\n case 'checkbox':\r\n return val ? '✔' : '✘';\r\n\r\n case 'price':\r\n return formatGroupedNumber(val, locale, numberingSystem);\r\n\r\n case 'date':\r\n return formatJalaliDate(val, { locale, numberingSystem, dateAdapter });\r\n\r\n default:\r\n return '—';\r\n }\r\n};\r\n","import React from 'react';\r\n\r\nimport { toFaDigits } from '../helper';\r\n\r\nfunction findHighlightRange(\r\n display: string,\r\n query: string,\r\n): { index: number; length: number } | null {\r\n const lowerText = display.toLowerCase();\r\n const seen = new Set<string>();\r\n for (const candidate of [query, toFaDigits(query)]) {\r\n const needle = candidate.toLowerCase();\r\n if (!needle || seen.has(needle)) continue;\r\n seen.add(needle);\r\n const index = lowerText.indexOf(needle);\r\n if (index !== -1) return { index, length: candidate.length };\r\n }\r\n return null;\r\n}\r\n\r\n/** Read-only cell text: wrap the current grid-search hit, otherwise return the string. */\r\nexport function highlightIfCurrentSearch(\r\n text: unknown,\r\n query: string | undefined,\r\n isCurrent: boolean | undefined,\r\n): React.ReactNode {\r\n const display = text == null ? '' : String(text);\r\n if (isCurrent && query?.trim()) {\r\n return highlightSearchText(display, query, true);\r\n }\r\n return display;\r\n}\r\n\r\nexport function highlightSearchText(\r\n text: unknown,\r\n query: string,\r\n isCurrent: boolean,\r\n): React.ReactNode {\r\n const display = text == null ? '' : String(text);\r\n const q = query.trim();\r\n if (!q) return display;\r\n\r\n const range = findHighlightRange(display, q);\r\n if (!range) return display;\r\n\r\n const markClass = isCurrent ? 'erp-search-hit is-current' : 'erp-search-hit';\r\n\r\n return (\r\n <>\r\n {display.slice(0, range.index)}\r\n <mark className={markClass}>\r\n {display.slice(range.index, range.index + range.length)}\r\n </mark>\r\n {display.slice(range.index + range.length)}\r\n </>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\n\r\nimport type { ColumnSchema, DefaultOptionType } from '../../bootstrap/type';\r\nimport type { ValidCell } from '../../engine/type';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { UIRow } from '../type';\r\n\r\n/**\r\n * Argument passed to `ColumnSchema.render` / `ColumnViewBinding.render`.\r\n * Built-in FieldType editors are skipped when `render` is set.\r\n */\r\nexport interface CellRenderContext {\r\n tableKey: string;\r\n row: UIRow;\r\n columnId: string;\r\n meta: ColumnSchema;\r\n controller: UITableController;\r\n value: unknown;\r\n display: unknown;\r\n isActive: boolean;\r\n isDeleted: boolean;\r\n isEditable: boolean;\r\n mode: 'view' | 'cell' | 'form';\r\n tabIndex: number;\r\n validation: ValidCell;\r\n dispatchChangeValue: (newValue: unknown, option?: DefaultOptionType) => void;\r\n dispatchChangeDisplay: (label: string | null) => void;\r\n activeCell: () => void;\r\n /** Current grid-search query when this cell is the active hit (PR-71). */\r\n searchQuery?: string;\r\n isCurrentSearchMatch?: boolean;\r\n}\r\n\r\nexport type CustomCellResolveResult =\r\n | { hit: false }\r\n | { hit: true; node: ReactNode };\r\n\r\n/**\r\n * PR-54: custom `render` wins over the FieldType switch.\r\n * `returnDisplayValue` is not a renderer — it stays the engine display formatter.\r\n */\r\nexport function resolveCustomCellNode(\r\n meta: Pick<ColumnSchema, 'render'> | undefined,\r\n ctx: CellRenderContext,\r\n): CustomCellResolveResult {\r\n if (typeof meta?.render !== 'function') {\r\n return { hit: false };\r\n }\r\n return { hit: true, node: (meta.render(ctx) ?? null) as ReactNode };\r\n}\r\n","import { highlightIfCurrentSearch } from '../gridSearch/highlightText';\r\nimport type { CellRenderContext } from './cellRenderContext';\r\n\r\n/**\r\n * Default `textArea` editor (PR-56). Registered in DEFAULT_CELL_COMPONENTS —\r\n * not a `switch (FieldType)` case in CellRenderer.\r\n */\r\nexport function TextAreaCell(ctx: CellRenderContext) {\r\n const showSearchHit = !!(\r\n ctx.isCurrentSearchMatch && ctx.searchQuery?.trim()\r\n );\r\n const editing =\r\n !showSearchHit &&\r\n (ctx.mode === 'form' || (ctx.mode === 'cell' && ctx.isActive));\r\n const disabled = ctx.isDeleted || !ctx.isEditable;\r\n const text = ctx.value == null ? '' : String(ctx.value);\r\n\r\n if (!editing || disabled) {\r\n return (\r\n <span className=\"whitespace-pre-wrap break-words py-1 text-start\">\r\n {showSearchHit\r\n ? highlightIfCurrentSearch(text, ctx.searchQuery, true)\r\n : text || (ctx.mode === 'view' ? '—' : '')}\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <textarea\r\n data-erp-cell-textarea\r\n autoFocus={ctx.mode !== 'form'}\r\n disabled={disabled}\r\n value={text}\r\n rows={2}\r\n className={`pdg-cell-editor w-full min-h-9 py-1 text-xs bg-transparent resize-none ${\r\n ctx.isDeleted ? 'cursor-not-allowed' : ''\r\n }`}\r\n onChange={(e) => ctx.dispatchChangeValue(e.target.value)}\r\n onClick={() => ctx.activeCell()}\r\n />\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\n\r\nimport type { ColumnSchema, FieldType } from '../../bootstrap/type';\r\nimport {\r\n resolveCustomCellNode,\r\n type CellRenderContext,\r\n type CustomCellResolveResult,\r\n} from './cellRenderContext';\r\nimport { TextAreaCell } from './TextAreaCell';\r\n\r\nexport type CellComponent = (ctx: CellRenderContext) => ReactNode;\r\n\r\n/**\r\n * Built-in FieldType keys plus free strings for host cell types (PR-56 `textArea`, …).\r\n */\r\nexport type CellComponentMap = Partial<Record<FieldType, CellComponent>> & {\r\n [customType: string]: CellComponent | undefined;\r\n};\r\n\r\nexport function resolveRegisteredCellNode(\r\n fieldType: string | undefined,\r\n components: CellComponentMap | undefined,\r\n ctx: CellRenderContext,\r\n): CustomCellResolveResult {\r\n if (!fieldType || !components) {\r\n return { hit: false };\r\n }\r\n const render = components[fieldType];\r\n if (typeof render !== 'function') {\r\n return { hit: false };\r\n }\r\n return { hit: true, node: (render(ctx) ?? null) as ReactNode };\r\n}\r\n\r\n/** Built-in registry. Host `components` override these keys. */\r\nexport const DEFAULT_CELL_COMPONENTS: CellComponentMap = {\r\n textArea: TextAreaCell,\r\n};\r\n\r\nexport function mergeCellComponents(\r\n host?: CellComponentMap,\r\n): CellComponentMap {\r\n return { ...DEFAULT_CELL_COMPONENTS, ...host };\r\n}\r\n\r\n/**\r\n * Column `render` (PR-54) wins; then `components[fieldType]` (PR-55/56);\r\n * miss → built-in FieldType switch.\r\n */\r\nexport function resolveBoundCellNode(\r\n meta: Pick<ColumnSchema, 'render' | 'fieldType'> | undefined,\r\n components: CellComponentMap | undefined,\r\n ctx: CellRenderContext,\r\n): CustomCellResolveResult {\r\n const column = resolveCustomCellNode(meta, ctx);\r\n if (column.hit) {\r\n return column;\r\n }\r\n return resolveRegisteredCellNode(\r\n meta?.fieldType,\r\n mergeCellComponents(components),\r\n ctx,\r\n );\r\n}\r\n","\"use client\";\r\nimport React, {\r\n forwardRef,\r\n Ref,\r\n useMemo,\r\n} from 'react';\r\n\r\nimport { ColumnSchema } from '../../../bootstrap/type';\r\nimport {\r\n UITableController,\r\n} from '../../../infrastructure/ui/UITableController';\r\nimport {\r\n buildDependencyBody,\r\n getDependFieldName,\r\n getStaticDependValue,\r\n hasDependValue,\r\n useHostDependOn,\r\n useLocale,\r\n useRemoteQuery,\r\n type DependValueResolver,\r\n} from '../../host';\r\nimport { highlightIfCurrentSearch } from '../../gridSearch/highlightText';\r\nimport {\r\n CustomDropdownButton,\r\n CustomTooltip,\r\n Dots,\r\n SavePlus,\r\n} from '../../primitives';\r\nimport { UIRow } from '../../type';\r\nimport {\r\n VoucherTypeApiResponse,\r\n} from './type';\r\n\r\nexport interface DescriptionComponentProps extends React.HTMLAttributes<HTMLDivElement> {\r\n disabled?: boolean;\r\n value?: unknown;\r\n onChange?: (e: unknown) => void;\r\n meta: ColumnSchema;\r\n controller: UITableController;\r\n tableKey: string;\r\n row: UIRow;\r\n columnId: string;\r\n idx: number;\r\n inputRef: Ref<HTMLInputElement | null>;\r\n isDeleted: boolean;\r\n editable: boolean;\r\n blockDrag: (e: React.DragEvent) => void;\r\n dispatchChangeValue: (newValue: unknown) => void;\r\n activeCell: () => void;\r\n searchQuery?: string;\r\n isCurrentSearchMatch?: boolean;\r\n}\r\nexport interface IDesc {\r\n AccountDescItemId: number;\r\n AccountDescId: number;\r\n Desc: string;\r\n}\r\n\r\nexport const DescriptionComponent = forwardRef<\r\n HTMLDivElement,\r\n DescriptionComponentProps\r\n>((props, ref) => {\r\n const locale = useLocale();\r\n const {\r\n meta,\r\n controller,\r\n tableKey,\r\n row,\r\n columnId,\r\n idx,\r\n inputRef,\r\n isDeleted,\r\n editable,\r\n value,\r\n blockDrag,\r\n dispatchChangeValue,\r\n activeCell,\r\n searchQuery,\r\n isCurrentSearchMatch,\r\n } = props;\r\n const showSearchHit = !!(isCurrentSearchMatch && searchQuery?.trim());\r\n const { endpoint, dependOn } = meta.dynamicSource ?? {};\r\n\r\n // Static value first, then the value the host resolves for that field\r\n // (e.g. the active page's form field).\r\n const { dependencyBody: hostValues } = useHostDependOn(dependOn, {\r\n enabled: true,\r\n });\r\n const resolveDepend: DependValueResolver = (item) =>\r\n getStaticDependValue(item) ?? hostValues[getDependFieldName(item)];\r\n const isReady = hasDependValue(dependOn, resolveDepend);\r\n const dependencyBody = buildDependencyBody(dependOn, resolveDepend);\r\n const { data: menuData } = useRemoteQuery<VoucherTypeApiResponse>({\r\n url: endpoint,\r\n body: {\r\n ...dependencyBody,\r\n RepoViewId: 0,\r\n RepoId: 0,\r\n PagingInfo: {\r\n PageNumber: 1,\r\n PageRecordCount: 10000,\r\n },\r\n },\r\n skip: !isReady,\r\n });\r\n const items = useMemo(\r\n () =>\r\n menuData?.Data?.map((item, index) => ({\r\n key: String(index),\r\n label: item.Desc,\r\n onClick: () => {\r\n meta.onChange?.(tableKey, row.id, row, controller,item.Desc);\r\n controller?.dispatch({\r\n type: \"UI_CELL_CHANGE\",\r\n rowId: row.id,\r\n columnId,\r\n value: item.Desc,\r\n });\r\n },\r\n })) || [],\r\n [menuData?.Data],\r\n );\r\nconst handleSaveDescription = ()=>{\r\n controller?.dispatch({\r\n type: \"UI_DESCRIPTION_SAVE\",\r\n rowId: row.id,\r\n flag:true\r\n });\r\n}\r\n return (\r\n <div className=\"flex justify-between items-center w-full\">\r\n {showSearchHit ? (\r\n <span\r\n className={`px-2 w-full text-xs truncate ${\r\n isDeleted ? 'cursor-not-allowed' : ''\r\n } ${meta.className ?? ''}`}\r\n onClick={() => activeCell()}\r\n >\r\n {highlightIfCurrentSearch(value, searchQuery, true)}\r\n </span>\r\n ) : (\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !editable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n pdg-cell-editor bg-transparent px-2\r\n ring-0 focus:!ring-0 focus:ring-offset-0 transition-colors !h-full w-full text-xs ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e.target.value)}\r\n onClick={() => activeCell()}\r\n />\r\n )}\r\n\r\n <CustomDropdownButton\r\n placement={locale !== \"fa\" ? \"bottomRight\" : \"bottomLeft\"}\r\n className=\"flex justify-center items-center bg-gray-gray3 dark:!bg-gray-gray11 p-0 rounded !h-9 cursor-pointer\"\r\n items={items}\r\n dropdownClassName=\"max-h-[20rem] max-w-[40vw]\"\r\n >\r\n <span className=\"cursor-pointer\" id=\"descriptionsList\">\r\n <Dots />\r\n </span>\r\n </CustomDropdownButton>\r\n\r\n <CustomTooltip\r\n // title={isDisabled ? t(\"general.notActive\") : t(\"general.save\")}\r\n // className={`\r\n // bg-gray-gray3 flex justify-center items-center w-[2.125rem] h-[2.125rem] rounded\r\n // ${isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"}\r\n // `}\r\n >\r\n <button\r\n onClick={() => {\r\n // if (!isDisabled) {\r\n handleSaveDescription();\r\n // }\r\n }}\r\n >\r\n <SavePlus\r\n config={{\r\n width: 18,\r\n height: 18,\r\n stroke: \"black\",\r\n }}\r\n />\r\n </button>\r\n </CustomTooltip>\r\n </div>\r\n );\r\n});\r\n\r\nDescriptionComponent.displayName = \"DescriptionComponent\";\r\n","\"use client\";\r\n\r\nimport React, { FC, useEffect, useMemo, useRef, useState } from 'react';\r\n\r\nimport {\r\n useHostDependOn,\r\n useLazyRemote,\r\n useTranslations,\r\n} from '../host';\r\nimport type { DependOn } from '../host/dependOn';\r\nimport { Reload, Select } from '../primitives';\r\nimport type { SelectOption as UiSelectOption } from '../primitives/Select';\r\n\r\n/**\r\n * Behavioural port of arianERP `atoms/defaultElements/dynamicSelect` (+ its\r\n * `CustomSelect` wrapper) onto the dependency-free `Select` primitive.\r\n * Redux / form-field (`config`), mobile and \"add new\" specifics are host\r\n * concerns and are intentionally not part of the package.\r\n */\r\n\r\ntype RemoteSelectOption = {\r\n _SelectId: string | number;\r\n _SelectValue?: string;\r\n _SelectDisplay?: string;\r\n};\r\nexport type MappedSelectOption = {\r\n key: string | number;\r\n value: string | number;\r\n label?: string;\r\n title?: string;\r\n option?: RemoteSelectOption;\r\n children?: MappedSelectOption[];\r\n};\r\ntype DynamicSelectSource = {\r\n endpoint?: string;\r\n repoViewId?: string;\r\n dependOn?: DependOn;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport interface ERPTableDynamicSelectProps {\r\n className?: string;\r\n value?: unknown;\r\n onChange?: (value: unknown, option?: unknown) => void;\r\n dynamicValue?: DynamicSelectSource;\r\n showId?: boolean;\r\n infinite?: boolean;\r\n onSearchPhrase?: (\r\n correctOptionValue: number,\r\n correctOptionTitle?: string,\r\n option?: unknown,\r\n ) => void;\r\n /** Accepted for API parity; the select is always searchable (as in the host). */\r\n showSearch?: boolean;\r\n onOptionsChange?: (options: MappedSelectOption[]) => void;\r\n labelValue?: 'selectDisplay' | 'selectValue';\r\n selectFirstDefault?: boolean;\r\n displayFormatter?: (option: RemoteSelectOption) => string | undefined;\r\n disabled?: boolean;\r\n /** Reload icon. Shown unless explicitly `false` (host default). */\r\n showRefetch?: boolean;\r\n noCache?: boolean;\r\n /** Filters the loaded option list itself (e.g. `isUnique` columns). */\r\n filterOptions?: (option: MappedSelectOption) => boolean;\r\n /** Search-box matcher. Default: case-insensitive `label` contains. */\r\n filterOption?: (input: string, option: UiSelectOption) => boolean;\r\n options?: MappedSelectOption[];\r\n /** Label shown for `value` while it is not (yet) in the loaded options. */\r\n valueLabel?: string;\r\n onClear?: () => void;\r\n onClick?: () => void;\r\n autoFocus?: boolean;\r\n popupMatchSelectWidth?: number | boolean;\r\n popupRender?: (menu: React.ReactNode) => React.ReactNode;\r\n placeholder?: React.ReactNode;\r\n allowClear?: boolean;\r\n onSearch?: (value: string) => void;\r\n}\r\n\r\nconst PAGE_RECORD_COUNT = 5000;\r\nconst DEPEND_DEBOUNCE_MS = 808;\r\n\r\nconst findOptionWithTitle = (data: MappedSelectOption[], searchTerm: string) => {\r\n const results: MappedSelectOption[] = [];\r\n const search = (items: MappedSelectOption[]) => {\r\n items.forEach((item) => {\r\n if (\r\n String(item?.title ?? '').includes(searchTerm) ||\r\n String(item?.label ?? '').includes(searchTerm)\r\n ) {\r\n results.push(item);\r\n }\r\n if (item.children && item.children.length > 0) search(item.children);\r\n });\r\n };\r\n search(data);\r\n return results;\r\n};\r\n\r\nexport const ERPTableDynamicSelect: FC<ERPTableDynamicSelectProps> = ({\r\n className,\r\n value,\r\n onChange,\r\n dynamicValue,\r\n showId = false,\r\n infinite = false,\r\n onSearchPhrase,\r\n showSearch = true,\r\n onOptionsChange,\r\n labelValue = 'selectDisplay',\r\n selectFirstDefault = false,\r\n displayFormatter,\r\n disabled,\r\n showRefetch,\r\n filterOptions,\r\n valueLabel,\r\n options: externalOptions,\r\n onClear,\r\n onClick,\r\n autoFocus,\r\n popupMatchSelectWidth,\r\n popupRender,\r\n filterOption,\r\n placeholder,\r\n allowClear,\r\n onSearch,\r\n}) => {\r\n const t = useTranslations();\r\n const [options, setOptions] = useState<MappedSelectOption[]>([]);\r\n const [searchPhrase, setSearchPhrase] = useState<string | null>(null);\r\n const [pageNumber, setPageNumber] = useState(1);\r\n\r\n const {\r\n endpoint,\r\n repoViewId,\r\n // UI-only flag of the host's select config; never part of the request body.\r\n addButton: _addButton,\r\n dependOn,\r\n ...bodyRequest\r\n } = dynamicValue ?? {};\r\n\r\n const getOptionLabel = (option: RemoteSelectOption) => {\r\n if (displayFormatter) return displayFormatter(option);\r\n return option._SelectDisplay;\r\n };\r\n\r\n const [getData, { data, isFetching }] = useLazyRemote<RemoteSelectOption[]>();\r\n const { dependencyBody, dependencyKey, isReady } = useHostDependOn(dependOn, {\r\n enabled: false,\r\n unwrapObjectValue: true,\r\n });\r\n\r\n const body = {\r\n ...bodyRequest,\r\n ...dependencyBody,\r\n PagingInfo: infinite\r\n ? { PageRecordCount: PAGE_RECORD_COUNT, PageNumber: pageNumber }\r\n : null,\r\n RepoViewId: repoViewId,\r\n };\r\n const existBody = Object.fromEntries(\r\n Object.entries(body).filter(([, v]) => v !== null),\r\n );\r\n\r\n const handleRefetch = () => {\r\n setPageNumber(1);\r\n if (dependOn && !isReady) return;\r\n void getData({ url: endpoint, body: existBody });\r\n };\r\n\r\n useEffect(() => {\r\n if (!data?.Data) return;\r\n const dynamicOptions: MappedSelectOption[] = data.Data.map((option) => ({\r\n key: option._SelectId,\r\n value: option._SelectId,\r\n label:\r\n labelValue === 'selectValue'\r\n ? option._SelectValue\r\n : getOptionLabel(option),\r\n title: getOptionLabel(option),\r\n option,\r\n }));\r\n if (infinite) {\r\n if (pageNumber === 1) {\r\n setOptions(dynamicOptions);\r\n } else {\r\n setOptions((prev) => [...prev, ...dynamicOptions]);\r\n if (showId && selectFirstDefault) onChange?.(dynamicOptions[0]?.value);\r\n }\r\n } else {\r\n setOptions(dynamicOptions);\r\n }\r\n }, [data?.Data]);\r\n\r\n useEffect(() => {\r\n if (infinite && searchPhrase && searchPhrase.length > 2) setPageNumber(1);\r\n }, [searchPhrase]);\r\n\r\n useEffect(() => {\r\n if (onOptionsChange && options) onOptionsChange(options);\r\n if (selectFirstDefault) onChange?.(options[0]?.value);\r\n }, [options, onOptionsChange]);\r\n\r\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\r\n const target = e.currentTarget;\r\n const bottom = target.scrollHeight === target.scrollTop + target.clientHeight;\r\n if (infinite && bottom && !isFetching) {\r\n data?.ReturnCount === PAGE_RECORD_COUNT && setPageNumber((prev) => prev + 1);\r\n }\r\n };\r\n\r\n const filteredOptions = useMemo(() => {\r\n const source = externalOptions ?? options;\r\n if (!filterOptions) return source;\r\n return source.filter(filterOptions);\r\n }, [externalOptions, options, filterOptions]);\r\n\r\n const { selectOptions, selectValue } = useMemo(() => {\r\n if (value === null || value === undefined || value === '') {\r\n return { selectOptions: filteredOptions, selectValue: value };\r\n }\r\n const matched = filteredOptions.find(\r\n (option) => String(option.value) === String(value),\r\n );\r\n if (matched) {\r\n return { selectOptions: filteredOptions, selectValue: matched.value };\r\n }\r\n if (valueLabel) {\r\n return {\r\n selectOptions: [\r\n ...filteredOptions,\r\n { key: value as string | number, value: value as string | number, label: valueLabel, title: valueLabel },\r\n ],\r\n selectValue: value,\r\n };\r\n }\r\n return { selectOptions: filteredOptions, selectValue: value };\r\n }, [filteredOptions, value, valueLabel]);\r\n\r\n useEffect(() => {\r\n if (value === null || value === undefined) {\r\n setSearchPhrase(null);\r\n setPageNumber(1);\r\n }\r\n }, [value]);\r\n\r\n const dependOnKey = useMemo(\r\n () => (dependOn ? JSON.stringify(dependOn) : null),\r\n [dependOn],\r\n );\r\n\r\n const isFirstDependRun = useRef(true);\r\n useEffect(() => {\r\n if (isFirstDependRun.current) {\r\n isFirstDependRun.current = false;\r\n return undefined;\r\n }\r\n const debounce = setTimeout(() => {\r\n if (dependOn && isReady) {\r\n void getData({ url: endpoint, body: existBody });\r\n }\r\n }, DEPEND_DEBOUNCE_MS);\r\n return () => clearTimeout(debounce);\r\n }, [dependOnKey, dependencyKey]);\r\n\r\n useEffect(() => {\r\n if (isReady) void getData({ url: endpoint, body: existBody });\r\n }, []);\r\n\r\n return (\r\n <div className=\"relative\">\r\n <Select\r\n className={`pdg-dynamic-select ${disabled ? 'is-disabled' : ''} ${className ?? ''}`}\r\n value={selectValue}\r\n disabled={disabled}\r\n showSearch\r\n allowClear={allowClear ?? true}\r\n autoFocus={autoFocus}\r\n popupMatchSelectWidth={popupMatchSelectWidth}\r\n popupRender={popupRender}\r\n placeholder={\r\n placeholder ??\r\n (showSearch ? t('general.search') : t('general.selectField'))\r\n }\r\n optionRender={(originNode) => (\r\n <div\r\n style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', height: 'fit-content' }}\r\n >\r\n <span>{originNode.data.title}</span>\r\n </div>\r\n )}\r\n filterOption={(input, option) => {\r\n if (filterOption && typeof filterOption === 'function') {\r\n return filterOption(input, option);\r\n }\r\n const label = option?.label;\r\n return (\r\n typeof label === 'string' &&\r\n label.toLowerCase().includes(input.toLowerCase())\r\n );\r\n }}\r\n onClick={onClick}\r\n onChange={onChange}\r\n onSearch={(currentValue) => {\r\n if (infinite) {\r\n setSearchPhrase(currentValue);\r\n const correctOption = findOptionWithTitle(options, currentValue);\r\n if (correctOption.length === 1 && onSearchPhrase) {\r\n onSearchPhrase(\r\n correctOption[0].value as number,\r\n correctOption[0]?.title,\r\n correctOption,\r\n );\r\n return;\r\n }\r\n }\r\n onSearch?.(currentValue);\r\n }}\r\n onPopupScroll={handleScroll}\r\n onClear={() => {\r\n if (infinite) {\r\n setSearchPhrase('');\r\n setPageNumber(1);\r\n }\r\n onClear?.();\r\n }}\r\n options={selectOptions}\r\n notFoundContent={isFetching ? 'Loading...' : 'No options found'}\r\n />\r\n {showRefetch !== false && (\r\n <div\r\n className={`${isFetching ? 'animate-spin' : ''} ${disabled ? 'opacity-50' : 'opacity-100'}`}\r\n style={{ position: 'absolute', top: '0.65rem', left: '2rem', cursor: 'pointer', transition: 'all 0.4s' }}\r\n onClick={handleRefetch}\r\n >\r\n <Reload config={{ height: 16, width: 16 }} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","\"use client\";\r\nimport React, { useEffect } from 'react';\r\n\r\nimport {\r\n ColumnSchema,\r\n DefaultOptionType,\r\n} from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { ValidCell } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { highlightIfCurrentSearch } from '../gridSearch/highlightText';\r\nimport { valueParser } from '../helper';\r\nimport {\r\n useDateAdapter,\r\n useERPTableHost,\r\n useNumberingSystem,\r\n} from '../host';\r\nimport { useGridSearchState } from '../hooks/useEngineSelector';\r\nimport {\r\n CustomCheckbox,\r\n InfoIcon,\r\n NewDatePicker,\r\n Select,\r\n Tooltip,\r\n} from '../primitives';\r\nimport { UIRow } from '../type';\r\nimport { type CellRenderContext } from './cellRenderContext';\r\nimport { resolveBoundCellNode } from './cellRegistry';\r\nimport { DescriptionComponent } from './descriptionComponent';\r\nimport { ERPTableDynamicSelect as DynamicSelect } from './ERPTableDynamicSelect';\r\n\r\nexport type { CellRenderContext } from './cellRenderContext';\r\nexport { resolveCustomCellNode } from './cellRenderContext';\r\nexport type { CellComponent, CellComponentMap } from './cellRegistry';\r\nexport {\r\n DEFAULT_CELL_COMPONENTS,\r\n mergeCellComponents,\r\n resolveBoundCellNode,\r\n resolveRegisteredCellNode,\r\n} from './cellRegistry';\r\nexport { TextAreaCell } from './TextAreaCell';\r\nexport {\r\n highlightIfCurrentSearch,\r\n highlightSearchText,\r\n} from '../gridSearch/highlightText';\r\n\r\n/* ======================================================\r\n Types\r\n ====================================================== */\r\n\r\ninterface CellRendererProps {\r\n tableKey: string;\r\n row: UIRow;\r\n columnId: string;\r\n idx: number;\r\n meta?: ColumnSchema;\r\n controller: UITableController;\r\n tabIndex: number;\r\n mode?: \"view\" | \"cell\" | \"form\";\r\n}\r\n\r\n/* ======================================================\r\n Cell Renderer\r\n ====================================================== */\r\n\r\n/** A cell without column meta renders nothing (the body keeps a stable hook order). */\r\nexport const CellRenderer: React.FC<CellRendererProps> = (props) =>\r\n props.meta ? <CellRendererBody {...props} meta={props.meta} /> : null;\r\n\r\nconst CellRendererBody: React.FC<CellRendererProps & { meta: ColumnSchema }> = ({\r\n tableKey,\r\n row,\r\n columnId,\r\n meta,\r\n controller,\r\n tabIndex,\r\n idx,\r\n mode = \"cell\",\r\n}) => {\r\n const dateHostRef = React.useRef<HTMLDivElement | null>(null);\r\n const { locale, components } = useERPTableHost();\r\n const numberingSystem = useNumberingSystem();\r\n const dateAdapter = useDateAdapter();\r\n const searchState = useGridSearchState(controller);\r\n const disable =\r\n typeof row.visibilityCondition[columnId] === \"boolean\" &&\r\n row.visibilityCondition[columnId] === false;\r\n const viewCell = controller.getCell(row.id, columnId);\r\n const draft = controller.getEditDraft(row.id, columnId);\r\n const value = draft ? draft.value : viewCell?.getValue();\r\n const display = draft ? draft.display : viewCell?.getDisplay();\r\n const isActive = controller.isActiveCell(row.id, columnId);\r\n const isEditing = controller.isEditingCell(row.id, columnId);\r\n const validation: ValidCell = controller.isValidCell(row.id, columnId) ?? {\r\n isValid: true,\r\n cellError: { rowId: row.id, caption: meta.fieldCaption, message: '' },\r\n };\r\n const inputRef = React.useRef<HTMLInputElement | null>(null);\r\n const dispatchChangeValue = (\r\n newValue: unknown,\r\n option?: DefaultOptionType,\r\n ) => {\r\n meta.onChange?.(tableKey, row.id, row, controller, newValue, option);\r\n controller.dispatch({\r\n type: \"UI_CELL_CHANGE\",\r\n rowId: row.id,\r\n columnId,\r\n value: newValue,\r\n });\r\n };\r\n const dispatchChangeDisplay = (label: string | null) => {\r\n controller.dispatch({\r\n type: \"UI_CELL_CHANGE_DISPLAY\",\r\n rowId: row.id,\r\n columnId,\r\n value: label ?? '',\r\n });\r\n };\r\n const activeCell = (e?: React.MouseEvent) => {\r\n controller.dispatch({\r\n type: 'UI_ACTIVE_CELL',\r\n rowId: row.id,\r\n columnId,\r\n shiftKey: e?.shiftKey,\r\n ctrlKey: Boolean(e?.ctrlKey || e?.metaKey),\r\n });\r\n };\r\n const startEdit = () => {\r\n controller.startCellEdit(row.id, columnId);\r\n };\r\n\r\n const type = meta.fieldType;\r\n const isEditable = meta.editable !== false;\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isCurrentSearchMatch =\r\n !!searchState &&\r\n searchState.currentIndex >= 0 &&\r\n searchState.matches[searchState.currentIndex]?.rowId === row.id &&\r\n searchState.matches[searchState.currentIndex]?.columnId === columnId;\r\n\r\n const renderCellContent = (cellText: unknown) => {\r\n const parsed = valueParser(\r\n cellText,\r\n meta.fieldType,\r\n locale,\r\n numberingSystem,\r\n dateAdapter,\r\n );\r\n return highlightIfCurrentSearch(\r\n parsed,\r\n searchState?.query,\r\n isCurrentSearchMatch,\r\n );\r\n };\r\n\r\n const blockDrag = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n useEffect(() => {\r\n const shouldFocus = mode === \"form\" || (mode === \"cell\" && isEditing);\r\n if (!shouldFocus) return;\r\n if (type === \"date\") {\r\n const id = window.setTimeout(() => {\r\n const el = dateHostRef.current?.querySelector(\r\n '[role=\"button\"][tabindex=\"0\"]',\r\n ) as HTMLElement | null;\r\n el?.focus();\r\n }, 0);\r\n return () => window.clearTimeout(id);\r\n }\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n if (mode !== \"form\") {\r\n inputRef.current.select();\r\n }\r\n }\r\n }, [isEditing, mode, type]);\r\n const cellRenderContext: CellRenderContext = {\r\n tableKey,\r\n row,\r\n columnId,\r\n meta,\r\n controller,\r\n value,\r\n display,\r\n isActive: !!isActive,\r\n isDeleted,\r\n isEditable,\r\n mode,\r\n tabIndex,\r\n validation,\r\n dispatchChangeValue,\r\n dispatchChangeDisplay,\r\n activeCell,\r\n searchQuery: searchState?.query,\r\n isCurrentSearchMatch,\r\n };\r\n\r\n const renderReadOnlyCell = (cellText: unknown) => (\r\n <span\r\n key={idx}\r\n className={`flex items-center px-2 w-full h-9 overflow-hidden text-xs text-ellipsis whitespace-nowrap ${meta.className}\r\n ${meta.fieldType === \"checkbox\" || meta.fieldType === \"price\" || meta.fieldType === \"number\" ? \"justify-center\" : \"justify-start\"}\r\n ${isCurrentSearchMatch ? \"ring-2 ring-yellow-400\" : \"\"}`}\r\n >\r\n <span className=\"truncate\">{renderCellContent(cellText)}</span>\r\n {!validation?.isValid && (\r\n <Tooltip title={validation?.cellError?.message}>\r\n <span>\r\n <InfoIcon config={{width: 18, height: 18, stroke: \"#f87171\"}} />\r\n </span>\r\n </Tooltip>\r\n )}\r\n </span>\r\n );\r\n\r\n if (disable) {\r\n if (mode === \"view\") {\r\n return (\r\n <span key={idx} className={`text-xs ${meta.className}`}>\r\n --\r\n </span>\r\n );\r\n }\r\n return (\r\n <span key={idx} className={` \"text-xs\" ${meta.className}`}>\r\n --\r\n </span>\r\n );\r\n }\r\n\r\n const customCell = resolveBoundCellNode(meta, components, cellRenderContext);\r\n if (customCell.hit) {\r\n const isColumnRender = typeof meta.render === 'function';\r\n return (\r\n <div\r\n key={idx}\r\n {...(isColumnRender\r\n ? { 'data-erp-custom-cell': columnId }\r\n : { 'data-erp-cell-component': type })}\r\n tabIndex={isDeleted ? -1 : tabIndex}\r\n className={`w-full h-full min-h-9 px-2 flex text-xs ${\r\n type === 'textArea' ? 'items-start' : 'items-center'\r\n } ${meta.className ?? ''} ${\r\n isDeleted ? 'cursor-not-allowed' : 'cursor-text'\r\n } ${isCurrentSearchMatch ? 'ring-2 ring-yellow-400' : ''}`}\r\n onClick={(e) => {\r\n if (!isDeleted) activeCell(e);\r\n }}\r\n >\r\n {customCell.node}\r\n </div>\r\n );\r\n }\r\n\r\n if (mode === \"view\") {\r\n return renderReadOnlyCell(display ?? value);\r\n }\r\n\r\n if (isEditable === false) {\r\n if (meta.fieldType === \"selectOption\") {\r\n return (\r\n <span key={idx} className={`text-xs text-start ${meta.className} `}>\r\n {value ? renderCellContent(value) : \"--\"}\r\n </span>\r\n );\r\n } else {\r\n return (\r\n <span key={idx} className={`text-xs ${meta.className} `}>\r\n {renderCellContent(value)}\r\n </span>\r\n );\r\n }\r\n } else if (\r\n mode !== \"form\" &&\r\n (!isEditing || isDeleted || isCurrentSearchMatch)\r\n ) {\r\n return (\r\n <>\r\n <button\r\n key={idx}\r\n tabIndex={tabIndex}\r\n disabled={isDeleted}\r\n className={` px-2 w-full \r\n text-start h-9 ${meta.className}\r\n ${isDeleted ? \"cursor-not-allowed \" : \"cursor-text\"}\r\n ${isCurrentSearchMatch ? \"ring-2 ring-yellow-400\" : \"\"}\r\n `}\r\n onClick={(e) => {\r\n activeCell(e);\r\n }}\r\n onDoubleClick={() => {\r\n if (!isDeleted && isEditable) startEdit();\r\n }}\r\n >\r\n <div\r\n className={`flex items-center w-full min-w-36 max-w-72 h-full overflow-hidden text-xs text-ellipsis whitespace-nowrap \r\n ${meta.fieldType === \"checkbox\" || meta.fieldType === \"price\" || meta.fieldType === \"number\" ? \"justify-center\" : \"justify-start\"}`}\r\n >\r\n <div className=\"truncate\">\r\n {renderCellContent(display ?? value)}\r\n {!validation?.isValid && (\r\n <Tooltip title={validation?.cellError?.message}>\r\n <span>\r\n <InfoIcon\r\n config={{width: 18, height: 18, stroke: \"#f87171\"}}\r\n />\r\n </span>\r\n </Tooltip>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n </>\r\n );\r\n }\r\n\r\n switch (type) {\r\n case \"number\":\r\n return (\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n value={value === \"\" || value == null ? \"\" : Number(value)}\r\n disabled={isDeleted || !isEditable}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n pdg-cell-editor bg-transparent px-3\r\n ring-0 focus:!ring-0 \r\n focus:ring-offset-0 !h-full w-full text-xs transition-colors ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) =>\r\n dispatchChangeValue(\r\n e.target.value === \"\" ? \"\" : Number(e.target.value),\r\n )\r\n }\r\n />\r\n );\r\n case \"price\":\r\n return (\r\n <input\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n pattern=\"[0-9,]*\"\r\n min={0}\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !isEditable}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n pdg-cell-editor bg-transparent px-3 !bg-white !rounded \r\n ring-0 focus:!ring-0 \r\n focus:ring-offset-0 h-9 w-full text-xs transition-colors \r\n ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n value={\r\n value === \"\" || value == null\r\n ? \"\"\r\n : `${value}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\")\r\n }\r\n onChange={(e) => {\r\n const inputValue = e.target.value;\r\n const parsedValue = inputValue.replace(/\\$\\s?|(,*)/g, \"\");\r\n if (parsedValue === \"\" || !isNaN(Number(parsedValue))) {\r\n dispatchChangeValue(\r\n parsedValue === \"\" ? \"\" : Number(parsedValue),\r\n );\r\n dispatchChangeDisplay(\r\n parsedValue === \"\"\r\n ? null\r\n : `${Number(parsedValue)}`.replace(\r\n /\\B(?=(\\d{3})+(?!\\d))/g,\r\n \",\",\r\n ),\r\n );\r\n }\r\n }}\r\n />\r\n );\r\n case \"date\":\r\n return (\r\n <div ref={dateHostRef} className=\"w-full h-full\">\r\n <NewDatePicker\r\n showMask\r\n className={`${meta.className}`}\r\n key={idx}\r\n disabled={isDeleted || !isEditable}\r\n value={\r\n value == null || value === ''\r\n ? undefined\r\n : typeof value === 'number'\r\n ? value\r\n : new Date(value as string).valueOf()\r\n }\r\n onChange={(v) => {\r\n dispatchChangeValue(v);\r\n }}\r\n />\r\n </div>\r\n );\r\n case \"checkbox\":\r\n return (\r\n <CustomCheckbox\r\n className={`${meta.className} w-full flex justify-center items-center`}\r\n key={idx}\r\n disabled={isDeleted || !isEditable}\r\n // value={value === true as boolean}\r\n checked={value === (true as boolean)}\r\n onChange={(e) => {\r\n dispatchChangeValue(e.target.checked);\r\n }}\r\n />\r\n );\r\n case \"select\":\r\n return (\r\n <Select\r\n key={idx}\r\n options={(meta?.options ?? []).map((opt) => ({\r\n value: opt.value,\r\n label: opt.label as React.ReactNode,\r\n }))}\r\n disabled={isDeleted || !isEditable}\r\n className={` h-9 ${isDeleted && \"cursor-not-allowed\"} ${meta.className}`}\r\n value={value}\r\n onClick={() => activeCell()}\r\n onChange={(v, o) => {\r\n dispatchChangeValue(v);\r\n const option = o as { label?: string } | undefined;\r\n if (option?.label) {\r\n dispatchChangeDisplay(option.label);\r\n } else {\r\n dispatchChangeDisplay('');\r\n }\r\n if (v) {\r\n controller.dispatch({\r\n type: \"UI_MOVE_ACTIVE_CELL\",\r\n rowId: row.id,\r\n columnId,\r\n direction: \"next\",\r\n });\r\n }\r\n }}\r\n />\r\n );\r\n case \"selectOption\": {\r\n const selectValue =\r\n value != null && value !== \"\" ? String(value) : undefined;\r\n\r\n return (\r\n <DynamicSelect\r\n labelValue={meta.labelValue}\r\n noCache={meta.noCache}\r\n key={`${row.id}-${columnId}`}\r\n showSearch\r\n infinite\r\n onSearchPhrase={(v, o) => {\r\n dispatchChangeValue(v);\r\n if (!Array.isArray(o)) {\r\n if (o) {\r\n dispatchChangeDisplay(o);\r\n } else {\r\n dispatchChangeDisplay(null);\r\n }\r\n }\r\n }}\r\n autoFocus={mode !== \"form\"}\r\n popupMatchSelectWidth={meta.popUpWidth}\r\n popupRender={(menu) => <div className=\"w-full\">{menu}</div>}\r\n disabled={isDeleted || !isEditable}\r\n // labelInValue is false in DynamicSelect — pass a primitive, not {value,label}\r\n value={selectValue}\r\n // Stored label for a value missing from the loaded options\r\n // (isUnique filter, >5000 entries, or before the fetch resolves).\r\n valueLabel={display != null && display !== \"\" ? String(display) : undefined}\r\n dynamicValue={meta?.dynamicSource}\r\n filterOption={(input, option) => {\r\n if (meta?.dynamicSelectFilterOption) {\r\n return meta.dynamicSelectFilterOption(input, option);\r\n }\r\n const label = option?.label;\r\n const remote = option.option;\r\n const display =\r\n typeof remote === 'object' &&\r\n remote !== null &&\r\n '_SelectDisplay' in remote &&\r\n typeof (remote as { _SelectDisplay?: unknown })._SelectDisplay ===\r\n 'string'\r\n ? (remote as { _SelectDisplay: string })._SelectDisplay\r\n : '';\r\n return (\r\n typeof label === 'string' &&\r\n display.toLowerCase().includes(input.toLowerCase())\r\n );\r\n }}\r\n filterOptions={(option) => {\r\n const unique = (controller.getAllRows() ?? []).some(\r\n (r) => r.getCell(columnId)?.getValue() === option.value,\r\n );\r\n if (meta.isUnique) {\r\n return !unique;\r\n }\r\n return true;\r\n }}\r\n className={`bg-white !border-[0.4px] !border-gray-gray7 h-9 ${meta.className} ${isDeleted && \"cursor-not-allowed\"} relative`}\r\n onClick={() => activeCell()}\r\n onChange={(v, o) => {\r\n dispatchChangeValue(v, o as DefaultOptionType);\r\n const option = o as { label?: string } | undefined;\r\n dispatchChangeDisplay(option?.label ?? '');\r\n if (v) {\r\n controller.dispatch({\r\n type: \"UI_MOVE_ACTIVE_CELL\",\r\n rowId: row.id,\r\n columnId,\r\n direction: \"next\",\r\n });\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n case \"static\":\r\n return (\r\n <span\r\n key={idx}\r\n tabIndex={tabIndex}\r\n className={` px-2 w-full h-full text-xs cursor-text ${meta.className}`}\r\n onClick={(e) => activeCell(e)}\r\n >\r\n {String(display ?? value ?? \"\") || \"—\"}\r\n </span>\r\n );\r\n case \"description\":\r\n return (\r\n <DescriptionComponent\r\n activeCell={activeCell}\r\n blockDrag={blockDrag}\r\n isDeleted={isDeleted}\r\n editable={isEditable}\r\n dispatchChangeValue={dispatchChangeValue}\r\n idx={idx}\r\n inputRef={inputRef}\r\n tableKey={tableKey}\r\n row={row}\r\n controller={controller}\r\n columnId={columnId}\r\n key={idx}\r\n disabled={isDeleted || !isEditable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n flex items-center bg-transparent px-2 pdg-cell-editor\r\n ring-0 focus:!ring-0 focus:ring-offset-0 h-8 transition-colors `}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e)}\r\n onClick={(e) => activeCell(e)}\r\n meta={meta}\r\n searchQuery={searchState?.query}\r\n isCurrentSearchMatch={isCurrentSearchMatch}\r\n />\r\n );\r\n case \"text\":\r\n default:\r\n return (\r\n <input\r\n key={idx}\r\n ref={inputRef}\r\n disabled={isDeleted || !isEditable}\r\n value={value == null ? \"\" : String(value)}\r\n className={`${isDeleted && \"cursor-not-allowed\"}\r\n pdg-cell-editor bg-transparent px-2\r\n ring-0 focus:ring-0! focus:ring-offset-0 transition-colors h-full! w-full text-xs ${meta.className}`}\r\n draggable={false}\r\n onDragStart={blockDrag}\r\n onDragOver={blockDrag}\r\n onDrop={blockDrag}\r\n onChange={(e) => dispatchChangeValue(e.target.value)}\r\n onClick={(e) => activeCell(e)}\r\n />\r\n );\r\n }\r\n};\r\n","import {\r\n formatLocaleNumber,\r\n useLocale,\r\n useNumberingSystem,\r\n useTranslations,\r\n} from '../host';\r\nimport {\r\n CustomDropdownButton,\r\n CustomCheckbox,\r\n Dots,\r\n DragIcon,\r\n Expand,\r\n RedTrashBin,\r\n Undo,\r\n type DropdownItem,\r\n} from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\n\r\ninterface IndexColProps {\r\n tableKey: string;\r\n idx: number;\r\n row: UIRow;\r\n controller: UITableController;\r\n meta: ColumnSchema;\r\n}\r\n\r\nexport const IndexCol: React.FC<IndexColProps> = ({\r\n idx,\r\n tableKey,\r\n row,\r\n controller,\r\n meta,\r\n}) => {\r\n const t = useTranslations();\r\n const locale = useLocale();\r\n const numberingSystem = useNumberingSystem();\r\n\r\n const handleDeleteRow = () => {\r\n controller.dispatch({ type: \"ROW_DELETED\", rowId: row.id });\r\n };\r\n\r\n const handleCopyRow = () => {\r\n controller.dispatch({ type: \"DUPLICATE_ROW\", rowId: row.id });\r\n };\r\n\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: \"ADD_EMPTY_ROW\" });\r\n };\r\n\r\n const extraItems = (meta.indexOptions?.(tableKey, row.id, row, controller) ??\r\n []) as DropdownItem[];\r\n const items: DropdownItem[] = [\r\n {\r\n key: \"1\",\r\n label: (\r\n <span className=\"flex text-sm\" onClick={handleCopyRow}>\r\n {t(\"general.replicateRow\")}\r\n </span>\r\n ),\r\n extra: \"Ali + D\",\r\n },\r\n {\r\n key: \"2\",\r\n label: (\r\n <span className=\"flex text-sm\" onClick={handleAddRow}>\r\n {t(\"general.addNewRow\")}\r\n </span>\r\n ),\r\n extra: \"Alt + N\",\r\n },\r\n {\r\n type: \"divider\",\r\n },\r\n ...extraItems,\r\n ];\r\n\r\n const handleExpandRow = () => {\r\n controller.dispatch({ type: \"TOGGLE_ROW_EXPANDED\", rowId: row.id });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLInputElement>) => {\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isSelectedRow = controller.isSelectedRow(row.id);\r\n\r\n return (\r\n <div\r\n className={`${isDeleted && \"cursor-not-allowed\"} flex justify-between items-center w-full gap-2 px-2 h-full relative`}\r\n >\r\n <div className=\"flex justify-start items-center gap-2\">\r\n {!isDeleted && (\r\n <CustomCheckbox\r\n disabled={isDeleted}\r\n checked={!!isSelectedRow}\r\n onClick={handleSelectRow}\r\n aria-label={`${t(\"general.selectRow\")} ${idx + 1}`}\r\n />\r\n )}\r\n <div className=\"w-[20px] text-xs text-center\">\r\n {formatLocaleNumber(idx + 1, { locale, numberingSystem })}\r\n </div>\r\n\r\n {meta.enableMoveButton && !isDeleted && (\r\n <div\r\n className=\"erp-table-index-btn cursor-grab active:cursor-grabbing\"\r\n draggable={false}\r\n onMouseDown={(e) => {\r\n const tr = e.currentTarget.closest(\"tr\");\r\n tr?.setAttribute(\"draggable\", \"true\");\r\n }}\r\n >\r\n <DragIcon config={{ width: 16, height: 16 }} />\r\n </div>\r\n )}\r\n\r\n {meta.enableDeleteButton && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDeleteRow();\r\n }}\r\n className=\"erp-table-index-btn hover:bg-red-100\"\r\n >\r\n {!isDeleted ? (\r\n <RedTrashBin config={{ width: 18, height: 18 }} />\r\n ) : (\r\n <Undo config={{ width: 18, height: 18 }} />\r\n )}\r\n </button>\r\n )}\r\n\r\n {meta.enableExpandButton && (\r\n <button\r\n type=\"button\"\r\n onClick={handleExpandRow}\r\n className={`erp-table-index-btn z-20 ${\r\n isDeleted ? \"cursor-not-allowed \" : \"hover:bg-zinc-200\"\r\n } `}\r\n disabled={isDeleted}\r\n >\r\n <Expand config={{ width: 18, height: 18 }} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {meta.enableOptionsButton && !isDeleted && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"flex m-0 p-0 rounded\"\r\n items={items}\r\n >\r\n <a className=\"cursor-pointer\" onClick={(e) => e.preventDefault()}>\r\n <Dots config={{ width: 18, height: 18 }} />\r\n </a>\r\n </CustomDropdownButton>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, {\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport { NoData } from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { columnSizeStyle } from '../../engine/columnWidth';\r\nimport {\r\n cellRangeClassName,\r\n cellRangeEdgeAttr,\r\n resolveCellRangePresentation,\r\n} from '../../engine/selection/cellRangePresentation';\r\nimport { resolveFillCorner } from '../../engine/selection/fillHandle';\r\nimport { FillHandle } from './FillHandle';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ariaColIndex, ariaDataRowIndex, gridCellA11y } from '../a11y/gridRoles';\r\nimport { columnPinCellProps } from '../columnPin';\r\nimport { CellRenderer } from '../cellRenderer';\r\nimport { UIRow } from '../type';\r\nimport { useColumnWindowOrAll } from '../virtual/columnWindow';\r\nimport { ColumnWindowCells } from '../virtual/ColumnWindowCells';\r\nimport { IndexCol } from './indexCol';\r\n\r\ninterface ERPTableRowProps {\r\n row: UIRow;\r\n index: number;\r\n stripeIndex: number;\r\n /** Pinned-top row count for aria-rowindex offset (PR-116). */\r\n pinnedTopCount?: number;\r\n table: Pick<\r\n import('../../engine/type').TableViewState,\r\n 'columns' | 'columnWidths' | 'activeCell' | 'cellRanges'\r\n >;\r\n controller: UITableController;\r\n tableKey: string;\r\n draggedRowIdRef: React.MutableRefObject<number | null>;\r\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\r\n isSelected: boolean;\r\n isActive: boolean;\r\n isCut: boolean;\r\n}\r\n\r\nfunction ERPTableRowComponent({\r\n row,\r\n index,\r\n stripeIndex,\r\n pinnedTopCount = 0,\r\n table,\r\n controller,\r\n tableKey,\r\n draggedRowIdRef,\r\n moreDetailComponent: MoreDetailComponent,\r\n isSelected: isSelectedRow,\r\n isActive: isActiveRow,\r\n isCut,\r\n}: ERPTableRowProps) {\r\n const t = useTranslations();\r\n const colWindow = useColumnWindowOrAll(\r\n table.columns ?? [],\r\n table.columnWidths,\r\n );\r\n const totalColSpan = colWindow.allVisible.length;\r\n const [dropZone, setDropZone] = useState<\"before\" | \"after\" | null>(null);\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const cellRanges = controller.getViewState()?.cellRanges ?? [];\r\n const columnOrder = (table.columns ?? [])\r\n .filter((c) => !c.hidden)\r\n .map((c) => c.fieldName);\r\n const fillCorner = resolveFillCorner(cellRanges, columnOrder);\r\n\r\n const rangeCellProps = (colId: string) => {\r\n const flags = resolveCellRangePresentation(\r\n { rowIndex: index, colId },\r\n cellRanges,\r\n );\r\n const edge = cellRangeEdgeAttr(flags);\r\n return {\r\n className: cellRangeClassName(flags),\r\n 'data-pdg-cell-range': flags.inRange ? 'true' : undefined,\r\n 'data-pdg-range-edge': edge,\r\n };\r\n };\r\n\r\n const handleRowClick = (e: React.MouseEvent) => {\r\n controller.onRowClick(row.id, {\r\n ctrlKey: e.ctrlKey,\r\n shiftKey: e.shiftKey,\r\n });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLElement>) => {\r\n const el = e.target as HTMLElement;\r\n if (el.tagName !== \"TR\") return;\r\n\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const handleDragStart = (\r\n e: React.DragEvent<HTMLTableRowElement>,\r\n rowId: number,\r\n ) => {\r\n draggedRowIdRef.current = rowId;\r\n e.dataTransfer.setData(\"text/plain\", String(rowId));\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n\r\n const handleDragOverLocal = (e: React.DragEvent<HTMLTableRowElement>) => {\r\n e.preventDefault();\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const mouseY = e.clientY - rect.top;\r\n setDropZone(mouseY < rect.height / 2 ? \"before\" : \"after\");\r\n };\r\n\r\n const handleDropLocal = (e: React.DragEvent<HTMLTableRowElement>) => {\r\n e.preventDefault();\r\n if (!dropZone) return;\r\n\r\n const sourceId = draggedRowIdRef.current;\r\n if (!sourceId || sourceId === row.id) return;\r\n controller.dispatch({\r\n type: \"ROW_REORDERED\",\r\n draggedRowId: sourceId,\r\n droppedRowId: row.id,\r\n position: dropZone,\r\n });\r\n\r\n setDropZone(null);\r\n };\r\n\r\n const isGroupedLeaf =\r\n (controller.getRowGroupColumns?.()?.length ?? 0) > 0;\r\n\r\n const rowClass = useMemo(() => {\r\n const zebraClass = stripeIndex % 2 ? \"bg-blue-blue11\" : \"bg-main-white\";\r\n\r\n return `relative w-full border\r\n ${isActiveRow ? \"border-gray-gray8\" : \"border-gray-gray5\"}\r\n ${isSelectedRow && !isDeleted ? \"bg-blue-100\" : \"\"}\r\n ${\r\n isDeleted\r\n ? \"!bg-gray-gray5 absolute inset-0 line-through\"\r\n : isSelectedRow\r\n ? \"\"\r\n : zebraClass\r\n }\r\n ${isCut ? \" border-dashed opacity-30\" : \"\"}\r\n h-9 rounded \r\n `;\r\n }, [isActiveRow, isSelectedRow, isDeleted, stripeIndex, isCut]);\r\n\r\n return (\r\n <>\r\n <tr\r\n role=\"row\"\r\n aria-rowindex={ariaDataRowIndex(index, pinnedTopCount)}\r\n className={rowClass}\r\n data-rowid={row.id}\r\n data-pdg-row-loading={row.loading ? 'true' : undefined}\r\n aria-busy={row.loading ? true : undefined}\r\n style={isGroupedLeaf ? { paddingInlineStart: 20 } : undefined}\r\n draggable={!row.loading}\r\n onDragStart={(e) => handleDragStart(e, row.id)}\r\n onDragOver={handleDragOverLocal}\r\n onDrop={handleDropLocal}\r\n onClick={handleRowClick}\r\n onDoubleClick={handleSelectRow}\r\n >\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"td\"\r\n spacerRole=\"presentation\"\r\n renderColumn={(c, absoluteColIndex) => {\r\n const pin = columnPinCellProps(\r\n c,\r\n colWindow.startPinOffsets,\r\n colWindow.endPinOffsets,\r\n );\r\n const meta: ColumnSchema = {\r\n ...c,\r\n enableDeleteButton: c.enableDeleteButton ?? true,\r\n enableExpandButton: c.enableExpandButton ?? true,\r\n enableMoveButton: c.enableMoveButton ?? true,\r\n enableOptionsButton: c.enableOptionsButton ?? true,\r\n };\r\n\r\n if (row.loading) {\r\n const rangeProps = rangeCellProps(c.fieldName);\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(absoluteColIndex)}\r\n className={`p-0 h-full overflow-hidden border ${pin.className} ${rangeProps.className}`.trim()}\r\n data-columnid={c.fieldName}\r\n data-pdg-row-index={index}\r\n data-pdg-col-index={absoluteColIndex}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n data-pdg-cell-range={rangeProps['data-pdg-cell-range']}\r\n data-pdg-range-edge={rangeProps['data-pdg-range-edge']}\r\n style={{ ...columnSizeStyle(c, table.columnWidths, colWindow.layoutWidths), ...pin.style }}\r\n >\r\n <div className=\"pdg-row-skeleton\" data-pdg-skeleton>\r\n <span className=\"pdg-row-skeleton__bar\" />\r\n </div>\r\n </td>\r\n );\r\n }\r\n\r\n if (c.fieldName === \"index\" || c.fieldType === \"index\") {\r\n const rangeProps = rangeCellProps(c.fieldName);\r\n return (\r\n <td\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(absoluteColIndex)}\r\n {...gridCellA11y(tableKey, row.id, c.fieldName, table.activeCell)}\r\n className={`p-0 h-full overflow-hidden border ${pin.className} ${rangeProps.className}`.trim()}\r\n key={c.fieldName}\r\n data-columnid={c.fieldName}\r\n data-pdg-row-index={index}\r\n data-pdg-col-index={absoluteColIndex}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n data-pdg-cell-range={rangeProps['data-pdg-cell-range']}\r\n data-pdg-range-edge={rangeProps['data-pdg-range-edge']}\r\n style={{ ...columnSizeStyle(c, table.columnWidths, colWindow.layoutWidths), ...pin.style }}\r\n >\r\n <IndexCol\r\n idx={index}\r\n tableKey={tableKey}\r\n row={row}\r\n controller={controller}\r\n meta={meta}\r\n />\r\n </td>\r\n );\r\n }\r\n\r\n const rangeProps = rangeCellProps(c.fieldName);\r\n const showFillHandle =\r\n fillCorner?.rowIndex === index &&\r\n fillCorner.colId === c.fieldName;\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(absoluteColIndex)}\r\n {...gridCellA11y(tableKey, row.id, c.fieldName, table.activeCell)}\r\n className={`p-0 h-full overflow-hidden border relative ${pin.className} ${rangeProps.className}`.trim()}\r\n data-columnid={c.fieldName}\r\n data-pdg-row-index={index}\r\n data-pdg-col-index={absoluteColIndex}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n data-pdg-cell-range={rangeProps['data-pdg-cell-range']}\r\n data-pdg-range-edge={rangeProps['data-pdg-range-edge']}\r\n style={{ ...columnSizeStyle(c, table.columnWidths, colWindow.layoutWidths), ...pin.style }}\r\n >\r\n <CellRenderer\r\n idx={absoluteColIndex}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={c.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={-1}\r\n mode=\"cell\"\r\n />\r\n {showFillHandle ? <FillHandle controller={controller} /> : null}\r\n </td>\r\n );\r\n }}\r\n />\r\n </tr>\r\n\r\n {row.isExpanded && (\r\n <tr role=\"row\">\r\n <td\r\n role=\"gridcell\"\r\n colSpan={totalColSpan}\r\n aria-colindex={1}\r\n aria-colspan={totalColSpan}\r\n >\r\n {MoreDetailComponent ? (\r\n <MoreDetailComponent data={row} />\r\n ) : (\r\n <div className=\"flex justify-center items-center bg-gray-100 shadow my-1 rounded transition-all duration-300\">\r\n <div className=\"flex flex-col items-center gap-2 m-12\">\r\n <NoData config={{width: 60, height: 60}} />\r\n <span className=\"text-gray-gray9 text-md\">\r\n {t(\"general.noData\")}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nexport const ERPTableRow = React.memo(ERPTableRowComponent, (prev, next) => {\r\n return (\r\n prev.row === next.row &&\r\n prev.index === next.index &&\r\n prev.stripeIndex === next.stripeIndex &&\r\n prev.controller === next.controller &&\r\n prev.tableKey === next.tableKey &&\r\n prev.isSelected === next.isSelected &&\r\n prev.isActive === next.isActive &&\r\n prev.isCut === next.isCut &&\r\n prev.table.columns === next.table.columns &&\r\n prev.table.columnWidths === next.table.columnWidths &&\r\n prev.table.activeCell?.rowId === next.table.activeCell?.rowId &&\r\n prev.table.activeCell?.columnId === next.table.activeCell?.columnId &&\r\n prev.table.cellRanges === next.table.cellRanges &&\r\n prev.moreDetailComponent === next.moreDetailComponent\r\n );\r\n});\r\n","import React, { Suspense, useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ERPTableRow } from './eRPTableRow';\r\n\r\nconst ERPTableGroupRow = React.lazy(() =>\r\n import('./ERPTableGroupRow').then((m) => ({ default: m.ERPTableGroupRow })),\r\n);\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\r\n /** Shifts aria-rowindex when pinned-top rows are present (PR-116). */\r\n pinnedTopCount?: number;\r\n}\r\n\r\nexport function ERPTableBody({\r\n controller,\r\n tableKey,\r\n moreDetailComponent: MoreDetailComponent,\r\n pinnedTopCount = 0,\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const dragRowId = useRef<number | null>(null);\r\n\r\n if (!table) return null;\r\n\r\n // Preserve UI index order (sort/filter/group — PR-120). Do not re-sort by index cell.\r\n const rows = table.rows;\r\n const hasGroups = rows.some((r) => r.rowKind === 'group');\r\n const displayRows = hasGroups\r\n ? rows\r\n : [...rows].sort(\r\n (a, b) =>\r\n Number(a.cells['index']?.value ?? 0) -\r\n Number(b.cells['index']?.value ?? 0),\r\n );\r\n\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\" role=\"rowgroup\">\r\n <Suspense fallback={null}>\r\n {displayRows.map((row, index) => {\r\n const absIndex =\r\n index + (table.pagination.page - 1) * table.pagination.pageSize;\r\n if (row.rowKind === 'group') {\r\n return (\r\n <ERPTableGroupRow\r\n key={row.id}\r\n row={row}\r\n index={absIndex}\r\n pinnedTopCount={pinnedTopCount}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n />\r\n );\r\n }\r\n return (\r\n <ERPTableRow\r\n key={row.id}\r\n row={row}\r\n stripeIndex={index}\r\n index={absIndex}\r\n pinnedTopCount={pinnedTopCount}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n draggedRowIdRef={dragRowId}\r\n moreDetailComponent={MoreDetailComponent}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n />\r\n );\r\n })}\r\n </Suspense>\r\n </tbody>\r\n );\r\n}\r\n","import React, {\r\n ReactNode,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport type { AggFuncName } from '../../domain/types/ColumnDef';\r\nimport { columnSizeStyle } from '../../engine/columnWidth';\r\nimport { isIndexColumn } from '../../engine/columnWidth';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ariaColIndex, ariaFooterRowIndex } from '../a11y/gridRoles';\r\nimport { columnPinCellProps } from '../columnPin';\r\nimport { useLocale, useTranslations } from '../host';\r\nimport { valueParser } from '../helper';\r\nimport { useColumnWindowOrAll } from '../virtual/columnWindow';\r\nimport { ColumnWindowCells } from '../virtual/ColumnWindowCells';\r\n\r\n/** Multi-row footer aggregation chrome (PR-119 / RFC-002). */\r\nexport type FooterRowDef = {\r\n id: string;\r\n label?: string;\r\n /** Override column aggFunc for this row. */\r\n aggFunc?: AggFuncName;\r\n};\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n footer?: boolean | ReactNode;\r\n footerRows?: readonly FooterRowDef[];\r\n dataRowCount?: number;\r\n pinnedTopCount?: number;\r\n pinnedBottomCount?: number;\r\n}\r\n\r\nconst DEFAULT_FOOTER_ROWS: FooterRowDef[] = [{ id: 'default' }];\r\n\r\nfunction resolveFooterRows(\r\n footer: boolean | ReactNode | undefined,\r\n footerRows: readonly FooterRowDef[] | undefined,\r\n): FooterRowDef[] | null {\r\n if (typeof footer !== 'boolean' || footer !== true) return null;\r\n if (footerRows && footerRows.length > 0) return [...footerRows];\r\n return DEFAULT_FOOTER_ROWS;\r\n}\r\n\r\nexport function ERPTableFooter({\r\n controller,\r\n footer,\r\n footerRows,\r\n dataRowCount,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n}: Props) {\r\n const locale = useLocale();\r\n const t = useTranslations();\r\n const [aggs, setAggs] = useState<Record<string, unknown>>({});\r\n const table = controller.getViewState();\r\n const rows = useMemo(\r\n () => resolveFooterRows(footer, footerRows),\r\n [footer, footerRows],\r\n );\r\n\r\n useEffect(() => {\r\n const view = controller.getViewState();\r\n if (!view || !rows) return;\r\n if (controller.isPagedWindow()) {\r\n // Page-window mode: RAM holds ONE page, so totals must fold over the\r\n // whole dataset streamed from IndexedDB (O(batch) heap, never the full\r\n // row array). Footer totals are sums; other aggFuncs use the window.\r\n let off: (() => void) | undefined;\r\n let cancelled = false;\r\n void import('./pagedFooterTotals').then(({ subscribePagedTotals }) => {\r\n if (!cancelled) off = subscribePagedTotals(controller, view.columns ?? [], setAggs);\r\n });\r\n return () => {\r\n cancelled = true;\r\n off?.();\r\n };\r\n }\r\n setAggs(controller.getColumnAggs());\r\n const unsubscribe = controller.subscribeColumnAggs(setAggs);\r\n return () => {\r\n unsubscribe?.();\r\n };\r\n }, [controller, rows]);\r\n\r\n const colWindow = useColumnWindowOrAll(\r\n table?.columns ?? [],\r\n table?.columnWidths,\r\n );\r\n\r\n if (!table || !table.columns) return null;\r\n if (typeof footer !== 'boolean' || footer !== true) {\r\n if (!footer) return null;\r\n const visibleColumns = table.columns.filter((c) => !c.hidden);\r\n const cols = visibleColumns.length;\r\n const footerRowIndex = ariaFooterRowIndex(\r\n dataRowCount ?? table.pagination.totalRows,\r\n pinnedTopCount,\r\n pinnedBottomCount,\r\n );\r\n return (\r\n <tfoot role=\"rowgroup\" className=\"erp-table-footer\" data-erp-footer=\"\">\r\n <tr\r\n role=\"row\"\r\n aria-rowindex={footerRowIndex}\r\n className={`w-full border border-gray-gray5 bg-main-white h-9 rounded `}\r\n >\r\n <td\r\n role=\"gridcell\"\r\n colSpan={cols}\r\n aria-colindex={1}\r\n aria-colspan={cols}\r\n >\r\n {footer}\r\n </td>\r\n </tr>\r\n </tfoot>\r\n );\r\n }\r\n\r\n if (!rows) return null;\r\n const baseRowIndex = ariaFooterRowIndex(\r\n dataRowCount ?? table.pagination.totalRows,\r\n pinnedTopCount,\r\n pinnedBottomCount,\r\n );\r\n\r\n return (\r\n <tfoot role=\"rowgroup\" className=\"erp-table-footer\" data-erp-footer=\"\">\r\n {rows.map((rowDef, rowOffset) => (\r\n <tr\r\n key={rowDef.id}\r\n role=\"row\"\r\n aria-rowindex={baseRowIndex + rowOffset}\r\n data-pdg-footer-row={rowDef.id}\r\n className={`w-full border border-gray-gray5 bg-main-white !h-9 rounded `}\r\n >\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"td\"\r\n spacerRole=\"presentation\"\r\n renderColumn={(c, index) => {\r\n const pin = columnPinCellProps(\r\n c,\r\n colWindow.startPinOffsets,\r\n colWindow.endPinOffsets,\r\n );\r\n let content: React.ReactNode = null;\r\n if (isIndexColumn(c)) {\r\n content =\r\n rowDef.label ??\r\n (rowDef.id === 'sum' || rowDef.id === 'default'\r\n ? t('general.footerTotal')\r\n : rowDef.id === 'avg'\r\n ? t('general.footerAvg')\r\n : (rowDef.label ?? rowDef.id));\r\n } else if (rowDef.aggFunc) {\r\n const value = controller.getColumnAggValue(\r\n c.fieldName,\r\n rowDef.aggFunc,\r\n );\r\n content =\r\n value == null\r\n ? null\r\n : valueParser(value, c.fieldType, locale);\r\n } else {\r\n const value = aggs[c.fieldName];\r\n content =\r\n value == null\r\n ? null\r\n : valueParser(value, c.fieldType, locale);\r\n }\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(index)}\r\n className={pin.className}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n style={{\r\n ...columnSizeStyle(\r\n c,\r\n table.columnWidths,\r\n colWindow.layoutWidths,\r\n ),\r\n ...pin.style,\r\n }}\r\n >\r\n {content}\r\n </td>\r\n );\r\n }}\r\n />\r\n </tr>\r\n ))}\r\n </tfoot>\r\n );\r\n}\r\n","import { isIndexColumn, type ColumnWidthHint } from './columnWidth';\r\n\r\nexport type ColumnReorderHint = ColumnWidthHint & { fieldName: string };\r\n\r\n/**\r\n * Map a header drop onto the same indices `Table.reorderColumns` uses\r\n * (display order / `getActiveCollectionColumns`). Index column is not movable.\r\n */\r\nexport function resolveColumnReorder(\r\n columns: readonly ColumnReorderHint[],\r\n sourceField: string,\r\n destField: string,\r\n): { sourceIndex: number; destIndex: number } | null {\r\n const sourceIndex = columns.findIndex((c) => c.fieldName === sourceField);\r\n const destIndex = columns.findIndex((c) => c.fieldName === destField);\r\n if (sourceIndex < 0 || destIndex < 0 || sourceIndex === destIndex) {\r\n return null;\r\n }\r\n const source = columns[sourceIndex];\r\n const dest = columns[destIndex];\r\n if (!source || !dest) return null;\r\n if (isIndexColumn(source) || isIndexColumn(dest)) return null;\r\n return { sourceIndex, destIndex };\r\n}\r\n","/**\r\n * Column header menu item model (PR-114). Pure — no React/DOM.\r\n */\r\n\r\nimport type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport { resolveFilterUi } from './filterModel';\r\nimport { isHeaderColumnSortable } from './sortModel';\r\nimport { isIndexColumn } from '../columnWidth';\r\n\r\nexport type ColumnMenuBuiltInId =\r\n | 'sortAsc'\r\n | 'sortDesc'\r\n | 'sortNone'\r\n | 'filter'\r\n | 'hideColumn'\r\n | 'pinStart'\r\n | 'pinEnd'\r\n | 'pinNone'\r\n | 'autoSize'\r\n | 'columnsPanel'\r\n | 'separator';\r\n\r\nexport type ColumnMenuCustomItem = {\r\n name: string;\r\n label: string;\r\n disabled?: boolean;\r\n};\r\n\r\nexport type ColumnMenuItemDef =\r\n | ColumnMenuBuiltInId\r\n | ColumnMenuCustomItem;\r\n\r\nexport type ColumnMenuItemsConfig =\r\n | ColumnMenuItemDef[]\r\n | ((defaults: ColumnMenuItemDef[]) => ColumnMenuItemDef[]);\r\n\r\nexport type ColumnMenuBuildContext = {\r\n column: ColumnSchema;\r\n sortable: boolean;\r\n filterable: boolean;\r\n hideable: boolean;\r\n pinnable: boolean;\r\n};\r\n\r\nexport function isColumnMenuCustomItem(\r\n item: ColumnMenuItemDef,\r\n): item is ColumnMenuCustomItem {\r\n return typeof item === 'object' && item !== null && 'name' in item;\r\n}\r\n\r\nexport function isColumnFilterable(column: ColumnSchema): boolean {\r\n const ui = resolveFilterUi(column);\r\n return ui != null;\r\n}\r\n\r\n/**\r\n * Page-window grids (`persistence: 'paged-idb'`) hold ONE page in RAM, so a\r\n * header sort / filter would only reorder / hide the rows of that page. There\r\n * they are offered only on columns that opt in explicitly\r\n * (`columnDef.sortable: true` / `columnDef.filter`).\r\n */\r\nexport function isColumnSortableInGrid(\r\n column: ColumnSchema,\r\n pagedWindow: boolean,\r\n): boolean {\r\n if (!isHeaderColumnSortable(column)) return false;\r\n return !pagedWindow || column.columnDef?.sortable === true;\r\n}\r\n\r\nexport function isColumnFilterableInGrid(\r\n column: ColumnSchema,\r\n pagedWindow: boolean,\r\n): boolean {\r\n if (!isColumnFilterable(column)) return false;\r\n if (!pagedWindow) return true;\r\n const def = column.columnDef?.filter;\r\n return def != null && def !== false;\r\n}\r\n\r\nexport function buildDefaultColumnMenuItems(\r\n ctx: ColumnMenuBuildContext,\r\n): ColumnMenuItemDef[] {\r\n const items: ColumnMenuItemDef[] = [];\r\n if (ctx.sortable) {\r\n items.push('sortAsc', 'sortDesc', 'sortNone', 'separator');\r\n }\r\n if (ctx.filterable) items.push('filter');\r\n if (ctx.hideable) items.push('hideColumn');\r\n if (ctx.pinnable) {\r\n items.push('pinStart', 'pinEnd', 'pinNone', 'separator');\r\n }\r\n items.push('autoSize', 'columnsPanel');\r\n return items;\r\n}\r\n\r\nexport function resolveColumnMenuItems(\r\n column: ColumnSchema,\r\n config?: ColumnMenuItemsConfig,\r\n options?: { pagedWindow?: boolean },\r\n): ColumnMenuItemDef[] {\r\n const pagedWindow = options?.pagedWindow === true;\r\n const ctx: ColumnMenuBuildContext = {\r\n column,\r\n sortable: isColumnSortableInGrid(column, pagedWindow),\r\n filterable: isColumnFilterableInGrid(column, pagedWindow),\r\n hideable: !isIndexColumn(column),\r\n pinnable: !isIndexColumn(column),\r\n };\r\n const defaults = buildDefaultColumnMenuItems(ctx);\r\n if (!config) return defaults;\r\n if (typeof config === 'function') return config(defaults);\r\n return config;\r\n}\r\n\r\nexport function columnMenuItemLabelKey(id: ColumnMenuBuiltInId): string {\r\n switch (id) {\r\n case 'sortAsc':\r\n return 'columnMenu.sortAsc';\r\n case 'sortDesc':\r\n return 'columnMenu.sortDesc';\r\n case 'sortNone':\r\n return 'columnMenu.sortNone';\r\n case 'filter':\r\n return 'columnMenu.filter';\r\n case 'hideColumn':\r\n return 'columnMenu.hideColumn';\r\n case 'pinStart':\r\n return 'columnMenu.pinStart';\r\n case 'pinEnd':\r\n return 'columnMenu.pinEnd';\r\n case 'pinNone':\r\n return 'columnMenu.pinNone';\r\n case 'autoSize':\r\n return 'columnMenu.autoSize';\r\n case 'columnsPanel':\r\n return 'columnMenu.columnsPanel';\r\n default:\r\n return id;\r\n }\r\n}\r\n\r\nexport function sortModelForMenuAction(\r\n current: readonly { colId: string; sort: 'asc' | 'desc' }[],\r\n colId: string,\r\n action: 'asc' | 'desc' | 'none',\r\n): { colId: string; sort: 'asc' | 'desc' }[] {\r\n if (action === 'none') {\r\n return current.filter((entry) => entry.colId !== colId);\r\n }\r\n return [{ colId, sort: action }];\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Window events that ask every mounted grid header to re-run validation.\r\n * Hosts dispatch one after changing something the grid cannot observe\r\n * (e.g. a header form field that feeds a column `requiredIf` rule).\r\n * `erp-table:revalidate` is the legacy arianERP name and stays supported.\r\n */\r\nexport const GRID_REVALIDATE_EVENT = 'pdg-grid:revalidate';\r\nexport const LEGACY_GRID_REVALIDATE_EVENT = 'erp-table:revalidate';\r\n\r\n/** Increments whenever a host fires a revalidate event. SSR-safe. */\r\nexport function useRevalidateRevision(): number {\r\n const [revision, setRevision] = useState(0);\r\n useEffect(() => {\r\n const bump = () => setRevision((v) => v + 1);\r\n const names = [GRID_REVALIDATE_EVENT, LEGACY_GRID_REVALIDATE_EVENT];\r\n names.forEach((n) => window.addEventListener(n, bump));\r\n return () => names.forEach((n) => window.removeEventListener(n, bump));\r\n }, []);\r\n return revision;\r\n}\r\n","import { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { GridSearchMatch } from './types';\r\n\r\nexport function getCellSearchText(\r\n controller: UITableController,\r\n rowId: number,\r\n columnId: string,\r\n): string {\r\n const cell = controller.getCell(rowId, columnId);\r\n const display = cell?.getDisplay();\r\n const value = cell?.getValue();\r\n if (display != null && display !== '') return String(display);\r\n return String(value ?? '');\r\n}\r\n\r\nexport function findColumnMatches(\r\n controller: UITableController,\r\n columnId: string,\r\n query: string,\r\n): GridSearchMatch[] {\r\n const q = query.trim();\r\n if (!q) return [];\r\n // PR-99: QuickFilterIndex candidates + UI order (no O(n) getAllRows scan).\r\n return controller.findColumnSearchMatches(columnId, q);\r\n}\r\n\r\n/** 0-based index in the same order as Desktop virtual body. */\r\nexport function getSortedRowAbsoluteIndex(\r\n controller: UITableController,\r\n rowId: number,\r\n): number {\r\n return controller.getUiRowAbsoluteIndex(rowId);\r\n}\r\n\r\nexport function computeVirtualScrollOffset(\r\n absoluteIndex: number,\r\n rowHeight: number,\r\n viewportSize: number,\r\n): number {\r\n if (absoluteIndex < 0) return 0;\r\n const lead = Math.min(Math.floor(viewportSize / 3), rowHeight * 2);\r\n return Math.max(0, absoluteIndex * rowHeight - lead);\r\n}\r\n\r\nexport function findTableScrollRoot(\r\n tableKey: string,\r\n): HTMLElement | null {\r\n if (typeof document === 'undefined') return null;\r\n const safeKey = tableKey.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\r\n return document.querySelector(\r\n `[data-erp-table-scroll][data-erp-table-key=\"${safeKey}\"]`,\r\n );\r\n}\r\n\r\nexport function isVirtualScrollRoot(el: HTMLElement | null): boolean {\r\n return el?.dataset.erpVirtualization === 'on';\r\n}\r\n\r\nfunction getTargetPage(\r\n controller: UITableController,\r\n rowId: number,\r\n): number | null {\r\n const absoluteIndex = getSortedRowAbsoluteIndex(controller, rowId);\r\n const table = controller.getViewState();\r\n if (!table || absoluteIndex < 0) return null;\r\n\r\n return Math.ceil((absoluteIndex + 1) / table.pagination.pageSize);\r\n}\r\n\r\n/**\r\n * Brings a row into view (pagination page change OR virtual viewport scroll).\r\n */\r\nexport async function revealRow(\r\n controller: UITableController,\r\n rowId: number,\r\n): Promise<void> {\r\n const table = controller.getViewState();\r\n if (!table) return;\r\n\r\n const tableKey = controller.getTableKey();\r\n const scrollRoot = findTableScrollRoot(tableKey);\r\n const session = controller.getSession();\r\n\r\n if (isVirtualScrollRoot(scrollRoot) && session) {\r\n const absoluteIndex = getSortedRowAbsoluteIndex(controller, rowId);\r\n if (absoluteIndex < 0) return;\r\n\r\n const viewport = session.getViewport();\r\n const scrollOffset = computeVirtualScrollOffset(\r\n absoluteIndex,\r\n viewport.rowHeight,\r\n viewport.viewportSize,\r\n );\r\n\r\n await session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset,\r\n viewportSize: viewport.viewportSize,\r\n rowHeight: viewport.rowHeight,\r\n overscan: viewport.overscan,\r\n });\r\n\r\n if (scrollRoot) {\r\n scrollRoot.scrollTop = scrollOffset;\r\n }\r\n return;\r\n }\r\n\r\n let targetPage: number | null;\r\n if (controller.isPagedWindow?.()) {\r\n // Stream from IDB and count the record's ordinal (sorted position) to\r\n // derive the page — no full row array in heap.\r\n const { findPagedRowPage } = await import('./pagedSearch');\r\n targetPage = await findPagedRowPage(controller, rowId, table.pagination.pageSize);\r\n } else {\r\n targetPage = getTargetPage(controller, rowId);\r\n }\r\n if (!targetPage) return;\r\n\r\n if (table.pagination.page !== targetPage) {\r\n await controller.dispatch({ type: 'CHANGE_PAGE', page: targetPage });\r\n }\r\n}\r\n\r\nexport async function navigateToMatch(\r\n controller: UITableController,\r\n match: GridSearchMatch,\r\n): Promise<void> {\r\n const table = controller.getViewState();\r\n if (!table) return;\r\n\r\n await revealRow(controller, match.rowId);\r\n await controller.dispatch({ type: 'UI_ACTIVE_ROW', rowId: match.rowId });\r\n}\r\n","import type { ReactNode } from 'react';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport type {\r\n ColumnFilter,\r\n FilterModel,\r\n} from '../../engine/dataOps/filterModel';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\n/**\r\n * Context passed to a host `FilterComponent` (PR-95).\r\n * Call `apply` with a `ColumnFilter` (usually `{ filterType: 'custom', customFilter }`).\r\n */\r\nexport type FilterComponentContext = {\r\n column: ColumnSchema;\r\n colId: string;\r\n filterModel: FilterModel;\r\n current: ColumnFilter | undefined;\r\n params?: Record<string, unknown>;\r\n controller: UITableController;\r\n apply: (next: ColumnFilter | null) => void;\r\n close: () => void;\r\n};\r\n\r\nexport type FilterComponent = (ctx: FilterComponentContext) => ReactNode;\r\n\r\n/**\r\n * Host map of custom filter UIs. Keys match `ColumnDef.filter` string / `{ type }` (PR-95).\r\n */\r\nexport type FilterComponentMap = Record<string, FilterComponent | undefined>;\r\n\r\nexport function resolveFilterComponent(\r\n name: string | undefined,\r\n components: FilterComponentMap | undefined,\r\n): FilterComponent | undefined {\r\n if (!name || !components) return undefined;\r\n const render = components[name];\r\n return typeof render === 'function' ? render : undefined;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport {\r\n collectUniqueFilterValues,\r\n type BooleanFilterOp,\r\n type ColumnFilter,\r\n type DateFilterOp,\r\n type FilterModel,\r\n type NumberFilterOp,\r\n type TextFilterOp,\r\n type BuiltinFilterKind,\r\n} from '../../engine/dataOps/filterModel';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { FilterComponent } from '../filters';\r\nimport { useThemePortalStyle, useTranslations } from '../host';\r\n\r\ntype Props = {\r\n column: ColumnSchema;\r\n kind?: BuiltinFilterKind;\r\n /** Custom filter registry name (PR-95). */\r\n customName?: string;\r\n customParams?: Record<string, unknown>;\r\n customComponent?: FilterComponent;\r\n filterModel: FilterModel;\r\n controller: UITableController;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n anchorRef: React.RefObject<HTMLElement | null>;\r\n};\r\n\r\nconst TEXT_OPS: TextFilterOp[] = [\r\n 'contains',\r\n 'notContains',\r\n 'equals',\r\n 'startsWith',\r\n 'endsWith',\r\n 'blank',\r\n 'notBlank',\r\n];\r\n\r\nconst NUMBER_OPS: NumberFilterOp[] = [\r\n 'equals',\r\n 'notEqual',\r\n 'lessThan',\r\n 'lessThanOrEqual',\r\n 'greaterThan',\r\n 'greaterThanOrEqual',\r\n 'inRange',\r\n 'blank',\r\n];\r\n\r\nconst DATE_OPS: DateFilterOp[] = [\r\n 'equals',\r\n 'before',\r\n 'after',\r\n 'inRange',\r\n 'blank',\r\n];\r\n\r\nfunction patchModel(\r\n model: FilterModel,\r\n colId: string,\r\n next: ColumnFilter | null,\r\n): FilterModel {\r\n const out: Record<string, ColumnFilter> = { ...model };\r\n if (next == null) delete out[colId];\r\n else out[colId] = next;\r\n return out;\r\n}\r\n\r\nexport function ColumnFilterPopover({\r\n column,\r\n kind,\r\n customName,\r\n customParams,\r\n customComponent,\r\n filterModel,\r\n controller,\r\n open,\r\n onOpenChange,\r\n anchorRef,\r\n}: Props) {\r\n const t = useTranslations();\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const current = filterModel[column.fieldName];\r\n const menuStyle = useThemePortalStyle({\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n zIndex: 60,\r\n });\r\n\r\n useEffect(() => {\r\n if (!open || !anchorRef.current) return;\r\n const rect = anchorRef.current.getBoundingClientRect();\r\n setPos({ top: rect.bottom + 4, left: rect.left });\r\n }, [open, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n const target = e.target as Node;\r\n if (anchorRef.current?.contains(target)) return;\r\n if (panelRef.current?.contains(target)) return;\r\n onOpenChange(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open, onOpenChange, anchorRef]);\r\n\r\n const uniqueValues = useMemo(() => {\r\n if (!open || kind !== 'set') return [];\r\n const rows = controller.getAllRows() ?? [];\r\n const ids = rows.map((r) => r.id.value);\r\n return collectUniqueFilterValues(ids, column.fieldName, {\r\n getValue: (rowId, colId) =>\r\n controller.getCell(rowId, colId)?.getValue() ?? null,\r\n });\r\n }, [open, kind, controller, column.fieldName]);\r\n\r\n if (!open || typeof document === 'undefined') return null;\r\n\r\n const apply = (next: ColumnFilter | null) => {\r\n controller.setFilterModel(patchModel(filterModel, column.fieldName, next));\r\n };\r\n\r\n const popoverKind = customName ? `custom:${customName}` : kind ?? 'custom';\r\n\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n className=\"pdg-filter-popover\"\r\n data-pdg-filter-popover={popoverKind}\r\n data-pdg-filter-col={column.fieldName}\r\n role=\"dialog\"\r\n aria-label={t('general.filter')}\r\n style={menuStyle}\r\n >\r\n {customComponent ? (\r\n <div data-pdg-filter-custom={customName}>\r\n {customComponent({\r\n column,\r\n colId: column.fieldName,\r\n filterModel,\r\n current,\r\n params: customParams,\r\n controller,\r\n apply: (next) => {\r\n apply(next);\r\n onOpenChange(false);\r\n },\r\n close: () => onOpenChange(false),\r\n })}\r\n </div>\r\n ) : null}\r\n {!customComponent && kind === 'text' ? (\r\n <TextFilterForm\r\n current={current}\r\n onApply={(f) => {\r\n apply(f);\r\n onOpenChange(false);\r\n }}\r\n onClear={() => {\r\n apply(null);\r\n onOpenChange(false);\r\n }}\r\n />\r\n ) : null}\r\n {!customComponent && kind === 'number' ? (\r\n <NumberFilterForm\r\n current={current}\r\n onApply={(f) => {\r\n apply(f);\r\n onOpenChange(false);\r\n }}\r\n onClear={() => {\r\n apply(null);\r\n onOpenChange(false);\r\n }}\r\n />\r\n ) : null}\r\n {!customComponent && kind === 'date' ? (\r\n <DateFilterForm\r\n current={current}\r\n onApply={(f) => {\r\n apply(f);\r\n onOpenChange(false);\r\n }}\r\n onClear={() => {\r\n apply(null);\r\n onOpenChange(false);\r\n }}\r\n />\r\n ) : null}\r\n {!customComponent && kind === 'boolean' ? (\r\n <BooleanFilterForm\r\n current={current}\r\n onApply={(f) => {\r\n apply(f);\r\n onOpenChange(false);\r\n }}\r\n onClear={() => {\r\n apply(null);\r\n onOpenChange(false);\r\n }}\r\n />\r\n ) : null}\r\n {!customComponent && kind === 'set' ? (\r\n <SetFilterForm\r\n values={uniqueValues}\r\n current={current}\r\n onApply={(f) => {\r\n apply(f);\r\n onOpenChange(false);\r\n }}\r\n onClear={() => {\r\n apply(null);\r\n onOpenChange(false);\r\n }}\r\n />\r\n ) : null}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nfunction TextFilterForm({\r\n current,\r\n onApply,\r\n onClear,\r\n}: {\r\n current: ColumnFilter | undefined;\r\n onApply: (f: ColumnFilter) => void;\r\n onClear: () => void;\r\n}) {\r\n const t = useTranslations();\r\n const initial =\r\n current && 'filterType' in current && current.filterType === 'text'\r\n ? current\r\n : null;\r\n const [type, setType] = useState<TextFilterOp>(initial?.type ?? 'contains');\r\n const [filter, setFilter] = useState(String(initial?.filter ?? ''));\r\n const needsValue = type !== 'blank' && type !== 'notBlank';\r\n\r\n return (\r\n <form\r\n className=\"pdg-filter-form\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n onApply({\r\n filterType: 'text',\r\n type,\r\n filter: needsValue ? filter : undefined,\r\n });\r\n }}\r\n >\r\n <select\r\n className=\"pdg-filter-select\"\r\n value={type}\r\n onChange={(e) => setType(e.target.value as TextFilterOp)}\r\n aria-label={t('general.filter')}\r\n >\r\n {TEXT_OPS.map((op) => (\r\n <option key={op} value={op}>\r\n {op}\r\n </option>\r\n ))}\r\n </select>\r\n {needsValue ? (\r\n <input\r\n className=\"pdg-filter-input\"\r\n value={filter}\r\n onChange={(e) => setFilter(e.target.value)}\r\n data-pdg-filter-input=\"text\"\r\n />\r\n ) : null}\r\n <div className=\"pdg-filter-actions\">\r\n <button type=\"submit\" className=\"pdg-filter-btn\">\r\n {t('general.filterApply')}\r\n </button>\r\n <button type=\"button\" className=\"pdg-filter-btn\" onClick={onClear}>\r\n {t('general.filterClear')}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\nfunction NumberFilterForm({\r\n current,\r\n onApply,\r\n onClear,\r\n}: {\r\n current: ColumnFilter | undefined;\r\n onApply: (f: ColumnFilter) => void;\r\n onClear: () => void;\r\n}) {\r\n const t = useTranslations();\r\n const initial =\r\n current && 'filterType' in current && current.filterType === 'number'\r\n ? current\r\n : null;\r\n const [type, setType] = useState<NumberFilterOp>(initial?.type ?? 'equals');\r\n const [filter, setFilter] = useState(String(initial?.filter ?? ''));\r\n const [filterTo, setFilterTo] = useState(String(initial?.filterTo ?? ''));\r\n const needsValue = type !== 'blank';\r\n const needsTo = type === 'inRange';\r\n\r\n return (\r\n <form\r\n className=\"pdg-filter-form\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n onApply({\r\n filterType: 'number',\r\n type,\r\n filter: needsValue ? filter : undefined,\r\n filterTo: needsTo ? filterTo : undefined,\r\n });\r\n }}\r\n >\r\n <select\r\n className=\"pdg-filter-select\"\r\n value={type}\r\n onChange={(e) => setType(e.target.value as NumberFilterOp)}\r\n >\r\n {NUMBER_OPS.map((op) => (\r\n <option key={op} value={op}>\r\n {op}\r\n </option>\r\n ))}\r\n </select>\r\n {needsValue ? (\r\n <input\r\n className=\"pdg-filter-input\"\r\n value={filter}\r\n onChange={(e) => setFilter(e.target.value)}\r\n data-pdg-filter-input=\"number\"\r\n />\r\n ) : null}\r\n {needsTo ? (\r\n <input\r\n className=\"pdg-filter-input\"\r\n value={filterTo}\r\n onChange={(e) => setFilterTo(e.target.value)}\r\n data-pdg-filter-input=\"number-to\"\r\n />\r\n ) : null}\r\n <div className=\"pdg-filter-actions\">\r\n <button type=\"submit\" className=\"pdg-filter-btn\">\r\n {t('general.filterApply')}\r\n </button>\r\n <button type=\"button\" className=\"pdg-filter-btn\" onClick={onClear}>\r\n {t('general.filterClear')}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\nfunction DateFilterForm({\r\n current,\r\n onApply,\r\n onClear,\r\n}: {\r\n current: ColumnFilter | undefined;\r\n onApply: (f: ColumnFilter) => void;\r\n onClear: () => void;\r\n}) {\r\n const t = useTranslations();\r\n const initial =\r\n current && 'filterType' in current && current.filterType === 'date'\r\n ? current\r\n : null;\r\n const [type, setType] = useState<DateFilterOp>(initial?.type ?? 'equals');\r\n const [dateFrom, setDateFrom] = useState(\r\n String(initial?.dateFrom ?? initial?.filter ?? ''),\r\n );\r\n const [dateTo, setDateTo] = useState(\r\n String(initial?.dateTo ?? initial?.filterTo ?? ''),\r\n );\r\n const needsFrom = type !== 'blank';\r\n const needsTo = type === 'inRange';\r\n\r\n return (\r\n <form\r\n className=\"pdg-filter-form\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n onApply({\r\n filterType: 'date',\r\n type,\r\n dateFrom: needsFrom ? dateFrom : undefined,\r\n dateTo: needsTo ? dateTo : undefined,\r\n });\r\n }}\r\n >\r\n <select\r\n className=\"pdg-filter-select\"\r\n value={type}\r\n onChange={(e) => setType(e.target.value as DateFilterOp)}\r\n >\r\n {DATE_OPS.map((op) => (\r\n <option key={op} value={op}>\r\n {op}\r\n </option>\r\n ))}\r\n </select>\r\n {needsFrom ? (\r\n <input\r\n className=\"pdg-filter-input\"\r\n type=\"date\"\r\n value={dateFrom}\r\n onChange={(e) => setDateFrom(e.target.value)}\r\n data-pdg-filter-input=\"date\"\r\n />\r\n ) : null}\r\n {needsTo ? (\r\n <input\r\n className=\"pdg-filter-input\"\r\n type=\"date\"\r\n value={dateTo}\r\n onChange={(e) => setDateTo(e.target.value)}\r\n data-pdg-filter-input=\"date-to\"\r\n />\r\n ) : null}\r\n <div className=\"pdg-filter-actions\">\r\n <button type=\"submit\" className=\"pdg-filter-btn\">\r\n {t('general.filterApply')}\r\n </button>\r\n <button type=\"button\" className=\"pdg-filter-btn\" onClick={onClear}>\r\n {t('general.filterClear')}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\nfunction BooleanFilterForm({\r\n current,\r\n onApply,\r\n onClear,\r\n}: {\r\n current: ColumnFilter | undefined;\r\n onApply: (f: ColumnFilter) => void;\r\n onClear: () => void;\r\n}) {\r\n const t = useTranslations();\r\n const initial =\r\n current && 'filterType' in current && current.filterType === 'boolean'\r\n ? current.type\r\n : 'any';\r\n const [type, setType] = useState<BooleanFilterOp>(initial);\r\n\r\n return (\r\n <form\r\n className=\"pdg-filter-form\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n onApply({ filterType: 'boolean', type });\r\n }}\r\n >\r\n {(['true', 'false', 'any'] as const).map((op) => (\r\n <label key={op} className=\"pdg-filter-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"bool-filter\"\r\n checked={type === op}\r\n onChange={() => setType(op)}\r\n data-pdg-filter-input={`boolean-${op}`}\r\n />\r\n {op}\r\n </label>\r\n ))}\r\n <div className=\"pdg-filter-actions\">\r\n <button type=\"submit\" className=\"pdg-filter-btn\">\r\n {t('general.filterApply')}\r\n </button>\r\n <button type=\"button\" className=\"pdg-filter-btn\" onClick={onClear}>\r\n {t('general.filterClear')}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\nfunction SetFilterForm({\r\n values,\r\n current,\r\n onApply,\r\n onClear,\r\n}: {\r\n values: unknown[];\r\n current: ColumnFilter | undefined;\r\n onApply: (f: ColumnFilter) => void;\r\n onClear: () => void;\r\n}) {\r\n const t = useTranslations();\r\n const initial =\r\n current && 'filterType' in current && current.filterType === 'set'\r\n ? new Set(current.values.map((v) => String(v ?? '')))\r\n : new Set(values.map((v) => String(v ?? '')));\r\n const [selected, setSelected] = useState(initial);\r\n\r\n return (\r\n <form\r\n className=\"pdg-filter-form\"\r\n onSubmit={(e) => {\r\n e.preventDefault();\r\n onApply({\r\n filterType: 'set',\r\n type: 'in',\r\n values: values.filter((v) => selected.has(String(v ?? ''))),\r\n });\r\n }}\r\n >\r\n <div className=\"pdg-filter-set-list\" data-pdg-filter-input=\"set\">\r\n {values.map((v, i) => {\r\n const key = String(v ?? '');\r\n const label = v == null || v === '' ? '(blank)' : String(v);\r\n return (\r\n <label key={`${key}-${i}`} className=\"pdg-filter-check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selected.has(key)}\r\n onChange={(e) => {\r\n setSelected((prev) => {\r\n const next = new Set(prev);\r\n if (e.target.checked) next.add(key);\r\n else next.delete(key);\r\n return next;\r\n });\r\n }}\r\n />\r\n {label}\r\n </label>\r\n );\r\n })}\r\n </div>\r\n <div className=\"pdg-filter-actions\">\r\n <button type=\"submit\" className=\"pdg-filter-btn\">\r\n {t('general.filterApply')}\r\n </button>\r\n <button type=\"button\" className=\"pdg-filter-btn\" onClick={onClear}>\r\n {t('general.filterClear')}\r\n </button>\r\n </div>\r\n </form>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport {\r\n buildColumnGroupHeaderModel,\r\n type ColumnGroupHeaderCell,\r\n} from '../../engine/dataOps/columnGroups';\r\nimport { columnSizeStyle } from '../../engine/columnWidth';\r\nimport type { ColumnWindowModel } from '../virtual/columnWindow';\r\n\r\ntype Props = {\r\n allVisible: ColumnSchema[];\r\n colWindow: ColumnWindowModel;\r\n columnWidths?: Record<string, number>;\r\n collapsedGroups: Record<string, true>;\r\n onToggleGroup: (groupId: string) => void;\r\n onGroupDragStart?: (groupId: string, leafFields: readonly string[]) => void;\r\n};\r\n\r\nfunction segmentWidth(\r\n columns: readonly ColumnSchema[],\r\n columnWidths: Record<string, number> | undefined,\r\n layoutWidths: Record<string, number>,\r\n): number {\r\n return columns.reduce((sum, col) => {\r\n const size = columnSizeStyle(col, columnWidths, layoutWidths);\r\n return sum + size.width;\r\n }, 0);\r\n}\r\n\r\nfunction renderGroupCell(\r\n cell: ColumnGroupHeaderCell,\r\n columns: readonly ColumnSchema[],\r\n columnWidths: Record<string, number> | undefined,\r\n layoutWidths: Record<string, number>,\r\n onToggleGroup: (groupId: string) => void,\r\n onGroupDragStart?: Props['onGroupDragStart'],\r\n) {\r\n const width = segmentWidth(columns, columnWidths, layoutWidths);\r\n return (\r\n <th\r\n key={`${cell.level}-${cell.groupId}`}\r\n role=\"columnheader\"\r\n colSpan={cell.colspan}\r\n aria-colspan={cell.colspan}\r\n data-erp-col-group={cell.groupId}\r\n className=\"erp-col-group-header relative px-2 text-xs border text-center whitespace-nowrap bg-gray-gray3\"\r\n style={{ width, minWidth: width }}\r\n draggable={Boolean(onGroupDragStart)}\r\n onDragStart={(e) => {\r\n if (!onGroupDragStart) return;\r\n e.dataTransfer.setData('text/plain', cell.groupId);\r\n e.dataTransfer.effectAllowed = 'move';\r\n onGroupDragStart(cell.groupId, cell.leafFields);\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n className=\"erp-col-group-toggle inline-flex items-center gap-1\"\r\n aria-expanded={!cell.collapsed}\r\n aria-label={cell.collapsed ? 'Expand group' : 'Collapse group'}\r\n data-pdg-no-sort\r\n onClick={() => onToggleGroup(cell.groupId)}\r\n >\r\n <span aria-hidden>{cell.collapsed ? '▸' : '▾'}</span>\r\n <span>{cell.headerName}</span>\r\n </button>\r\n </th>\r\n );\r\n}\r\n\r\nfunction renderZoneGroupRow(\r\n zoneColumns: ColumnSchema[],\r\n level: number,\r\n rowCells: ColumnGroupHeaderCell[],\r\n columnWidths: Record<string, number> | undefined,\r\n layoutWidths: Record<string, number>,\r\n onToggleGroup: (groupId: string) => void,\r\n onGroupDragStart?: Props['onGroupDragStart'],\r\n): React.ReactNode[] {\r\n const nodes: React.ReactNode[] = [];\r\n const fieldSet = new Set(zoneColumns.map((c) => c.fieldName));\r\n let colCursor = 0;\r\n\r\n for (const cell of rowCells) {\r\n const colsInZone = cell.leafFields\r\n .map((f) => zoneColumns.find((c) => c.fieldName === f))\r\n .filter((c): c is ColumnSchema => Boolean(c));\r\n if (colsInZone.length === 0) continue;\r\n\r\n const startIdx = zoneColumns.findIndex((c) => c.fieldName === colsInZone[0]!.fieldName);\r\n while (colCursor < startIdx) {\r\n const gapCol = zoneColumns[colCursor]!;\r\n const gapSize = columnSizeStyle(gapCol, columnWidths, layoutWidths);\r\n nodes.push(\r\n <th\r\n key={`gap-${level}-${gapCol.fieldName}`}\r\n role=\"columnheader\"\r\n aria-hidden\r\n style={{ width: gapSize.width, minWidth: gapSize.width, padding: 0, border: 'none' }}\r\n />,\r\n );\r\n colCursor += 1;\r\n }\r\n\r\n if (!cell.leafFields.some((f) => fieldSet.has(f))) continue;\r\n\r\n nodes.push(\r\n renderGroupCell(\r\n { ...cell, colspan: colsInZone.length },\r\n colsInZone,\r\n columnWidths,\r\n layoutWidths,\r\n onToggleGroup,\r\n onGroupDragStart,\r\n ),\r\n );\r\n colCursor += colsInZone.length;\r\n }\r\n\r\n while (colCursor < zoneColumns.length) {\r\n const gapCol = zoneColumns[colCursor]!;\r\n const gapSize = columnSizeStyle(gapCol, columnWidths, layoutWidths);\r\n nodes.push(\r\n <th\r\n key={`tail-gap-${level}-${gapCol.fieldName}`}\r\n role=\"presentation\"\r\n aria-hidden\r\n style={{ width: gapSize.width, minWidth: gapSize.width, padding: 0, border: 'none' }}\r\n />,\r\n );\r\n colCursor += 1;\r\n }\r\n\r\n return nodes;\r\n}\r\n\r\nexport function ColumnGroupHeaderRows({\r\n allVisible,\r\n colWindow,\r\n columnWidths,\r\n collapsedGroups,\r\n onToggleGroup,\r\n onGroupDragStart,\r\n}: Props) {\r\n const visible = allVisible.filter((c) => !c.hidden);\r\n const model = buildColumnGroupHeaderModel(visible, collapsedGroups);\r\n if (model.maxDepth === 0) return null;\r\n\r\n const layoutWidths = colWindow.layoutWidths;\r\n\r\n return (\r\n <>\r\n {model.rows.map((rowCells, level) => (\r\n <tr\r\n key={`group-row-${level}`}\r\n role=\"row\"\r\n aria-rowindex={level + 1}\r\n className=\"erp-col-group-row bg-gray-gray3\"\r\n data-erp-col-group-level={level}\r\n >\r\n {renderZoneGroupRow(\r\n colWindow.pinnedStart,\r\n level,\r\n rowCells,\r\n columnWidths,\r\n layoutWidths,\r\n onToggleGroup,\r\n onGroupDragStart,\r\n )}\r\n {colWindow.spacerStart > 0 ? (\r\n <th\r\n aria-hidden\r\n role=\"presentation\"\r\n style={{ width: colWindow.spacerStart, minWidth: colWindow.spacerStart, padding: 0, border: 'none' }}\r\n />\r\n ) : null}\r\n {renderZoneGroupRow(\r\n colWindow.scrollable,\r\n level,\r\n rowCells,\r\n columnWidths,\r\n layoutWidths,\r\n onToggleGroup,\r\n onGroupDragStart,\r\n )}\r\n {colWindow.spacerEnd > 0 ? (\r\n <th\r\n aria-hidden\r\n role=\"presentation\"\r\n style={{ width: colWindow.spacerEnd, minWidth: colWindow.spacerEnd, padding: 0, border: 'none' }}\r\n />\r\n ) : null}\r\n {renderZoneGroupRow(\r\n colWindow.pinnedEnd,\r\n level,\r\n rowCells,\r\n columnWidths,\r\n layoutWidths,\r\n onToggleGroup,\r\n onGroupDragStart,\r\n )}\r\n </tr>\r\n ))}\r\n </>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport {\r\n columnMenuItemLabelKey,\r\n isColumnMenuCustomItem,\r\n resolveColumnMenuItems,\r\n sortModelForMenuAction,\r\n type ColumnMenuBuiltInId,\r\n type ColumnMenuItemDef,\r\n type ColumnMenuItemsConfig,\r\n} from '../../engine/dataOps/columnMenu';\r\nimport type { FilterModel } from '../../engine/dataOps/filterModel';\r\nimport type { SortModel } from '../../engine/dataOps/sortModel';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { trapTabKey } from '../../infrastructure/ui/focusTrap';\r\nimport { useThemePortalStyle, useTranslations } from '../host';\r\n\r\nexport type ColumnMenuActionEvent = {\r\n name: string;\r\n columnId: string;\r\n};\r\n\r\ntype Props = {\r\n column: ColumnSchema;\r\n controller: UITableController;\r\n sortModel: SortModel;\r\n filterModel: FilterModel;\r\n itemsConfig?: ColumnMenuItemsConfig;\r\n onCustomAction?: (event: ColumnMenuActionEvent) => void;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n anchorRef: React.RefObject<HTMLElement | null>;\r\n onOpenFilter?: () => void;\r\n onOpenColumnsPanel?: () => void;\r\n};\r\n\r\ntype MenuRow =\r\n | { kind: 'separator'; key: string }\r\n | { kind: 'item'; key: string; label: string; disabled?: boolean; action: () => void };\r\n\r\nfunction buildRows(\r\n items: ColumnMenuItemDef[],\r\n column: ColumnSchema,\r\n controller: UITableController,\r\n sortModel: SortModel,\r\n onCustomAction: ((event: ColumnMenuActionEvent) => void) | undefined,\r\n onOpenFilter: (() => void) | undefined,\r\n onOpenColumnsPanel: (() => void) | undefined,\r\n t: (key: string) => string,\r\n): MenuRow[] {\r\n const colId = column.fieldName;\r\n const rows: MenuRow[] = [];\r\n\r\n for (const item of items) {\r\n if (item === 'separator') {\r\n rows.push({ kind: 'separator', key: `sep-${rows.length}` });\r\n continue;\r\n }\r\n if (isColumnMenuCustomItem(item)) {\r\n rows.push({\r\n kind: 'item',\r\n key: `custom-${item.name}`,\r\n label: item.label,\r\n disabled: item.disabled,\r\n action: () => onCustomAction?.({ name: item.name, columnId: colId }),\r\n });\r\n continue;\r\n }\r\n const id = item as ColumnMenuBuiltInId;\r\n if (id === 'separator') continue;\r\n rows.push({\r\n kind: 'item',\r\n key: id,\r\n label: t(columnMenuItemLabelKey(id)),\r\n action: () => {\r\n switch (id) {\r\n case 'sortAsc':\r\n controller.setSortModel(sortModelForMenuAction(sortModel, colId, 'asc'));\r\n break;\r\n case 'sortDesc':\r\n controller.setSortModel(sortModelForMenuAction(sortModel, colId, 'desc'));\r\n break;\r\n case 'sortNone':\r\n controller.setSortModel(sortModelForMenuAction(sortModel, colId, 'none'));\r\n break;\r\n case 'filter':\r\n onOpenFilter?.();\r\n break;\r\n case 'hideColumn':\r\n controller.setColumnVisible(colId, false);\r\n break;\r\n case 'pinStart':\r\n controller.setColumnPinned(colId, 'start');\r\n break;\r\n case 'pinEnd':\r\n controller.setColumnPinned(colId, 'end');\r\n break;\r\n case 'pinNone':\r\n controller.setColumnPinned(colId, null);\r\n break;\r\n case 'autoSize':\r\n controller.autoSizeColumns([colId]);\r\n break;\r\n case 'columnsPanel':\r\n onOpenColumnsPanel?.();\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n });\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nexport function ColumnMenuPopover({\r\n column,\r\n controller,\r\n sortModel,\r\n itemsConfig,\r\n onCustomAction,\r\n open,\r\n onOpenChange,\r\n anchorRef,\r\n onOpenFilter,\r\n onOpenColumnsPanel,\r\n}: Props) {\r\n const t = useTranslations();\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const [focusIndex, setFocusIndex] = useState(0);\r\n const portalStyle = useThemePortalStyle({\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n zIndex: 1200,\r\n });\r\n\r\n const pagedWindow = controller.isPagedWindow();\r\n const items = useMemo(\r\n () => resolveColumnMenuItems(column, itemsConfig, { pagedWindow }),\r\n [column, itemsConfig, pagedWindow],\r\n );\r\n\r\n const rows = useMemo(\r\n () =>\r\n buildRows(\r\n items,\r\n column,\r\n controller,\r\n sortModel,\r\n onCustomAction,\r\n onOpenFilter,\r\n onOpenColumnsPanel,\r\n t,\r\n ),\r\n [\r\n items,\r\n column,\r\n controller,\r\n sortModel,\r\n onCustomAction,\r\n onOpenFilter,\r\n onOpenColumnsPanel,\r\n t,\r\n ],\r\n );\r\n\r\n const actionable = rows.filter((r) => r.kind === 'item') as Extract<\r\n MenuRow,\r\n { kind: 'item' }\r\n >[];\r\n\r\n useEffect(() => {\r\n if (!open || !anchorRef.current) return;\r\n const rect = anchorRef.current.getBoundingClientRect();\r\n setPos({ top: rect.bottom + 4, left: rect.left });\r\n setFocusIndex(0);\r\n }, [open, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onKey = (e: KeyboardEvent) => {\r\n if (menuRef.current && trapTabKey(menuRef.current, e)) {\r\n return;\r\n }\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n onOpenChange(false);\r\n return;\r\n }\r\n if (actionable.length === 0) return;\r\n if (e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n setFocusIndex((i) => (i + 1) % actionable.length);\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n setFocusIndex((i) => (i - 1 + actionable.length) % actionable.length);\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault();\r\n const row = actionable[focusIndex];\r\n if (row && !row.disabled) {\r\n row.action();\r\n onOpenChange(false);\r\n }\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open, actionable, focusIndex, onOpenChange]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const id = requestAnimationFrame(() => {\r\n const focused = menuRef.current?.querySelector<HTMLElement>(\r\n '[role=\"menuitem\"]:not([disabled])',\r\n );\r\n focused?.focus();\r\n });\r\n return () => cancelAnimationFrame(id);\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n const target = e.target as Node;\r\n if (menuRef.current?.contains(target)) return;\r\n if (anchorRef.current?.contains(target)) return;\r\n onOpenChange(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open, onOpenChange, anchorRef]);\r\n\r\n if (!open || typeof document === 'undefined') return null;\r\n\r\n let actionCursor = -1;\r\n\r\n return createPortal(\r\n <div\r\n ref={menuRef}\r\n role=\"menu\"\r\n className=\"erp-col-menu pdg-col-menu\"\r\n data-pdg-col-menu={column.fieldName}\r\n style={portalStyle}\r\n >\r\n {rows.map((row) => {\r\n if (row.kind === 'separator') {\r\n return (\r\n <div\r\n key={row.key}\r\n role=\"separator\"\r\n className=\"erp-col-menu__separator\"\r\n data-pdg-col-menu-separator\r\n />\r\n );\r\n }\r\n actionCursor += 1;\r\n const idx = actionCursor;\r\n const focused = idx === focusIndex;\r\n return (\r\n <button\r\n key={row.key}\r\n type=\"button\"\r\n role=\"menuitem\"\r\n data-pdg-col-menu-item={row.key}\r\n className={`erp-col-menu__item${focused ? ' is-focused' : ''}`}\r\n disabled={row.disabled}\r\n tabIndex={focused ? 0 : -1}\r\n onMouseEnter={() => setFocusIndex(idx)}\r\n onClick={() => {\r\n if (row.disabled) return;\r\n row.action();\r\n onOpenChange(false);\r\n }}\r\n >\r\n {row.label}\r\n </button>\r\n );\r\n })}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nexport type { ColumnMenuItemDef, ColumnMenuItemsConfig };\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport { isIndexColumn } from '../../engine/columnWidth';\r\nimport { canSetColumnVisible } from '../../engine/dataOps/columnVisibility';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { trapTabKey } from '../../infrastructure/ui/focusTrap';\r\nimport { useThemePortalStyle, useTranslations } from '../host';\r\n\r\ntype Props = {\r\n columns: ColumnSchema[];\r\n controller: UITableController;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n anchorRef: React.RefObject<HTMLElement | null>;\r\n};\r\n\r\nexport function ColumnsPanelPopover({\r\n columns,\r\n controller,\r\n open,\r\n onOpenChange,\r\n anchorRef,\r\n}: Props) {\r\n const t = useTranslations();\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const portalStyle = useThemePortalStyle({\r\n position: 'fixed',\r\n top: pos.top,\r\n left: pos.left,\r\n zIndex: 1200,\r\n minWidth: 200,\r\n });\r\n\r\n const togglable = columns.filter((c) => !isIndexColumn(c));\r\n\r\n useEffect(() => {\r\n if (!open || !anchorRef.current) return;\r\n const rect = anchorRef.current.getBoundingClientRect();\r\n setPos({ top: rect.bottom + 4, left: rect.left });\r\n }, [open, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onKey = (e: KeyboardEvent) => {\r\n if (panelRef.current && trapTabKey(panelRef.current, e)) {\r\n return;\r\n }\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n onOpenChange(false);\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n return () => document.removeEventListener('keydown', onKey);\r\n }, [open, onOpenChange]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const onDoc = (e: MouseEvent) => {\r\n const target = e.target as Node;\r\n if (panelRef.current?.contains(target)) return;\r\n if (anchorRef.current?.contains(target)) return;\r\n onOpenChange(false);\r\n };\r\n document.addEventListener('mousedown', onDoc);\r\n return () => document.removeEventListener('mousedown', onDoc);\r\n }, [open, onOpenChange, anchorRef]);\r\n\r\n if (!open || typeof document === 'undefined') return null;\r\n\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n role=\"dialog\"\r\n aria-label={t('columnMenu.columnsPanel')}\r\n className=\"erp-col-menu erp-col-columns-panel pdg-col-columns-panel\"\r\n data-pdg-col-columns-panel\r\n style={portalStyle}\r\n >\r\n <div className=\"erp-col-columns-panel__title\">{t('columnMenu.columnsPanel')}</div>\r\n <ul className=\"erp-col-columns-panel__list\" role=\"listbox\">\r\n {togglable.map((col) => {\r\n const visible = !col.hidden;\r\n const locked = canSetColumnVisible(col, true).ok === false && !visible;\r\n return (\r\n <li key={col.fieldName} role=\"option\" aria-selected={visible}>\r\n <label className=\"erp-col-columns-panel__row\">\r\n <input\r\n type=\"checkbox\"\r\n checked={visible}\r\n disabled={locked}\r\n data-pdg-col-panel-toggle={col.fieldName}\r\n onChange={() => {\r\n controller.setColumnVisible(col.fieldName, !visible);\r\n }}\r\n />\r\n <span>{col.fieldCaption}</span>\r\n </label>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useRef } from 'react';\r\n\r\nimport { clampColumnWidth, type ColumnWidthHint } from '../../engine/columnWidth';\r\n\r\ntype Props = {\r\n columnId: string;\r\n currentWidth: number;\r\n column: ColumnWidthHint;\r\n direction: 'rtl' | 'ltr';\r\n onResize: (width: number) => void;\r\n /** Double-click resize handle → auto-size this column (PR-112). */\r\n onAutoSize?: () => void;\r\n};\r\n\r\nexport function ColumnResizeHandle({\r\n columnId,\r\n currentWidth,\r\n column,\r\n direction,\r\n onResize,\r\n onAutoSize,\r\n}: Props) {\r\n const drag = useRef<{ startX: number; startW: number } | null>(null);\r\n\r\n const endDrag = (target: HTMLElement, pointerId: number) => {\r\n drag.current = null;\r\n document.body.classList.remove('erp-col-resizing');\r\n try {\r\n target.releasePointerCapture(pointerId);\r\n } catch {\r\n /* already released */\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n aria-label=\"Resize column\"\r\n data-erp-col-resize={columnId}\r\n className=\"erp-col-resize\"\r\n onDragStart={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }}\r\n onPointerDown={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n drag.current = { startX: e.clientX, startW: currentWidth };\r\n document.body.classList.add('erp-col-resizing');\r\n }}\r\n onPointerMove={(e) => {\r\n if (!drag.current) return;\r\n const delta =\r\n direction === 'rtl'\r\n ? drag.current.startX - e.clientX\r\n : e.clientX - drag.current.startX;\r\n onResize(clampColumnWidth(drag.current.startW + delta, column));\r\n }}\r\n onPointerUp={(e) => {\r\n endDrag(e.currentTarget, e.pointerId);\r\n }}\r\n onPointerCancel={(e) => {\r\n endDrag(e.currentTarget, e.pointerId);\r\n }}\r\n onLostPointerCapture={() => {\r\n drag.current = null;\r\n document.body.classList.remove('erp-col-resizing');\r\n }}\r\n onDoubleClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onAutoSize?.();\r\n }}\r\n />\r\n );\r\n}\r\n","import React, { type ReactNode, useEffect, useRef, useState } from 'react';\r\nimport { CustomDropdownButton, CustomCheckbox } from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { resolveColumnReorder } from '../../engine/columnReorder';\r\nimport { columnSizeStyle, isIndexColumn } from '../../engine/columnWidth';\r\nimport {\r\n isColumnFilterActive,\r\n resolveFilterUi,\r\n type ColumnFilter,\r\n type FilterModel,\r\n} from '../../engine/dataOps/filterModel';\r\nimport {\r\n ariaSortForColumn,\r\n cycleSortModel,\r\n HEADER_SORT_CLICK_MAX_MOVE_PX,\r\n shouldCommitHeaderSortClick,\r\n sortPriorityForColumn,\r\n} from '../../engine/dataOps/sortModel';\r\nimport {\r\n isColumnFilterableInGrid,\r\n isColumnSortableInGrid,\r\n} from '../../engine/dataOps/columnMenu';\r\nimport { ValidationCallbackResult } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useRevalidateRevision } from '../hooks/useRevalidateRevision';\r\nimport { revealRow } from '../gridSearch/utils';\r\nimport {\r\n resolveFilterComponent,\r\n type FilterComponentMap,\r\n} from '../filters';\r\nimport { useDirection, useERPTableHost, useTranslations } from '../host';\r\nimport { useColumnWindowOrAll } from '../virtual/columnWindow';\r\nimport { ColumnWindowCells } from '../virtual/ColumnWindowCells';\r\nimport {\r\n ARIA_HEADER_ROW_INDEX,\r\n ariaColIndex,\r\n} from '../a11y/gridRoles';\r\nimport { columnPinCellProps, columnPinClassName } from '../columnPin';\r\nimport { ColumnFilterPopover } from './ColumnFilterPopover';\r\nimport { ColumnGroupHeaderRows } from './ColumnGroupHeaderRows';\r\nimport { ColumnMenuPopover } from './ColumnMenuPopover';\r\nimport { ColumnsPanelPopover } from './ColumnsPanelPopover';\r\nimport { ColumnResizeHandle } from './ColumnResizeHandle';\r\nimport {\r\n maxColumnGroupDepth,\r\n resolveGroupBlockReorder,\r\n} from '../../engine/dataOps/columnGroups';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n header?: ReactNode;\r\n /** Optional floating filter row under the header (PR-94). */\r\n floatingFilter?: boolean;\r\n /** Custom filter UI registry (PR-95). */\r\n filterComponents?: FilterComponentMap;\r\n}\r\n\r\nfunction isInteractiveHeaderTarget(target: EventTarget | null): boolean {\r\n if (!(target instanceof Element)) return false;\r\n return Boolean(\r\n target.closest(\r\n '.erp-col-resize, button, input, [role=\"checkbox\"], [data-pdg-no-sort], [data-pdg-filter-btn], [data-pdg-col-menu-btn]',\r\n ),\r\n );\r\n}\r\n\r\nfunction floatingFilterValue(\r\n model: FilterModel,\r\n colId: string,\r\n): string {\r\n const entry = model[colId];\r\n if (!entry || !('filterType' in entry)) return '';\r\n if (entry.filterType === 'text') return String(entry.filter ?? '');\r\n if (entry.filterType === 'number') return String(entry.filter ?? '');\r\n if (entry.filterType === 'date') {\r\n return String(entry.dateFrom ?? entry.filter ?? '');\r\n }\r\n return '';\r\n}\r\n\r\nfunction applyFloatingFilter(\r\n model: FilterModel,\r\n col: ColumnSchema,\r\n raw: string,\r\n): FilterModel {\r\n const ui = resolveFilterUi(col);\r\n const next: Record<string, ColumnFilter> = { ...model };\r\n if (!ui || ui.mode !== 'builtin' || raw.trim() === '') {\r\n delete next[col.fieldName];\r\n return next;\r\n }\r\n const kind = ui.kind;\r\n if (kind === 'number') {\r\n next[col.fieldName] = {\r\n filterType: 'number',\r\n type: 'equals',\r\n filter: raw,\r\n };\r\n } else if (kind === 'date') {\r\n next[col.fieldName] = {\r\n filterType: 'date',\r\n type: 'equals',\r\n dateFrom: raw,\r\n };\r\n } else if (kind === 'boolean') {\r\n const v = raw.trim().toLowerCase();\r\n next[col.fieldName] = {\r\n filterType: 'boolean',\r\n type: v === 'true' || v === '1' ? 'true' : v === 'false' || v === '0' ? 'false' : 'any',\r\n };\r\n } else {\r\n next[col.fieldName] = {\r\n filterType: 'text',\r\n type: 'contains',\r\n filter: raw,\r\n };\r\n }\r\n return next;\r\n}\r\n\r\nexport function ERPTableHeader({\r\n controller,\r\n tableKey,\r\n header,\r\n floatingFilter = false,\r\n filterComponents,\r\n}: Props) {\r\n const direction = useDirection();\r\n const t = useTranslations();\r\n const host = useERPTableHost();\r\n const filters = filterComponents ?? host.filterComponents;\r\n const columnMenuItems = host.columnMenuItems;\r\n const onColumnMenuAction = host.onColumnMenuAction;\r\n const table = controller.getViewState();\r\n /** Page-window grid: header sort / filter only on columns that opt in. */\r\n const pagedWindow = controller.isPagedWindow();\r\n const draggedFieldRef = useRef<string | null>(null);\r\n const draggedGroupRef = useRef<string | null>(null);\r\n const pointerOriginRef = useRef<{ x: number; y: number } | null>(null);\r\n const suppressSortClickRef = useRef(false);\r\n const filterBtnRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n const menuBtnRefs = useRef<Record<string, HTMLButtonElement | null>>({});\r\n const columnsPanelAnchorRef = useRef<HTMLButtonElement | null>(null);\r\n const [dropField, setDropField] = useState<string | null>(null);\r\n const [openFilterCol, setOpenFilterCol] = useState<string | null>(null);\r\n const [openMenuCol, setOpenMenuCol] = useState<string | null>(null);\r\n const [openColumnsPanel, setOpenColumnsPanel] = useState(false);\r\n const [validationResult, setValidationResult] =\r\n useState<ValidationCallbackResult>({\r\n valid: true,\r\n data: null,\r\n errors: new Map(),\r\n });\r\n\r\n const validationRevision = useRevalidateRevision();\r\n\r\n useEffect(() => {\r\n const validation = controller.validation();\r\n validation((res) => {\r\n setValidationResult(res);\r\n });\r\n }, [\r\n controller,\r\n table?.activeCell?.columnId,\r\n table?.activeCell?.rowId,\r\n validationRevision,\r\n ]);\r\n\r\n const displayColumns = table?.columns ?? [];\r\n const collapsedGroups = table?.collapsedColumnGroups ?? {};\r\n const colWindow = useColumnWindowOrAll(displayColumns, table?.columnWidths);\r\n const groupDepth = maxColumnGroupDepth(displayColumns);\r\n\r\n if (!table || !table.columns) return null;\r\n\r\n const visibleColumns = displayColumns.filter((c: ColumnSchema) => !c.hidden);\r\n const sortModel = table.sortModel ?? [];\r\n const filterModel = table.filterModel ?? {};\r\n const isSelectedActivePageRows = table.rows.every(\r\n (row) => !!table.selectedRows[row.id],\r\n );\r\n const handleSelectActivePageRows = () => {\r\n controller.dispatch({type: \"TOGGLE_PAGE_ROW_SELECTED\"});\r\n };\r\n const allRows = controller.getAllRows() ?? [];\r\n const handleNavigateToError = (rowId: number) => {\r\n void revealRow(controller, rowId);\r\n };\r\n const items = Array.from((validationResult.errors ?? new Map()).entries()).map(\r\n ([key, value], errorIndex) => {\r\n const Index = allRows.findIndex((r) => r.id.value == value.rowId) + 1;\r\n\r\n return {\r\n key: errorIndex.toString(),\r\n\r\n label: (\r\n <button\r\n className=\"flex bg-red-300 text-red-600 text-xs\"\r\n onClick={() => {\r\n handleNavigateToError(value.rowId);\r\n }}\r\n >\r\n {`${t('general.validationInRow')} ${Index} ${t('general.validationInColumn')} ${value.caption} : ${value.message}`}\r\n </button>\r\n ),\r\n };\r\n },\r\n );\r\n const cols = visibleColumns.length;\r\n\r\n const renderHeaderColumn = (col: ColumnSchema, index: number) => {\r\n const size = columnSizeStyle(col, table.columnWidths, colWindow.layoutWidths);\r\n const handle = (\r\n <ColumnResizeHandle\r\n columnId={col.fieldName}\r\n currentWidth={size.width}\r\n column={col}\r\n direction={direction}\r\n onResize={(width) => {\r\n void controller.dispatch({\r\n type: \"UI_RESIZE_COLUMN\",\r\n columnId: col.fieldName,\r\n width,\r\n });\r\n }}\r\n onAutoSize={() => controller.autoSizeColumns([col.fieldName])}\r\n />\r\n );\r\n const pin = columnPinCellProps(col, colWindow.startPinOffsets, colWindow.endPinOffsets);\r\n if (isIndexColumn(col)) {\r\n return (\r\n <th\r\n key={col.fieldName}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n style={{...col.style, ...size, ...pin.style}}\r\n className={`relative px-2 text-xs border text-start whitespace-nowrap ${pin.className} ${col.className || \"\"}`}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <CustomCheckbox\r\n checked={isSelectedActivePageRows}\r\n onClick={handleSelectActivePageRows}\r\n aria-label={t(\"general.toggle\")}\r\n />\r\n\r\n {col.fieldCaption}\r\n </div>\r\n {handle}\r\n </th>\r\n );\r\n }\r\n\r\n const sortable = isColumnSortableInGrid(col, pagedWindow);\r\n const filterUi = isColumnFilterableInGrid(col, pagedWindow)\r\n ? resolveFilterUi(col)\r\n : null;\r\n const customFilter =\r\n filterUi?.mode === 'custom'\r\n ? resolveFilterComponent(filterUi.name, filters)\r\n : undefined;\r\n const filterable =\r\n filterUi != null &&\r\n (filterUi.mode === 'builtin' || customFilter != null);\r\n const filterActive = isColumnFilterActive(filterModel, col.fieldName);\r\n const ariaSort = sortable\r\n ? ariaSortForColumn(sortModel, col.fieldName)\r\n : undefined;\r\n const priority = sortPriorityForColumn(sortModel, col.fieldName);\r\n const showPriority = priority != null && sortModel.length > 1;\r\n\r\n return (\r\n <th\r\n key={col.fieldName}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n aria-sort={ariaSort}\r\n style={{...col.style, ...size, ...pin.style}}\r\n className={`relative px-2 text-xs border text-start min-w-36 ${pin.className} ${col.className || \"\"}`}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n data-erp-col-drag={col.fieldName}\r\n data-erp-col-drop={dropField === col.fieldName ? col.fieldName : undefined}\r\n data-pdg-sortable={sortable ? 'true' : undefined}\r\n data-pdg-filterable={filterable ? 'true' : undefined}\r\n data-pdg-filter-active={filterActive ? 'true' : undefined}\r\n data-pdg-filter-custom={\r\n filterUi?.mode === 'custom' ? filterUi.name : undefined\r\n }\r\n data-pdg-sort-move-px={HEADER_SORT_CLICK_MAX_MOVE_PX}\r\n draggable\r\n onPointerDown={markPointerOrigin}\r\n onPointerMove={trackPointerMove}\r\n onClick={(e) => commitHeaderSort(e, col.fieldName, sortable)}\r\n onDragStart={(e) => beginColumnDrag(e, col.fieldName)}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = \"move\";\r\n hoverColumnDrop(col.fieldName);\r\n }}\r\n onDragLeave={(e) => {\r\n leaveColumnDrop(\r\n col.fieldName,\r\n e.currentTarget,\r\n e.relatedTarget,\r\n );\r\n }}\r\n onDrop={(e) => {\r\n e.preventDefault();\r\n dropColumn(col.fieldName);\r\n }}\r\n onDragEnd={endColumnDrag}\r\n >\r\n <div className=\"pdg-header-label\">\r\n <span className=\"pdg-header-caption\">{col.fieldCaption}</span>\r\n {sortable ? (\r\n <span className=\"pdg-sort-indicator\" aria-hidden>\r\n {ariaSort === 'ascending' ? (\r\n <span className=\"pdg-sort-icon pdg-sort-icon--asc\">▲</span>\r\n ) : null}\r\n {ariaSort === 'descending' ? (\r\n <span className=\"pdg-sort-icon pdg-sort-icon--desc\">▼</span>\r\n ) : null}\r\n {showPriority ? (\r\n <span className=\"pdg-sort-priority\">{priority}</span>\r\n ) : null}\r\n </span>\r\n ) : null}\r\n {filterable ? (\r\n <button\r\n type=\"button\"\r\n className={`pdg-filter-btn-icon${filterActive ? ' is-active' : ''}`}\r\n data-pdg-filter-btn={col.fieldName}\r\n data-pdg-no-sort\r\n aria-label={t('general.filter')}\r\n aria-expanded={openFilterCol === col.fieldName}\r\n title={filterActive ? t('general.filterActive') : t('general.filter')}\r\n ref={(el) => {\r\n filterBtnRefs.current[col.fieldName] = el;\r\n }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpenMenuCol(null);\r\n setOpenFilterCol((cur) =>\r\n cur === col.fieldName ? null : col.fieldName,\r\n );\r\n }}\r\n >\r\n ▽\r\n </button>\r\n ) : null}\r\n <button\r\n type=\"button\"\r\n className=\"pdg-col-menu-btn\"\r\n data-pdg-col-menu-btn={col.fieldName}\r\n data-pdg-no-sort\r\n aria-label={t('columnMenu.open')}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={openMenuCol === col.fieldName}\r\n title={t('columnMenu.open')}\r\n ref={(el) => {\r\n menuBtnRefs.current[col.fieldName] = el;\r\n if (openColumnsPanel && openMenuCol === col.fieldName) {\r\n columnsPanelAnchorRef.current = el;\r\n }\r\n }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpenFilterCol(null);\r\n setOpenColumnsPanel(false);\r\n setOpenMenuCol((cur) =>\r\n cur === col.fieldName ? null : col.fieldName,\r\n );\r\n }}\r\n >\r\n ⋮\r\n </button>\r\n </div>\r\n {openMenuCol === col.fieldName ? (\r\n <ColumnMenuPopover\r\n column={col}\r\n controller={controller}\r\n sortModel={sortModel}\r\n filterModel={filterModel}\r\n itemsConfig={columnMenuItems}\r\n onCustomAction={onColumnMenuAction}\r\n open\r\n onOpenChange={(next) => {\r\n if (!next) setOpenMenuCol(null);\r\n }}\r\n anchorRef={{\r\n get current() {\r\n return menuBtnRefs.current[col.fieldName] ?? null;\r\n },\r\n }}\r\n onOpenFilter={() => {\r\n setOpenMenuCol(null);\r\n setOpenFilterCol(col.fieldName);\r\n }}\r\n onOpenColumnsPanel={() => {\r\n columnsPanelAnchorRef.current =\r\n menuBtnRefs.current[col.fieldName] ?? null;\r\n setOpenMenuCol(null);\r\n setOpenColumnsPanel(true);\r\n }}\r\n />\r\n ) : null}\r\n {filterable && filterUi && openFilterCol === col.fieldName ? (\r\n <ColumnFilterPopover\r\n column={col}\r\n kind={filterUi.mode === 'builtin' ? filterUi.kind : undefined}\r\n customName={\r\n filterUi.mode === 'custom' ? filterUi.name : undefined\r\n }\r\n customParams={\r\n filterUi.mode === 'custom' ? filterUi.params : undefined\r\n }\r\n customComponent={customFilter}\r\n filterModel={filterModel}\r\n controller={controller}\r\n open\r\n onOpenChange={(next) => {\r\n if (!next) setOpenFilterCol(null);\r\n }}\r\n anchorRef={{\r\n get current() {\r\n return filterBtnRefs.current[col.fieldName] ?? null;\r\n },\r\n }}\r\n />\r\n ) : null}\r\n {handle}\r\n </th>\r\n );\r\n };\r\n\r\n const renderFloatingFilterColumn = (col: ColumnSchema, index: number) => {\r\n const size = columnSizeStyle(col, table.columnWidths, colWindow.layoutWidths);\r\n const ui = isColumnFilterableInGrid(col, pagedWindow) ? resolveFilterUi(col) : null;\r\n if (isIndexColumn(col) || !ui || ui.mode !== 'builtin') {\r\n return (\r\n <th\r\n key={`ff-${col.fieldName}`}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n style={size}\r\n className={`pdg-floating-filter-cell ${columnPinClassName(col)}`}\r\n />\r\n );\r\n }\r\n return (\r\n <th\r\n key={`ff-${col.fieldName}`}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n style={size}\r\n className={`pdg-floating-filter-cell ${columnPinClassName(col)}`}\r\n >\r\n <input\r\n className=\"pdg-floating-filter-input\"\r\n data-pdg-floating-filter-input={col.fieldName}\r\n data-pdg-filter-kind={ui.kind}\r\n aria-label={`${t('general.filter')} ${col.fieldCaption}`}\r\n value={floatingFilterValue(filterModel, col.fieldName)}\r\n onChange={(e) => {\r\n controller.setFilterModel(\r\n applyFloatingFilter(filterModel, col, e.target.value),\r\n );\r\n }}\r\n />\r\n </th>\r\n );\r\n };\r\n\r\n const beginColumnDrag = (\r\n e: React.DragEvent<HTMLTableCellElement>,\r\n fieldName: string,\r\n ) => {\r\n suppressSortClickRef.current = true;\r\n draggedFieldRef.current = fieldName;\r\n e.dataTransfer.setData(\"text/plain\", fieldName);\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n\r\n const hoverColumnDrop = (fieldName: string) => {\r\n setDropField((current) => (current === fieldName ? current : fieldName));\r\n };\r\n\r\n const leaveColumnDrop = (\r\n fieldName: string,\r\n currentTarget: HTMLElement,\r\n relatedTarget: EventTarget | null,\r\n ) => {\r\n if (relatedTarget instanceof Node && currentTarget.contains(relatedTarget)) {\r\n return;\r\n }\r\n setDropField((current) => (current === fieldName ? null : current));\r\n };\r\n\r\n const dropColumn = (destField: string) => {\r\n const sourceField = draggedFieldRef.current;\r\n const sourceGroup = draggedGroupRef.current;\r\n draggedFieldRef.current = null;\r\n draggedGroupRef.current = null;\r\n setDropField(null);\r\n if (sourceGroup) {\r\n const move = resolveGroupBlockReorder(displayColumns, sourceGroup, destField);\r\n if (!move) return;\r\n void controller.dispatch({\r\n type: \"COLUMN_REORDERED\",\r\n sourceIndex: move.sourceIndex,\r\n destIndex: move.destIndex,\r\n });\r\n return;\r\n }\r\n if (!sourceField) return;\r\n const move = resolveColumnReorder(displayColumns, sourceField, destField);\r\n if (!move) return;\r\n void controller.dispatch({\r\n type: \"COLUMN_REORDERED\",\r\n sourceIndex: move.sourceIndex,\r\n destIndex: move.destIndex,\r\n });\r\n };\r\n\r\n const endColumnDrag = () => {\r\n draggedFieldRef.current = null;\r\n draggedGroupRef.current = null;\r\n setDropField(null);\r\n };\r\n\r\n const markPointerOrigin = (e: React.PointerEvent<HTMLTableCellElement>) => {\r\n if (e.button !== 0) return;\r\n pointerOriginRef.current = { x: e.clientX, y: e.clientY };\r\n suppressSortClickRef.current = false;\r\n };\r\n\r\n const trackPointerMove = (e: React.PointerEvent<HTMLTableCellElement>) => {\r\n const origin = pointerOriginRef.current;\r\n if (!origin) return;\r\n const movedPx = Math.hypot(e.clientX - origin.x, e.clientY - origin.y);\r\n if (!shouldCommitHeaderSortClick(movedPx)) {\r\n suppressSortClickRef.current = true;\r\n }\r\n };\r\n\r\n const commitHeaderSort = (\r\n e: React.MouseEvent<HTMLTableCellElement>,\r\n fieldName: string,\r\n sortable: boolean,\r\n ) => {\r\n if (!sortable) return;\r\n if (isInteractiveHeaderTarget(e.target)) return;\r\n if (suppressSortClickRef.current) return;\r\n const origin = pointerOriginRef.current;\r\n if (origin) {\r\n const movedPx = Math.hypot(e.clientX - origin.x, e.clientY - origin.y);\r\n if (!shouldCommitHeaderSortClick(movedPx)) return;\r\n }\r\n const next = cycleSortModel(sortModel, fieldName, { multi: e.shiftKey });\r\n controller.setSortModel(next);\r\n };\r\n\r\n return (\r\n <thead className=\"top-0 z-20 sticky\" role=\"rowgroup\" data-pdg-dir={direction}>\r\n {header}\r\n {!validationResult.valid && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"top-1 z-10 absolute flex m-0 p-0 rounded start-1\"\r\n items={items}\r\n >\r\n <span className=\"bg-red-600 border rounded-full w-2 h-2\"></span>\r\n </CustomDropdownButton>\r\n )}\r\n <ColumnGroupHeaderRows\r\n allVisible={visibleColumns}\r\n colWindow={colWindow}\r\n columnWidths={table.columnWidths}\r\n collapsedGroups={collapsedGroups}\r\n onToggleGroup={(groupId) => controller.toggleColumnGroup(groupId)}\r\n onGroupDragStart={(groupId) => {\r\n draggedGroupRef.current = groupId;\r\n }}\r\n />\r\n <tr\r\n role=\"row\"\r\n aria-rowindex={ARIA_HEADER_ROW_INDEX + groupDepth}\r\n style={{gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`}}\r\n className={`relative h-10 bg-gray-gray3 rounded-t-lg w-full `}\r\n data-pdg-header-cols={\r\n colWindow.pinnedStart.length +\r\n colWindow.mountedScrollableCount +\r\n colWindow.pinnedEnd.length\r\n }\r\n >\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"th\"\r\n spacerRole=\"columnheader\"\r\n renderColumn={renderHeaderColumn}\r\n />\r\n </tr>\r\n <ColumnsPanelPopover\r\n columns={displayColumns}\r\n controller={controller}\r\n open={openColumnsPanel}\r\n onOpenChange={setOpenColumnsPanel}\r\n anchorRef={columnsPanelAnchorRef}\r\n />\r\n {floatingFilter ? (\r\n <tr\r\n role=\"row\"\r\n className=\"pdg-floating-filter-row\"\r\n data-pdg-floating-filter=\"true\"\r\n >\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"th\"\r\n spacerRole=\"columnheader\"\r\n renderColumn={renderFloatingFilterColumn}\r\n />\r\n </tr>\r\n ) : null}\r\n </thead>\r\n );\r\n}\r\n","/**\r\n * Pinned top/bottom host rows (PR-116). Pure — no React/DOM.\r\n * Display-only; not part of the UI row index / sort / filter / selection.\r\n */\r\n\r\nimport type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport { isIndexColumn } from '../columnWidth';\r\n\r\n/** Read a display value from a host pinned row object. */\r\nexport function readPinnedRowCellValue(\r\n row: unknown,\r\n column: ColumnSchema,\r\n): unknown {\r\n if (isIndexColumn(column)) return null;\r\n if (row == null || typeof row !== 'object') return null;\r\n const field = column.fieldName;\r\n if (field in (row as Record<string, unknown>)) {\r\n return (row as Record<string, unknown>)[field];\r\n }\r\n return null;\r\n}\r\n\r\nexport function countPinnedRows(\r\n top: readonly unknown[] | null | undefined,\r\n bottom: readonly unknown[] | null | undefined,\r\n): { top: number; bottom: number } {\r\n return {\r\n top: top?.length ?? 0,\r\n bottom: bottom?.length ?? 0,\r\n };\r\n}\r\n","/**\r\n * Pinned top/bottom rows (PR-116). Rendered outside the virtual window so\r\n * they stay fixed while the scroll body moves.\r\n */\r\n\r\nimport React from 'react';\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\nimport { columnSizeStyle } from '../../engine/columnWidth';\r\nimport { readPinnedRowCellValue } from '../../engine/dataOps/pinnedRows';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport {\r\n ariaColIndex,\r\n ariaPinnedBottomRowIndex,\r\n ariaPinnedTopRowIndex,\r\n} from '../a11y/gridRoles';\r\nimport { columnPinCellProps } from '../columnPin';\r\nimport { valueParser } from '../helper';\r\nimport { useLocale, type ERPTableLocale } from '../host';\r\nimport { useColumnWindowOrAll } from '../virtual/columnWindow';\r\nimport { ColumnWindowCells } from '../virtual/ColumnWindowCells';\r\n\r\nexport type PinnedRowSide = 'top' | 'bottom';\r\n\r\ntype Props<TRow> = {\r\n side: PinnedRowSide;\r\n rows: readonly TRow[];\r\n controller: UITableController;\r\n /** Absolute data row count (for bottom aria indices). */\r\n dataRowCount: number;\r\n pinnedTopCount: number;\r\n};\r\n\r\nfunction PinnedRowCells<TRow>({\r\n row,\r\n columns,\r\n columnWidths,\r\n locale,\r\n}: {\r\n row: TRow;\r\n columns: ColumnSchema[];\r\n columnWidths: Record<string, number> | undefined;\r\n locale: ERPTableLocale;\r\n}) {\r\n const colWindow = useColumnWindowOrAll(columns, columnWidths);\r\n return (\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"td\"\r\n spacerRole=\"presentation\"\r\n renderColumn={(c, index) => {\r\n const pin = columnPinCellProps(\r\n c,\r\n colWindow.startPinOffsets,\r\n colWindow.endPinOffsets,\r\n );\r\n const raw = readPinnedRowCellValue(row, c);\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(index)}\r\n className={pin.className}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n style={{\r\n ...columnSizeStyle(c, columnWidths, colWindow.layoutWidths),\r\n ...pin.style,\r\n }}\r\n >\r\n {valueParser(raw, c.fieldType, locale)}\r\n </td>\r\n );\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport function ERPTablePinnedRows<TRow>({\r\n side,\r\n rows,\r\n controller,\r\n dataRowCount,\r\n pinnedTopCount,\r\n}: Props<TRow>) {\r\n const locale = useLocale();\r\n const view = controller.getViewState();\r\n if (!view || rows.length === 0) return null;\r\n\r\n const columns = view.columns ?? [];\r\n const isTop = side === 'top';\r\n const className = isTop\r\n ? 'erp-pinned-rows erp-pinned-rows--top'\r\n : 'erp-pinned-rows erp-pinned-rows--bottom';\r\n\r\n return (\r\n <tbody\r\n role=\"rowgroup\"\r\n className={className}\r\n data-erp-pinned-top={isTop ? '' : undefined}\r\n data-erp-pinned-bottom={isTop ? undefined : ''}\r\n >\r\n {rows.map((row, index) => {\r\n const ariaRowindex =\r\n side === 'top'\r\n ? ariaPinnedTopRowIndex(index)\r\n : ariaPinnedBottomRowIndex(index, dataRowCount, pinnedTopCount);\r\n return (\r\n <tr\r\n key={`pinned-${side}-${index}`}\r\n role=\"row\"\r\n aria-rowindex={ariaRowindex}\r\n data-erp-pinned-row={side}\r\n className=\"erp-pinned-row\"\r\n >\r\n <PinnedRowCells\r\n row={row}\r\n columns={columns}\r\n columnWidths={view.columnWidths}\r\n locale={locale}\r\n />\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n );\r\n}\r\n","// engine/equality.ts — shared equality helpers for selector subscriptions\r\n\r\nexport function shallowEqualArray(\r\n a: unknown[] | null | undefined,\r\n b: unknown[] | null | undefined,\r\n): boolean {\r\n if (a === b) return true;\r\n if (!a || !b || a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i += 1) {\r\n if (!Object.is(a[i], b[i])) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Structural compare for plain JSON-like snapshots (rows / view slices). */\r\nexport function structuralEqual(a: unknown, b: unknown): boolean {\r\n if (Object.is(a, b)) return true;\r\n if (a == null || b == null) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n try {\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import type { VisibleRange } from '../../domain/value-objects/Viewport';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport { SparseRowIndex } from '../../engine/SparseRowIndex';\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\n\r\nexport type VirtualWindowModel<T> = {\r\n readonly range: VisibleRange;\r\n readonly visibleItems: readonly T[];\r\n /** Absolute row indices matching visibleItems. */\r\n readonly absoluteIndices: readonly number[];\r\n readonly spacerTop: number;\r\n readonly spacerBottom: number;\r\n readonly totalHeight: number;\r\n};\r\n\r\n/**\r\n * Pure adapter helper: map items + viewport → render window.\r\n * No React / DOM — unit-testable in Node.\r\n */\r\nexport function buildVirtualWindow<T>(\r\n items: readonly T[],\r\n viewport: Viewport,\r\n): VirtualWindowModel<T> {\r\n const range = ViewportCalculator.calculate(items.length, viewport);\r\n const visibleItems = ViewportCalculator.projectRows(items, range);\r\n const absoluteIndices = ViewportCalculator.indices(range);\r\n return {\r\n range,\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop: range.startOffset,\r\n spacerBottom: range.endOffset,\r\n totalHeight: range.totalHeight,\r\n };\r\n}\r\n\r\n/** Same window as `buildVirtualWindow`, from SparseRowIndex.projectVisible (O(window)). */\r\nexport function buildVirtualWindowFromSparse<T>(\r\n index: SparseRowIndex<T>,\r\n viewport: Viewport,\r\n): VirtualWindowModel<T> {\r\n const range = ViewportCalculator.calculate(index.size, viewport);\r\n const visibleItems = index.projectVisible(range);\r\n const absoluteIndices = ViewportCalculator.indices(range);\r\n return {\r\n range,\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop: range.startOffset,\r\n spacerBottom: range.endOffset,\r\n totalHeight: range.totalHeight,\r\n };\r\n}\r\n\r\nexport function isSparseRowIndex<T>(\r\n value: readonly T[] | SparseRowIndex<T>,\r\n): value is SparseRowIndex<T> {\r\n return value instanceof SparseRowIndex;\r\n}\r\n\r\nexport function buildVirtualWindowFromSource<T>(\r\n items: readonly T[] | SparseRowIndex<T>,\r\n viewport: Viewport,\r\n): VirtualWindowModel<T> {\r\n return isSparseRowIndex(items)\r\n ? buildVirtualWindowFromSparse(items, viewport)\r\n : buildVirtualWindow(items, viewport);\r\n}\r\n\r\nexport function viewportFromScroll(params: {\r\n scrollOffset: number;\r\n viewportSize: number;\r\n rowHeight: number;\r\n overscan?: number;\r\n}): Viewport {\r\n return new Viewport(\r\n Math.max(0, params.scrollOffset),\r\n params.viewportSize,\r\n params.rowHeight,\r\n params.overscan ?? 2,\r\n );\r\n}\r\n\r\n/** Debounce-friendly equality for visible window identity. */\r\nexport function virtualWindowKey(range: VisibleRange): string {\r\n return `${range.startIndex}:${range.endIndex}:${range.totalHeight}`;\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport { structuralEqual } from '../../engine/equality';\r\nimport {\r\n buildVirtualWindowFromSource,\r\n isSparseRowIndex,\r\n type VirtualWindowModel,\r\n virtualWindowKey,\r\n} from './virtualWindow';\r\nimport type { SparseRowIndex } from '../../engine/SparseRowIndex';\r\n\r\nexport type UseVirtualWindowResult<T> = VirtualWindowModel<T> & {\r\n readonly onScroll: (scrollTop: number, clientHeight?: number) => void;\r\n};\r\n\r\n/**\r\n * Syncs GridSession viewport with a scrollable container and returns\r\n * only the visible item window for rendering.\r\n */\r\nexport function useVirtualWindow<T>(\r\n session: GridSession | null | undefined,\r\n items: readonly T[] | SparseRowIndex<T>,\r\n options?: {\r\n rowHeight?: number;\r\n overscan?: number;\r\n initialViewportSize?: number;\r\n },\r\n): UseVirtualWindowResult<T> {\r\n const rowHeight = options?.rowHeight ?? 40;\r\n const overscan = options?.overscan ?? 2;\r\n const initialViewportSize = options?.initialViewportSize ?? 400;\r\n\r\n const [windowModel, setWindowModel] = useState<VirtualWindowModel<T>>(() =>\r\n buildVirtualWindowFromSource(\r\n items,\r\n session?.getViewport() ??\r\n new Viewport(0, initialViewportSize, rowHeight, overscan),\r\n ),\r\n );\r\n\r\n useEffect(() => {\r\n if (!session) {\r\n setWindowModel(\r\n buildVirtualWindowFromSource(\r\n items,\r\n new Viewport(0, initialViewportSize, rowHeight, overscan),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n const sync = () => {\r\n const next = buildVirtualWindowFromSource(items, session.getViewport());\r\n setWindowModel((prev) =>\r\n virtualWindowKey(prev.range) === virtualWindowKey(next.range) &&\r\n prev.visibleItems.length === next.visibleItems.length &&\r\n prev.visibleItems.every((item, i) => Object.is(item, next.visibleItems[i]))\r\n ? prev\r\n : next,\r\n );\r\n };\r\n\r\n sync();\r\n\r\n return session.subscribeSelected(\r\n () => {\r\n const vp = session.getViewport();\r\n const itemCount = isSparseRowIndex(items)\r\n ? session.getUiRowCount()\r\n : items.length;\r\n // Read after the count (that rebuilds a dirty index): a sort keeps the\r\n // count but changes the order.\r\n const indexRevision = isSparseRowIndex(items) ? items.revision : 0;\r\n return {\r\n scrollOffset: vp.scrollOffset,\r\n viewportSize: vp.viewportSize,\r\n rowHeight: vp.rowHeight,\r\n overscan: vp.overscan,\r\n itemCount,\r\n indexRevision,\r\n };\r\n },\r\n sync,\r\n structuralEqual,\r\n );\r\n }, [session, items, rowHeight, overscan, initialViewportSize]);\r\n\r\n const onScroll = (scrollTop: number, clientHeight?: number) => {\r\n if (!session) return;\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: Math.max(0, scrollTop),\r\n viewportSize: clientHeight,\r\n rowHeight,\r\n overscan,\r\n });\r\n };\r\n\r\n return {\r\n ...windowModel,\r\n onScroll,\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n type RefObject,\r\n useEffect,\r\n useRef,\r\n} from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { columnSizeStyle } from '../../engine/columnWidth';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { UIRow } from '../type';\r\nimport { columnPinCellProps } from '../columnPin';\r\nimport { useVirtualWindow } from '../virtual/useVirtualWindow';\r\nimport { useColumnWindowOrAll } from '../virtual/columnWindow';\r\nimport { ColumnWindowCells } from '../virtual/ColumnWindowCells';\r\nimport { ERPTableRow } from './eRPTableRow';\r\n\r\nconst ERPTableGroupRow = React.lazy(() =>\r\n import('./ERPTableGroupRow').then((m) => ({ default: m.ERPTableGroupRow })),\r\n);\r\n\r\nconst DEFAULT_ROW_HEIGHT = 40;\r\n\r\ntype Props = {\r\n controller: UITableController;\r\n session: GridSession;\r\n tableKey: string;\r\n scrollParentRef: RefObject<HTMLDivElement | null>;\r\n viewportHeight: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n moreDetailComponent?: React.ComponentType<{ data: unknown }>;\r\n /** Shifts aria-rowindex when pinned-top rows are present (PR-116). */\r\n pinnedTopCount?: number;\r\n};\r\n\r\n/**\r\n * Table-native virtual body: same ERPTableRow as pagination path,\r\n * but only the visible window (via GridSession viewport) is mounted.\r\n */\r\nexport function ERPTableVirtualBody({\r\n controller,\r\n session,\r\n tableKey,\r\n scrollParentRef,\r\n viewportHeight,\r\n rowHeight = DEFAULT_ROW_HEIGHT,\r\n overscan = 2,\r\n moreDetailComponent: MoreDetailComponent,\r\n pinnedTopCount = 0,\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const dragRowId = useRef<number | null>(null);\r\n const uiRowIndex = session.getEngine().getUiRowIndex();\r\n\r\n const {\r\n visibleItems: visibleIds,\r\n absoluteIndices,\r\n spacerTop,\r\n spacerBottom,\r\n onScroll,\r\n } = useVirtualWindow(session, uiRowIndex, {\r\n rowHeight,\r\n overscan,\r\n initialViewportSize: viewportHeight,\r\n });\r\n\r\n const visibleItems = visibleIds\r\n .map((id) => controller.getRowView(id))\r\n .filter((row): row is UIRow => row != null);\r\n\r\n useEffect(() => {\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: session.getViewport().scrollOffset,\r\n viewportSize: viewportHeight,\r\n rowHeight,\r\n overscan,\r\n });\r\n }, [session, viewportHeight, rowHeight, overscan]);\r\n\r\n useEffect(() => {\r\n const el = scrollParentRef.current;\r\n if (!el) return;\r\n\r\n const handleScroll = () => {\r\n onScroll(el.scrollTop, el.clientHeight);\r\n };\r\n\r\n el.addEventListener('scroll', handleScroll, { passive: true });\r\n return () => el.removeEventListener('scroll', handleScroll);\r\n }, [scrollParentRef, onScroll]);\r\n\r\n const colWindow = useColumnWindowOrAll(\r\n table?.columns ?? [],\r\n table?.columnWidths,\r\n );\r\n\r\n if (!table) return null;\r\n\r\n const spacerStyle = {\r\n height: 0,\r\n padding: 0,\r\n border: 'none',\r\n lineHeight: 0,\r\n } as const;\r\n\r\n const renderSpacer = (kind: 'top' | 'bottom', height: number) => {\r\n if (height <= 0) return null;\r\n return (\r\n <tr aria-hidden role=\"presentation\" data-erp-virtual-spacer={kind}>\r\n <ColumnWindowCells\r\n window={colWindow}\r\n spacerElement=\"td\"\r\n spacerRole=\"presentation\"\r\n spacerStyle={{ ...spacerStyle, height }}\r\n renderColumn={(c) => {\r\n const pin = columnPinCellProps(\r\n c,\r\n colWindow.startPinOffsets,\r\n colWindow.endPinOffsets,\r\n );\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"presentation\"\r\n className={pin.className}\r\n data-erp-col-pin={pin['data-erp-col-pin']}\r\n style={{\r\n ...spacerStyle,\r\n height,\r\n ...columnSizeStyle(c, table.columnWidths, colWindow.layoutWidths),\r\n ...pin.style,\r\n }}\r\n />\r\n );}}\r\n />\r\n </tr>\r\n );\r\n };\r\n\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\" data-erp-virtual-body role=\"rowgroup\">\r\n {renderSpacer('top', spacerTop)}\r\n\r\n <React.Suspense fallback={null}>\r\n {visibleItems.map((row, i) => {\r\n const absoluteIndex = absoluteIndices[i] ?? i;\r\n if (row.rowKind === 'group') {\r\n return (\r\n <ERPTableGroupRow\r\n key={row.id}\r\n row={row}\r\n index={absoluteIndex}\r\n pinnedTopCount={pinnedTopCount}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n />\r\n );\r\n }\r\n return (\r\n <ERPTableRow\r\n key={row.id}\r\n row={row}\r\n stripeIndex={absoluteIndex}\r\n index={absoluteIndex}\r\n pinnedTopCount={pinnedTopCount}\r\n table={table}\r\n controller={controller}\r\n tableKey={tableKey}\r\n draggedRowIdRef={dragRowId}\r\n moreDetailComponent={MoreDetailComponent}\r\n isSelected={!!table.selectedRows?.[row.id]}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n />\r\n );\r\n })}\r\n </React.Suspense>\r\n\r\n {renderSpacer('bottom', spacerBottom)}\r\n </tbody>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\n\r\nimport { CustomTooltip } from '../primitives';\r\n\r\ntype Props = {\r\n label: string;\r\n disabled?: boolean;\r\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\r\n children: React.ReactNode;\r\n className?: string;\r\n} & Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n 'children' | 'aria-label' | 'type' | 'disabled' | 'onClick' | 'className'\r\n>;\r\n\r\nexport function ToolbarIconButton({\r\n label,\r\n disabled,\r\n onClick,\r\n children,\r\n className,\r\n ...rest\r\n}: Props) {\r\n return (\r\n <CustomTooltip title={label}>\r\n <button\r\n type=\"button\"\r\n aria-label={label}\r\n disabled={disabled}\r\n className={`erp-toolbar-btn flex justify-center items-center p-1 border rounded ${\r\n disabled ? \"opacity-40\" : \"\"\r\n } ${className ?? \"\"}`}\r\n onClick={onClick}\r\n {...rest}\r\n >\r\n {children}\r\n </button>\r\n </CustomTooltip>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState } from 'react';\r\n\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\nimport { useDirection, useHostToast, useTranslations } from '../host';\r\nimport { PdfIcon, Spin, SpinIcon } from '../primitives';\r\n\r\nconst PDF_EXPORT_PLUGIN = 'pdf-export';\r\n\r\ntype Props = {\r\n pluginHost?: PluginHost;\r\n};\r\n\r\n/**\r\n * Desktop/mobile toolbar control. Renders only when PdfExportPlugin is registered.\r\n */\r\nexport function PdfExportToolbarButton({ pluginHost }: Props) {\r\n const t = useTranslations();\r\n const direction = useDirection();\r\n const { success, error } = useHostToast();\r\n const [busy, setBusy] = useState(false);\r\n\r\n if (!pluginHost?.has(PDF_EXPORT_PLUGIN)) return null;\r\n\r\n const handleExport = async () => {\r\n if (busy) return;\r\n setBusy(true);\r\n try {\r\n await pluginHost.requestExport({\r\n format: 'pdf',\r\n direction,\r\n fileName: `export-${new Date().toISOString().slice(0, 10)}.pdf`,\r\n });\r\n success(t('general.exportToPdfSuccess'));\r\n } catch {\r\n error(t('general.exportToPdfError'));\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n return (\r\n <ToolbarIconButton\r\n label={t('general.exportToPdf')}\r\n disabled={busy}\r\n data-erp-pdf-export=\"\"\r\n className={busy ? 'opacity-60 cursor-wait' : ''}\r\n onClick={() => {\r\n void handleExport();\r\n }}\r\n >\r\n {busy ? (\r\n <Spin\r\n size=\"small\"\r\n indicator={<SpinIcon config={{ width: 16, height: 16 }} />}\r\n />\r\n ) : (\r\n <PdfIcon config={{ width: 18, height: 18 }} />\r\n )}\r\n </ToolbarIconButton>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState } from 'react';\r\n\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\nimport { useHostToast, useTranslations } from '../host';\r\nimport { ExcelImport, Spin, SpinIcon } from '../primitives';\r\n\r\nconst EXCEL_IMPORT_PLUGIN = 'excel-import';\r\nconst XLSX_ACCEPT =\r\n '.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n\r\ntype Props = {\r\n pluginHost?: PluginHost;\r\n};\r\n\r\n/**\r\n * Desktop/mobile toolbar control. Renders only when ExcelImportPlugin is registered.\r\n */\r\nexport function ExcelImportToolbarButton({ pluginHost }: Props) {\r\n const t = useTranslations();\r\n const { success, error } = useHostToast();\r\n const [busy, setBusy] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n if (!pluginHost?.has(EXCEL_IMPORT_PLUGIN)) return null;\r\n\r\n const handleImport = async (file: File) => {\r\n if (busy) return;\r\n setBusy(true);\r\n try {\r\n await pluginHost.requestImport({ format: 'xlsx', data: file });\r\n success(t('general.importFromExcelSuccess'));\r\n } catch {\r\n error(t('general.importFromExcelError'));\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <ToolbarIconButton\r\n label={t('general.importFromExcel')}\r\n disabled={busy}\r\n data-erp-xlsx-import=\"\"\r\n className={busy ? 'opacity-60 cursor-wait' : ''}\r\n onClick={() => {\r\n inputRef.current?.click();\r\n }}\r\n >\r\n {busy ? (\r\n <Spin\r\n size=\"small\"\r\n indicator={<SpinIcon config={{ width: 16, height: 16 }} />}\r\n />\r\n ) : (\r\n <ExcelImport config={{ width: 18, height: 18 }} />\r\n )}\r\n </ToolbarIconButton>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n accept={XLSX_ACCEPT}\r\n hidden\r\n data-erp-xlsx-import-input=\"\"\r\n onChange={(event) => {\r\n const file = event.target.files?.[0];\r\n event.target.value = '';\r\n if (file) void handleImport(file);\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, {\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport { Select } from '../primitives';\r\nimport { useMediaQuery, useThemePortalStyle, useTranslations } from '../host';\r\nimport { LeftChevron, RightChevron } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useGridSearchState } from '../hooks/useEngineSelector';\r\nimport { findColumnMatches, navigateToMatch } from './utils';\r\n\r\nconst MOBILE_SEARCH_PANEL_HEIGHT = 220;\r\n\r\ninterface GridSearchPanelProps {\r\n controller: UITableController;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n anchorRef: React.RefObject<HTMLElement | null>;\r\n}\r\n\r\nexport function GridSearchPanel({\r\n controller,\r\n isOpen,\r\n onClose,\r\n anchorRef,\r\n}: GridSearchPanelProps) {\r\n const t = useTranslations();\r\n const { match: viewportMatch } = useMediaQuery('XLUP');\r\n const isMobile = viewportMatch === false;\r\n const searchState = useGridSearchState(controller);\r\n const [columnId, setColumnId] = useState('');\r\n const [query, setQuery] = useState('');\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const [position, setPosition] = useState({ top: 0, left: 0 });\r\n const panelRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const themeVars = useThemePortalStyle();\r\n\r\n const table = controller.getViewState();\r\n const columns = useMemo(\r\n () => (table?.columns ?? []).filter(col => !col.hidden && col.fieldName !== 'index'),\r\n [table?.columns],\r\n );\r\n\r\n const columnOptions = useMemo(\r\n () =>\r\n columns.map(col => ({\r\n value: col.fieldName,\r\n label: col.fieldCaption || col.fieldName,\r\n })),\r\n [columns],\r\n );\r\n\r\n const isCurrentSearch =\r\n hasSearched &&\r\n searchState?.columnId === columnId &&\r\n searchState?.query === query.trim();\r\n\r\n const totalMatches = isCurrentSearch ? searchState?.matches.length ?? 0 : 0;\r\n const currentMatchIndex = isCurrentSearch ? searchState?.currentIndex ?? -1 : -1;\r\n const canNavigate = totalMatches > 1;\r\n\r\n useEffect(() => {\r\n if (!columnId && columns.length > 0) {\r\n setColumnId(columns[0].fieldName);\r\n }\r\n }, [columns, columnId]);\r\n\r\n useLayoutEffect(() => {\r\n if (!isOpen || isMobile || !anchorRef.current) return;\r\n\r\n const updatePosition = () => {\r\n const rect = anchorRef.current!.getBoundingClientRect();\r\n setPosition({\r\n left: rect.left,\r\n top: rect.top - 8,\r\n });\r\n };\r\n\r\n updatePosition();\r\n window.addEventListener('resize', updatePosition);\r\n window.addEventListener('scroll', updatePosition, true);\r\n\r\n return () => {\r\n window.removeEventListener('resize', updatePosition);\r\n window.removeEventListener('scroll', updatePosition, true);\r\n };\r\n }, [isOpen, isMobile, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n inputRef.current?.focus();\r\n }\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (panelRef.current?.contains(target) || anchorRef.current?.contains(target)) {\r\n return;\r\n }\r\n onClose();\r\n };\r\n\r\n const timer = window.setTimeout(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n }, 0);\r\n\r\n return () => {\r\n window.clearTimeout(timer);\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isOpen, onClose, anchorRef]);\r\n\r\n const runSearch = async (startIndex = 0) => {\r\n const trimmedQuery = query.trim();\r\n if (!columnId || !trimmedQuery) return;\r\n\r\n // Page-window mode streams from IndexedDB (lazy module); otherwise the\r\n // in-memory QuickFilterIndex answers synchronously.\r\n const matches = controller.isPagedWindow?.()\r\n ? await (\r\n await import('./pagedSearch')\r\n ).findPagedColumnMatches(controller, columnId, trimmedQuery)\r\n : findColumnMatches(controller, columnId, trimmedQuery);\r\n setHasSearched(true);\r\n\r\n if (!matches.length) {\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: { columnId, query: trimmedQuery, matches: [], currentIndex: -1 },\r\n });\r\n return;\r\n }\r\n\r\n const index = Math.min(Math.max(startIndex, 0), matches.length - 1);\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: { columnId, query: trimmedQuery, matches, currentIndex: index },\r\n });\r\n await navigateToMatch(controller, matches[index]);\r\n };\r\n\r\n const goToMatch = async (direction: 1 | -1) => {\r\n if (!canNavigate || !searchState?.matches.length) return;\r\n\r\n const nextIndex =\r\n (searchState.currentIndex + direction + searchState.matches.length) %\r\n searchState.matches.length;\r\n const nextState = { ...searchState, currentIndex: nextIndex };\r\n await controller.dispatch({\r\n type: 'UI_SET_GRID_SEARCH',\r\n search: nextState,\r\n });\r\n await navigateToMatch(controller, nextState.matches[nextIndex]);\r\n };\r\n\r\n if (!isOpen || typeof document === 'undefined') return null;\r\n\r\n const resultSummary = !hasSearched\r\n ? ''\r\n : totalMatches > 0\r\n ? t('general.searchFound', { count: totalMatches })\r\n : t('general.searchNotFound');\r\n\r\n const positionSummary =\r\n totalMatches > 0 && currentMatchIndex >= 0\r\n ? t('general.searchPosition', {\r\n current: currentMatchIndex + 1,\r\n total: totalMatches,\r\n })\r\n : '';\r\n\r\n const panelContent = (\r\n <>\r\n <Select\r\n className=\"w-full\"\r\n value={columnId || undefined}\r\n options={columnOptions}\r\n placeholder={t('general.choice')}\r\n getPopupContainer={(trigger: HTMLElement) => trigger.parentElement ?? document.body}\r\n onChange={(value) => {\r\n setColumnId(String(value ?? ''));\r\n setHasSearched(false);\r\n }}\r\n />\r\n\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={query}\r\n placeholder={t('general.search')}\r\n className=\"px-3 py-2 border border-gray-gray5 rounded w-full text-sm outline-none focus:border-blue-blue6\"\r\n onChange={event => {\r\n setQuery(event.target.value);\r\n setHasSearched(false);\r\n }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n void runSearch(0);\r\n }\r\n }}\r\n />\r\n\r\n <div className=\"flex justify-between items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n className=\"flex-1 bg-blue-blue6 px-3 py-1.5 rounded text-white text-sm\"\r\n onClick={() => void runSearch(0)}\r\n >\r\n {t('general.search')}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n title={t('general.prev')}\r\n aria-label={t('general.prev')}\r\n className=\"erp-toolbar-btn flex justify-center items-center p-1.5 border border-gray-gray5 rounded disabled:opacity-40\"\r\n disabled={!canNavigate}\r\n onClick={() => void goToMatch(-1)}\r\n >\r\n <LeftChevron config={{ width: 16, height: 16 }} />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n title={t('general.next')}\r\n aria-label={t('general.next')}\r\n className=\"erp-toolbar-btn flex justify-center items-center p-1.5 border border-gray-gray5 rounded disabled:opacity-40\"\r\n disabled={!canNavigate}\r\n onClick={() => void goToMatch(1)}\r\n >\r\n <RightChevron config={{ width: 16, height: 16 }} />\r\n </button>\r\n </div>\r\n\r\n {resultSummary ? (\r\n <span className=\"text-gray-gray7 text-xs text-center\">{resultSummary}</span>\r\n ) : null}\r\n\r\n {positionSummary ? (\r\n <span className=\"text-blue-blue6 text-xs text-center font-medium\">{positionSummary}</span>\r\n ) : null}\r\n </>\r\n );\r\n\r\n if (isMobile) {\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n style={{\r\n ...themeVars,\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n width: '100%',\r\n height: MOBILE_SEARCH_PANEL_HEIGHT,\r\n zIndex: 9999,\r\n }}\r\n className=\"flex flex-col gap-2 bg-main-white shadow-lg px-3 py-3 border-b border-gray-gray5\"\r\n >\r\n {panelContent}\r\n </div>,\r\n document.body,\r\n );\r\n }\r\n\r\n return createPortal(\r\n <div\r\n ref={panelRef}\r\n style={{\r\n ...themeVars,\r\n position: 'fixed',\r\n left: position.left,\r\n top: position.top,\r\n transform: 'translateY(-100%)',\r\n zIndex: 9999,\r\n }}\r\n className=\"flex flex-col gap-2 bg-white shadow-lg p-3 border border-gray-gray5 rounded-lg min-w-[320px]\"\r\n >\r\n {panelContent}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useRef, useState } from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport { Magnifier } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\nimport { GridSearchPanel } from './GridSearchPanel';\r\n\r\ninterface GridSearchControlProps {\r\n controller: UITableController;\r\n}\r\n\r\nexport function GridSearchControl({ controller }: GridSearchControlProps) {\r\n const t = useTranslations();\r\n const [searchOpen, setSearchOpen] = useState(false);\r\n const searchAnchorRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleSearch = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n event.stopPropagation();\r\n setSearchOpen((prev) => {\r\n if (prev) {\r\n void controller.dispatch({ type: 'UI_CLEAR_GRID_SEARCH' });\r\n }\r\n return !prev;\r\n });\r\n };\r\n\r\n const closeSearch = () => {\r\n setSearchOpen(false);\r\n void controller.dispatch({ type: 'UI_CLEAR_GRID_SEARCH' });\r\n };\r\n\r\n return (\r\n <div className=\"relative\" ref={searchAnchorRef}>\r\n <ToolbarIconButton\r\n label={t(\"general.search\")}\r\n className={searchOpen ? \"bg-blue-blue11\" : \"\"}\r\n onClick={toggleSearch}\r\n >\r\n <Magnifier config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n <GridSearchPanel\r\n controller={controller}\r\n isOpen={searchOpen}\r\n anchorRef={searchAnchorRef}\r\n onClose={closeSearch}\r\n />\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nimport { useLocale, useTranslations } from '../host';\r\nimport { CustomCheckbox } from '../primitives';\r\n\r\nimport { valueParser } from '../helper';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ntype MultiSelectRow = Record<string, unknown>;\r\ntype MultiSelectRowId = string | number;\r\n\r\ninterface Props {\r\n rows: MultiSelectRow[];\r\n ListConfig: IMultiSelectConfig[\"ListConfig\"];\r\n selectedRows: Map<MultiSelectRowId, MultiSelectRow>;\r\n fieldKey: string;\r\n onToggleRow: (row: MultiSelectRow) => void;\r\n}\r\n\r\nexport function MultiSelectListBody({\r\n rows,\r\n ListConfig,\r\n selectedRows,\r\n fieldKey,\r\n onToggleRow,\r\n}: Props) {\r\n const locale = useLocale()\r\n const t = useTranslations()\r\n return (\r\n <tbody>\r\n {rows.map((row) => {\r\n const rawId = row[fieldKey];\r\n const id =\r\n typeof rawId === 'string' || typeof rawId === 'number' ? rawId : String(rawId);\r\n\r\n return (\r\n <tr key={String(id)} className=\"border h-10\">\r\n {ListConfig.filter((c) => c.hidden !== true).map((col, idx: number) => (\r\n <td key={idx} className=\"px-2 border text-xs\">\r\n {idx === 0 && (\r\n <CustomCheckbox\r\n checked={selectedRows.has(id)}\r\n onClick={() => onToggleRow(row)}\r\n />\r\n )}\r\n\r\n {valueParser(row[col.fieldName],col.fieldType)}\r\n </td>\r\n ))}\r\n </tr>\r\n );\r\n })}\r\n</tbody>\r\n\r\n );\r\n}\r\n ","import React from 'react';\r\n\r\nimport { CustomCheckbox } from '../primitives';\r\n\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ntype MultiSelectRow = Record<string, unknown>;\r\ntype MultiSelectRowId = string | number;\r\n\r\ninterface Props {\r\n ListConfig: IMultiSelectConfig[\"ListConfig\"];\r\n rows: MultiSelectRow[];\r\n fieldKey: string;\r\n selectedRows: Map<MultiSelectRowId, MultiSelectRow>;\r\n onToggleAll: () => void;\r\n}\r\n\r\nexport function MultiSelectListHeader({\r\n ListConfig,\r\n rows,\r\n fieldKey,\r\n selectedRows,\r\n onToggleAll,\r\n}: Props) {\r\n const isAllSelected =\r\n rows.length > 0 &&\r\n rows.every((r) => {\r\n const rawId = r[fieldKey];\r\n const id =\r\n typeof rawId === 'string' || typeof rawId === 'number'\r\n ? rawId\r\n : String(rawId);\r\n return selectedRows.has(id);\r\n });\r\n\r\n return (\r\n <thead className=\"top-0 z-20 sticky\">\r\n <tr className=\"bg-gray-gray3 h-10\">\r\n {ListConfig.filter((c) => c.hidden !== true).map((col, index) => (\r\n <th key={index} className=\"px-2 border text-xs text-start\">\r\n {col.fieldName == \"index\" ? (\r\n <CustomCheckbox checked={isAllSelected} onClick={onToggleAll} />\r\n ) : (\r\n <>{col.fieldCaption}</>\r\n )}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n );\r\n}\r\n","import React, {\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nimport { Pagination, CustomButton, InputText, LeftChevron, RightChevron } from '../primitives';\r\nimport {\r\n useDirection,\r\n useHostDependOn,\r\n useLocale,\r\n useRemoteQuery,\r\n useTranslations,\r\n} from '../host';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { MultiSelectListBody } from './body';\r\nimport { MultiSelectListHeader } from './header';\r\n\r\nfunction asRowId(value: unknown): string | number | undefined {\r\n return typeof value === 'string' || typeof value === 'number'\r\n ? value\r\n : undefined;\r\n}\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n multiSelectConfig: IMultiSelectConfig;\r\n handleCloseModal: () => void;\r\n}\r\n\r\nexport default function MultiselectList({\r\n multiSelectConfig,\r\n controller,\r\n handleCloseModal,\r\n}: Props) {\r\n const { dynamicValue, fieldKey, detailFieldKey, onAdd, ListConfig } =\r\n multiSelectConfig;\r\n const locale = useLocale();\r\n const direction = useDirection();\r\n const t = useTranslations();\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const [pageRecordCount, setPageRecordCount] = useState(8);\r\n const [selectedRows, setSelectedRows] = useState<\r\n Map<string | number, Record<string, unknown>>\r\n >(new Map());\r\n const [searchInput, setSearchInput] = useState(\"\");\r\n const [quickSearch, setQuickSearch] = useState(\"\");\r\n const { endpoint, repoViewId, dependOn, ...bodyRequest } = dynamicValue;\r\n const { dependencyBody, isReady } = useHostDependOn(dependOn, {\r\n enabled: Boolean(multiSelectConfig.dependOnFromHost),\r\n });\r\n const body = {\r\n ...bodyRequest,\r\n ...dependencyBody,\r\n PagingInfo: {\r\n PageRecordCount: pageRecordCount,\r\n PageNumber: pageNumber,\r\n },\r\n FullSearchPhrase: quickSearch,\r\n RepoViewId: repoViewId,\r\n };\r\n const existBody = Object.fromEntries(\r\n Object.entries(body).filter(([, value]) => value !== null),\r\n );\r\n const { data } = useRemoteQuery<Record<string, unknown>[]>({\r\n url: endpoint,\r\n body: existBody,\r\n skip: !isReady,\r\n });\r\n // const processedData = useProcessedData({\r\n // data: data?.Data,\r\n // columnsConfig: ListConfig,\r\n // locale,\r\n // });\r\n // console.log(processedData);\r\n const rows = useMemo(() => {\r\n return data?.Data ?? [];\r\n }, [data]);\r\n\r\n const toggleRow = (row: Record<string, unknown>) => {\r\n const id = asRowId(row[fieldKey]);\r\n if (id === undefined) return;\r\n setSelectedRows((prev) => {\r\n const newMap = new Map(prev);\r\n\r\n if (newMap.has(id)) {\r\n newMap.delete(id);\r\n } else {\r\n newMap.set(id, row);\r\n }\r\n\r\n return newMap;\r\n });\r\n };\r\n\r\n const toggleSelectAll = () => {\r\n const allSelected = rows.every((r: Record<string, unknown>) => {\r\n const id = asRowId(r[fieldKey]);\r\n return id !== undefined && selectedRows.has(id);\r\n });\r\n\r\n setSelectedRows((prev) => {\r\n const newMap = new Map(prev);\r\n\r\n if (allSelected) {\r\n rows.forEach((r: Record<string, unknown>) => {\r\n const id = asRowId(r[fieldKey]);\r\n if (id !== undefined) newMap.delete(id);\r\n });\r\n } else {\r\n rows.forEach((r: Record<string, unknown>) => {\r\n const id = asRowId(r[fieldKey]);\r\n if (id !== undefined) newMap.set(id, r);\r\n });\r\n }\r\n\r\n return newMap;\r\n });\r\n };\r\n\r\n const handleAdd = () => {\r\n const selected = Array.from(selectedRows.values());\r\n const rows = selected.map((row) =>\r\n Object.entries(row).map(([key, value]) => {\r\n const config = multiSelectConfig.ListConfig.find(\r\n (cfg) => cfg.fieldName === key,\r\n );\r\n return {\r\n key,\r\n value: config?.returnValue ? config.returnValue(row, key) : value,\r\n display: config?.returnDisplayValue\r\n ? config.returnDisplayValue(row, key)\r\n : value,\r\n };\r\n }),\r\n );\r\n controller.dispatch({ type: \"ADD_NEW_ROWS\", rows, detailFieldKey });\r\n onAdd?.(selected);\r\n handleCloseModal();\r\n };\r\n\r\n const handlePagination = (page: number) => {\r\n setPageNumber(page);\r\n };\r\n\r\n const handlePageSizeChange = (_page: number, size: number) => {\r\n setPageRecordCount(size);\r\n setPageNumber(1);\r\n };\r\n\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setQuickSearch(searchInput);\r\n setPageNumber(1);\r\n }, 808);\r\n\r\n return () => {\r\n clearTimeout(handler);\r\n };\r\n }, [searchInput]);\r\n return (\r\n <div className=\"flex flex-col justify-between gap-2 p-2 border !h-full\">\r\n <div className=\"flex flex-col gap-2\">\r\n <InputText\r\n value={searchInput}\r\n onChange={(e: { target: { value: string } }) => setSearchInput(e.target.value)}\r\n placeholder={t('general.search')}\r\n className=\" \"\r\n />\r\n <table className=\"w-full border-collapse\">\r\n <MultiSelectListHeader\r\n ListConfig={ListConfig}\r\n fieldKey={fieldKey}\r\n rows={rows}\r\n selectedRows={selectedRows}\r\n onToggleAll={toggleSelectAll}\r\n />\r\n\r\n <MultiSelectListBody\r\n rows={rows}\r\n fieldKey={fieldKey}\r\n ListConfig={ListConfig}\r\n selectedRows={selectedRows}\r\n onToggleRow={toggleRow}\r\n />\r\n </table>\r\n </div>\r\n\r\n <div className=\"flex justify-between items-center\">\r\n <CustomButton\r\n type=\"text\"\r\n className=\"bg-main-black dark:bg-main-white text-gray-gray3 dark:text-gray-gray7\"\r\n onClick={handleAdd}\r\n >\r\n {t('general.add')}\r\n </CustomButton>\r\n\r\n <Pagination\r\n prevIcon={\r\n <CustomButton className=\"m-0 p-0 rounded w-fit\">\r\n {direction === \"rtl\" ? <RightChevron /> : <LeftChevron />}\r\n </CustomButton>\r\n }\r\n nextIcon={\r\n <CustomButton className=\"m-0 p-0 w-fit\">\r\n {direction === \"rtl\" ? <LeftChevron /> : <RightChevron />}\r\n </CustomButton>\r\n }\r\n current={pageNumber}\r\n pageSize={pageRecordCount}\r\n total={data?.TotalCount ?? 0}\r\n onShowSizeChange={handlePageSizeChange}\r\n onChange={handlePagination}\r\n // hideOnSinglePage\r\n showTitle={false}\r\n className={`\r\n [&_.ant-pagination-item-active:hover]:!bg-main-black \r\n [&_.ant-pagination-item-active:hover]:!border-main-black \r\n [&_.ant-pagination-item-active]:!border-main-black \r\n [&_.ant-pagination-next_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-prev_.ant-btn:hover]:!border-main-black \r\n [&_.ant-pagination-item-active_a:hover]:!text-main-white \r\n [&_.ant-pagination-item-active_a]:!text-main-black\r\n`}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from 'react';\r\n\r\nimport { useERPTableHost, useTranslations } from '../host';\r\nimport { MoonIcon, SunIcon } from '../primitives';\r\nimport { isStockDarkTheme } from './resolveActiveTheme';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\n\r\nexport function ThemeToggleButton() {\r\n const t = useTranslations();\r\n const { themeToggle, themeLocked, theme, onToggleTheme } = useERPTableHost();\r\n if (!themeToggle || themeLocked || !onToggleTheme || !theme) return null;\r\n\r\n const isDark = isStockDarkTheme(theme);\r\n const label = isDark ? t('general.themeLight') : t('general.themeDark');\r\n\r\n return (\r\n <ToolbarIconButton\r\n label={label}\r\n data-erp-theme-toggle=\"\"\r\n aria-pressed={isDark}\r\n onClick={onToggleTheme}\r\n >\r\n {isDark ? (\r\n <SunIcon config={{ width: 18, height: 18 }} />\r\n ) : (\r\n <MoonIcon config={{ width: 18, height: 18 }} />\r\n )}\r\n </ToolbarIconButton>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\n\r\nimport {\r\n formatLocaleNumber,\r\n useDirection,\r\n useHostToast,\r\n useLocale,\r\n useNumberingSystem,\r\n useTranslations,\r\n} from '../host';\r\nimport {\r\n ClipboardCheck,\r\n ClipboardIcon,\r\n CustomModal,\r\n CutIcon,\r\n Excel,\r\n GuaranteeReceive,\r\n Layers,\r\n PlusIcon,\r\n Spin,\r\n SpinIcon,\r\n TrashBin,\r\n} from '../primitives';\r\n\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport { exportActiveCollectionToExcel } from '../../infrastructure/excel/exportActiveCollectionToExcel';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\nimport { PdfExportToolbarButton } from '../export/PdfExportToolbarButton';\r\nimport { ExcelImportToolbarButton } from '../export/ExcelImportToolbarButton';\r\nimport { GridSearchControl } from '../gridSearch/GridSearchControl';\r\nimport MultiselectList from '../multiSelectList';\r\nimport { ThemeToggleButton } from '../theme/ThemeToggleButton';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface GroupActionButtonsProps {\r\n controller: UITableController;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n pluginHost?: PluginHost;\r\n}\r\n\r\nexport const GroupActionButtons: React.FC<GroupActionButtonsProps> = ({\r\n controller,\r\n multiSelectConfig,\r\n pluginHost,\r\n}) => {\r\n const t = useTranslations();\r\n const direction = useDirection();\r\n const locale = useLocale();\r\n const numberingSystem = useNumberingSystem();\r\n const { success, error } = useHostToast();\r\n const [modalIsOpen, setModalIsOpen] = useState<boolean>(false);\r\n const [isExporting, setIsExporting] = useState(false);\r\n\r\n const selectedRows = controller.getSelectedRows();\r\n const count = selectedRows ? Object.keys(selectedRows).length : 0;\r\n const table = controller.getViewState();\r\n const tableAction = table?.action;\r\n\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: \"ADD_EMPTY_ROW\" });\r\n };\r\n\r\n const handleExportToExcel = async () => {\r\n if (isExporting) return;\r\n setIsExporting(true);\r\n try {\r\n await exportActiveCollectionToExcel(controller, {\r\n direction,\r\n rowHeaderLabel: t('general.row'),\r\n });\r\n success(t(\"general.exportToExcelSuccess\"));\r\n } catch {\r\n error(t(\"general.exportToExcelError\"));\r\n } finally {\r\n setIsExporting(false);\r\n }\r\n };\r\n\r\n // Toolbar \"toggle\" = select/deselect all rows (engine TOGGLE_SELECT_ALL_ROWS).\r\n const handleSelectAllRows = () => {\r\n controller.dispatch({ type: \"TOGGLE_ROW_SELECTED\" });\r\n };\r\n\r\n const handleChangeTableAction = (action: TableActions) => {\r\n controller.dispatch({ type: \"UI_ACTION_TABLE\", action });\r\n };\r\n\r\n const handleDeleteSelectedRows = () => {\r\n controller.dispatch({ type: \"UI_DELETE_SELECTED_ROW\" });\r\n };\r\n\r\n const canPaste =\r\n (tableAction == \"copy\" || tableAction == \"cut\") && count != 0;\r\n\r\n return (\r\n <div\r\n className=\"flex items-center gap-2 flex-1 justify-start\"\r\n role=\"toolbar\"\r\n aria-label={t(\"general.toolbar\")}\r\n >\r\n <ToolbarIconButton label={t(\"general.addNewRow\")} onClick={handleAddRow}>\r\n <PlusIcon config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.copy\")}\r\n disabled={count == 0}\r\n onClick={() => {\r\n handleChangeTableAction(\"copy\");\r\n }}\r\n >\r\n <GuaranteeReceive config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.cut\")}\r\n disabled={count == 0}\r\n onClick={() => {\r\n handleChangeTableAction(\"cut\");\r\n }}\r\n >\r\n <CutIcon config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.paste\")}\r\n disabled={!canPaste}\r\n onClick={() => {\r\n handleChangeTableAction(\"paste\");\r\n }}\r\n >\r\n <ClipboardIcon config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.delete\")}\r\n disabled={count == 0}\r\n onClick={handleDeleteSelectedRows}\r\n >\r\n <TrashBin config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n {multiSelectConfig && (\r\n <>\r\n <ToolbarIconButton\r\n label={t(\"general.chooseFromList\")}\r\n data-erp-multiselect=\"\"\r\n onClick={() => {\r\n setModalIsOpen(true);\r\n }}\r\n >\r\n <ClipboardCheck config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n <CustomModal\r\n contentClassName={\"!h-[480px]\"}\r\n width={ 720}\r\n headerName={t(\"general.chooseFromList\")}\r\n headerIcon={<ClipboardCheck config={{ width: 18, height: 18 }} />}\r\n closeModal={() => setModalIsOpen(false)}\r\n isModalOpen={modalIsOpen}\r\n content={\r\n <MultiselectList\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n handleCloseModal={() => { setModalIsOpen(false); }}\r\n />\r\n }\r\n />\r\n </>\r\n )}\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.toggle\")}\r\n onClick={handleSelectAllRows}\r\n >\r\n <Layers config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.exportToExcel\")}\r\n disabled={isExporting}\r\n className={isExporting ? \"opacity-60 cursor-wait\" : \"\"}\r\n onClick={() => {\r\n void handleExportToExcel();\r\n }}\r\n >\r\n {isExporting ? (\r\n <Spin\r\n size=\"small\"\r\n indicator={<SpinIcon config={{ width: 16, height: 16 }} />}\r\n />\r\n ) : (\r\n <Excel config={{ width: 18, height: 18 }} />\r\n )}\r\n </ToolbarIconButton>\r\n\r\n <ExcelImportToolbarButton pluginHost={pluginHost} />\r\n\r\n <PdfExportToolbarButton pluginHost={pluginHost} />\r\n\r\n <GridSearchControl controller={controller} />\r\n\r\n <ThemeToggleButton />\r\n\r\n <span className=\"px-2 text-black-black6 text-xs\">\r\n {t(\"general.selected\")}{' '}\r\n {formatLocaleNumber(count, { locale, numberingSystem })}\r\n </span>\r\n </div>\r\n );\r\n};\r\n","// ui/pagination.tsx\r\n\r\nimport { Pagination } from '../primitives';\r\nimport {\r\n formatLocaleNumber,\r\n useDirection,\r\n useLocale,\r\n useNumberingSystem,\r\n useTranslations,\r\n} from '../host';\r\nimport { LeftChevron, RightChevron } from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\ninterface Props {\r\n controller: UITableController;\r\n tableKey: string;\r\n store: string;\r\n}\r\n\r\nexport default function ERPTablePagination({\r\n controller,\r\n tableKey\r\n}: Props) {\r\n const table = controller.getViewState();\r\n const locale = useLocale();\r\n const numberingSystem = useNumberingSystem();\r\n const direction = useDirection();\r\n const t = useTranslations();\r\n if (!table) return null;\r\n const { page, pageSize, totalPages, totalRows } = table.pagination;\r\n const handlePageChange = (e: number) => {\r\n controller.dispatch({ type: \"CHANGE_PAGE\", page: e });\r\n };\r\n const handlePageSizeChange = (_page: number, pageSize: number) => {\r\n controller.dispatch({ type: \"CHANGE_PAGE_SIZE\", pageSize: pageSize });\r\n };\r\n const fmt = (n: number) =>\r\n formatLocaleNumber(n, { locale, numberingSystem, useGrouping: true });\r\n\r\n return (\r\n <div className=\"flex justify-center items-center gap-3 bg-main-white p-2 border-gray-gray5 border-t w-full\">\r\n <Pagination\r\n current={page}\r\n prevIcon={direction === \"rtl\" ? <RightChevron /> : <LeftChevron />}\r\n nextIcon={direction === \"rtl\" ? <LeftChevron /> : <RightChevron />}\r\n jumpNextIcon={<span>...</span>}\r\n jumpPrevIcon={<span>...</span>}\r\n pageSize={pageSize}\r\n total={totalRows}\r\n showSizeChanger={true}\r\n onShowSizeChange={handlePageSizeChange}\r\n pageSizeOptions={[\"9\", \"10\", \"20\", \"50\", \"100\"]}\r\n // hideOnSinglePage\r\n locale={{ items_per_page: \"\" }}\r\n showTotal={(total: number) => (\r\n <div className=\"flex items-center gap-1 h-full font-light text-gray-gray10 text-xs\">\r\n <span>{fmt(total)}</span>\r\n <span>{t('general.rowsIn')}</span>\r\n <span>{fmt(totalPages)}</span>\r\n <span>{t('general.page')}</span>\r\n </div>\r\n )}\r\n onChange={handlePageChange}\r\n direction={direction}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { GridSession } from '../../application/session/GridSession';\r\n\r\n/**\r\n * Desktop row virtualization (PR-97 / D17).\r\n * Default **on** when a `GridSession` is present.\r\n * Pass `virtualization={false}` for classic pagination chrome.\r\n * Without a session, virtualization stays off (no viewport).\r\n */\r\nexport function resolveDesktopVirtualization(\r\n virtualization: boolean | undefined,\r\n session: GridSession | null | undefined,\r\n): boolean {\r\n if (!session) return false;\r\n if (virtualization === false) return false;\r\n return true;\r\n}\r\n","import {\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useState,\r\n} from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\nconst DEFAULT_ROW_HEIGHT = 40;\r\nconst TABLE_HEADER_HEIGHT = 40;\r\nconst VIEWPORT_BOTTOM_GAP = 20;\r\nconst MIN_TABLE_HEIGHT = 240;\r\n\r\ntype UseERPTableLayoutOptions = {\r\n rootRef: RefObject<HTMLDivElement | null>;\r\n bodyRef: RefObject<HTMLDivElement | null>;\r\n controller: UITableController | null;\r\n tableHeight?: number;\r\n ready?: boolean;\r\n /** When false, skip CHANGE_PAGE_SIZE sync (virtual scroll mode). */\r\n syncPageSize?: boolean;\r\n rowHeight?: number;\r\n};\r\n\r\nexport function useERPTableLayout({\r\n rootRef,\r\n bodyRef,\r\n controller,\r\n tableHeight,\r\n ready = false,\r\n syncPageSize = true,\r\n rowHeight = DEFAULT_ROW_HEIGHT,\r\n}: UseERPTableLayoutOptions) {\r\n const [autoHeight, setAutoHeight] = useState<number | null>(null);\r\n\r\n const measureRootHeight = useCallback(() => {\r\n if (tableHeight != null) return;\r\n\r\n const root = rootRef.current;\r\n if (!root) return;\r\n\r\n const top = root.getBoundingClientRect().top;\r\n const available = window.innerHeight - top - VIEWPORT_BOTTOM_GAP;\r\n setAutoHeight(Math.max(MIN_TABLE_HEIGHT, Math.floor(available)));\r\n }, [tableHeight, rootRef]);\r\n\r\n useEffect(() => {\r\n if (!ready) return;\r\n if (tableHeight != null) return;\r\n\r\n const frame = requestAnimationFrame(measureRootHeight);\r\n window.addEventListener('resize', measureRootHeight);\r\n\r\n const parent = rootRef.current?.parentElement;\r\n const observer = parent ? new ResizeObserver(measureRootHeight) : null;\r\n if (parent && observer) {\r\n observer.observe(parent);\r\n }\r\n\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n window.removeEventListener('resize', measureRootHeight);\r\n observer?.disconnect();\r\n };\r\n }, [measureRootHeight, tableHeight, ready]);\r\n\r\n useEffect(() => {\r\n if (!syncPageSize) return;\r\n if (!controller) return;\r\n\r\n const syncPageSizeToHeight = (height: number) => {\r\n if (height < rowHeight * 2) return;\r\n\r\n const rowsArea = Math.max(0, height - TABLE_HEADER_HEIGHT);\r\n const pageSize = Math.max(3, Math.floor(rowsArea / rowHeight));\r\n const table = controller.getViewState();\r\n\r\n if (table && table.pagination.pageSize !== pageSize) {\r\n void controller.dispatch({ type: 'CHANGE_PAGE_SIZE', pageSize });\r\n }\r\n };\r\n\r\n if (tableHeight != null) {\r\n syncPageSizeToHeight(tableHeight);\r\n return;\r\n }\r\n\r\n if (!bodyRef.current) return;\r\n\r\n const updatePageSize = () => {\r\n syncPageSizeToHeight(bodyRef.current?.clientHeight ?? 0);\r\n };\r\n\r\n updatePageSize();\r\n const observer = new ResizeObserver(updatePageSize);\r\n observer.observe(bodyRef.current);\r\n\r\n return () => observer.disconnect();\r\n }, [controller, bodyRef, tableHeight, autoHeight, syncPageSize, rowHeight]);\r\n\r\n return {\r\n bodyHeight: tableHeight ?? autoHeight,\r\n };\r\n}\r\n","/**\r\n * Which full-body overlay to show (PR-103). Pure — no React.\r\n * `loading` wins over no-rows.\r\n */\r\nexport type GridOverlayKind = 'loading' | 'noRows' | null;\r\n\r\nexport function resolveGridOverlay(\r\n loading: boolean | undefined,\r\n rowCount: number,\r\n): GridOverlayKind {\r\n if (loading) return 'loading';\r\n if (rowCount <= 0) return 'noRows';\r\n return null;\r\n}\r\n","\"use client\";\r\n\r\nimport React, { type ReactNode } from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport { NoData, SpinIcon } from '../primitives';\r\nimport {\r\n resolveGridOverlay,\r\n type GridOverlayKind,\r\n} from './resolveGridOverlay';\r\n\r\nexport type GridOverlayContext = {\r\n loading: boolean;\r\n rowCount: number;\r\n kind: Exclude<GridOverlayKind, null>;\r\n};\r\n\r\nexport type GridOverlayComponent = (ctx: GridOverlayContext) => ReactNode;\r\n\r\nexport type GridOverlaysProps = {\r\n loading?: boolean;\r\n rowCount: number;\r\n loadingOverlayComponent?: GridOverlayComponent;\r\n noRowsOverlayComponent?: GridOverlayComponent;\r\n};\r\n\r\nfunction DefaultLoadingOverlay() {\r\n const t = useTranslations();\r\n return (\r\n <div className=\"pdg-overlay__panel\" data-pdg-overlay-default=\"loading\">\r\n <SpinIcon config={{ width: 28, height: 28 }} />\r\n <span>{t('general.loading')}</span>\r\n </div>\r\n );\r\n}\r\n\r\nfunction DefaultNoRowsOverlay() {\r\n const t = useTranslations();\r\n return (\r\n <div className=\"pdg-overlay__panel\" data-pdg-overlay-default=\"noRows\">\r\n <NoData config={{ width: 56, height: 56 }} />\r\n <span>{t('general.noData')}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Absolute layer over the scroll body: loading or empty (PR-103).\r\n */\r\nexport function GridOverlays({\r\n loading,\r\n rowCount,\r\n loadingOverlayComponent,\r\n noRowsOverlayComponent,\r\n}: GridOverlaysProps) {\r\n const kind = resolveGridOverlay(loading, rowCount);\r\n if (!kind) return null;\r\n\r\n const ctx: GridOverlayContext = {\r\n loading: Boolean(loading),\r\n rowCount,\r\n kind,\r\n };\r\n\r\n let body: ReactNode;\r\n if (kind === 'loading') {\r\n body = loadingOverlayComponent ? (\r\n loadingOverlayComponent(ctx)\r\n ) : (\r\n <DefaultLoadingOverlay />\r\n );\r\n } else {\r\n body = noRowsOverlayComponent ? (\r\n noRowsOverlayComponent(ctx)\r\n ) : (\r\n <DefaultNoRowsOverlay />\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"pdg-overlay\"\r\n data-pdg-overlay={kind}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-busy={kind === 'loading' ? true : undefined}\r\n >\r\n {body}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { ReactNode, useEffect, useRef } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { useScrollToSearchMatch } from '../hooks/useScrollToSearchMatch';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { useERPTableTheme } from '../host';\r\nimport { ariaGridRowCount, gridCellDomId } from '../a11y/gridRoles';\r\nimport { GridLiveRegion } from '../a11y/GridLiveRegion';\r\nimport { ERPTableBody } from './ERPTableBody';\r\nimport { ERPTableFooter } from './ERPTableFooter';\r\nimport type { FooterRowDef } from './ERPTableFooter';\r\nimport { ERPTableHeader } from './ERPTableHeader';\r\nimport { ERPTablePinnedRows } from './ERPTablePinnedRows';\r\nimport { ERPTableVirtualBody } from './ERPTableVirtualBody';\r\nimport { GroupActionButtons } from './groupActionButtons';\r\nimport ERPTablePagination from './pagination';\r\nimport { resolveDesktopVirtualization } from './resolveDesktopVirtualization';\r\nimport { useERPTableLayout } from './useERPTableLayout';\r\nimport { ColumnWindowProvider } from '../virtual/columnWindow';\r\nimport {\r\n GridOverlays,\r\n type GridOverlayComponent,\r\n} from '../overlays';\r\n\r\nexport interface DesktopTableProps<TRow = unknown> {\r\n controller: UITableController;\r\n tableKey: string;\r\n store: string;\r\n tableTitle?: ReactNode;\r\n header?: ReactNode;\r\n footer?: boolean | ReactNode;\r\n /** Multi-row aggregation footer (PR-119). Used when `footer={true}`. */\r\n footerRows?: readonly FooterRowDef[];\r\n tableHeight?: number;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n moreDetailComponent?: React.ComponentType<{ data: unknown }>;\r\n ready: boolean;\r\n /**\r\n * Desktop virtual scroll (GridSession viewport + visible window).\r\n * **On by default** when `session` is present (PR-97 / D17).\r\n * Pass `virtualization={false}` for classic pagination.\r\n * Pagination chrome is hidden while virtualization is on.\r\n */\r\n virtualization?: boolean;\r\n /** Used when virtualization is on (default). Ignored when `virtualization={false}`. */\r\n session?: GridSession;\r\n pluginHost?: PluginHost;\r\n /** Floating filter row under the header (PR-94). */\r\n floatingFilter?: boolean;\r\n /** Host-driven full-grid loading overlay (PR-103). */\r\n loading?: boolean;\r\n loadingOverlayComponent?: GridOverlayComponent;\r\n noRowsOverlayComponent?: GridOverlayComponent;\r\n /** Rows stuck under the header (PR-116). Not virtualized. */\r\n pinnedTopRowData?: readonly TRow[];\r\n /** Rows stuck above the footer (PR-116). Not virtualized. */\r\n pinnedBottomRowData?: readonly TRow[];\r\n}\r\n\r\nexport function DesktopTable<TRow = unknown>({\r\n controller,\r\n tableKey,\r\n store,\r\n tableTitle,\r\n header,\r\n footer,\r\n footerRows,\r\n tableHeight,\r\n multiSelectConfig,\r\n moreDetailComponent,\r\n ready,\r\n virtualization,\r\n session,\r\n pluginHost,\r\n floatingFilter = false,\r\n loading = false,\r\n loadingOverlayComponent,\r\n noRowsOverlayComponent,\r\n pinnedTopRowData,\r\n pinnedBottomRowData,\r\n}: DesktopTableProps<TRow>) {\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const bodyRef = useRef<HTMLDivElement>(null);\r\n // Page-window mode ('paged-idb') is pagination-driven: RAM holds one page.\r\n const useVirtual =\r\n !controller.isPagedWindow() &&\r\n resolveDesktopVirtualization(virtualization, session);\r\n const rowHeight = useERPTableTheme().params.rowHeight;\r\n\r\n const { bodyHeight } = useERPTableLayout({\r\n rootRef,\r\n bodyRef,\r\n controller,\r\n tableHeight,\r\n ready,\r\n syncPageSize: !useVirtual,\r\n rowHeight,\r\n });\r\n const resolvedBodyHeight = tableHeight ?? bodyHeight ?? 400;\r\n\r\n useScrollToSearchMatch(bodyRef, controller);\r\n\r\n const view = controller.getViewState();\r\n const colCount = (view?.columns ?? []).filter((c) => !c.hidden).length;\r\n const dataRowCount = useVirtual && session\r\n ? session.getUiRowCount()\r\n : view?.pagination.totalRows ?? 0;\r\n const pinnedTopCount = pinnedTopRowData?.length ?? 0;\r\n const pinnedBottomCount = pinnedBottomRowData?.length ?? 0;\r\n const hasFooter = Boolean(footer);\r\n const footerRowCount =\r\n typeof footer === 'boolean' && footer\r\n ? Math.max(1, footerRows?.length ?? 1)\r\n : hasFooter\r\n ? 1\r\n : 0;\r\n const activeDescendant = view?.activeCell\r\n ? gridCellDomId(tableKey, view.activeCell.rowId, view.activeCell.columnId)\r\n : undefined;\r\n /** Group rows use aria-expanded/aria-level — valid on treegrid, not grid (PR-123). */\r\n const isTreeGrid = Boolean(\r\n view?.rows?.some((r) => r.rowKind === 'group'),\r\n );\r\n\r\n useEffect(() => {\r\n const root = bodyRef.current;\r\n if (!root) return;\r\n const thead = root.querySelector('thead');\r\n const tfoot = root.querySelector('tfoot');\r\n if (thead) {\r\n root.style.setProperty(\r\n '--erp-pinned-top-offset',\r\n `${thead.getBoundingClientRect().height}px`,\r\n );\r\n }\r\n if (tfoot) {\r\n root.style.setProperty(\r\n '--erp-pinned-bottom-offset',\r\n `${tfoot.getBoundingClientRect().height}px`,\r\n );\r\n } else {\r\n root.style.setProperty('--erp-pinned-bottom-offset', '0px');\r\n }\r\n }, [floatingFilter, pinnedTopCount, pinnedBottomCount, hasFooter, view?.columns]);\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className=\"flex flex-col w-full h-full transition-all duration-200 erp-table-desktop\"\r\n >\r\n <GridLiveRegion controller={controller} />\r\n {tableTitle}\r\n <div\r\n ref={bodyRef}\r\n data-erp-table-scroll\r\n data-erp-table-key={tableKey}\r\n data-erp-virtualization={useVirtual ? 'on' : 'off'}\r\n className=\"overflow-auto [overflow-anchor:none] relative\"\r\n style={{\r\n height: resolvedBodyHeight ?? '100%',\r\n width: 'auto',\r\n overflowAnchor: 'none',\r\n }}\r\n >\r\n <GridOverlays\r\n loading={loading}\r\n rowCount={dataRowCount}\r\n loadingOverlayComponent={loadingOverlayComponent}\r\n noRowsOverlayComponent={noRowsOverlayComponent}\r\n />\r\n <table\r\n className=\"min-w-max w-full\"\r\n role={isTreeGrid ? 'treegrid' : 'grid'}\r\n tabIndex={0}\r\n aria-colcount={colCount || undefined}\r\n aria-rowcount={\r\n ariaGridRowCount(\r\n dataRowCount,\r\n footerRowCount,\r\n pinnedTopCount,\r\n pinnedBottomCount,\r\n ) || undefined\r\n }\r\n aria-activedescendant={activeDescendant}\r\n data-pdg-col-virt\r\n data-pdg-grid-focus=\"\"\r\n onFocus={(e) => {\r\n if (e.target !== e.currentTarget) return;\r\n if (controller.getActiveCell()) return;\r\n const firstRow = view?.rows?.find((r) => r.rowKind !== 'group');\r\n const firstCol = (view?.columns ?? []).find(\r\n (c) => !c.hidden && c.fieldType !== 'index' && c.fieldName !== 'index',\r\n );\r\n if (firstRow && firstCol) {\r\n void controller.dispatch({\r\n type: 'UI_ACTIVE_CELL',\r\n rowId: firstRow.id,\r\n columnId: firstCol.fieldName,\r\n });\r\n }\r\n }}\r\n >\r\n <ColumnWindowProvider\r\n scrollRef={bodyRef}\r\n columns={view?.columns ?? []}\r\n columnWidths={view?.columnWidths}\r\n onViewportWidthChange={(w) => controller.setLayoutViewportWidth(w)}\r\n >\r\n <ERPTableHeader\r\n controller={controller}\r\n tableKey={tableKey}\r\n header={header}\r\n floatingFilter={floatingFilter}\r\n />\r\n {pinnedTopCount > 0 && pinnedTopRowData ? (\r\n <ERPTablePinnedRows\r\n side=\"top\"\r\n rows={pinnedTopRowData}\r\n controller={controller}\r\n dataRowCount={dataRowCount}\r\n pinnedTopCount={pinnedTopCount}\r\n />\r\n ) : null}\r\n {useVirtual && session ? (\r\n <ERPTableVirtualBody\r\n controller={controller}\r\n session={session}\r\n tableKey={tableKey}\r\n scrollParentRef={bodyRef}\r\n viewportHeight={resolvedBodyHeight}\r\n rowHeight={rowHeight}\r\n moreDetailComponent={moreDetailComponent}\r\n pinnedTopCount={pinnedTopCount}\r\n />\r\n ) : (\r\n <ERPTableBody\r\n controller={controller}\r\n tableKey={tableKey}\r\n moreDetailComponent={moreDetailComponent}\r\n pinnedTopCount={pinnedTopCount}\r\n />\r\n )}\r\n {pinnedBottomCount > 0 && pinnedBottomRowData ? (\r\n <ERPTablePinnedRows\r\n side=\"bottom\"\r\n rows={pinnedBottomRowData}\r\n controller={controller}\r\n dataRowCount={dataRowCount}\r\n pinnedTopCount={pinnedTopCount}\r\n />\r\n ) : null}\r\n {footer && (\r\n <ERPTableFooter\r\n controller={controller}\r\n footer={footer}\r\n footerRows={footerRows}\r\n dataRowCount={dataRowCount}\r\n pinnedTopCount={pinnedTopCount}\r\n pinnedBottomCount={pinnedBottomCount}\r\n />\r\n )}\r\n </ColumnWindowProvider>\r\n </table>\r\n </div>\r\n <div className=\"flex justify-between items-center gap-3 w-full shrink-0 erp-table-desktop__toolbar\">\r\n <GroupActionButtons\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n pluginHost={pluginHost}\r\n />\r\n {!useVirtual ? (\r\n <ERPTablePagination\r\n controller={controller}\r\n store={store}\r\n tableKey={tableKey}\r\n />\r\n ) : (\r\n <div\r\n className=\"text-xs text-neutral-500 px-2\"\r\n data-erp-virtual-row-count\r\n >\r\n {session?.getUiRowCount() ?? 0} rows\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\n\r\nimport { useTranslations } from '../host';\r\nimport {\r\n CustomModal,\r\n ClipboardCheck,\r\n PlusIcon,\r\n TrashBin,\r\n} from '../primitives';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { ToolbarIconButton } from '../a11y/ToolbarIconButton';\r\nimport { PdfExportToolbarButton } from '../export/PdfExportToolbarButton';\r\nimport { ExcelImportToolbarButton } from '../export/ExcelImportToolbarButton';\r\nimport { GridSearchControl } from '../gridSearch/GridSearchControl';\r\nimport MultiselectList from '../multiSelectList';\r\nimport { ThemeToggleButton } from '../theme/ThemeToggleButton';\r\nimport { IMultiSelectConfig } from '../type';\r\n\r\ninterface MobileActionButtonsProps {\r\n controller: UITableController;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n pluginHost?: PluginHost;\r\n}\r\n\r\nexport function MobileActionButtons({\r\n controller,\r\n multiSelectConfig,\r\n pluginHost,\r\n}: MobileActionButtonsProps) {\r\n const t = useTranslations();\r\n const [modalIsOpen, setModalIsOpen] = useState(false);\r\n\r\n const selectedRows = controller.getSelectedRows();\r\n const count = selectedRows ? Object.keys(selectedRows).length : 0;\r\n const handleAddRow = () => {\r\n void controller.dispatch({ type: 'UI_OPEN_MOBILE_ADD' });\r\n };\r\n\r\n const handleDeleteSelectedRows = () => {\r\n controller.dispatch({ type: \"UI_DELETE_SELECTED_ROW\" });\r\n };\r\n\r\n return (\r\n <div\r\n className=\"flex items-center gap-2 justify-end\"\r\n role=\"toolbar\"\r\n aria-label={t(\"general.toolbar\")}\r\n >\r\n <ToolbarIconButton label={t(\"general.addNewRow\")} onClick={handleAddRow}>\r\n <PlusIcon config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n <ToolbarIconButton\r\n label={t(\"general.delete\")}\r\n disabled={count == 0}\r\n onClick={handleDeleteSelectedRows}\r\n >\r\n <TrashBin config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n\r\n {multiSelectConfig && (\r\n <>\r\n <ToolbarIconButton\r\n label={t(\"general.chooseFromList\")}\r\n data-erp-multiselect=\"\"\r\n onClick={() => setModalIsOpen(true)}\r\n >\r\n <ClipboardCheck config={{ width: 18, height: 18 }} />\r\n </ToolbarIconButton>\r\n <CustomModal\r\n contentClassName={\"w-[720px] !h-[480px]\"}\r\n headerName={t(\"general.chooseFromList\")}\r\n headerIcon={<ClipboardCheck config={{ width: 18, height: 18 }} />}\r\n closeModal={() => setModalIsOpen(false)}\r\n isModalOpen={modalIsOpen}\r\n content={\r\n <MultiselectList\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n handleCloseModal={() => setModalIsOpen(false)}\r\n />\r\n }\r\n />\r\n </>\r\n )}\r\n\r\n <ExcelImportToolbarButton pluginHost={pluginHost} />\r\n\r\n <PdfExportToolbarButton pluginHost={pluginHost} />\r\n\r\n <GridSearchControl controller={controller} />\r\n\r\n <ThemeToggleButton />\r\n\r\n <span className=\"px-2 text-black-black6 text-xs\">\r\n {t(\"general.selected\")} {count}\r\n </span>\r\n </div>\r\n );\r\n}\r\n","import { CustomButton } from '../primitives';\r\nimport {\r\n formatLocaleNumber,\r\n useLocale,\r\n useNumberingSystem,\r\n useTranslations,\r\n} from '../host';\r\n\r\ninterface Props {\r\n onClick: () => void;\r\n visibleCount: number;\r\n totalRows: number;\r\n}\r\n\r\nexport function MobileLoadMoreButton({\r\n onClick,\r\n visibleCount,\r\n totalRows,\r\n}: Props) {\r\n const t = useTranslations();\r\n const locale = useLocale();\r\n const numberingSystem = useNumberingSystem();\r\n const visible = formatLocaleNumber(visibleCount, {\r\n locale,\r\n numberingSystem,\r\n });\r\n const total = formatLocaleNumber(totalRows, { locale, numberingSystem });\r\n\r\n return (\r\n <div className=\"shrink-0 w-full py-3 border-gray-gray5 border-t bg-main-white\">\r\n <CustomButton\r\n htmlType=\"button\"\r\n type=\"default\"\r\n className=\"w-full h-10 text-sm\"\r\n onClick={onClick}\r\n >\r\n {t('general.loadMore', { visible, total })}\r\n </CustomButton>\r\n </div>\r\n );\r\n}\r\n","import { ColumnSchema } from \"../../bootstrap/type\";\r\nimport { UIRow } from \"../type\";\r\n\r\nexport function buildDynamicSourceForRow(\r\n dynamicSource: ColumnSchema[\"dynamicSource\"],\r\n row: UIRow,\r\n): ColumnSchema[\"dynamicSource\"] {\r\n if (!dynamicSource) return dynamicSource;\r\n\r\n const { dependsOn, dependOn, ...rest } = dynamicSource;\r\n\r\n if (dependOn) {\r\n return dynamicSource;\r\n }\r\n\r\n if (!dependsOn?.length) {\r\n return dynamicSource;\r\n }\r\n\r\n const deps = dependsOn.map((fieldName) => ({\r\n fieldName,\r\n value: row.cells[fieldName]?.value ?? null,\r\n }));\r\n\r\n return {\r\n ...rest,\r\n dependsOn,\r\n dependOn: deps.length === 1 ? deps[0] : deps,\r\n };\r\n}\r\n\r\nexport function resolveColumnMetaForRow(\r\n col: ColumnSchema,\r\n row: UIRow,\r\n): ColumnSchema {\r\n if (!col.dynamicSource) return col;\r\n\r\n return {\r\n ...col,\r\n dynamicSource: buildDynamicSourceForRow(col.dynamicSource, row),\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { useTranslations } from \"../host\";\r\nimport { CustomButton, CustomModal } from \"../primitives\";\r\n\r\nimport { ColumnSchema } from \"../../bootstrap/type\";\r\nimport { RowStateEnum } from \"../../domain/value-objects\";\r\nimport { UITableController } from \"../../infrastructure/ui/UITableController\";\r\nimport { CellRenderer } from \"../cellRenderer\";\r\nimport { resolveColumnMetaForRow } from \"./buildDynamicSource\";\r\nimport type { MobileRowEditorState } from \"./types\";\r\nimport { UIRow } from \"../type\";\r\n\r\ninterface MobileRowFormModalProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n editor: NonNullable<MobileRowEditorState>;\r\n onClose: () => void;\r\n}\r\n\r\nexport function MobileRowFormModal({\r\n controller,\r\n tableKey,\r\n editor,\r\n onClose,\r\n}: MobileRowFormModalProps) {\r\n const t = useTranslations();\r\n\r\n const getRowById = (): UIRow | null => {\r\n return controller.getRowView(editor.rowId);\r\n };\r\n\r\n const [row, setRow] = useState<UIRow | null>(getRowById);\r\n\r\n useEffect(() => {\r\n const syncRow = () => {\r\n setRow(getRowById());\r\n };\r\n\r\n syncRow();\r\n const unsubscribe = controller.subscribe(syncRow);\r\n return () => unsubscribe?.();\r\n }, [controller, editor.rowId]);\r\n\r\n const formColumns = useMemo(() => {\r\n const table = controller.getViewState();\r\n if (!table?.columns) return [];\r\n return table.columns.filter(\r\n (c) =>\r\n !c.hidden && c.fieldType !== \"index\" && c.fieldName !== \"index\",\r\n );\r\n }, [controller, row]);\r\n\r\n if (!row || row.rowState === RowStateEnum.Deleted) {\r\n return null;\r\n }\r\n\r\n const title =\r\n editor.mode === \"add\" ? t(\"general.addNewRow\") : t(\"general.rowEdit\");\r\n\r\n return (\r\n <CustomModal\r\n headerName={title}\r\n isModalOpen\r\n closeModal={onClose}\r\n content={\r\n <div className=\"relative w-full h-[calc(100dvh-150px)]\">\r\n <div className=\"flex flex-col gap-4 px-2 pb-24 w-full h-full overflow-y-auto\">\r\n {formColumns.map((col, idx) => {\r\n const disable =\r\n typeof row.visibilityCondition[col.fieldName] === \"boolean\" &&\r\n row.visibilityCondition[col.fieldName] === false;\r\n\r\n if (disable) return null;\r\n\r\n const meta: ColumnSchema = resolveColumnMetaForRow(\r\n {\r\n ...col,\r\n enableDeleteButton: col.enableDeleteButton ?? true,\r\n enableExpandButton: col.enableExpandButton ?? true,\r\n enableMoveButton: col.enableMoveButton ?? true,\r\n enableOptionsButton: col.enableOptionsButton ?? true,\r\n },\r\n row,\r\n );\r\n\r\n return (\r\n <div key={col.fieldName} className=\"flex flex-col gap-2\">\r\n {col.fieldType !== \"checkbox\" && (\r\n <span className=\"font-medium text-sm\">\r\n {col.fieldCaption}\r\n </span>\r\n )}\r\n <CellRenderer\r\n key={`${row.id}-${col.fieldName}`}\r\n idx={idx}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={col.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={-1}\r\n mode={col.editable === false ? \"view\" : \"form\"}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"bottom-0 fixed px-4 py-4 -end-4 start-0 topShadow\">\r\n <CustomButton\r\n type=\"text\"\r\n className=\"flex justify-center items-center !bg-black-black95 focus:!text-none rounded w-full h-[42px] text-white text-sm\"\r\n onClick={onClose}\r\n >\r\n {t(\"general.add\")}\r\n </CustomButton>\r\n </div>\r\n </div>\r\n }\r\n />\r\n );\r\n}\r\n","import {\r\n formatLocaleNumber,\r\n useLocale,\r\n useNumberingSystem,\r\n useTranslations,\r\n} from '../host';\r\nimport {\r\n CustomCheckbox,\r\n EditPencil,\r\n RedTrashBin,\r\n Undo,\r\n} from '../primitives';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\n\r\ninterface MobileIndexColProps {\r\n idx: number;\r\n row: UIRow;\r\n controller: UITableController;\r\n meta: ColumnSchema;\r\n}\r\n\r\nexport function MobileIndexCol({\r\n idx,\r\n row,\r\n controller,\r\n meta,\r\n}: MobileIndexColProps) {\r\n const t = useTranslations();\r\n const locale = useLocale();\r\n const numberingSystem = useNumberingSystem();\r\n\r\n const handleDeleteRow = () => {\r\n controller.dispatch({ type: \"ROW_DELETED\", rowId: row.id });\r\n };\r\n\r\n const handleSelectRow = (e: React.MouseEvent<HTMLInputElement>) => {\r\n if (!e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n controller.onRowSelect(row.id);\r\n }\r\n };\r\n\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n const isSelectedRow = controller.isSelectedRow(row.id);\r\n\r\n return (\r\n <div\r\n className={`${isDeleted && \"cursor-not-allowed\"} flex justify-between items-center w-full gap-2 px-2 h-full relative`}\r\n >\r\n <div className=\"flex justify-start items-center gap-2\">\r\n {!isDeleted && (\r\n <CustomCheckbox\r\n disabled={isDeleted}\r\n checked={!!isSelectedRow}\r\n onClick={handleSelectRow}\r\n aria-label={`${t(\"general.selectRow\")} ${idx + 1}`}\r\n />\r\n )}\r\n <div className=\"w-[20px] text-xs text-center\">\r\n {formatLocaleNumber(idx + 1, { locale, numberingSystem })}\r\n </div>\r\n\r\n {!isDeleted && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n void controller.dispatch({\r\n type: 'UI_OPEN_MOBILE_EDIT',\r\n rowId: row.id,\r\n });\r\n }}\r\n className=\"hover:bg-zinc-200\"\r\n aria-label={t(\"general.edit\")}\r\n >\r\n <EditPencil config={{ width: 16, height: 16 }} />\r\n </button>\r\n )}\r\n\r\n {meta.enableDeleteButton && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDeleteRow();\r\n }}\r\n className=\"hover:bg-red-100\"\r\n >\r\n {!isDeleted ? (\r\n <RedTrashBin config={{ width: 18, height: 18 }} />\r\n ) : (\r\n <Undo config={{ width: 18, height: 18 }} />\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useMemo } from 'react';\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { overlayStoredColumnWidth } from '../../engine/columnWidth';\r\nimport { RowStateEnum } from '../../domain/value-objects';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { ariaColIndex, ariaDataRowIndex, gridCellA11y } from '../a11y/gridRoles';\r\nimport { indexPinClassName, indexPinDataAttr } from '../columnPin';\r\nimport { CellRenderer } from '../cellRenderer';\r\nimport { UIRow } from '../type';\r\nimport { MobileIndexCol } from './MobileIndexCol';\r\n\r\ninterface MobileTableRowProps {\r\n row: UIRow;\r\n index: number;\r\n columns: ColumnSchema[];\r\n controller: UITableController;\r\n tableKey: string;\r\n isSelected: boolean;\r\n isActive: boolean;\r\n isCut: boolean;\r\n activeCell?: { rowId: number; columnId: string } | null;\r\n}\r\n\r\nfunction MobileTableRowComponent({\r\n row,\r\n index,\r\n columns,\r\n controller,\r\n tableKey,\r\n isSelected: isSelectedRow,\r\n isActive: isActiveRow,\r\n isCut,\r\n activeCell,\r\n}: MobileTableRowProps) {\r\n const columnWidths = controller.getViewState()?.columnWidths;\r\n const visibleColumns = columns.filter(\r\n (c: ColumnSchema) => !c.hidden,\r\n );\r\n const isDeleted = row.rowState === RowStateEnum.Deleted;\r\n\r\n const handleRowClick = (e: React.MouseEvent) => {\r\n controller.onRowClick(row.id, {\r\n ctrlKey: e.ctrlKey,\r\n shiftKey: e.shiftKey,\r\n });\r\n };\r\n\r\n const rowClass = useMemo(() => {\r\n return `relative w-full border bg-main-white\r\n ${isActiveRow ? \"border-gray-gray8\" : \"border-gray-gray5\"}\r\n ${isSelectedRow && !isDeleted ? \"bg-blue-100\" : \"\"}\r\n ${\r\n isDeleted\r\n ? \"!bg-gray-gray5 absolute inset-0 line-through\"\r\n : isSelectedRow\r\n ? \"\"\r\n : \"bg-main-white\"\r\n }\r\n ${isCut ? \" border-dashed opacity-30\" : \"\"}\r\n h-9 rounded`;\r\n }, [isActiveRow, isSelectedRow, isDeleted, isCut]);\r\n\r\n return (\r\n <tr\r\n role=\"row\"\r\n aria-rowindex={ariaDataRowIndex(index)}\r\n className={rowClass}\r\n data-rowid={row.id}\r\n onClick={handleRowClick}\r\n >\r\n {visibleColumns.map((c: ColumnSchema, idx: number) => {\r\n const meta: ColumnSchema = {\r\n ...c,\r\n enableDeleteButton: c.enableDeleteButton ?? true,\r\n enableExpandButton: c.enableExpandButton ?? true,\r\n enableMoveButton: c.enableMoveButton ?? true,\r\n enableOptionsButton: c.enableOptionsButton ?? true,\r\n };\r\n\r\n if (c.fieldName === \"index\") {\r\n return (\r\n <td\r\n className={`p-0 h-full ${indexPinClassName(c)}`}\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(idx)}\r\n {...gridCellA11y(tableKey, row.id, c.fieldName, activeCell)}\r\n data-columnid={c.fieldName}\r\n data-erp-col-pin={indexPinDataAttr(c)}\r\n style={overlayStoredColumnWidth(c, columnWidths, {})}\r\n >\r\n <MobileIndexCol\r\n idx={index}\r\n row={row}\r\n controller={controller}\r\n meta={meta}\r\n />\r\n </td>\r\n );\r\n }\r\n\r\n return (\r\n <td\r\n key={c.fieldName}\r\n role=\"gridcell\"\r\n aria-colindex={ariaColIndex(idx)}\r\n {...gridCellA11y(tableKey, row.id, c.fieldName, activeCell)}\r\n className=\"p-0 h-full\"\r\n data-columnid={c.fieldName}\r\n style={overlayStoredColumnWidth(c, columnWidths, {})}\r\n >\r\n <CellRenderer\r\n idx={idx}\r\n tableKey={tableKey}\r\n row={row}\r\n columnId={c.fieldName}\r\n meta={meta}\r\n controller={controller}\r\n tabIndex={-1}\r\n mode=\"view\"\r\n />\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n}\r\n\r\nexport const MobileTableRow = React.memo(\r\n MobileTableRowComponent,\r\n (prev, next) => {\r\n return (\r\n prev.row === next.row &&\r\n prev.index === next.index &&\r\n prev.columns === next.columns &&\r\n prev.isSelected === next.isSelected &&\r\n prev.isActive === next.isActive &&\r\n prev.isCut === next.isCut &&\r\n prev.activeCell?.rowId === next.activeCell?.rowId &&\r\n prev.activeCell?.columnId === next.activeCell?.columnId\r\n );\r\n },\r\n);\r\n","import { ColumnSchema } from '../../bootstrap/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { UIRow } from '../type';\r\nimport { MobileTableRow } from './MobileTableRow';\r\n\r\ninterface MobileTableBodyProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n rows: UIRow[];\r\n columns: ColumnSchema[];\r\n}\r\n\r\nexport function MobileTableBody({\r\n controller,\r\n tableKey,\r\n rows,\r\n columns,\r\n}: MobileTableBodyProps) {\r\n const activeCell = controller.getViewState()?.activeCell ?? null;\r\n return (\r\n <tbody className=\"w-full min-w-0 overflow-x-auto\" role=\"rowgroup\">\r\n {rows.map((row, index) => (\r\n <MobileTableRow\r\n key={row.id}\r\n row={row}\r\n index={index}\r\n columns={columns}\r\n controller={controller}\r\n tableKey={tableKey}\r\n isSelected={!!controller.isSelectedRow(row.id)}\r\n isActive={!!controller.isActiveRow(row.id)}\r\n isCut={!!controller.isCutRow(row.id)}\r\n activeCell={activeCell}\r\n />\r\n ))}\r\n </tbody>\r\n );\r\n}\r\n","import React, { ReactNode, useEffect, useState } from 'react';\r\n\r\nimport { CustomDropdownButton, CustomCheckbox } from '../primitives';\r\n\r\nimport { overlayStoredColumnWidth } from '../../engine/columnWidth';\r\nimport { ValidationCallbackResult } from '../../engine/type';\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useRevalidateRevision } from '../hooks/useRevalidateRevision';\r\nimport { revealRow } from '../gridSearch/utils';\r\nimport {\r\n ARIA_HEADER_ROW_INDEX,\r\n ariaColIndex,\r\n} from '../a11y/gridRoles';\r\nimport { useTranslations } from '../host';\r\nimport { indexPinClassName, indexPinDataAttr } from '../columnPin';\r\n\r\ninterface MobileTableHeaderProps {\r\n controller: UITableController;\r\n header?: ReactNode;\r\n}\r\n\r\nexport function MobileTableHeader({\r\n controller,\r\n header,\r\n}: MobileTableHeaderProps) {\r\n const t = useTranslations();\r\n const table = controller.getViewState();\r\n const [validationResult, setValidationResult] =\r\n useState<ValidationCallbackResult>({\r\n valid: true,\r\n data: null,\r\n errors: new Map(),\r\n });\r\n\r\n const validationRevision = useRevalidateRevision();\r\n\r\n useEffect(() => {\r\n const validation = controller.validation();\r\n validation((res) => {\r\n setValidationResult(res);\r\n });\r\n }, [\r\n controller,\r\n table?.activeCell?.columnId,\r\n table?.activeCell?.rowId,\r\n validationRevision,\r\n ]);\r\n\r\n if (!table || !table.columns) return null;\r\n\r\n const visibleColumns = table.columns.filter((c) => !c.hidden);\r\n const isSelectedActivePageRows = table.rows.every(\r\n (row) => !!table.selectedRows[row.id],\r\n );\r\n const handleSelectActivePageRows = () => {\r\n controller.dispatch({ type: \"TOGGLE_PAGE_ROW_SELECTED\" });\r\n };\r\n\r\n const allRows = controller.getAllRows() ?? [];\r\n const handleNavigateToError = (rowId: number) => {\r\n void revealRow(controller, rowId);\r\n };\r\n\r\n const items = Array.from((validationResult.errors ?? new Map()).entries()).map(\r\n ([key, value], errorIndex) => {\r\n const Index = allRows.findIndex((r) => r.id.value == value.rowId) + 1;\r\n\r\n return {\r\n key: errorIndex.toString(),\r\n label: (\r\n <button\r\n className=\"flex bg-red-300 text-red-600 text-xs\"\r\n onClick={() => {\r\n handleNavigateToError(value.rowId);\r\n }}\r\n >\r\n {`${t('general.validationInRow')} ${Index} ${t('general.validationInColumn')} ${value.caption} : ${value.message}`}\r\n </button>\r\n ),\r\n };\r\n },\r\n );\r\n\r\n return (\r\n <thead className=\"top-0 z-20 sticky\" role=\"rowgroup\">\r\n {header}\r\n {!validationResult.valid && (\r\n <CustomDropdownButton\r\n placement=\"bottom\"\r\n className=\"top-1 z-10 absolute flex m-0 p-0 rounded start-1\"\r\n items={items}\r\n >\r\n <span className=\"bg-red-600 border rounded-full w-2 h-2\"></span>\r\n </CustomDropdownButton>\r\n )}\r\n <tr\r\n role=\"row\"\r\n aria-rowindex={ARIA_HEADER_ROW_INDEX}\r\n className=\"relative h-10 bg-gray-gray3 rounded-t-lg w-full\"\r\n >\r\n {visibleColumns.map((col, index) => {\r\n if (col.fieldType === \"index\") {\r\n return (\r\n <th\r\n key={col.fieldName}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n style={{\r\n ...col.style,\r\n ...overlayStoredColumnWidth(col, table.columnWidths, { width: 120 }),\r\n }}\r\n className={`px-2 text-xs border text-start whitespace-nowrap ${indexPinClassName(col)} ${col.className || \"\"}`}\r\n data-erp-col-pin={indexPinDataAttr(col)}\r\n >\r\n <CustomCheckbox\r\n checked={isSelectedActivePageRows}\r\n onClick={handleSelectActivePageRows}\r\n aria-label={t(\"general.toggle\")}\r\n />\r\n {col.fieldCaption}\r\n </th>\r\n );\r\n }\r\n\r\n return (\r\n <th\r\n key={col.fieldName}\r\n role=\"columnheader\"\r\n aria-colindex={ariaColIndex(index)}\r\n style={{\r\n ...col.style,\r\n ...overlayStoredColumnWidth(col, table.columnWidths, {\r\n minWidth: col.minWidth,\r\n }),\r\n }}\r\n className={`px-2 text-xs border text-start min-w-24 ${col.className || \"\"}`}\r\n >\r\n {col.fieldCaption}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n );\r\n}\r\n","export function scrollToTableEnd(\r\n container: HTMLElement | null,\r\n rowId?: number,\r\n): void {\r\n if (!container) return;\r\n\r\n container.scrollLeft = Math.max(\r\n 0,\r\n container.scrollWidth - container.clientWidth,\r\n );\r\n\r\n const rowEl = rowId\r\n ? container.querySelector<HTMLElement>(`tr[data-rowid=\"${rowId}\"]`)\r\n : container.querySelector<HTMLElement>('tbody tr:last-child');\r\n\r\n rowEl?.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });\r\n}\r\n","import { RefObject, useEffect, useRef } from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useMobileEditorState } from '../hooks/useEngineSelector';\r\nimport { scrollToTableEnd } from './scrollToTableEnd';\r\n\r\nexport function useScrollAfterMobileAdd(\r\n scrollRef: RefObject<HTMLElement | null>,\r\n controller: UITableController,\r\n revealAllRows: () => void,\r\n) {\r\n const mobileEditor = useMobileEditorState(controller);\r\n const previousEditorRef = useRef(mobileEditor);\r\n\r\n useEffect(() => {\r\n const previousEditor = previousEditorRef.current;\r\n previousEditorRef.current = mobileEditor;\r\n\r\n if (previousEditor?.mode !== 'add' || mobileEditor) {\r\n return;\r\n }\r\n\r\n revealAllRows();\r\n\r\n const rowId = previousEditor.rowId;\r\n requestAnimationFrame(() => {\r\n scrollToTableEnd(scrollRef.current, rowId);\r\n requestAnimationFrame(() => {\r\n scrollToTableEnd(scrollRef.current, rowId);\r\n });\r\n });\r\n }, [mobileEditor, revealAllRows, scrollRef]);\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n ReactNode,\r\n useEffect,\r\n useRef,\r\n} from 'react';\r\n\r\nimport { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport { ERPTableFooter } from '../desktop/ERPTableFooter';\r\nimport { jsonEqual, useControllerSelector } from '../hooks/useEngineSelector';\r\nimport { useScrollToSearchMatch } from '../hooks/useScrollToSearchMatch';\r\nimport { IMultiSelectConfig } from '../type';\r\nimport { ariaGridRowCount, gridCellDomId } from '../a11y/gridRoles';\r\nimport { GridLiveRegion } from '../a11y/GridLiveRegion';\r\nimport { MobileActionButtons } from './MobileActionButtons';\r\nimport { MobileLoadMoreButton } from './MobileLoadMoreButton';\r\nimport { MobileRowFormModal } from './MobileRowFormModal';\r\nimport { MobileTableBody } from './MobileTableBody';\r\nimport { MobileTableHeader } from './MobileTableHeader';\r\nimport { useScrollAfterMobileAdd } from './useScrollAfterMobileAdd';\r\nimport { scrollToTableEnd } from './scrollToTableEnd';\r\nimport {\r\n GridOverlays,\r\n type GridOverlayComponent,\r\n} from '../overlays';\r\n\r\nexport interface MobileTableProps {\r\n controller: UITableController;\r\n tableKey: string;\r\n tableTitle?: ReactNode;\r\n header?: ReactNode;\r\n footer?: boolean | ReactNode;\r\n multiSelectConfig?: IMultiSelectConfig;\r\n pluginHost?: PluginHost;\r\n loading?: boolean;\r\n loadingOverlayComponent?: GridOverlayComponent;\r\n noRowsOverlayComponent?: GridOverlayComponent;\r\n}\r\n\r\nexport function MobileTable({\r\n controller,\r\n tableKey,\r\n tableTitle,\r\n header,\r\n footer,\r\n multiSelectConfig,\r\n pluginHost,\r\n loading = false,\r\n loadingOverlayComponent,\r\n noRowsOverlayComponent,\r\n}: MobileTableProps) {\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const mobileView =controller.getMobileViewState();\r\n const mobileEditor = mobileView?.mobileEditor ?? null;\r\n useEffect(() => {\r\n controller.resetMobileVisibleRows();\r\n }, [controller, tableKey]);\r\n\r\n useScrollToSearchMatch(scrollRef, controller);\r\n useScrollAfterMobileAdd(scrollRef, controller, () =>\r\n controller.revealAllMobileRows(),\r\n );\r\n\r\n if (!mobileView) return null;\r\n\r\n const viewState = controller.getViewState();\r\n const activeDescendant = viewState?.activeCell\r\n ? gridCellDomId(\r\n tableKey,\r\n viewState.activeCell.rowId,\r\n viewState.activeCell.columnId,\r\n )\r\n : undefined;\r\n\r\n return (\r\n <>\r\n <GridLiveRegion controller={controller} />\r\n <div className=\"flex flex-col w-full transition-all duration-200\">\r\n <div className=\"flex items-center gap-2 bg-main-white px-1 py-2 border-gray-gray5 border-b w-full shrink-0\">\r\n <div className=\"shrink-0\">{tableTitle}</div>\r\n <div className=\"flex items-center ms-auto\">\r\n <MobileActionButtons\r\n controller={controller}\r\n multiSelectConfig={multiSelectConfig}\r\n pluginHost={pluginHost}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div\r\n ref={scrollRef}\r\n data-erp-table-scroll\r\n className=\"hidden-show-scrollBar overflow-x-auto [overflow-anchor:none] relative\"\r\n style={{ overflowAnchor: 'none', minHeight: 160 }}\r\n >\r\n <GridOverlays\r\n loading={loading}\r\n rowCount={mobileView.totalRows}\r\n loadingOverlayComponent={loadingOverlayComponent}\r\n noRowsOverlayComponent={noRowsOverlayComponent}\r\n />\r\n <table\r\n className=\"min-w-max\"\r\n role=\"grid\"\r\n tabIndex={0}\r\n aria-colcount={\r\n mobileView.columns.filter((c) => !c.hidden).length || undefined\r\n }\r\n aria-rowcount={\r\n ariaGridRowCount(mobileView.totalRows, Boolean(footer)) ||\r\n undefined\r\n }\r\n aria-activedescendant={activeDescendant}\r\n data-pdg-grid-focus=\"\"\r\n onFocus={(e) => {\r\n if (e.target !== e.currentTarget) return;\r\n if (controller.getActiveCell()) return;\r\n const firstRow = mobileView.rows[0];\r\n const firstCol = mobileView.columns.find(\r\n (c) =>\r\n !c.hidden &&\r\n c.fieldType !== 'index' &&\r\n c.fieldName !== 'index',\r\n );\r\n if (firstRow && firstCol) {\r\n void controller.dispatch({\r\n type: 'UI_ACTIVE_CELL',\r\n rowId: firstRow.id,\r\n columnId: firstCol.fieldName,\r\n });\r\n }\r\n }}\r\n >\r\n <MobileTableHeader controller={controller} header={header} />\r\n <MobileTableBody\r\n controller={controller}\r\n tableKey={tableKey}\r\n rows={mobileView.rows}\r\n columns={mobileView.columns}\r\n />\r\n {footer && (\r\n <ERPTableFooter\r\n controller={controller}\r\n footer={footer}\r\n dataRowCount={mobileView.totalRows}\r\n />\r\n )}\r\n </table>\r\n </div>\r\n\r\n {mobileView.hasMore && (\r\n <MobileLoadMoreButton\r\n onClick={\r\n \r\n async () =>{\r\n await controller.loadMoreMobileRows()\r\n scrollToTableEnd(scrollRef.current)\r\n } \r\n\r\n\r\n }\r\n visibleCount={mobileView.visibleCount}\r\n totalRows={mobileView.totalRows}\r\n />\r\n )}\r\n </div>\r\n\r\n {mobileEditor && (\r\n <MobileRowFormModal\r\n controller={controller}\r\n tableKey={tableKey}\r\n editor={mobileEditor}\r\n onClose={() => {\r\n void controller.dispatch({ type: 'UI_CLOSE_MOBILE_EDITOR' });\r\n }}\r\n />\r\n )}\r\n </>\r\n );\r\n}\r\n","const SELECT_NAV_SKIP = new Set([\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'Enter',\r\n 'NumpadEnter',\r\n]);\r\n\r\nconst TEXTAREA_NAV_SKIP = new Set([\r\n 'Enter',\r\n 'NumpadEnter',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n]);\r\n\r\ntype ClosestHost = {\r\n closest: (selector: string) => unknown;\r\n getAttribute?: (name: string) => string | null;\r\n};\r\n\r\nfunction asClosestHost(target: EventTarget | null): ClosestHost | null {\r\n if (!target || typeof (target as unknown as ClosestHost).closest !== 'function') {\r\n return null;\r\n }\r\n return target as unknown as ClosestHost;\r\n}\r\n\r\n/** Select widget, its portal dropdown / virtual list, or an option/combobox node. */\r\nfunction isInsideSelect(el: ClosestHost): boolean {\r\n return Boolean(\r\n el.closest('.ant-select') ||\r\n el.closest('.ant-select-dropdown') ||\r\n el.closest('.rc-virtual-list') ||\r\n el.closest('.erp-table-select') ||\r\n el.getAttribute?.('role') === 'option' ||\r\n el.getAttribute?.('role') === 'combobox',\r\n );\r\n}\r\n\r\n/**\r\n * Table shortcuts that must win over a focused Select: every Alt shortcut and\r\n * the Ctrl+Space / Ctrl+Arrow / Ctrl+End row shortcuts. The caller must\r\n * `preventDefault()` + `stopPropagation()` synchronously — an async dispatch\r\n * is too late to stop the Select's own handling.\r\n */\r\nexport function isGridShortcutKey(e: {\r\n altKey: boolean;\r\n ctrlKey: boolean;\r\n code: string;\r\n getModifierState?: (key: string) => boolean;\r\n}): boolean {\r\n // AltGr (reported as Ctrl+Alt on Windows) types a character, it is no chord.\r\n if (typeof e.getModifierState === 'function' && e.getModifierState('AltGraph')) {\r\n return false;\r\n }\r\n if (e.altKey) return true;\r\n return (\r\n e.ctrlKey &&\r\n (e.code === 'Space' ||\r\n e.code === 'ArrowUp' ||\r\n e.code === 'ArrowDown' ||\r\n e.code === 'End')\r\n );\r\n}\r\n\r\n/**\r\n * Window-capture KEY_DOWN must not steal Enter/arrows from native controls.\r\n * Select: keep existing skip. Textarea: Enter inserts a newline (PR-56).\r\n */\r\nexport function shouldSkipGridNavigation(\r\n target: EventTarget | null,\r\n code: string,\r\n): boolean {\r\n const el = asClosestHost(target);\r\n if (!el) return false;\r\n if (isInsideSelect(el)) {\r\n return SELECT_NAV_SKIP.has(code);\r\n }\r\n if (el.closest('[data-erp-cell-textarea]')) {\r\n return TEXTAREA_NAV_SKIP.has(code);\r\n }\r\n return false;\r\n}\r\n\n/**\n * Where a window-level keydown came from, relative to ONE grid root.\n * - `cell`: a body cell or the grid's own table (APG focus) → grid keyboard.\n * - `page`: nothing focused (body / document) → grid keyboard (arrows keep\n * working after a click on a non-focusable area, as in the legacy table).\n * - `outside`: any other control — page forms, the grid toolbar, header\n * filters, popovers, dialogs → only the legacy global chords\n * (`isGridShortcutKey`); typing, copy/paste, Enter, Tab, arrows stay native.\n * - `other-grid`: inside another grid → ignored.\n */\nexport type GridKeyScope = 'cell' | 'page' | 'outside' | 'other-grid';\n\nexport function resolveGridKeyScope(\n target: EventTarget | null,\n root: Element | null,\n): GridKeyScope {\n if (!root) return 'cell';\n if (typeof Element === 'undefined' || !(target instanceof Element)) return 'page';\n if (\n typeof document !== 'undefined' &&\n (target === document.body || target === document.documentElement)\n ) {\n return 'page';\n }\n const owner = target.closest('[data-pdg-grid]');\n if (owner && owner !== root) return 'other-grid';\n if (!root.contains(target)) return 'outside';\n if (target.closest('[role=\"menu\"], [role=\"dialog\"], .erp-table-modal')) return 'outside';\n if (target.closest('[role=\"gridcell\"], [data-erp-cell-textarea]')) return 'cell';\n if (target.closest('[role=\"grid\"], [role=\"treegrid\"]') === target) return 'cell';\n return 'outside';\n}\n","// hooks/useERPTable.ts\r\nimport {\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\nimport type { GridSession } from '../application/session/GridSession';\r\nimport type { PluginHost } from '../application/plugins/PluginHost';\r\nimport type { EventStore } from '../application/ports/EventStore';\r\nimport { createGrid } from '../bootstrap';\r\nimport {\r\n createGridTableKey,\r\n DEFAULT_MEMORY_STORE,\r\n isPersistentStore,\r\n} from '../bootstrap/defaults';\r\nimport type {\r\n CreateERPTableConfig,\r\n CreateGridResult,\r\n} from '../bootstrap/type';\r\nimport { flattenColDefOrGroup } from '../infrastructure/columns/flattenColumnDefs';\r\nimport type { TableSnapShot } from '../engine/type';\r\nimport type {\r\n HistoryItem,\r\n HistoryQuery,\r\n} from '../infrastructure/history/HistoryPanelViewModel';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogQuery,\r\n} from '../infrastructure/projections/ChangelogProjection';\r\nimport type { GridApi } from '../infrastructure/ui/createGridApi';\r\nimport {\r\n UITableController,\r\n} from '../infrastructure/ui/UITableController';\r\n\r\nexport type UseGridResult<TRow = unknown> =\r\n | { ready: false }\r\n | {\r\n ready: true;\r\n controller: UITableController;\r\n api: GridApi<TRow>;\r\n session: GridSession;\r\n pluginHost: PluginHost;\r\n eventStore: EventStore;\r\n store: string;\r\n tableKey: string;\r\n rows: TableSnapShot;\r\n changelog: ChangelogEntry[];\r\n changelogCount: number;\r\n historyItems: HistoryItem[];\r\n historyItemCount: number;\r\n canUndo: boolean;\r\n canRedo: boolean;\r\n getChangelog: (\r\n filter?: Omit<ChangelogQuery, 'tableId'>\r\n ) => ChangelogEntry[];\r\n getHistoryItems: (\r\n filter?: Omit<HistoryQuery, 'tableId'>\r\n ) => HistoryItem[];\r\n subscribeChangelog: (\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter?: Omit<ChangelogQuery, 'tableId'>\r\n ) => () => void;\r\n subscribeHistoryItems: (\r\n cb: (items: HistoryItem[]) => void,\r\n filter?: Omit<HistoryQuery, 'tableId'>\r\n ) => () => void;\r\n subscribeSelected: GridSession['subscribeSelected'];\r\n getViewport: GridSession['getViewport'];\r\n getVisibleRange: GridSession['getVisibleRange'];\r\n projectVisibleRows: GridSession['projectVisibleRows'];\r\n getUiRowCount: GridSession['getUiRowCount'];\r\n projectVisibleUiRows: GridSession['projectVisibleUiRows'];\r\n changeViewport: (input: {\r\n scrollOffset: number;\r\n viewportSize?: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n }) => Promise<void>;\r\n undo: () => Promise<boolean>;\r\n redo: () => Promise<boolean>;\r\n };\r\n\r\n/** @deprecated Use {@link UseGridResult}. Removed in 1.0.0. */\r\nexport type UseERPTableResult<TRow = unknown> = UseGridResult<TRow>;\r\n\r\nexport function useGrid<TRow = unknown>(\r\n config: CreateERPTableConfig<TRow>\r\n): UseGridResult<TRow> {\r\n const generatedKeyRef = useRef<string | undefined>(undefined);\r\n if (config.tableKey) {\r\n generatedKeyRef.current = config.tableKey;\r\n } else if (!generatedKeyRef.current) {\r\n generatedKeyRef.current = createGridTableKey();\r\n }\r\n const tableKey = generatedKeyRef.current;\r\n\r\n const [controller, setController] =\r\n useState<UITableController | null>(null);\r\n const [api, setApi] = useState<GridApi<TRow> | null>(null);\r\n const [session, setSession] = useState<GridSession | null>(null);\r\n const [pluginHost, setPluginHost] = useState<PluginHost | null>(null);\r\n const [eventStore, setEventStore] = useState<EventStore | null>(null);\r\n const [rows, setRows] = useState<TableSnapShot | null>(null);\r\n const [, setViewVersion] = useState(0);\r\n const [undoFlags, setUndoFlags] = useState({ canUndo: false, canRedo: false });\r\n const [historyItems, setHistoryItems] = useState<HistoryItem[]>([]);\r\n const [changelog, setChangelog] = useState<ChangelogEntry[]>([]);\r\n\r\n // Page-window mode ('paged-idb'): an empty `tableKey` means \"page left /\r\n // not mounted yet\" — never build (or rebuild IndexedDB for) a grid then.\r\n const pagedIdb = config.persistence === 'paged-idb';\r\n const disabled = pagedIdb && !config.tableKey;\r\n // Latest config for the effect below (config identity changes every render;\r\n // only the listed deps rebuild the grid).\r\n const configRef = useRef(config);\r\n configRef.current = config;\r\n // Teardown of the previous grid. A new grid waits for it so the old one has\r\n // released its event store / IndexedDB connection before the next opens it.\r\n const teardownRef = useRef<Promise<void>>(Promise.resolve());\r\n\r\n // ---------- bootstrap + teardown ----------\r\n // The grid is created inside the effect (never in render / useMemo): render\r\n // is pure, StrictMode's mount→cleanup→mount creates exactly one grid (the\r\n // first run is cancelled before it builds), and every grid that was built is\r\n // released by its own cleanup.\r\n useEffect(() => {\r\n let cancelled = false;\r\n let built: CreateGridResult<TRow> | null = null;\r\n setController(null);\r\n setApi(null);\r\n setSession(null);\r\n setPluginHost(null);\r\n setEventStore(null);\r\n setRows(null);\r\n\r\n if (disabled) return undefined;\r\n\r\n const previous = teardownRef.current;\r\n void previous.then(() => {\r\n if (cancelled) return;\r\n const grid = createGrid<TRow>({ ...configRef.current, tableKey });\r\n built = grid;\r\n void grid.ready.then((result) => {\r\n if (cancelled) return;\r\n setController(result.controller);\r\n setApi(result.api);\r\n setSession(result.session);\r\n setPluginHost(result.pluginHost);\r\n setEventStore(result.eventStore);\r\n });\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n const grid = built;\r\n if (!grid) {\r\n teardownRef.current = previous;\r\n return;\r\n }\r\n // Paged mode: dispose() = drop the RAM page window (IndexedDB stays the\r\n // source of truth) + release resources. Default event-sourced mode:\r\n // persisted data is left exactly as it is; only resources are released.\r\n // A failed assembly already cleaned up after itself (ready rejects).\r\n teardownRef.current = previous.then(() =>\r\n grid.ready.then(\r\n (result) =>\r\n pagedIdb\r\n ? result.controller.dispose()\r\n : result.controller.releaseResources(),\r\n () => undefined,\r\n ),\r\n );\r\n };\r\n }, [tableKey, disabled, pagedIdb, config.columns, config.columnDefs, config.store]);\r\n\r\n // Re-apply host rows only when the `rowData` prop changes (PR-82). Inline\r\n // `columnDefs` / `getRowId` get a new identity on every host render; keying\r\n // this effect on them re-applied the unchanged rows and reset grid edits.\r\n useEffect(() => {\r\n if (!controller || config.rowData === undefined) return;\r\n const { columnDefs, getRowId } = configRef.current;\r\n controller.applyHostRowData(config.rowData, columnDefs, getRowId);\r\n }, [controller, config.rowData]);\r\n\r\n useEffect(() => {\r\n if (!controller || !config.columnDefs) return;\r\n for (const def of flattenColDefOrGroup(config.columnDefs)) {\r\n if (def.hide === undefined) continue;\r\n const colId =\r\n typeof def.colId === 'string' && def.colId.length > 0\r\n ? def.colId\r\n : typeof def.field === 'string'\r\n ? def.field\r\n : null;\r\n if (!colId) continue;\r\n controller.setColumnVisible(colId, !def.hide);\r\n }\r\n }, [controller, config.columnDefs]);\r\n\r\n useEffect(() => {\r\n if (!controller || config.quickFilterText === undefined) return;\r\n controller.setQuickFilterText(config.quickFilterText);\r\n }, [controller, config.quickFilterText]);\r\n\r\n useEffect(() => {\r\n if (!controller || config.groupBy === undefined) return;\r\n const cols =\r\n typeof config.groupBy === 'string'\r\n ? [config.groupBy]\r\n : [...config.groupBy];\r\n controller.setRowGroupColumns(cols);\r\n }, [controller, config.groupBy]);\r\n\r\n useEffect(() => {\r\n if (!controller || config.groupDefaultExpanded === undefined) return;\r\n controller.setGroupDefaultExpanded(config.groupDefaultExpanded);\r\n }, [controller, config.groupDefaultExpanded]);\r\n\r\n // Snapshot equality skips selection / active-row / expand because those live\r\n // on view state, not TableSnapShot. Bump viewVersion on every store tick so\r\n // checkboxes and toolbar counts re-render (same as the ERP host hook).\r\n useEffect(() => {\r\n if (!controller) return;\r\n\r\n let cancelled = false;\r\n const syncView = () => {\r\n if (cancelled) return;\r\n // Re-render only in page-window mode — never rebuild a row snapshot on\r\n // every keystroke; server save uses getFullSnapShot().\r\n if (!controller.isPagedWindow()) {\r\n const snapshot = controller.getSnapShot('active');\r\n if (snapshot) setRows(snapshot);\r\n }\r\n setViewVersion((version) => version + 1);\r\n };\r\n\r\n syncView();\r\n const unsubscribe = controller.subscribe(syncView);\r\n\r\n if (!unsubscribe) {\r\n const retryTimer = window.setTimeout(syncView, 0);\r\n return () => {\r\n cancelled = true;\r\n window.clearTimeout(retryTimer);\r\n };\r\n }\r\n\r\n return () => {\r\n cancelled = true;\r\n unsubscribe();\r\n };\r\n }, [controller]);\r\n\r\n // ---------- selector: undo flags (independent of row snapshot) ----------\r\n useEffect(() => {\r\n if (!controller) return;\r\n\r\n const readFlags = () => ({\r\n canUndo: controller.canUndo(),\r\n canRedo: controller.canRedo(),\r\n });\r\n\r\n setUndoFlags(readFlags());\r\n\r\n return controller.subscribeSelected(\r\n readFlags,\r\n setUndoFlags,\r\n (a: { canUndo: boolean; canRedo: boolean }, b: { canUndo: boolean; canRedo: boolean }) =>\r\n a.canUndo === b.canUndo && a.canRedo === b.canRedo,\r\n );\r\n }, [controller]);\r\n\r\n // ---------- history / changelog: dedicated projection subscriptions ----------\r\n useEffect(() => {\r\n if (!controller) return;\r\n setHistoryItems(controller.getHistoryItems());\r\n setChangelog(controller.getChangelog());\r\n const unsubHistory = controller.subscribeHistoryItems(setHistoryItems);\r\n const unsubChangelog = controller.subscribeChangelog(setChangelog);\r\n return () => {\r\n unsubHistory();\r\n unsubChangelog();\r\n };\r\n }, [controller]);\r\n\r\n if (!eventStore || !controller || !api || !session || !pluginHost || !controller.getViewState()) {\r\n return { ready: false };\r\n }\r\n\r\n return {\r\n ready: true,\r\n controller,\r\n api,\r\n session,\r\n pluginHost,\r\n eventStore,\r\n store: isPersistentStore(config.store) ? config.store : DEFAULT_MEMORY_STORE,\r\n tableKey,\r\n rows: rows ?? (controller.getSnapShot('active') as TableSnapShot),\r\n changelog,\r\n changelogCount: changelog.length,\r\n historyItems,\r\n historyItemCount: historyItems.length,\r\n canUndo: undoFlags.canUndo,\r\n canRedo: undoFlags.canRedo,\r\n getChangelog: (filter) => controller.getChangelog(filter),\r\n getHistoryItems: (filter) => controller.getHistoryItems(filter),\r\n subscribeChangelog: (cb, filter) =>\r\n controller.subscribeChangelog(cb, filter),\r\n subscribeHistoryItems: (cb, filter) =>\r\n controller.subscribeHistoryItems(cb, filter),\r\n subscribeSelected: ((selector, listener, isEqual) =>\r\n controller.subscribeSelected(selector, listener, isEqual)) as GridSession['subscribeSelected'],\r\n getViewport: () => session.getViewport(),\r\n getVisibleRange: (totalRows?: number) => session.getVisibleRange(totalRows),\r\n projectVisibleRows: <T,>(rows: T[], totalRows?: number) =>\r\n session.projectVisibleRows(rows, totalRows),\r\n getUiRowCount: () => session.getUiRowCount(),\r\n projectVisibleUiRows: () => session.projectVisibleUiRows(),\r\n changeViewport: (input: {\r\n scrollOffset: number;\r\n viewportSize?: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n }) =>\r\n session.dispatchViewIntent({ type: 'CHANGE_VIEWPORT', ...input }),\r\n undo: () => controller.undo(),\r\n redo: () => controller.redo(),\r\n };\r\n}\r\n\r\n/** @deprecated Use {@link useGrid}. Removed in 1.0.0. */\r\nexport const useERPTable = useGrid;\r\n","import type { Ref } from 'react';\r\n\r\nexport function assignRef<T>(ref: Ref<T> | undefined, value: T): void {\r\n if (!ref) return;\r\n if (typeof ref === 'function') {\r\n ref(value);\r\n return;\r\n }\r\n (ref as { current: T }).current = value;\r\n}\r\n","\"use client\";\nimport React, {\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { CreateERPTableConfig } from '../bootstrap/type';\nimport { UITableController } from '../infrastructure/ui/UITableController';\nimport type { GridApi } from '../infrastructure/ui/createGridApi';\nimport {\n ERPTableHostProvider,\n resolveDirection,\n useMediaQuery,\n type ERPTableLocale,\n type ERPTableMessages,\n type ERPTableToastKind,\n type NumberingSystem,\n type DateAdapter,\n type UseDependOnHook,\n} from './host';\nimport type { ColumnMenuItemsConfig } from '../engine/dataOps/columnMenu';\nimport { DesktopTable } from './desktop/DesktopTable';\nimport type { ColumnMenuActionEvent } from './desktop/ColumnMenuPopover';\nimport { MobileTable } from './mobile/MobileTable';\nimport {\n GridTheme,\n isStockDarkTheme,\n resolveActiveTheme,\n themeDefault,\n themeToStyle,\n} from './theme';\nimport { IMultiSelectConfig } from './type';\nimport type { CellComponentMap } from './cellRenderer/cellRegistry';\nimport type { FilterComponentMap } from './filters';\nimport type { GridOverlayComponent } from './overlays';\nimport {\n isGridShortcutKey,\n resolveGridKeyScope,\n shouldSkipGridNavigation,\n} from './keyboard/skipGridNavigation';\nimport { useGrid } from './useERPTable';\nimport { useGridHostEvents } from './host/useGridHostEvents';\nimport { assignRef } from './host/assignRef';\nimport type {\n GridReadyEvent,\n} from './host/bindGridHostEvents';\nimport type {\n CellFocusedEvent,\n CellValueChangedEvent,\n RowDataUpdatedEvent,\n RowValueChangedEvent,\n SelectionChangedEvent,\n} from '../application/events/hostGridEvents';\nimport type { ProcessCellForClipboardParams } from '../engine/selection/clipboardCopy';\nimport type {\n ClipboardCopyEvent,\n ClipboardPasteEvent,\n} from '../infrastructure/ui/gridClipboard';\n\nexport type {\n CellFocusedEvent,\n CellValueChangedEvent,\n RowDataUpdatedEvent,\n RowValueChangedEvent,\n SelectionChangedEvent,\n} from '../application/events/hostGridEvents';\nexport type {\n ClipboardCopyEvent,\n ClipboardPasteEvent,\n} from '../infrastructure/ui/gridClipboard';\nexport type { ProcessCellForClipboardParams } from '../engine/selection/clipboardCopy';\nexport type { GridReadyEvent } from './host/bindGridHostEvents';\nexport type {\n GridApi,\n GridColumnState,\n GridRowNode,\n StartEditingCellParams,\n} from '../infrastructure/ui/createGridApi';\n\nexport interface DataGridProps<TRow = unknown> extends CreateERPTableConfig<TRow> {\n /**\n * Filled when the grid hydrates; cleared on unmount.\n * Prefer this over `onReady` (PR-86).\n */\n apiRef?: Ref<GridApi<TRow> | null>;\n /**\n * @deprecated Prefer {@link DataGridProps.apiRef} / `onGridReady` (PR-86).\n * Still receives `UITableController` for one version so existing hosts compile.\n */\n onReady?: (controller: UITableController) => void;\n /** Fires once when the grid has hydrated. Same moment as `onReady` (PR-85). */\n onGridReady?: (event: GridReadyEvent<NoInfer<TRow>>) => void;\n /** One call per `CELL_CHANGED` catalog event. */\n onCellValueChanged?: (event: CellValueChangedEvent<NoInfer<TRow>>) => void;\n /** Same `CELL_CHANGED` event, with the host row (`data`). */\n onRowValueChanged?: (event: RowValueChangedEvent<NoInfer<TRow>>) => void;\n /** Row add/delete/reorder catalog events, or later `rowData` prop updates. */\n onRowDataUpdated?: (event: RowDataUpdatedEvent<NoInfer<TRow>>) => void;\n /** View-store selection (`selectedRows`), not a second event bus. */\n onSelectionChanged?: (event: SelectionChangedEvent<NoInfer<TRow>>) => void;\n /** View-store active cell. */\n onCellFocused?: (event: CellFocusedEvent) => void;\n tableTitle?: ReactNode;\n header?: ReactNode;\n footer?: boolean | ReactNode;\n /**\n * When `footer={true}`, optional multi-row aggregates (PR-119).\n * Each row can override `aggFunc` (e.g. sum + avg).\n */\n footerRows?: readonly import('./desktop/ERPTableFooter').FooterRowDef[];\n activeCollection?: string;\n tableHeight?: number;\n /** When omitted, the choose-from-list button and modal are not rendered (D11). */\n multiSelectConfig?: IMultiSelectConfig;\n moreDetailComponent?: React.ComponentType<{data: unknown}>;\n /**\n * Desktop virtual scroll. Default **on** when a session is present (PR-97 / D17).\n * Pass `virtualization={false}` for classic pagination chrome.\n */\n virtualization?: boolean;\n locale?: ERPTableLocale;\n /**\n * Writing direction. Default derived from `locale` (`fa`/`ar` → rtl, `en` → ltr).\n * Pass explicitly to override (PR-127).\n */\n direction?: 'rtl' | 'ltr';\n /**\n * Intl digit system (PR-127). Default from locale meta\n * (`fa` → arabext, `ar` → arab, `en` → latn).\n */\n numberingSystem?: NumberingSystem;\n /**\n * Calendar port (PR-128 / D21). Default jalali for `locale=\"fa\"`, else gregorian.\n */\n dateAdapter?: DateAdapter;\n messages?: Partial<ERPTableMessages>;\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\n /** Typed CSS variables on the table root. Default `themeDefault`. */\n theme?: GridTheme;\n /**\n * Show the light/dark button in product chrome. Default true.\n * Hidden when `theme` is a custom (non-stock) GridTheme.\n */\n themeToggle?: boolean;\n /**\n * Replace built-in FieldType editors (PR-55). Keys are FieldType or a custom\n * string. Column `render` still wins. Omit = CellRenderer switch fallback.\n */\n components?: CellComponentMap;\n /**\n * Custom column filter UIs (PR-95). Keys match `ColumnDef.filter` string /\n * `{ type }`. Built-in names (`text`/`number`/…) stay on the default popover.\n */\n filterComponents?: FilterComponentMap;\n /**\n * Show a floating filter row under the header (PR-94).\n * Column menu filters work without this.\n */\n floatingFilter?: boolean;\n /**\n * Full-grid loading overlay (PR-103). Independent of hydrate `ready`.\n */\n loading?: boolean;\n /** Replace the default loading overlay (PR-103). */\n loadingOverlayComponent?: GridOverlayComponent;\n /** Replace the default empty overlay (PR-103). */\n noRowsOverlayComponent?: GridOverlayComponent;\n /**\n * Copy formatted display strings instead of raw values (PR-106).\n * Default false.\n */\n copyFormattedValue?: boolean;\n /** Include column headers in clipboard TSV/HTML (PR-106). Default false. */\n copyHeadersToClipboard?: boolean;\n /**\n * Convert eastern digits to ASCII in clipboard text (PR-106).\n * Default true.\n */\n copyDigitsAsLatin?: boolean;\n /** Override per-cell clipboard text (PR-106). */\n processCellForClipboard?: (\n params: ProcessCellForClipboardParams,\n ) => string;\n /**\n * Fires before writing to the system clipboard (PR-106).\n * Return `false` to cancel the default write.\n */\n onClipboardCopy?: (event: ClipboardCopyEvent) => boolean | void;\n /**\n * When true (default), paste past the last row adds rows (PR-107).\n */\n pasteAddsRows?: boolean;\n /** Fires before paste; return false to cancel (PR-107). */\n onClipboardPaste?: (event: ClipboardPasteEvent) => boolean | void;\n /**\n * Column header ⋮ menu items (PR-114). Pass a function to trim/reorder defaults\n * or append `{ name, label }` custom entries (handle via `onColumnMenuAction`).\n */\n columnMenuItems?: ColumnMenuItemsConfig;\n /** Fires for custom column menu items (PR-114). */\n onColumnMenuAction?: (event: ColumnMenuActionEvent) => void;\n /**\n * Host hook resolving `dependOn` values of remote lists (see\n * `ERPTableHostProvider`). When omitted, an outer `ERPTableHostProvider`'s\n * hook is used, else the static item values.\n */\n useDependOn?: UseDependOnHook;\n /**\n * Rows stuck under the header (PR-116). Display-only; not virtualized,\n * sorted, filtered, or selected with body rows.\n */\n pinnedTopRowData?: readonly NoInfer<TRow>[];\n /**\n * Rows stuck above the footer (PR-116). Display-only; not virtualized.\n */\n pinnedBottomRowData?: readonly NoInfer<TRow>[];\n}\n\n/** @deprecated Use {@link DataGridProps}. Removed in 1.0.0. */\nexport type ERPTableProps<TRow = unknown> = DataGridProps<TRow>;\n\nexport function DataGrid<TRow = unknown>(props: DataGridProps<TRow>) {\n const {\n apiRef,\n onReady,\n onGridReady,\n onCellValueChanged,\n onRowValueChanged,\n onRowDataUpdated,\n onSelectionChanged,\n onCellFocused,\n tableTitle,\n header,\n footer,\n footerRows,\n tableHeight,\n multiSelectConfig,\n moreDetailComponent,\n virtualization,\n remoteApi,\n locale = 'fa',\n direction,\n numberingSystem,\n dateAdapter,\n messages,\n onToast,\n theme: themeProp,\n themeToggle = true,\n components,\n filterComponents,\n rowData,\n floatingFilter = false,\n loading = false,\n loadingOverlayComponent,\n noRowsOverlayComponent,\n copyFormattedValue,\n copyHeadersToClipboard,\n copyDigitsAsLatin,\n processCellForClipboard,\n onClipboardCopy,\n pasteAddsRows,\n onClipboardPaste,\n columnMenuItems,\n onColumnMenuAction,\n useDependOn,\n pinnedTopRowData,\n pinnedBottomRowData,\n } = props;\n\n /** Grid root — scopes the window key listener to this grid. */\n const rootRef = useRef<HTMLDivElement>(null);\n /** Last focus / pointer event seen inside the grid's React tree (portals included). */\n const insideEventRef = useRef<Event | null>(null);\n const markInsideEvent = useCallback((e: React.SyntheticEvent) => {\n insideEventRef.current = e.nativeEvent;\n }, []);\n\n const requestedTheme = themeProp ?? themeDefault;\n const requestedKey = JSON.stringify(requestedTheme.params);\n const [preferDark, setPreferDark] = useState(() =>\n isStockDarkTheme(requestedTheme),\n );\n\n const { theme: resolvedTheme, locked: themeLocked } = useMemo(\n () =>\n resolveActiveTheme({\n requested: requestedTheme,\n preferDark,\n }),\n [requestedTheme, preferDark],\n );\n\n useEffect(() => {\n if (themeLocked) return;\n setPreferDark(isStockDarkTheme(requestedTheme));\n }, [requestedKey, themeLocked, requestedTheme]);\n\n const onToggleTheme = useCallback(() => {\n setPreferDark((value) => !value);\n }, []);\n\n // Every grid option (`persistence`, `cellEditCommit`, `enterNavigation`,\n // `quickFilterText`, `rowModelType`, `eventStoreName`, …) reaches createGrid;\n // the UI-only props are ignored there. Page size follows the rendered row\n // height of the theme.\n const result = useGrid<TRow>({\n ...props,\n rowHeight: resolvedTheme.params.rowHeight,\n });\n\n useEffect(() => {\n if (!result.ready) return;\n result.controller.configureClipboard({\n copyFormattedValue,\n copyHeadersToClipboard,\n copyDigitsAsLatin,\n processCellForClipboard,\n onClipboardCopy,\n pasteAddsRows,\n onClipboardPaste,\n });\n }, [\n result.ready,\n result.ready ? result.controller : null,\n copyFormattedValue,\n copyHeadersToClipboard,\n copyDigitsAsLatin,\n processCellForClipboard,\n onClipboardCopy,\n pasteAddsRows,\n onClipboardPaste,\n ]);\n\n useEffect(() => {\n if (!result.ready) return;\n const {controller} = result;\n\n const clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const button = target.closest(\"button\");\n if (button) {\n const {pageid, id} = button.dataset;\n if (result.tableKey === id || result.tableKey === pageid) {\n controller.dispose();\n }\n }\n };\n\n const handler = (e: KeyboardEvent) => {\n // The listener is window-level (Select popups, legacy chords): keys\n // typed in page forms, the toolbar, header filters or another grid are\n // never taken — only the legacy global chords are.\n const scope = resolveGridKeyScope(e.target, rootRef.current);\n if (scope === 'other-grid') return;\n const shortcut = isGridShortcutKey(e);\n if (scope === 'outside' && !shortcut) return;\n // Table Alt/Ctrl shortcuts win over Select; preventDefault must run\n // synchronously — the async dispatch below is too late.\n if (shortcut) {\n e.preventDefault();\n e.stopPropagation();\n } else if (shouldSkipGridNavigation(e.target, e.code)) {\n return;\n }\n const activeRow = controller.getActiveRow();\n const activeCell = controller.getActiveCell();\n void controller.dispatch({\n type: \"KEY_DOWN\",\n event: e,\n ctx: {\n activeRowId: activeRow,\n tableKey: result.tableKey,\n activeColumnId: activeCell?.columnId ?? null,\n },\n });\n };\n\n window.addEventListener(\"keydown\", handler, true);\n window.addEventListener(\"click\", clickHandler, true);\n return () => {\n window.removeEventListener(\"click\", clickHandler, true);\n window.removeEventListener(\"keydown\", handler, true);\n };\n }, [result.ready, result]);\n\n // `stopEditingWhenCellsLoseFocus`: a focus / pointer-down outside the grid\n // ends a deferred edit. React events bubble through portals, so Select\n // popups, date pickers and menus rendered by the grid count as inside.\n const readyController = result.ready ? result.controller : null;\n useEffect(() => {\n if (!readyController || typeof document === 'undefined') return;\n const onDocument = (event: Event) => {\n window.setTimeout(() => {\n if (insideEventRef.current === event) return;\n void readyController.leaveGridFocus();\n }, 0);\n };\n document.addEventListener('focusin', onDocument, true);\n document.addEventListener('pointerdown', onDocument, true);\n return () => {\n document.removeEventListener('focusin', onDocument, true);\n document.removeEventListener('pointerdown', onDocument, true);\n };\n }, [readyController]);\n\n useGridHostEvents({\n ready: result.ready,\n controller: result.ready ? result.controller : null,\n eventStore: result.ready ? result.eventStore : null,\n tableKey: result.ready ? result.tableKey : '',\n onCellValueChanged,\n onRowValueChanged,\n onRowDataUpdated,\n onSelectionChanged,\n onCellFocused,\n });\n\n const rowDataPrimedRef = useRef(false);\n useEffect(() => {\n if (!result.ready) {\n rowDataPrimedRef.current = false;\n return;\n }\n if (rowData === undefined) return;\n if (!rowDataPrimedRef.current) {\n rowDataPrimedRef.current = true;\n return;\n }\n onRowDataUpdated?.({\n rowData: [...rowData],\n source: 'rowData',\n });\n }, [result.ready, rowData, onRowDataUpdated]);\n\n useEffect(() => {\n if (!result.ready) return;\n const api = result.api;\n assignRef(apiRef, api);\n onReady?.(result.controller);\n onGridReady?.({ api });\n return () => assignRef(apiRef, null);\n }, [result, apiRef, onReady, onGridReady]);\n\n const {match: viewportMatch} = useMediaQuery(\"XLUP\");\n const isMobile = viewportMatch === false;\n\n if (!result.ready) return null;\n\n const sharedProps = {\n controller: result.controller,\n tableKey: result.tableKey,\n tableTitle,\n header,\n footer,\n multiSelectConfig,\n pluginHost: result.pluginHost,\n loading,\n loadingOverlayComponent,\n noRowsOverlayComponent,\n };\n\n const table = isMobile ? (\n <MobileTable {...sharedProps} />\n ) : (\n <DesktopTable\n {...sharedProps}\n store={result.store}\n tableHeight={tableHeight}\n moreDetailComponent={moreDetailComponent}\n ready={result.ready}\n virtualization={virtualization}\n session={result.session}\n floatingFilter={floatingFilter}\n footerRows={footerRows}\n pinnedTopRowData={pinnedTopRowData}\n pinnedBottomRowData={pinnedBottomRowData}\n />\n );\n\n const dir = resolveDirection(locale, direction);\n const themeMode = isStockDarkTheme(resolvedTheme) ? 'dark' : 'light';\n\n return (\n <ERPTableHostProvider\n locale={locale}\n direction={dir}\n numberingSystem={numberingSystem}\n dateAdapter={dateAdapter}\n messages={messages}\n onToast={onToast}\n remoteApi={remoteApi ?? result.controller.getRemoteApi()}\n theme={resolvedTheme}\n themeToggle={themeToggle}\n themeLocked={themeLocked}\n onToggleTheme={themeLocked ? undefined : onToggleTheme}\n components={components}\n filterComponents={filterComponents}\n columnMenuItems={columnMenuItems}\n onColumnMenuAction={onColumnMenuAction}\n useDependOn={useDependOn}\n >\n <div\n ref={rootRef}\n className=\"pdg-grid erp-table\"\n dir={dir}\n onFocusCapture={markInsideEvent}\n onPointerDownCapture={markInsideEvent}\n data-pdg-grid\n data-erp-table\n data-erp-theme={themeMode}\n data-erp-theme-locked={themeLocked ? 'true' : 'false'}\n style={themeToStyle(resolvedTheme)}\n >\n {table}\n </div>\n </ERPTableHostProvider>\n );\n}\n\n/** @deprecated Use {@link DataGrid}. Removed in 1.0.0. */\nexport const ERPTable = DataGrid;\n","/**\n * GENERATED from ui/styles/erp-table.css — do not edit by hand.\n * Regenerate: yarn generate:inject-styles\n */\nconst STYLE_ID = 'erp-table-injected-css';\n\nconst CSS = `/* Visual tokens copied from the ERP Tailwind theme so the published\r\n table looks identical after npm install (no host Tailwind scan). */\r\n\r\n/* Canonical class is \\`.pdg-grid\\` (PR-87 / D13). \\`.erp-table\\` is a one-version alias. */\r\n.pdg-grid,\r\n.erp-table {\r\n --pdg-main-black: #0e0e0e;\r\n --pdg-main-white: #fff;\r\n --pdg-gray-3: #f4f4f4;\r\n --pdg-gray-5: #ececec;\r\n --pdg-gray-6: #cecece;\r\n --pdg-gray-7: #b1b1b1;\r\n --pdg-gray-8: #939393;\r\n --pdg-gray-85: #848484;\r\n --pdg-gray-9: #767676;\r\n --pdg-gray-10: #585858;\r\n --pdg-gray-11: #515151;\r\n --pdg-black-6: #292929;\r\n --pdg-blue-6: #0658b0;\r\n --pdg-blue-11: #ddecfd;\r\n --pdg-blue-100: #dbeafe;\r\n --pdg-red-100: #fee2e2;\r\n --pdg-red-300: #fca5a5;\r\n --pdg-red-600: #dc2626;\r\n --pdg-yellow-200: #fef08a;\r\n --pdg-yellow-400: #facc15;\r\n --pdg-zinc-200: #e4e4e7;\r\n --pdg-neutral-500: #737373;\r\n --pdg-gray-100: #f3f4f6;\r\n --pdg-scrollbar: #d9d9d9;\r\n --pdg-success: #2c8440;\r\n --pdg-error: #dc3545;\r\n --pdg-overlay: rgba(14, 14, 14, 0.35);\r\n\r\n --erp-main-black: var(--pdg-main-black);\r\n --erp-main-white: var(--pdg-main-white);\r\n --erp-gray-3: var(--pdg-gray-3);\r\n --erp-gray-5: var(--pdg-gray-5);\r\n --erp-gray-6: var(--pdg-gray-6);\r\n --erp-gray-7: var(--pdg-gray-7);\r\n --erp-gray-8: var(--pdg-gray-8);\r\n --erp-gray-85: var(--pdg-gray-85);\r\n --erp-gray-9: var(--pdg-gray-9);\r\n --erp-gray-10: var(--pdg-gray-10);\r\n --erp-gray-11: var(--pdg-gray-11);\r\n --erp-black-6: var(--pdg-black-6);\r\n --erp-blue-6: var(--pdg-blue-6);\r\n --erp-blue-11: var(--pdg-blue-11);\r\n --erp-blue-100: var(--pdg-blue-100);\r\n --erp-red-100: var(--pdg-red-100);\r\n --erp-red-300: var(--pdg-red-300);\r\n --erp-red-600: var(--pdg-red-600);\r\n --erp-yellow-200: var(--pdg-yellow-200);\r\n --erp-yellow-400: var(--pdg-yellow-400);\r\n --erp-zinc-200: var(--pdg-zinc-200);\r\n --erp-neutral-500: var(--pdg-neutral-500);\r\n --erp-gray-100: var(--pdg-gray-100);\r\n --erp-scrollbar: var(--pdg-scrollbar);\r\n --erp-success: var(--pdg-success);\r\n --erp-error: var(--pdg-error);\r\n --erp-overlay: var(--pdg-overlay);\r\n\r\n /* Semantic roles (alias to palette — same computed colors as before). */\r\n --pdg-bg: var(--pdg-main-white);\r\n --pdg-fg: var(--pdg-black-6);\r\n --pdg-accent: var(--pdg-blue-6);\r\n --pdg-range-bg: color-mix(in srgb, var(--pdg-accent) 14%, transparent);\r\n --pdg-range-border: var(--pdg-accent);\r\n --pdg-header-bg: var(--pdg-gray-3);\r\n --pdg-row-stripe: var(--pdg-blue-11);\r\n --pdg-row-selected: var(--pdg-blue-100);\r\n --pdg-border: var(--pdg-gray-5);\r\n --pdg-danger: var(--pdg-red-600);\r\n --pdg-search-match: var(--pdg-yellow-400);\r\n --pdg-search-other: var(--pdg-yellow-200);\r\n --pdg-muted: var(--pdg-neutral-500);\r\n --pdg-font: IRANSans, Tahoma, sans-serif;\r\n --pdg-row-height: 40px;\r\n --pdg-font-size: 12px;\r\n --pdg-radius: 0.25rem;\r\n\r\n --erp-bg: var(--pdg-bg);\r\n --erp-fg: var(--pdg-fg);\r\n --erp-accent: var(--pdg-accent);\r\n --erp-range-bg: var(--pdg-range-bg);\r\n --erp-range-border: var(--pdg-range-border);\r\n --erp-header-bg: var(--pdg-header-bg);\r\n --erp-row-stripe: var(--pdg-row-stripe);\r\n --erp-row-selected: var(--pdg-row-selected);\r\n --erp-border: var(--pdg-border);\r\n --erp-danger: var(--pdg-danger);\r\n --erp-search-match: var(--pdg-search-match);\r\n --erp-search-other: var(--pdg-search-other);\r\n --erp-muted: var(--pdg-muted);\r\n --erp-font: var(--pdg-font);\r\n --erp-row-height: var(--pdg-row-height);\r\n --erp-font-size: var(--pdg-font-size);\r\n --erp-radius: var(--pdg-radius);\r\n\r\n font-family: var(--pdg-font);\r\n color: var(--pdg-fg);\r\n box-sizing: border-box;\r\n width: 100%;\r\n}\r\n\r\n.erp-table *,\r\n.erp-table *::before,\r\n.erp-table *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n.erp-table table {\r\n border-collapse: separate;\r\n border-spacing: 0;\r\n}\r\n.erp-table .border-collapse { border-collapse: collapse; }\r\n\r\n.erp-table .flex { display: flex; }\r\n.erp-table .inline-flex { display: inline-flex; }\r\n.erp-table .flex-col { flex-direction: column; }\r\n.erp-table .flex-1 { flex: 1 1 0%; }\r\n.erp-table .flex-wrap { flex-wrap: wrap; }\r\n.erp-table .shrink-0 { flex-shrink: 0; }\r\n.erp-table .items-center { align-items: center; }\r\n.erp-table .items-start { align-items: flex-start; }\r\n.erp-table .justify-between { justify-content: space-between; }\r\n.erp-table .justify-start { justify-content: flex-start; }\r\n.erp-table .justify-end { justify-content: flex-end; }\r\n.erp-table .justify-center { justify-content: center; }\r\n.erp-table .gap-1 { gap: 0.25rem; }\r\n.erp-table .gap-2 { gap: 0.5rem; }\r\n.erp-table .gap-3 { gap: 0.75rem; }\r\n.erp-table .gap-4 { gap: 1rem; }\r\n.erp-table .gap-5 { gap: 1.25rem; }\r\n.erp-table .w-full { width: 100%; }\r\n.erp-table .h-full { height: 100%; }\r\n.erp-table .h-8 { height: 2rem; }\r\n.erp-table .h-9 { height: var(--erp-row-height); }\r\n.erp-table .h-10 { height: 2.5rem; }\r\n.erp-table .\\\\!h-9 { height: var(--erp-row-height) !important; }\r\n.erp-table .\\\\!h-full { height: 100% !important; }\r\n.erp-table .\\\\!h-\\\\[480px\\\\] { height: 480px !important; }\r\n.erp-table .min-w-max { min-width: max-content; }\r\n.erp-table .min-w-0 { min-width: 0; }\r\n.erp-table .min-w-24 { min-width: 6rem; }\r\n.erp-table .min-w-36 { min-width: 9rem; }\r\n.erp-table .min-w-5 { min-width: 1.25rem; }\r\n.erp-table .max-w-72 { max-width: 18rem; }\r\n.erp-table .max-h-\\\\[20rem\\\\] { max-height: 20rem; }\r\n.erp-table .max-w-\\\\[40vw\\\\] { max-width: 40vw; }\r\n.erp-table .w-2 { width: 0.5rem; }\r\n.erp-table .h-2 { height: 0.5rem; }\r\n.erp-table .w-fit { width: fit-content; }\r\n.erp-table .w-\\\\[16px\\\\] { width: 16px; }\r\n.erp-table .h-\\\\[16px\\\\] { height: 16px; }\r\n.erp-table .w-\\\\[20px\\\\] { width: 20px; }\r\n.erp-table .w-\\\\[2\\\\.125rem\\\\] { width: 2.125rem; }\r\n.erp-table .h-\\\\[2\\\\.125rem\\\\] { height: 2.125rem; }\r\n.erp-table .w-\\\\[720px\\\\] { width: 720px; }\r\n.erp-table .min-w-\\\\[320px\\\\] { min-width: 320px; }\r\n.erp-table .overflow-auto { overflow: auto; }\r\n.erp-table .overflow-hidden { overflow: hidden; }\r\n.erp-table .overflow-x-auto { overflow-x: auto; }\r\n.erp-table .overflow-y-auto { overflow-y: auto; }\r\n.erp-table .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n.erp-table .text-ellipsis { text-overflow: ellipsis; }\r\n.erp-table .whitespace-nowrap { white-space: nowrap; }\r\n.erp-table .text-3xs { font-size: 8px; }\r\n.erp-table .text-xs { font-size: var(--erp-font-size); line-height: 1.25rem; }\r\n.erp-table .text-sm { font-size: 14px; line-height: 1.25rem; }\r\n.erp-table .text-md { font-size: 16px; }\r\n.erp-table .text-start { text-align: start; }\r\n.erp-table .text-center { text-align: center; }\r\n.erp-table .text-white { color: var(--erp-bg); }\r\n.erp-table .font-light { font-weight: 300; }\r\n.erp-table .font-medium { font-weight: 500; }\r\n.erp-table .font-semibold { font-weight: 600; }\r\n.erp-table .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; }\r\n.erp-table .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }\r\n.erp-table .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\r\n.erp-table .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\r\n.erp-table .py-1\\\\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }\r\n.erp-table .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\r\n.erp-table .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }\r\n.erp-table .p-0 { padding: 0; }\r\n.erp-table .p-1 { padding: 0.25rem; }\r\n.erp-table .p-1\\\\.5 { padding: 0.375rem; }\r\n.erp-table .p-2 { padding: 0.5rem; }\r\n.erp-table .p-3 { padding: 0.75rem; }\r\n.erp-table .pb-24 { padding-bottom: 6rem; }\r\n.erp-table .pt-5 { padding-top: 1.25rem; }\r\n.erp-table .m-0 { margin: 0; }\r\n.erp-table .m-12 { margin: 3rem; }\r\n.erp-table .my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; }\r\n.erp-table .ms-auto { margin-inline-start: auto; }\r\n.erp-table .start-1 { inset-inline-start: 0.25rem; }\r\n.erp-table .border { border-width: 1px; border-style: solid; border-color: var(--erp-border); }\r\n.erp-table .border-0 { border-width: 0; }\r\n.erp-table .border-b { border-bottom: 1px solid var(--erp-border); }\r\n.erp-table .border-t { border-top: 1px solid var(--erp-border); }\r\n.erp-table .border-dashed { border-style: dashed; }\r\n.erp-table .rounded { border-radius: var(--erp-radius); }\r\n.erp-table .rounded-t-lg { border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; }\r\n.erp-table .rounded-lg { border-radius: 0.5rem; }\r\n.erp-table .rounded-full { border-radius: 9999px; }\r\n.erp-table .rounded-sm { border-radius: 0.125rem; }\r\n.erp-table .sticky { position: sticky; }\r\n.erp-table .absolute { position: absolute; }\r\n.erp-table .relative { position: relative; }\r\n.erp-table .fixed { position: fixed; }\r\n.erp-table .inset-0 { inset: 0; }\r\n.erp-table .top-0 { top: 0; }\r\n.erp-table .top-1 { top: 0.25rem; }\r\n.erp-table .right-0 { right: 0; }\r\n.erp-table .left-0 { left: 0; }\r\n.erp-table .z-10 { z-index: 10; }\r\n.erp-table .z-20 { z-index: 20; }\r\n.erp-table .shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); }\r\n.erp-table .shadow-lg { box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1); }\r\n.erp-table .transition-all { transition: all 0.2s ease; }\r\n.erp-table .transition-colors { transition: color 0.15s ease, background-color 0.15s ease; }\r\n.erp-table .duration-200 { transition-duration: 200ms; }\r\n.erp-table .duration-300 { transition-duration: 300ms; }\r\n.erp-table .duration-400 { transition-duration: 400ms; }\r\n.erp-table .cursor-pointer { cursor: pointer; }\r\n.erp-table .cursor-text { cursor: text; }\r\n.erp-table .cursor-not-allowed { cursor: not-allowed; }\r\n.erp-table .cursor-grab { cursor: grab; }\r\n.erp-table .cursor-grabbing,\r\n.erp-table .active\\\\:cursor-grabbing:active { cursor: grabbing; }\r\n.erp-table .cursor-wait { cursor: wait; }\r\n.erp-table .cursor-col-resize { cursor: col-resize; }\r\n.erp-table .opacity-30 { opacity: 0.3; }\r\n.erp-table .opacity-40 { opacity: 0.4; }\r\n.erp-table .opacity-50 { opacity: 0.5; }\r\n.erp-table .opacity-60 { opacity: 0.6; }\r\n.erp-table .opacity-100 { opacity: 1; }\r\n.erp-table .line-through { text-decoration: line-through; }\r\n.erp-table .bg-transparent { background-color: transparent; }\r\n.erp-table .outline-none,\r\n.erp-table .focus\\\\:outline-none:focus,\r\n.erp-table .focus-visible\\\\:outline-none:focus-visible { outline: none; }\r\n.erp-table .ring-0,\r\n.erp-table .focus\\\\:ring-0:focus,\r\n.erp-table .focus\\\\:\\\\!ring-0:focus { box-shadow: none !important; }\r\n.erp-table .ring-2 { box-shadow: 0 0 0 2px var(--erp-search-match); }\r\n.erp-table .ring-yellow-400 { --tw-ring-color: var(--erp-search-match); }\r\n.erp-table .bg-main-white { background-color: var(--erp-bg); }\r\n.erp-table .bg-main-black { background-color: var(--erp-main-black); }\r\n.erp-table .bg-gray-gray3 { background-color: var(--erp-header-bg); }\r\n.erp-table .bg-gray-gray5,\r\n.erp-table .\\\\!bg-gray-gray5 { background-color: var(--erp-gray-5) !important; }\r\n.erp-table .bg-gray-100 { background-color: var(--erp-gray-100); }\r\n.erp-table .bg-blue-100 { background-color: var(--erp-row-selected); }\r\n.erp-table .bg-blue-blue11 { background-color: var(--erp-row-stripe); }\r\n.erp-table .bg-blue-blue6 { background-color: var(--erp-accent); }\r\n.erp-table .bg-red-300 { background-color: var(--erp-red-300); }\r\n.erp-table .bg-red-600 { background-color: var(--erp-danger); }\r\n.erp-table .bg-white,\r\n.erp-table .\\\\!bg-white { background-color: var(--erp-bg) !important; }\r\n.erp-table .text-main-white { color: var(--erp-main-white); }\r\n.erp-table .text-main-black { color: var(--erp-main-black); }\r\n.erp-table .text-gray-gray3 { color: var(--erp-gray-3); }\r\n.erp-table .text-gray-gray7 { color: var(--erp-gray-7); }\r\n.erp-table .text-gray-gray9 { color: var(--erp-gray-9); }\r\n.erp-table .text-gray-gray10 { color: var(--erp-gray-10); }\r\n.erp-table .stroke-gray-gray3 { stroke: var(--erp-gray-3); }\r\n.erp-table .stroke-gray-gray6 { stroke: var(--erp-gray-6); }\r\n.erp-table .stroke-gray-gray10 { stroke: var(--erp-gray-10); }\r\n.erp-table .stroke-gray-gray85 { stroke: var(--erp-gray-85); }\r\n.erp-table .fill-gray-gray6 { fill: var(--erp-gray-6); }\r\n.erp-table .fill-gray-gray7 { fill: var(--erp-gray-7); }\r\n.erp-table .fill-gray-gray8 { fill: var(--erp-gray-8); }\r\n.erp-table .fill-gray-gray10 { fill: var(--erp-gray-10); }\r\n.erp-table .fill-white { fill: var(--erp-bg); }\r\n.erp-table .text-black-black6 { color: var(--erp-fg); }\r\n.erp-table .text-blue-blue6 { color: var(--erp-accent); }\r\n.erp-table .text-red-600 { color: var(--erp-danger); }\r\n.erp-table .text-neutral-500 { color: var(--erp-muted); }\r\n.erp-table .border-gray-gray5 { border-color: var(--erp-border); }\r\n.erp-table .border-gray-gray7,\r\n.erp-table .\\\\!border-gray-gray7 { border-color: var(--erp-gray-7) !important; }\r\n.erp-table .border-gray-gray8 { border-color: var(--erp-gray-8); }\r\n.erp-table .border-gray-gray5 { border-color: var(--erp-border); }\r\n.erp-table .\\\\!border-\\\\[0\\\\.4px\\\\] { border-width: 0.4px !important; }\r\n.erp-table .hover\\\\:bg-red-100:hover { background-color: var(--erp-red-100); }\r\n.erp-table .hover\\\\:bg-zinc-200:hover { background-color: var(--erp-zinc-200); }\r\n.erp-table .disabled\\\\:opacity-40:disabled { opacity: 0.4; }\r\n.erp-table .animate-spin { animation: erp-table-spin 0.8s linear infinite; }\r\n.erp-table .bg-yellow-400 { background-color: var(--erp-search-match); }\r\n.erp-table .bg-yellow-200 { background-color: var(--erp-search-other); }\r\n.erp-table mark.bg-yellow-400 { background-color: var(--erp-search-match); font-weight: 600; }\r\n.erp-table mark.bg-yellow-200 { background-color: var(--erp-search-other); }\r\n.erp-table mark.erp-search-hit {\r\n background-color: var(--erp-search-other);\r\n color: inherit;\r\n}\r\n.erp-table mark.erp-search-hit.is-current {\r\n background-color: var(--erp-search-match);\r\n font-weight: 600;\r\n}\r\n.erp-table tfoot.erp-table-footer tr {\r\n background-color: var(--erp-bg);\r\n border-color: var(--erp-border);\r\n color: var(--erp-fg);\r\n height: var(--erp-row-height);\r\n}\r\n.erp-table tfoot.erp-table-footer td {\r\n color: var(--erp-fg);\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n/* PR-116: pinned top/bottom rows — sticky within the scrollport */\r\n.erp-table tbody.erp-pinned-rows--top {\r\n position: sticky;\r\n top: var(--erp-pinned-top-offset, var(--erp-row-height, 40px));\r\n z-index: 15;\r\n}\r\n.erp-table tbody.erp-pinned-rows--top tr.erp-pinned-row {\r\n background-color: var(--pdg-bg, var(--erp-bg));\r\n box-shadow: 0 1px 0 var(--pdg-border, var(--erp-border));\r\n}\r\n.erp-table tbody.erp-pinned-rows--bottom {\r\n position: sticky;\r\n bottom: var(--erp-pinned-bottom-offset, 0px);\r\n z-index: 15;\r\n}\r\n.erp-table tbody.erp-pinned-rows--bottom tr.erp-pinned-row {\r\n background-color: var(--pdg-bg, var(--erp-bg));\r\n box-shadow: 0 -1px 0 var(--pdg-border, var(--erp-border));\r\n}\r\n.erp-table tbody.erp-pinned-rows td {\r\n background-color: inherit;\r\n font-variant-numeric: tabular-nums;\r\n}\r\n.erp-table tbody.erp-pinned-rows .erp-col-pin-start,\r\n.erp-table tbody.erp-pinned-rows .erp-col-pin-index,\r\n.erp-table tbody.erp-pinned-rows .erp-col-pin-end {\r\n z-index: 16;\r\n}\r\n\r\n.erp-table .hidden-show-scrollBar {\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--erp-scrollbar) transparent;\r\n}\r\n.erp-table .hidden-show-scrollBar::-webkit-scrollbar {\r\n height: 6px;\r\n width: 6px;\r\n}\r\n.erp-table .hidden-show-scrollBar::-webkit-scrollbar-thumb {\r\n background: var(--erp-scrollbar);\r\n border-radius: 999px;\r\n}\r\n\r\n.erp-table .\\\\[overflow-anchor\\\\:none\\\\] { overflow-anchor: none; }\r\n\r\n.erp-table input,\r\n.erp-table select,\r\n.erp-table button {\r\n font-family: inherit;\r\n}\r\n\r\n.erp-table th,\r\n.erp-table td {\r\n vertical-align: middle;\r\n}\r\n\r\n@keyframes erp-table-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n/* Pagination (ERP antd look) */\r\n.erp-table-pagination {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-size: var(--erp-font-size);\r\n}\r\n.erp-table-pagination__pages {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n}\r\n.erp-table-pagination__page {\r\n min-width: 1.75rem;\r\n height: 1.75rem;\r\n padding: 0 0.4rem;\r\n border: 1px solid var(--erp-border);\r\n border-radius: var(--erp-radius);\r\n background: var(--erp-bg);\r\n cursor: pointer;\r\n}\r\n.erp-table-pagination__page.is-active {\r\n border-color: var(--erp-main-black);\r\n color: var(--erp-main-black);\r\n font-weight: 600;\r\n}\r\n.erp-table-pagination__page.is-active:hover {\r\n background: var(--erp-main-black);\r\n color: var(--erp-bg);\r\n}\r\n.erp-table-pagination__nav {\r\n display: inline-flex;\r\n margin: 0;\r\n padding: 0;\r\n border-radius: var(--erp-radius);\r\n width: fit-content;\r\n border: 1px solid var(--erp-border);\r\n background: var(--erp-bg);\r\n cursor: pointer;\r\n}\r\n.erp-table-pagination__nav:hover {\r\n border-color: var(--erp-main-black);\r\n}\r\n.erp-table-pagination__nav:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n.erp-table-pagination select {\r\n height: 1.75rem;\r\n min-width: 3.25rem;\r\n padding: 0 0.4rem;\r\n border: 1px solid var(--erp-border);\r\n border-radius: var(--erp-radius);\r\n background: var(--erp-bg);\r\n font-size: var(--erp-font-size);\r\n color: var(--erp-fg);\r\n cursor: pointer;\r\n}\r\n\r\n/* Modal */\r\n.erp-table-modal-overlay {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 11000;\r\n background: var(--erp-overlay);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n}\r\n\r\n/* Cell range selection (PR-105) */\r\n.pdg-cell-range {\r\n background: var(--pdg-range-bg, var(--erp-range-bg));\r\n}\r\n.pdg-cell-range[data-pdg-range-edge~='top'] {\r\n box-shadow: inset 0 2px 0 0 var(--pdg-range-border, var(--erp-range-border));\r\n}\r\n.pdg-cell-range[data-pdg-range-edge~='bottom'] {\r\n box-shadow: inset 0 -2px 0 0 var(--pdg-range-border, var(--erp-range-border));\r\n}\r\n.pdg-cell-range[data-pdg-range-edge~='left'] {\r\n box-shadow: inset 2px 0 0 0 var(--pdg-range-border, var(--erp-range-border));\r\n}\r\n.pdg-cell-range[data-pdg-range-edge~='right'] {\r\n box-shadow: inset -2px 0 0 0 var(--pdg-range-border, var(--erp-range-border));\r\n}\r\n\r\n/* Fill handle (PR-108) */\r\n.pdg-fill-handle {\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 2;\r\n width: 7px;\r\n height: 7px;\r\n margin: 0;\r\n padding: 0;\r\n border: 1px solid var(--pdg-range-border, var(--erp-range-border));\r\n background: var(--pdg-accent, var(--erp-accent));\r\n cursor: crosshair;\r\n touch-action: none;\r\n}\r\n\r\n/* Grid body overlays (PR-103) */\r\n.pdg-overlay {\r\n position: absolute;\r\n inset: 0;\r\n z-index: 5;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n pointer-events: none;\r\n background: color-mix(in srgb, var(--pdg-bg, var(--erp-bg)) 82%, transparent);\r\n color: var(--pdg-fg, var(--erp-fg));\r\n}\r\n.pdg-overlay[data-pdg-overlay='loading'] {\r\n pointer-events: auto;\r\n}\r\n.pdg-overlay__panel {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 0.75rem;\r\n padding: 1rem 1.25rem;\r\n font-size: var(--pdg-font-size, var(--erp-font-size));\r\n color: var(--pdg-muted, var(--erp-muted, var(--pdg-gray-9)));\r\n}\r\n.pdg-row-skeleton {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n height: 100%;\r\n min-height: calc(var(--pdg-row-height, 40px) - 8px);\r\n padding: 0 0.5rem;\r\n box-sizing: border-box;\r\n}\r\n.pdg-row-skeleton__bar {\r\n display: block;\r\n width: 70%;\r\n height: 0.55rem;\r\n border-radius: 999px;\r\n background: linear-gradient(\r\n 90deg,\r\n var(--pdg-gray-5) 0%,\r\n var(--pdg-gray-3) 45%,\r\n var(--pdg-gray-5) 90%\r\n );\r\n background-size: 200% 100%;\r\n animation: pdg-skeleton-shimmer 1.2s ease-in-out infinite;\r\n}\r\n.pdg-grid[data-erp-theme='dark'] .pdg-row-skeleton__bar {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--pdg-gray-7) 0%,\r\n var(--pdg-gray-6) 45%,\r\n var(--pdg-gray-7) 90%\r\n );\r\n background-size: 200% 100%;\r\n}\r\n@keyframes pdg-skeleton-shimmer {\r\n 0% {\r\n background-position: 100% 0;\r\n }\r\n 100% {\r\n background-position: -100% 0;\r\n }\r\n}\r\n\r\n.erp-table-modal {\r\n background: var(--erp-bg);\r\n border-radius: 0.5rem;\r\n width: min(720px, 100%);\r\n max-height: 90vh;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 20px 48px rgba(10, 21, 64, 0.18);\r\n}\r\n.erp-table-modal__header {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.75rem 1rem;\r\n border-bottom: 1px solid var(--erp-border);\r\n font-size: 14px;\r\n}\r\n.erp-table-modal__body {\r\n padding: 0.5rem;\r\n overflow: auto;\r\n flex: 1;\r\n}\r\n.erp-table-modal__close {\r\n margin-inline-start: auto;\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n font-size: 1.1rem;\r\n}\r\n\r\n/* Dropdown / tooltip / select */\r\n.erp-table-tooltip {\r\n position: absolute;\r\n z-index: 12000;\r\n background: var(--erp-black-6);\r\n color: var(--erp-bg);\r\n font-size: 11px;\r\n padding: 0.25rem 0.5rem;\r\n border-radius: var(--erp-radius);\r\n pointer-events: none;\r\n white-space: nowrap;\r\n}\r\n.erp-table-dropdown {\r\n position: absolute;\r\n z-index: 12000;\r\n background: var(--erp-bg);\r\n border: 1px solid var(--erp-border);\r\n border-radius: 0.375rem;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\r\n min-width: 10rem;\r\n max-height: 20rem;\r\n overflow: auto;\r\n padding: 0.25rem 0;\r\n}\r\n.erp-table-dropdown__item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 0.75rem;\r\n width: 100%;\r\n padding: 0.4rem 0.75rem;\r\n background: transparent;\r\n border: 0;\r\n cursor: pointer;\r\n font-size: 13px;\r\n text-align: start;\r\n}\r\n.erp-table-dropdown__item:hover { background: var(--erp-header-bg); }\r\n.erp-table-dropdown__divider {\r\n height: 1px;\r\n background: var(--erp-border);\r\n margin: 0.25rem 0;\r\n}\r\n\r\n\r\n/* DynamicSelect root (host: h-[2.125rem] w-full rounded !bg-gray-gray3, 50% when disabled) */\r\n.pdg-dynamic-select {\r\n width: 100%;\r\n height: 2.125rem;\r\n border-radius: 0.25rem;\r\n background-color: var(--pdg-gray-3);\r\n}\r\n.pdg-dynamic-select.is-disabled { opacity: 0.5; }\r\n\r\n/* Date cell (react-persian-range-picker DatePicker; host: h-[2.125rem] text-sm bg-gray-3 px-2 rounded-sm) */\r\n.pdg-date-picker {\r\n width: 100%;\r\n height: 2.125rem;\r\n padding: 0 0.5rem;\r\n font-size: 0.875rem;\r\n border: none;\r\n border-radius: 0.125rem;\r\n background-color: var(--pdg-gray-3);\r\n}\r\n.pdg-date-picker.is-disabled {\r\n background-color: var(--pdg-gray-5);\r\n color: var(--pdg-gray-7);\r\n}\r\n\r\n.erp-table-checkbox {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n width: 16px;\r\n height: 16px;\r\n min-width: 16px;\r\n margin: 0;\r\n border: 1px solid var(--erp-scrollbar);\r\n border-radius: 4px;\r\n background: var(--erp-bg);\r\n cursor: pointer;\r\n display: inline-block;\r\n position: relative;\r\n vertical-align: middle;\r\n flex-shrink: 0;\r\n}\r\n.erp-table-checkbox:checked {\r\n background: var(--erp-main-black);\r\n border-color: var(--erp-main-black);\r\n}\r\n.erp-table-checkbox:checked::after {\r\n content: '';\r\n position: absolute;\r\n inset-inline-start: 4px;\r\n top: 1px;\r\n width: 5px;\r\n height: 9px;\r\n border: 2px solid var(--erp-bg);\r\n border-top: 0;\r\n border-inline-start: 0;\r\n transform: rotate(45deg);\r\n}\r\n.erp-table-checkbox:disabled {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n}\r\n\r\n.erp-table-toast {\r\n position: fixed;\r\n z-index: 14000;\r\n bottom: 1.25rem;\r\n inset-inline-end: 1.25rem;\r\n padding: 0.6rem 0.9rem;\r\n border-radius: 0.4rem;\r\n font-size: var(--erp-font-size);\r\n color: var(--erp-bg);\r\n box-shadow: 0 0 16px rgba(0, 0, 0, 0.1);\r\n}\r\n.erp-table-toast.is-success { background: var(--erp-success); }\r\n.erp-table-toast.is-error { background: var(--erp-error); }\r\n\r\n.erp-table-date {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n}\r\n.erp-table-date .erp-table-select__control,\r\n.erp-table-date input,\r\n.erp-table-date .pdg-date-range__trigger {\r\n height: 2.25rem;\r\n width: 100%;\r\n background: var(--erp-header-bg);\r\n border: none;\r\n border-radius: 0.125rem;\r\n font-size: var(--erp-font-size);\r\n padding: 0 0.5rem;\r\n text-align: inherit;\r\n cursor: pointer;\r\n}\r\n\r\n/* Internal Jalali calendar / range picker (PR-140) */\r\n.pdg-date-range__popover {\r\n position: absolute;\r\n z-index: 40;\r\n top: calc(100% + 2px);\r\n inset-inline-start: 0;\r\n min-width: 16rem;\r\n padding: 0.5rem;\r\n background: var(--pdg-bg);\r\n border: 1px solid var(--pdg-border);\r\n border-radius: 0.375rem;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\r\n}\r\n.pdg-date-range__actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 0.35rem;\r\n}\r\n.pdg-date-range__clear {\r\n background: transparent;\r\n border: 0;\r\n font-size: 0.75rem;\r\n cursor: pointer;\r\n color: var(--pdg-accent);\r\n padding: 0.25rem 0.5rem;\r\n}\r\n.pdg-jalali-cal {\r\n font-size: 0.75rem;\r\n user-select: none;\r\n}\r\n.pdg-jalali-cal__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 0.35rem;\r\n gap: 0.25rem;\r\n}\r\n.pdg-jalali-cal__title {\r\n font-weight: 600;\r\n flex: 1;\r\n text-align: center;\r\n}\r\n.pdg-jalali-cal__nav {\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n width: 1.75rem;\r\n height: 1.75rem;\r\n border-radius: 0.25rem;\r\n font-size: 1rem;\r\n line-height: 1;\r\n color: var(--pdg-fg);\r\n}\r\n.pdg-jalali-cal__nav:hover {\r\n background: var(--pdg-row-stripe);\r\n}\r\n.pdg-jalali-cal__weekdays,\r\n.pdg-jalali-cal__grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n}\r\n.pdg-jalali-cal__wd {\r\n text-align: center;\r\n opacity: 0.65;\r\n padding: 0.15rem 0;\r\n}\r\n.pdg-jalali-cal__day {\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n aspect-ratio: 1;\r\n border-radius: 0.25rem;\r\n font-size: 0.75rem;\r\n color: var(--pdg-fg);\r\n}\r\n.pdg-jalali-cal__day.is-outside {\r\n opacity: 0.35;\r\n}\r\n.pdg-jalali-cal__day.is-holiday:not(.is-selected) {\r\n color: var(--pdg-danger);\r\n font-weight: 600;\r\n}\r\n.pdg-jalali-cal__day.is-today:not(.is-selected) {\r\n outline: 1px solid var(--pdg-accent);\r\n}\r\n.pdg-jalali-cal__day:hover:not(.is-selected) {\r\n background: var(--pdg-row-stripe);\r\n}\r\n\r\n.erp-table-desktop__toolbar {\r\n padding: 0.5rem 0.25rem 0.35rem;\r\n}\r\n\r\n.erp-table-index-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: transparent;\r\n border: 0;\r\n padding: 0.125rem;\r\n border-radius: 0.125rem;\r\n cursor: pointer;\r\n line-height: 0;\r\n}\r\n\r\n.erp-table th[data-pdg-sortable='true'] {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.erp-table .pdg-header-label {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n min-width: 0;\r\n max-width: calc(100% - 0.5rem);\r\n}\r\n\r\n.erp-table .pdg-header-caption {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.erp-table .pdg-sort-indicator {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.15rem;\r\n flex-shrink: 0;\r\n color: var(--pdg-accent, var(--erp-accent));\r\n font-size: 0.65rem;\r\n line-height: 1;\r\n}\r\n\r\n.erp-table .pdg-sort-icon {\r\n opacity: 0.9;\r\n}\r\n\r\n.erp-table .pdg-sort-priority {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-inline-size: 0.9rem;\r\n padding-inline: 0.15rem;\r\n border-radius: 0.2rem;\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 18%, transparent);\r\n color: var(--pdg-accent, var(--erp-accent));\r\n font-size: 0.6rem;\r\n font-weight: 600;\r\n}\r\n\r\n.erp-table .pdg-filter-btn-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-inline-start: 0.15rem;\r\n padding: 0.05rem 0.2rem;\r\n border: 0;\r\n border-radius: 0.2rem;\r\n background: transparent;\r\n color: var(--pdg-fg-muted, var(--erp-fg-muted));\r\n font-size: 0.55rem;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.erp-table .pdg-filter-btn-icon.is-active,\r\n.erp-table th[data-pdg-filter-active='true'] .pdg-filter-btn-icon {\r\n color: var(--pdg-accent, var(--erp-accent));\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 16%, transparent);\r\n}\r\n\r\n.pdg-filter-popover {\r\n min-width: 12rem;\r\n max-width: 18rem;\r\n padding: 0.5rem;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 0.375rem;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: var(--pdg-fg, var(--erp-fg));\r\n box-shadow: 0 8px 24px color-mix(in srgb, var(--pdg-fg, var(--erp-fg)) 18%, transparent);\r\n}\r\n\r\n.pdg-filter-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.4rem;\r\n}\r\n\r\n.pdg-filter-select,\r\n.pdg-filter-input,\r\n.pdg-floating-filter-input {\r\n width: 100%;\r\n min-height: 1.75rem;\r\n padding: 0.2rem 0.35rem;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 0.25rem;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: inherit;\r\n font-size: 0.75rem;\r\n}\r\n\r\n.pdg-filter-actions {\r\n display: flex;\r\n gap: 0.35rem;\r\n justify-content: flex-end;\r\n}\r\n\r\n.pdg-filter-btn {\r\n padding: 0.2rem 0.45rem;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 0.25rem;\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 12%, transparent);\r\n color: inherit;\r\n font-size: 0.7rem;\r\n cursor: pointer;\r\n}\r\n\r\n.pdg-filter-check {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n font-size: 0.75rem;\r\n}\r\n\r\n.pdg-filter-set-list {\r\n max-height: 10rem;\r\n overflow: auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.25rem;\r\n}\r\n\r\n.erp-table .pdg-floating-filter-row {\r\n background: var(--pdg-bg-muted, var(--erp-bg-muted));\r\n}\r\n\r\n.erp-table .pdg-floating-filter-cell {\r\n padding: 0.25rem;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n font-weight: normal;\r\n}\r\n\r\n.erp-table .erp-col-resize {\r\n position: absolute;\r\n inset-block: 0;\r\n inset-inline-end: 0;\r\n width: 6px;\r\n padding: 0;\r\n margin: 0;\r\n border: 0;\r\n background: transparent;\r\n cursor: col-resize;\r\n touch-action: none;\r\n z-index: 2;\r\n}\r\n\r\n.erp-table .erp-col-resize:hover,\r\n.erp-table .erp-col-resize:focus-visible {\r\n background: var(--erp-accent);\r\n opacity: 0.35;\r\n}\r\n\r\nbody.erp-col-resizing,\r\nbody.erp-col-resizing * {\r\n cursor: col-resize;\r\n user-select: none;\r\n}\r\n\r\n.erp-table th[data-erp-col-drag] {\r\n cursor: grab;\r\n}\r\n\r\n.erp-table th[data-erp-col-drop] {\r\n box-shadow: inset 0 0 0 2px var(--erp-accent);\r\n}\r\n\r\n.erp-table .erp-col-group-header {\r\n font-weight: 600;\r\n vertical-align: middle;\r\n}\r\n\r\n.erp-table .erp-col-group-toggle {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n font: inherit;\r\n color: inherit;\r\n padding: 0;\r\n}\r\n\r\n.pdg-col-menu-btn {\r\n margin-inline-start: 0.25rem;\r\n padding: 0 0.25rem;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n font-size: 0.875rem;\r\n line-height: 1;\r\n color: var(--pdg-muted, var(--erp-muted));\r\n}\r\n\r\n.pdg-col-menu-btn:hover {\r\n color: var(--pdg-accent, inherit);\r\n}\r\n\r\n.erp-col-menu {\r\n min-width: 11rem;\r\n padding: 0.25rem 0;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 0.375rem;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: var(--pdg-fg, var(--erp-fg));\r\n box-shadow: 0 8px 24px color-mix(in srgb, var(--pdg-fg, var(--erp-fg)) 18%, transparent);\r\n}\r\n\r\n.erp-col-menu__item {\r\n display: block;\r\n width: 100%;\r\n padding: 0.375rem 0.75rem;\r\n border: none;\r\n background: transparent;\r\n text-align: start;\r\n font: inherit;\r\n font-size: 0.75rem;\r\n cursor: pointer;\r\n color: inherit;\r\n}\r\n\r\n.erp-col-menu__item:hover,\r\n.erp-col-menu__item.is-focused {\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 12%, transparent);\r\n}\r\n\r\n.erp-col-menu__item:disabled {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n}\r\n\r\n.erp-col-menu__separator {\r\n height: 1px;\r\n margin: 0.25rem 0;\r\n background: var(--pdg-border, var(--erp-border));\r\n}\r\n\r\n.erp-col-columns-panel__title {\r\n padding: 0.375rem 0.75rem;\r\n font-size: 0.75rem;\r\n font-weight: 600;\r\n border-bottom: 1px solid var(--pdg-border, var(--erp-border));\r\n}\r\n\r\n.erp-col-columns-panel__list {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0.25rem 0;\r\n max-height: 16rem;\r\n overflow: auto;\r\n}\r\n\r\n.erp-col-columns-panel__row {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.25rem 0.75rem;\r\n font-size: 0.75rem;\r\n cursor: pointer;\r\n}\r\n\r\n.erp-col-columns-panel__row:hover {\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 12%, transparent);\r\n}\r\n\r\n.erp-table .erp-col-pin-start,\r\n.erp-table .erp-col-pin-index {\r\n position: sticky;\r\n z-index: 2;\r\n background-color: inherit;\r\n}\r\n\r\n.erp-table .erp-col-pin-end {\r\n position: sticky;\r\n z-index: 2;\r\n background-color: inherit;\r\n}\r\n\r\n.erp-table thead .erp-col-pin-start,\r\n.erp-table thead .erp-col-pin-index,\r\n.erp-table thead .erp-col-pin-end {\r\n z-index: 4;\r\n background-color: var(--erp-header-bg);\r\n}\r\n\r\n.erp-table tfoot .erp-col-pin-start,\r\n.erp-table tfoot .erp-col-pin-index,\r\n.erp-table tfoot .erp-col-pin-end {\r\n z-index: 3;\r\n background-color: var(--erp-bg);\r\n}\r\n\r\n.erp-table[dir=\"ltr\"] .erp-col-pin-start,\r\n.erp-table[dir=\"ltr\"] .erp-col-pin-index {\r\n box-shadow: 4px 0 8px -6px rgb(0 0 0 / 0.22);\r\n}\r\n\r\n.erp-table[dir=\"rtl\"] .erp-col-pin-start,\r\n.erp-table[dir=\"rtl\"] .erp-col-pin-index {\r\n box-shadow: -4px 0 8px -6px rgb(0 0 0 / 0.22);\r\n}\r\n\r\n.erp-table[dir=\"ltr\"] .erp-col-pin-end {\r\n box-shadow: -4px 0 8px -6px rgb(0 0 0 / 0.22);\r\n}\r\n\r\n.erp-table[dir=\"rtl\"] .erp-col-pin-end {\r\n box-shadow: 4px 0 8px -6px rgb(0 0 0 / 0.22);\r\n}\r\n\r\n.erp-table .erp-toolbar-btn:focus-visible {\r\n outline: 2px solid var(--erp-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* PR-124: cell editors expose a visible focus ring (APG). */\r\n.erp-table .pdg-cell-editor:focus-visible,\r\n.pdg-grid .pdg-cell-editor:focus-visible {\r\n outline: 2px solid var(--pdg-accent, var(--erp-accent));\r\n outline-offset: 1px;\r\n}\r\n\r\n/* PR-125: polite announcements for AT; keep out of visual layout. */\r\n.pdg-live-region {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* PR-136: product audit history panel */\r\n.pdg-history-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n min-width: 220px;\r\n max-width: 360px;\r\n max-height: 100%;\r\n padding: 10px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 6px;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: var(--pdg-fg, var(--erp-fg));\r\n font-size: 12px;\r\n box-sizing: border-box;\r\n}\r\n.pdg-history-panel__header {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n.pdg-history-panel__title {\r\n margin: 0;\r\n font-size: 14px;\r\n font-weight: 600;\r\n}\r\n.pdg-history-panel__filters {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 6px;\r\n}\r\n.pdg-history-panel__filter {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n.pdg-history-panel__filter select {\r\n font: inherit;\r\n padding: 4px 6px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 4px;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: inherit;\r\n}\r\n.pdg-history-panel__empty {\r\n margin: 0;\r\n opacity: 0.7;\r\n}\r\n.pdg-history-panel__list {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n overflow: auto;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n.pdg-history-panel__item {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 4px;\r\n padding: 6px;\r\n background: var(--pdg-bg-muted, var(--erp-bg-muted));\r\n}\r\n.pdg-history-panel__item[data-pdg-history-severity='warning'] {\r\n border-color: var(--pdg-warning, var(--erp-warning, var(--erp-accent)));\r\n}\r\n.pdg-history-panel__item[data-pdg-history-severity='error'] {\r\n border-color: var(--pdg-danger, var(--erp-danger));\r\n}\r\n.pdg-history-panel__jump {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n align-items: flex-start;\r\n width: 100%;\r\n padding: 0;\r\n border: 0;\r\n background: transparent;\r\n color: inherit;\r\n text-align: inherit;\r\n font: inherit;\r\n cursor: pointer;\r\n}\r\n.pdg-history-panel__jump:disabled {\r\n cursor: default;\r\n opacity: 0.85;\r\n}\r\n.pdg-history-panel__jump:not(:disabled):hover .pdg-history-panel__item-title {\r\n color: var(--pdg-accent, var(--erp-accent));\r\n}\r\n.pdg-history-panel__item-title {\r\n font-weight: 600;\r\n}\r\n.pdg-history-panel__item-meta {\r\n opacity: 0.65;\r\n font-size: 11px;\r\n}\r\n.pdg-history-panel__item-desc {\r\n opacity: 0.85;\r\n}\r\n.pdg-history-panel__restore {\r\n align-self: flex-start;\r\n font: inherit;\r\n font-size: 11px;\r\n padding: 3px 8px;\r\n border-radius: 4px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n background: var(--pdg-bg, var(--erp-bg));\r\n color: var(--pdg-accent, var(--erp-accent));\r\n cursor: pointer;\r\n}\r\n.pdg-history-panel__restore:hover {\r\n border-color: var(--pdg-accent, var(--erp-accent));\r\n}\r\n\r\n/* PR-137: offline / pending mutations status */\r\n.pdg-offline-status {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n padding: 8px 10px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 6px;\r\n background: var(--pdg-bg-muted, var(--erp-bg-muted));\r\n color: var(--pdg-fg, var(--erp-fg));\r\n font-size: 12px;\r\n}\r\n.pdg-offline-status[data-pdg-connectivity='offline'] {\r\n border-color: var(--pdg-warning, var(--erp-warning, var(--erp-accent)));\r\n}\r\n.pdg-offline-status__row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.pdg-offline-status__badge {\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 2px 8px;\r\n border-radius: 999px;\r\n font-weight: 600;\r\n font-size: 11px;\r\n background: color-mix(in srgb, var(--pdg-accent, var(--erp-accent)) 16%, transparent);\r\n}\r\n.pdg-offline-status[data-pdg-connectivity='offline'] .pdg-offline-status__badge {\r\n background: color-mix(\r\n in srgb,\r\n var(--pdg-warning, var(--erp-warning, var(--erp-accent))) 22%,\r\n transparent\r\n );\r\n}\r\n.pdg-offline-status__pending {\r\n opacity: 0.9;\r\n}\r\n.pdg-offline-status__queue {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n max-height: 8rem;\r\n overflow: auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n.pdg-offline-status__queue li {\r\n padding: 4px 6px;\r\n border-radius: 4px;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n}\r\n\r\n.pdg-sync-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 8px 10px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 6px;\r\n background: var(--pdg-surface, var(--erp-surface));\r\n color: var(--pdg-text, var(--erp-text));\r\n font-size: 0.875rem;\r\n}\r\n.pdg-sync-panel__row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.pdg-sync-panel__policy {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n.pdg-sync-panel__policy select,\r\n.pdg-sync-panel button {\r\n font: inherit;\r\n color: inherit;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 4px;\r\n padding: 4px 8px;\r\n cursor: pointer;\r\n}\r\n.pdg-sync-panel button:disabled,\r\n.pdg-sync-panel select:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n.pdg-sync-panel__status {\r\n margin: 0;\r\n opacity: 0.85;\r\n}\r\n.pdg-sync-panel__conflicts {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n}\r\n.pdg-sync-panel__conflicts li {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n align-items: center;\r\n padding: 6px 8px;\r\n border-radius: 4px;\r\n background: var(--pdg-bg, var(--erp-bg));\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n}\r\n.pdg-sync-panel__conflict-key {\r\n font-weight: 600;\r\n color: var(--pdg-accent, var(--erp-accent));\r\n}\r\n.pdg-sync-panel__conflict-actions {\r\n display: flex;\r\n gap: 6px;\r\n margin-inline-start: auto;\r\n}\r\n\r\n.pdg-presence-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n padding: 8px 10px;\r\n border: 1px solid var(--pdg-border, var(--erp-border));\r\n border-radius: 6px;\r\n background: var(--pdg-surface, var(--erp-surface));\r\n color: var(--pdg-text, var(--erp-text));\r\n font-size: 0.875rem;\r\n}\r\n.pdg-presence-panel__title {\r\n font-weight: 600;\r\n}\r\n.pdg-presence-panel__empty {\r\n margin: 0;\r\n opacity: 0.75;\r\n}\r\n.pdg-presence-panel__list {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n.pdg-presence-panel__list li {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.pdg-presence-panel__dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n.pdg-presence-panel__cell {\r\n opacity: 0.8;\r\n margin-inline-start: auto;\r\n}\r\n\r\n`;\n\nexport function injectGridStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n el.textContent = CSS;\n document.head.appendChild(el);\n}\n\n/** @deprecated Use `injectGridStyles()` (PR-77 / D16). */\nexport function injectERPTableStyles(): void {\n injectGridStyles();\n}\n","'use client';\r\n\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\n\r\nimport type {\r\n HistoryCategory,\r\n HistoryItem,\r\n HistorySeverity,\r\n} from '../../infrastructure/history/HistoryPanelViewModel';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useTranslations } from '../host';\r\nimport { revealRow } from '../gridSearch/utils';\r\n\r\nexport type GridHistoryPanelProps = {\r\n controller: UITableController;\r\n /** Max timeline rows (newest last in the ViewModel; we reverse for display). */\r\n limit?: number;\r\n className?: string;\r\n /** Fires after jump-to-cell (for hosts that want to close a drawer). */\r\n onNavigate?: (item: HistoryItem) => void;\r\n};\r\n\r\nfunction payloadCell(\r\n item: HistoryItem,\r\n): { rowId: number; columnId: string } | null {\r\n const payload = item.raw.payload as Record<string, unknown> | null;\r\n if (!payload) return null;\r\n const rowRaw = payload.rowId;\r\n const columnId = payload.columnId;\r\n if (typeof columnId !== 'string' || columnId.length === 0) return null;\r\n const rowId =\r\n typeof rowRaw === 'number'\r\n ? rowRaw\r\n : typeof rowRaw === 'string'\r\n ? Number(rowRaw)\r\n : NaN;\r\n if (!Number.isFinite(rowId)) return null;\r\n return { rowId, columnId };\r\n}\r\n\r\nfunction canRestore(item: HistoryItem): boolean {\r\n if (item.type !== 'CELL_CHANGED') return false;\r\n const payload = item.raw.payload as Record<string, unknown> | null;\r\n return Boolean(payload && 'previousValue' in payload && payloadCell(item));\r\n}\r\n\r\nfunction formatWhen(ts: number, locale: string): string {\r\n try {\r\n return new Intl.DateTimeFormat(locale, {\r\n dateStyle: 'short',\r\n timeStyle: 'medium',\r\n }).format(new Date(ts));\r\n } catch {\r\n return new Date(ts).toISOString();\r\n }\r\n}\r\n\r\nconst SEVERITIES: Array<HistorySeverity | ''> = [\r\n '',\r\n 'info',\r\n 'warning',\r\n 'error',\r\n];\r\nconst CATEGORIES: Array<HistoryCategory | ''> = [\r\n '',\r\n 'data',\r\n 'structure',\r\n 'view',\r\n 'system',\r\n];\r\n\r\n/**\r\n * Product audit timeline (PR-136). Subscribes to `HistoryPanelViewModel`\r\n * via the controller; jump focuses a cell; restore writes previousValue.\r\n */\r\nexport function GridHistoryPanel({\r\n controller,\r\n limit = 100,\r\n className,\r\n onNavigate,\r\n}: GridHistoryPanelProps) {\r\n const t = useTranslations();\r\n const [items, setItems] = useState<HistoryItem[]>([]);\r\n const [severity, setSeverity] = useState<HistorySeverity | ''>('');\r\n const [category, setCategory] = useState<HistoryCategory | ''>('');\r\n\r\n const filter = useMemo(\r\n () => ({\r\n ...(severity ? { severity } : {}),\r\n ...(category ? { category } : {}),\r\n limit,\r\n }),\r\n [severity, category, limit],\r\n );\r\n\r\n useEffect(() => {\r\n setItems(controller.getHistoryItems(filter));\r\n return controller.subscribeHistoryItems(setItems, filter);\r\n }, [controller, filter]);\r\n\r\n const timeline = useMemo(() => [...items].reverse(), [items]);\r\n\r\n const jumpTo = async (item: HistoryItem) => {\r\n const cell = payloadCell(item);\r\n if (!cell) return;\r\n await revealRow(controller, cell.rowId);\r\n await controller.dispatch({\r\n type: 'UI_ACTIVE_CELL',\r\n rowId: cell.rowId,\r\n columnId: cell.columnId,\r\n });\r\n onNavigate?.(item);\r\n };\r\n\r\n const restore = async (item: HistoryItem) => {\r\n const cell = payloadCell(item);\r\n const payload = item.raw.payload as Record<string, unknown> | null;\r\n if (!cell || !payload || !('previousValue' in payload)) return;\r\n // Ensure we write through (not a session draft patch).\r\n controller.cancelCellEdit();\r\n await controller.dispatch({\r\n type: 'UI_CELL_CHANGE',\r\n rowId: cell.rowId,\r\n columnId: cell.columnId,\r\n value: payload.previousValue,\r\n });\r\n await jumpTo(item);\r\n };\r\n\r\n return (\r\n <aside\r\n className={['pdg-history-panel', className].filter(Boolean).join(' ')}\r\n data-pdg-history-panel=\"\"\r\n aria-label={t('history.title')}\r\n >\r\n <header className=\"pdg-history-panel__header\">\r\n <h2 className=\"pdg-history-panel__title\">{t('history.title')}</h2>\r\n <div className=\"pdg-history-panel__filters\">\r\n <label className=\"pdg-history-panel__filter\">\r\n <span>{t('history.severity')}</span>\r\n <select\r\n data-pdg-history-severity=\"\"\r\n value={severity}\r\n onChange={(e) =>\r\n setSeverity(e.target.value as HistorySeverity | '')\r\n }\r\n >\r\n {SEVERITIES.map((s) => (\r\n <option key={s || 'all'} value={s}>\r\n {s ? t(`history.severity.${s}`) : t('history.filterAll')}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label className=\"pdg-history-panel__filter\">\r\n <span>{t('history.category')}</span>\r\n <select\r\n data-pdg-history-category=\"\"\r\n value={category}\r\n onChange={(e) =>\r\n setCategory(e.target.value as HistoryCategory | '')\r\n }\r\n >\r\n {CATEGORIES.map((c) => (\r\n <option key={c || 'all'} value={c}>\r\n {c ? t(`history.category.${c}`) : t('history.filterAll')}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n </div>\r\n </header>\r\n\r\n {timeline.length === 0 ? (\r\n <p className=\"pdg-history-panel__empty\" data-pdg-history-empty=\"\">\r\n {t('history.empty')}\r\n </p>\r\n ) : (\r\n <ol className=\"pdg-history-panel__list\" data-pdg-history-list=\"\">\r\n {timeline.map((item) => {\r\n const cell = payloadCell(item);\r\n return (\r\n <li\r\n key={item.id}\r\n className=\"pdg-history-panel__item\"\r\n data-pdg-history-item={item.id}\r\n data-pdg-history-type={item.type}\r\n data-pdg-history-severity={item.severity}\r\n data-pdg-history-category={item.category}\r\n >\r\n <button\r\n type=\"button\"\r\n className=\"pdg-history-panel__jump\"\r\n data-pdg-history-jump=\"\"\r\n disabled={!cell}\r\n onClick={() => void jumpTo(item)}\r\n >\r\n <span className=\"pdg-history-panel__item-title\">\r\n {item.title}\r\n </span>\r\n <span className=\"pdg-history-panel__item-meta\">\r\n {item.actorId} · {formatWhen(item.occurredAt, 'en')}\r\n </span>\r\n <span className=\"pdg-history-panel__item-desc\">\r\n {item.description}\r\n </span>\r\n </button>\r\n {canRestore(item) ? (\r\n <button\r\n type=\"button\"\r\n className=\"pdg-history-panel__restore\"\r\n data-pdg-history-restore=\"\"\r\n onClick={() => void restore(item)}\r\n >\r\n {t('history.restore')}\r\n </button>\r\n ) : null}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n )}\r\n </aside>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport type {\r\n Connectivity,\r\n PendingChange,\r\n} from '../../application/offline/OfflineStatus';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useTranslations } from '../host';\r\n\r\nexport type GridOfflineStatusProps = {\r\n controller: UITableController;\r\n className?: string;\r\n /** Show the pending mutation list (default true). */\r\n showQueue?: boolean;\r\n};\r\n\r\n/**\r\n * Online/offline badge + pending local mutations (PR-137).\r\n */\r\nexport function GridOfflineStatus({\r\n controller,\r\n className,\r\n showQueue = true,\r\n}: GridOfflineStatusProps) {\r\n const t = useTranslations();\r\n const [connectivity, setConnectivity] = useState<Connectivity>(() =>\r\n controller.getConnectivity(),\r\n );\r\n const [pending, setPending] = useState<readonly PendingChange[]>(() =>\r\n controller.getPendingChanges(),\r\n );\r\n\r\n useEffect(() => {\r\n const unsubConn = controller.subscribeConnectivity(setConnectivity);\r\n const unsubPending = controller.subscribePendingChanges(setPending);\r\n return () => {\r\n unsubConn();\r\n unsubPending();\r\n };\r\n }, [controller]);\r\n\r\n const count = pending.length;\r\n const pendingLabel =\r\n count === 0\r\n ? t('offline.pendingEmpty')\r\n : t('offline.pendingCount', { count });\r\n\r\n return (\r\n <aside\r\n className={['pdg-offline-status', className].filter(Boolean).join(' ')}\r\n data-pdg-offline-status=\"\"\r\n data-pdg-connectivity={connectivity}\r\n aria-live=\"polite\"\r\n >\r\n <div className=\"pdg-offline-status__row\">\r\n <span\r\n className=\"pdg-offline-status__badge\"\r\n data-pdg-offline-badge=\"\"\r\n >\r\n {connectivity === 'online'\r\n ? t('offline.online')\r\n : t('offline.offline')}\r\n </span>\r\n <span\r\n className=\"pdg-offline-status__pending\"\r\n data-pdg-offline-pending-count={count}\r\n >\r\n {pendingLabel}\r\n </span>\r\n </div>\r\n {showQueue && count > 0 ? (\r\n <ol className=\"pdg-offline-status__queue\" data-pdg-offline-queue=\"\">\r\n {pending.map((item) => (\r\n <li\r\n key={item.eventId}\r\n data-pdg-offline-queue-item={item.eventId}\r\n data-pdg-offline-queue-type={item.type}\r\n >\r\n {item.summary}\r\n </li>\r\n ))}\r\n </ol>\r\n ) : null}\r\n </aside>\r\n );\r\n}\r\n","export type BenchmarkSample = {\r\n readonly name: string;\r\n readonly iterations: number;\r\n readonly totalMs: number;\r\n readonly avgMs: number;\r\n readonly maxMs: number;\r\n};\r\n\r\nexport type PerformanceBudget = {\r\n readonly name: string;\r\n /** Maximum allowed average milliseconds per iteration. */\r\n readonly maxAvgMs: number;\r\n /** Maximum allowed single-iteration milliseconds. */\r\n readonly maxMaxMs?: number;\r\n};\r\n\r\nexport type BenchmarkResult = {\r\n readonly sample: BenchmarkSample;\r\n readonly budget: PerformanceBudget;\r\n readonly ok: boolean;\r\n readonly reasons: string[];\r\n};\r\n\r\n/**\r\n * Tiny synchronous/async micro-benchmark helper for core hot paths.\r\n * Not a substitute for browser profiling — guards CI regressions.\r\n */\r\nexport async function runBenchmark(\r\n name: string,\r\n iterations: number,\r\n fn: () => void | Promise<void>,\r\n): Promise<BenchmarkSample> {\r\n // Warmup\r\n await fn();\r\n\r\n let totalMs = 0;\r\n let maxMs = 0;\r\n for (let i = 0; i < iterations; i += 1) {\r\n const start = performance.now();\r\n await fn();\r\n const elapsed = performance.now() - start;\r\n totalMs += elapsed;\r\n if (elapsed > maxMs) maxMs = elapsed;\r\n }\r\n\r\n return {\r\n name,\r\n iterations,\r\n totalMs,\r\n avgMs: totalMs / iterations,\r\n maxMs,\r\n };\r\n}\r\n\r\nexport function checkBudget(\r\n sample: BenchmarkSample,\r\n budget: PerformanceBudget,\r\n): BenchmarkResult {\r\n const reasons: string[] = [];\r\n if (sample.avgMs > budget.maxAvgMs) {\r\n reasons.push(\r\n `avg ${sample.avgMs.toFixed(3)}ms exceeds budget ${budget.maxAvgMs}ms`,\r\n );\r\n }\r\n if (budget.maxMaxMs != null && sample.maxMs > budget.maxMaxMs) {\r\n reasons.push(\r\n `max ${sample.maxMs.toFixed(3)}ms exceeds budget ${budget.maxMaxMs}ms`,\r\n );\r\n }\r\n return {\r\n sample,\r\n budget,\r\n ok: reasons.length === 0,\r\n reasons,\r\n };\r\n}\r\n\r\n/** Default budgets for Phase 4 CI guards (generous for CI variance). */\r\nexport const DEFAULT_PERFORMANCE_BUDGETS = {\r\n inMemoryAppend100: {\r\n name: 'inMemoryAppend100',\r\n maxAvgMs: 25,\r\n maxMaxMs: 80,\r\n },\r\n indexedDbAppend100: {\r\n name: 'indexedDbAppend100',\r\n maxAvgMs: 80,\r\n maxMaxMs: 200,\r\n },\r\n selectorNotifyNoop: {\r\n name: 'selectorNotifyNoop',\r\n maxAvgMs: 5,\r\n maxMaxMs: 20,\r\n },\r\n /** PR-99: one arrow-key neighbor lookup on a 100k SparseRowIndex. */\r\n arrowNeighbor100k: {\r\n name: 'arrowNeighbor100k',\r\n maxAvgMs: 2,\r\n // Single-iteration spikes from GC under the 100k harness (PR-100).\r\n maxMaxMs: 20,\r\n },\r\n} as const satisfies Record<string, PerformanceBudget>;\r\n","\"use client\";\r\n\r\nimport React, { useCallback, useRef } from 'react';\r\n\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport { useVirtualWindow } from './useVirtualWindow';\r\n\r\nexport type VirtualListProps<T> = {\r\n session: GridSession;\r\n items: readonly T[];\r\n /** Scrollport height in pixels. */\r\n height: number;\r\n rowHeight?: number;\r\n overscan?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n getItemKey?: (item: T, absoluteIndex: number) => string | number;\r\n renderItem: (item: T, absoluteIndex: number) => React.ReactNode;\r\n};\r\n\r\n/**\r\n * Thin React adapter for Core ViewportCalculator.\r\n * Renders spacers + absolute-positioned visible rows only.\r\n */\r\nexport function VirtualList<T>({\r\n session,\r\n items,\r\n height,\r\n rowHeight = 40,\r\n overscan = 2,\r\n className,\r\n style,\r\n getItemKey,\r\n renderItem,\r\n}: VirtualListProps<T>) {\r\n const scrollerRef = useRef<HTMLDivElement>(null);\r\n const {\r\n visibleItems,\r\n absoluteIndices,\r\n spacerTop,\r\n spacerBottom,\r\n totalHeight,\r\n onScroll,\r\n } = useVirtualWindow(session, items, {\r\n rowHeight,\r\n overscan,\r\n initialViewportSize: height,\r\n });\r\n\r\n // Keep session viewportSize aligned with the scrollport height.\r\n React.useEffect(() => {\r\n void session.dispatchViewIntent({\r\n type: 'CHANGE_VIEWPORT',\r\n scrollOffset: session.getViewport().scrollOffset,\r\n viewportSize: height,\r\n rowHeight,\r\n overscan,\r\n });\r\n }, [session, height, rowHeight, overscan]);\r\n\r\n const handleScroll = useCallback(\r\n (event: React.UIEvent<HTMLDivElement>) => {\r\n const el = event.currentTarget;\r\n onScroll(el.scrollTop, el.clientHeight);\r\n },\r\n [onScroll],\r\n );\r\n\r\n return (\r\n <div\r\n ref={scrollerRef}\r\n data-erp-virtual-list\r\n className={className}\r\n style={{\r\n height,\r\n overflow: 'auto',\r\n position: 'relative',\r\n ...style,\r\n }}\r\n onScroll={handleScroll}\r\n >\r\n <div style={{ height: totalHeight, position: 'relative' }}>\r\n <div style={{ height: spacerTop }} aria-hidden />\r\n {visibleItems.map((item, i) => {\r\n const absoluteIndex = absoluteIndices[i] ?? i;\r\n const key = getItemKey\r\n ? getItemKey(item, absoluteIndex)\r\n : absoluteIndex;\r\n return (\r\n <div\r\n key={key}\r\n data-erp-virtual-row={absoluteIndex}\r\n style={{\r\n height: rowHeight,\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n {renderItem(item, absoluteIndex)}\r\n </div>\r\n );\r\n })}\r\n <div style={{ height: spacerBottom }} aria-hidden />\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
|