persian-data-grid 0.5.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.
@@ -0,0 +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, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\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(/&lt;/g, '<')\r\n .replace(/&gt;/g, '>')\r\n .replace(/&quot;/g, '\"')\r\n .replace(/&apos;/g, \"'\")\r\n .replace(/&amp;/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"]}