indas-ui 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1014) hide show
  1. package/dist/cjs/components/auth/ProtectedRoute.js +48 -0
  2. package/dist/cjs/components/auth/UnauthorizedPage.js +19 -0
  3. package/dist/cjs/components/auth/index.js +9 -0
  4. package/dist/cjs/components/chat/ai-messages.js +271 -0
  5. package/dist/cjs/components/chat/chat-prompt-navigator.js +110 -0
  6. package/dist/cjs/components/chat/chat.js +1032 -0
  7. package/dist/cjs/components/chat/index.js +19 -0
  8. package/dist/cjs/components/chat/multimodal-input.js +119 -0
  9. package/dist/cjs/components/dashboard/DrillDownModal.js +36 -0
  10. package/dist/cjs/components/dashboard/FilterBar.js +434 -0
  11. package/dist/cjs/components/dashboard/Tooltip.js +86 -0
  12. package/dist/cjs/components/dashboard/charts/Area.js +127 -0
  13. package/dist/cjs/components/dashboard/charts/Bar.js +111 -0
  14. package/dist/cjs/components/dashboard/charts/BoxPlot.js +118 -0
  15. package/dist/cjs/components/dashboard/charts/Bubble.js +102 -0
  16. package/dist/cjs/components/dashboard/charts/DashboardCard.js +12 -0
  17. package/dist/cjs/components/dashboard/charts/Donut.js +130 -0
  18. package/dist/cjs/components/dashboard/charts/FlowMap.js +238 -0
  19. package/dist/cjs/components/dashboard/charts/Funnel.js +38 -0
  20. package/dist/cjs/components/dashboard/charts/Gantt.js +271 -0
  21. package/dist/cjs/components/dashboard/charts/Gauge.js +143 -0
  22. package/dist/cjs/components/dashboard/charts/GeoMap.js +164 -0
  23. package/dist/cjs/components/dashboard/charts/Heatmap.js +116 -0
  24. package/dist/cjs/components/dashboard/charts/Line.js +75 -0
  25. package/dist/cjs/components/dashboard/charts/Pareto.js +110 -0
  26. package/dist/cjs/components/dashboard/charts/Radar.js +94 -0
  27. package/dist/cjs/components/dashboard/charts/Sankey.js +92 -0
  28. package/dist/cjs/components/dashboard/charts/Scatter.js +128 -0
  29. package/dist/cjs/components/dashboard/charts/Sparkline.js +134 -0
  30. package/dist/cjs/components/dashboard/charts/Treemap.js +104 -0
  31. package/dist/cjs/components/dashboard/charts/index.js +45 -0
  32. package/dist/cjs/components/dashboard/charts/india-map.js +464 -0
  33. package/dist/cjs/components/dashboard/charts/theme.js +132 -0
  34. package/dist/cjs/components/dashboard/config.js +118 -0
  35. package/dist/cjs/components/dashboard/index.js +39 -0
  36. package/dist/cjs/components/dashboard/kpi/KpiBeforeAfter.js +16 -0
  37. package/dist/cjs/components/dashboard/kpi/KpiBreakdown.js +42 -0
  38. package/dist/cjs/components/dashboard/kpi/KpiComparison.js +41 -0
  39. package/dist/cjs/components/dashboard/kpi/KpiQuickStats.js +41 -0
  40. package/dist/cjs/components/dashboard/kpi/KpiRating.js +38 -0
  41. package/dist/cjs/components/dashboard/kpi/KpiScroll.js +83 -0
  42. package/dist/cjs/components/dashboard/kpi/KpiTrend.js +37 -0
  43. package/dist/cjs/components/dashboard/kpi/index.js +22 -0
  44. package/dist/cjs/components/dashboard/kpi/kpi-shell.js +113 -0
  45. package/dist/cjs/components/dashboard/time-range.js +126 -0
  46. package/dist/cjs/components/datagrid/DataGrid.js +1613 -0
  47. package/dist/cjs/components/datagrid/cells/BooleanCell.js +42 -0
  48. package/dist/cjs/components/datagrid/cells/CellRenderer.js +142 -0
  49. package/dist/cjs/components/datagrid/cells/EditableCell.js +217 -0
  50. package/dist/cjs/components/datagrid/cells/SelectionCell.js +60 -0
  51. package/dist/cjs/components/datagrid/cells/index.js +6 -0
  52. package/dist/cjs/components/datagrid/columns/ActionsColumn.js +485 -0
  53. package/dist/cjs/components/datagrid/columns/ColumnContextMenu.js +341 -0
  54. package/dist/cjs/components/datagrid/columns/DraggableColumnHeader.js +150 -0
  55. package/dist/cjs/components/datagrid/controls/AutoResizeButton.js +10 -0
  56. package/dist/cjs/components/datagrid/controls/PaginationControls.js +38 -0
  57. package/dist/cjs/components/datagrid/controls/SummaryControls.js +30 -0
  58. package/dist/cjs/components/datagrid/controls/menu/ActionsMenu.js +16 -0
  59. package/dist/cjs/components/datagrid/controls/menu/column/ColumnChooserModal.js +25 -0
  60. package/dist/cjs/components/datagrid/controls/menu/column/ColumnSection.js +10 -0
  61. package/dist/cjs/components/datagrid/controls/menu/export/ExportSection.js +19 -0
  62. package/dist/cjs/components/datagrid/controls/menu/export/export.js +227 -0
  63. package/dist/cjs/components/datagrid/controls/menu/filter/AdvancedFilterModal.js +405 -0
  64. package/dist/cjs/components/datagrid/controls/menu/filter/FilterSection.js +9 -0
  65. package/dist/cjs/components/datagrid/controls/menu/grouping/GroupingSection.js +23 -0
  66. package/dist/cjs/components/datagrid/controls/menu/grouping/index.js +6 -0
  67. package/dist/cjs/components/datagrid/controls/menu/import/ImportSection.js +75 -0
  68. package/dist/cjs/components/datagrid/controls/menu/import/import.js +232 -0
  69. package/dist/cjs/components/datagrid/controls/menu/index.js +24 -0
  70. package/dist/cjs/components/datagrid/controls/menu/view/CardView.js +176 -0
  71. package/dist/cjs/components/datagrid/controls/menu/view/ChartView.js +401 -0
  72. package/dist/cjs/components/datagrid/controls/menu/view/ViewSection.js +12 -0
  73. package/dist/cjs/components/datagrid/hooks/useCellRangeSelection.js +127 -0
  74. package/dist/cjs/components/datagrid/hooks/useClipboard.js +154 -0
  75. package/dist/cjs/components/datagrid/hooks/useDataGridState.js +115 -0
  76. package/dist/cjs/components/datagrid/hooks/useKeyboardNavigation.js +120 -0
  77. package/dist/cjs/components/datagrid/index.js +90 -0
  78. package/dist/cjs/components/datagrid/rows/DraggableRow.js +34 -0
  79. package/dist/cjs/components/datagrid/rows/ExpandableRow.js +184 -0
  80. package/dist/cjs/components/datagrid/rows/FilterRow.js +188 -0
  81. package/dist/cjs/components/datagrid/rows/SelectColumn.js +34 -0
  82. package/dist/cjs/components/datagrid/rows/SummaryRow.js +34 -0
  83. package/dist/cjs/components/datagrid/rows/summary.js +67 -0
  84. package/dist/cjs/components/datagrid/search/InlineSearchCell.js +99 -0
  85. package/dist/cjs/components/datagrid/search/SearchHighlighter.js +133 -0
  86. package/dist/cjs/components/datagrid/search/SearchNavigator.js +185 -0
  87. package/dist/cjs/components/datagrid/search/SearchNewModal.js +238 -0
  88. package/dist/cjs/components/datagrid/search/advancedSearch.js +112 -0
  89. package/dist/cjs/components/datagrid/utils/grid-helpers.js +102 -0
  90. package/dist/cjs/components/datagrid/utils/grid-types.js +3 -0
  91. package/dist/cjs/components/draft/AutoSaveIndicator.js +70 -0
  92. package/dist/cjs/components/draft/DraftModal.js +220 -0
  93. package/dist/cjs/components/forms/date-picker/CalendarView.js +82 -0
  94. package/dist/cjs/components/forms/date-picker/DatePicker.js +748 -0
  95. package/dist/cjs/components/forms/date-picker/DateTimePicker.js +174 -0
  96. package/dist/cjs/components/forms/date-picker/index.js +21 -0
  97. package/dist/cjs/components/forms/date-picker/shared-utils.js +24 -0
  98. package/dist/cjs/components/forms/dropdown/Dropdown.js +427 -0
  99. package/dist/cjs/components/forms/dropdown/MultiSelect.js +136 -0
  100. package/dist/cjs/components/forms/dropdown/SingleSelect.js +254 -0
  101. package/dist/cjs/components/forms/dropdown/hooks/useDropdownCreate.js +88 -0
  102. package/dist/cjs/components/forms/dropdown/hooks/useDropdownFiltering.js +87 -0
  103. package/dist/cjs/components/forms/dropdown/hooks/useDropdownState.js +63 -0
  104. package/dist/cjs/components/forms/dropdown/index.js +6 -0
  105. package/dist/cjs/components/forms/dropdown/types.js +3 -0
  106. package/dist/cjs/components/forms/file-attachment/EmailPreview.js +419 -0
  107. package/dist/cjs/components/forms/file-attachment/FileAttachment.js +966 -0
  108. package/dist/cjs/components/forms/file-attachment/index.js +6 -0
  109. package/dist/cjs/components/forms/index.js +16 -0
  110. package/dist/cjs/components/forms/quantity-input-popup.js +135 -0
  111. package/dist/cjs/components/forms/remark-input/RemarkInput.js +263 -0
  112. package/dist/cjs/components/forms/remark-input/index.js +8 -0
  113. package/dist/cjs/components/forms/unified-currency-dropdown.js +202 -0
  114. package/dist/cjs/components/index.js +41 -0
  115. package/dist/cjs/components/layout/SidebarContextMenu.js +179 -0
  116. package/dist/cjs/components/layout/app-shell.js +81 -0
  117. package/dist/cjs/components/layout/bottom-nav.js +262 -0
  118. package/dist/cjs/components/layout/floating-action-button.js +77 -0
  119. package/dist/cjs/components/layout/footer.js +60 -0
  120. package/dist/cjs/components/layout/index.js +18 -0
  121. package/dist/cjs/components/layout/mobile-menu-sheet.js +195 -0
  122. package/dist/cjs/components/layout/side-panel.js +118 -0
  123. package/dist/cjs/components/layout/sidebar.js +581 -0
  124. package/dist/cjs/components/layout/top-header.js +270 -0
  125. package/dist/cjs/components/layout/userprofile-dropdown.js +100 -0
  126. package/dist/cjs/components/master/editable-cells/EditableCell.js +106 -0
  127. package/dist/cjs/components/master/editable-cells/index.js +17 -0
  128. package/dist/cjs/components/master/index.js +9 -0
  129. package/dist/cjs/components/messaging/conversation-list.js +109 -0
  130. package/dist/cjs/components/messaging/create-conversation-modal.js +112 -0
  131. package/dist/cjs/components/messaging/message-bubble.js +69 -0
  132. package/dist/cjs/components/messaging/message-input.js +154 -0
  133. package/dist/cjs/components/messaging/message-thread.js +124 -0
  134. package/dist/cjs/components/messaging/messaging-panel-content.js +69 -0
  135. package/dist/cjs/components/messaging/thread-panel.js +50 -0
  136. package/dist/cjs/components/modals/3DModal.js +35 -0
  137. package/dist/cjs/components/modals/ImageModal.js +587 -0
  138. package/dist/cjs/components/modals/Modal.js +311 -0
  139. package/dist/cjs/components/modals/StandardModal.js +28 -0
  140. package/dist/cjs/components/modals/api-config-modal.js +120 -0
  141. package/dist/cjs/components/modals/global-api-config-modal.js +127 -0
  142. package/dist/cjs/components/modals/index.js +17 -0
  143. package/dist/cjs/components/modals/logout-modal.js +45 -0
  144. package/dist/cjs/components/modals/modal-alert.js +295 -0
  145. package/dist/cjs/components/modals/password-reset-modal.js +112 -0
  146. package/dist/cjs/components/modals/session-expiry-warning.js +18 -0
  147. package/dist/cjs/components/providers/api-provider.js +19 -0
  148. package/dist/cjs/components/providers/query-provider.js +29 -0
  149. package/dist/cjs/components/providers/session-provider.js +119 -0
  150. package/dist/cjs/components/theme/ThemeCustomizer.js +184 -0
  151. package/dist/cjs/components/ui/buttons/button.js +264 -0
  152. package/dist/cjs/components/ui/card.js +58 -0
  153. package/dist/cjs/components/ui/chart.js +160 -0
  154. package/dist/cjs/components/ui/display/boolean-badge.js +29 -0
  155. package/dist/cjs/components/ui/display/card.js +20 -0
  156. package/dist/cjs/components/ui/display/collapsible.js +44 -0
  157. package/dist/cjs/components/ui/display/separator.js +44 -0
  158. package/dist/cjs/components/ui/display/stats-card.js +29 -0
  159. package/dist/cjs/components/ui/display/text.js +94 -0
  160. package/dist/cjs/components/ui/feedback/alert.js +61 -0
  161. package/dist/cjs/components/ui/feedback/badge.js +93 -0
  162. package/dist/cjs/components/ui/feedback/progress.js +44 -0
  163. package/dist/cjs/components/ui/feedback/reminder-button.js +111 -0
  164. package/dist/cjs/components/ui/feedback/skeleton-table.js +20 -0
  165. package/dist/cjs/components/ui/feedback/skeleton.js +53 -0
  166. package/dist/cjs/components/ui/feedback/tooltip.js +54 -0
  167. package/dist/cjs/components/ui/form-toggle.js +47 -0
  168. package/dist/cjs/components/ui/forms/checkbox.js +24 -0
  169. package/dist/cjs/components/ui/forms/input.js +111 -0
  170. package/dist/cjs/components/ui/forms/label.js +10 -0
  171. package/dist/cjs/components/ui/forms/switch.js +58 -0
  172. package/dist/cjs/components/ui/forms/textarea.js +49 -0
  173. package/dist/cjs/components/ui/index.js +157 -0
  174. package/dist/cjs/components/ui/navigation/dropdown-menu.js +84 -0
  175. package/dist/cjs/components/ui/navigation/header-steps.js +51 -0
  176. package/dist/cjs/components/ui/navigation/tabs.js +97 -0
  177. package/dist/cjs/components/ui/overlays/loading.js +169 -0
  178. package/dist/cjs/components/ui/select.js +72 -0
  179. package/dist/cjs/config/api.js +65 -0
  180. package/dist/cjs/contexts/AppConfigContext.js +37 -0
  181. package/dist/cjs/contexts/CurrencyContext.js +336 -0
  182. package/dist/cjs/contexts/DeviceContext.js +106 -0
  183. package/dist/cjs/contexts/EmailContext.js +727 -0
  184. package/dist/cjs/contexts/GlobalAlertContext.js +232 -0
  185. package/dist/cjs/contexts/ImpactAnalysisContext.js +60 -0
  186. package/dist/cjs/contexts/LanguageContext.js +104 -0
  187. package/dist/cjs/contexts/MessagingContext.js +726 -0
  188. package/dist/cjs/contexts/ModuleAuthContext.js +316 -0
  189. package/dist/cjs/contexts/NavigationContext.js +182 -0
  190. package/dist/cjs/contexts/NetworkStatusContext.js +95 -0
  191. package/dist/cjs/contexts/NotificationContext.js +169 -0
  192. package/dist/cjs/contexts/PageTitleContext.js +28 -0
  193. package/dist/cjs/contexts/SearchPreferencesContext.js +42 -0
  194. package/dist/cjs/contexts/SessionAdapterContext.js +24 -0
  195. package/dist/cjs/contexts/SidebarPreferencesContext.js +116 -0
  196. package/dist/cjs/contexts/ThemeContext.js +193 -0
  197. package/dist/cjs/hooks/index.js +50 -0
  198. package/dist/cjs/hooks/useApproval.js +250 -0
  199. package/dist/cjs/hooks/useBacchaSearch.js +257 -0
  200. package/dist/cjs/hooks/useBusinessAudit.js +54 -0
  201. package/dist/cjs/hooks/useColumnFreezing.js +204 -0
  202. package/dist/cjs/hooks/useColumnMetadata.js +48 -0
  203. package/dist/cjs/hooks/useConditionalFormatting.js +197 -0
  204. package/dist/cjs/hooks/useDebounce.js +49 -0
  205. package/dist/cjs/hooks/useDraft.js +181 -0
  206. package/dist/cjs/hooks/useFormValidation.js +68 -0
  207. package/dist/cjs/hooks/useGridSettings.js +85 -0
  208. package/dist/cjs/hooks/useGridTheme.js +204 -0
  209. package/dist/cjs/hooks/useId.js +21 -0
  210. package/dist/cjs/hooks/useIntelligentColumnSizing.js +315 -0
  211. package/dist/cjs/hooks/useKeyboardNavigation.js +192 -0
  212. package/dist/cjs/hooks/useNotifications.js +63 -0
  213. package/dist/cjs/hooks/usePrevious.js +20 -0
  214. package/dist/cjs/hooks/useRowSelection.js +150 -0
  215. package/dist/cjs/hooks/useSignalR.js +53 -0
  216. package/dist/cjs/hooks/useTheme.js +268 -0
  217. package/dist/cjs/hooks/useTranslation.js +20 -0
  218. package/dist/cjs/hooks/useUnsavedChanges.js +88 -0
  219. package/dist/cjs/index.js +21 -0
  220. package/dist/cjs/lib/api/activity/audit/audit.js +51 -0
  221. package/dist/cjs/lib/api/activity/audit/index.js +29 -0
  222. package/dist/cjs/lib/api/activity/audit/send.js +434 -0
  223. package/dist/cjs/lib/api/activity/email/client.js +467 -0
  224. package/dist/cjs/lib/api/activity/email/index.js +31 -0
  225. package/dist/cjs/lib/api/activity/email/password-reset.js +58 -0
  226. package/dist/cjs/lib/api/activity/email/templates.js +537 -0
  227. package/dist/cjs/lib/api/activity/email/types.js +24 -0
  228. package/dist/cjs/lib/api/activity/index.js +48 -0
  229. package/dist/cjs/lib/api/activity/messaging/messaging.js +254 -0
  230. package/dist/cjs/lib/api/activity/notifications/index.js +43 -0
  231. package/dist/cjs/lib/api/activity/notifications/notifications.js +224 -0
  232. package/dist/cjs/lib/api/activity/notifications/reminders.js +30 -0
  233. package/dist/cjs/lib/api/activity/notifications/send.js +267 -0
  234. package/dist/cjs/lib/api/activity/notifications/types.js +66 -0
  235. package/dist/cjs/lib/api/activity/notify-and-log.js +63 -0
  236. package/dist/cjs/lib/api/activity/remarks/index.js +6 -0
  237. package/dist/cjs/lib/api/activity/remarks/remarks.js +186 -0
  238. package/dist/cjs/lib/api/activity/storage.js +83 -0
  239. package/dist/cjs/lib/api/ai/chat.js +227 -0
  240. package/dist/cjs/lib/api/ai/types.js +6 -0
  241. package/dist/cjs/lib/api/approval/approvals.js +210 -0
  242. package/dist/cjs/lib/api/approval/index.js +13 -0
  243. package/dist/cjs/lib/api/auth/auth.js +154 -0
  244. package/dist/cjs/lib/api/auth/index.js +11 -0
  245. package/dist/cjs/lib/api/auth/password-reset-otp.js +192 -0
  246. package/dist/cjs/lib/api/auth/two-factor-auth.js +94 -0
  247. package/dist/cjs/lib/api/auth/two-factor.js +186 -0
  248. package/dist/cjs/lib/api/core/auth-helpers.js +141 -0
  249. package/dist/cjs/lib/api/core/client.js +305 -0
  250. package/dist/cjs/lib/api/core/config.js +248 -0
  251. package/dist/cjs/lib/api/core/index.js +43 -0
  252. package/dist/cjs/lib/api/core/session-validator.js +98 -0
  253. package/dist/cjs/lib/api/core/types.js +4 -0
  254. package/dist/cjs/lib/api/core/utils.js +70 -0
  255. package/dist/cjs/lib/api/dashboard/costing.js +15 -0
  256. package/dist/cjs/lib/api/dashboard/management.js +11 -0
  257. package/dist/cjs/lib/api/dashboard/sales.js +11 -0
  258. package/dist/cjs/lib/api/draft/drafts.js +279 -0
  259. package/dist/cjs/lib/api/draft/index.js +13 -0
  260. package/dist/cjs/lib/api/enquiry/enquiry.js +624 -0
  261. package/dist/cjs/lib/api/enquiry/index.js +20 -0
  262. package/dist/cjs/lib/api/enquiry/rate-enquiry.js +78 -0
  263. package/dist/cjs/lib/api/estimation/categories.js +113 -0
  264. package/dist/cjs/lib/api/estimation/category-defaults.js +47 -0
  265. package/dist/cjs/lib/api/estimation/company-config.js +26 -0
  266. package/dist/cjs/lib/api/estimation/content.js +210 -0
  267. package/dist/cjs/lib/api/estimation/freight.js +25 -0
  268. package/dist/cjs/lib/api/estimation/grid-costing-drafts.js +30 -0
  269. package/dist/cjs/lib/api/estimation/grid-costing.js +176 -0
  270. package/dist/cjs/lib/api/estimation/index.js +58 -0
  271. package/dist/cjs/lib/api/estimation/legacy-costing.js +51 -0
  272. package/dist/cjs/lib/api/estimation/machines.js +74 -0
  273. package/dist/cjs/lib/api/estimation/planning.js +403 -0
  274. package/dist/cjs/lib/api/estimation/qualities.js +245 -0
  275. package/dist/cjs/lib/api/estimation/quotation-load.js +52 -0
  276. package/dist/cjs/lib/api/estimation/quotation-save.js +109 -0
  277. package/dist/cjs/lib/api/estimation/quote-check.js +34 -0
  278. package/dist/cjs/lib/api/estimation/quotepanel.js +496 -0
  279. package/dist/cjs/lib/api/estimation/shipper-planning.js +220 -0
  280. package/dist/cjs/lib/api/estimation/wastage.js +47 -0
  281. package/dist/cjs/lib/api/index.js +33 -0
  282. package/dist/cjs/lib/api/integration/proxy.js +40 -0
  283. package/dist/cjs/lib/api/master/category.js +215 -0
  284. package/dist/cjs/lib/api/master/company.js +389 -0
  285. package/dist/cjs/lib/api/master/hsn.js +61 -0
  286. package/dist/cjs/lib/api/master/index.js +47 -0
  287. package/dist/cjs/lib/api/master/item.js +142 -0
  288. package/dist/cjs/lib/api/master/ledger.js +398 -0
  289. package/dist/cjs/lib/api/master/logistics.js +119 -0
  290. package/dist/cjs/lib/api/master/machine.js +579 -0
  291. package/dist/cjs/lib/api/master/material-group.js +103 -0
  292. package/dist/cjs/lib/api/master/other.js +63 -0
  293. package/dist/cjs/lib/api/master/process-types.js +5 -0
  294. package/dist/cjs/lib/api/master/process.js +131 -0
  295. package/dist/cjs/lib/api/master/production-units.js +22 -0
  296. package/dist/cjs/lib/api/master/rate.js +203 -0
  297. package/dist/cjs/lib/api/master/tool.js +88 -0
  298. package/dist/cjs/lib/api/master/user.js +154 -0
  299. package/dist/cjs/lib/api/settings/erp-parameters.js +69 -0
  300. package/dist/cjs/lib/api/utility/index.js +11 -0
  301. package/dist/cjs/lib/api/utility/menu.js +136 -0
  302. package/dist/cjs/lib/auth.js +10 -0
  303. package/dist/cjs/lib/pwa.js +59 -0
  304. package/dist/cjs/lib/react-query-config.js +134 -0
  305. package/dist/cjs/lib/security/audit-logger.js +177 -0
  306. package/dist/cjs/lib/security/rate-limiter.js +122 -0
  307. package/dist/cjs/lib/server-url.js +76 -0
  308. package/dist/cjs/lib/svg-utils.js +213 -0
  309. package/dist/cjs/lib/theme/types.js +235 -0
  310. package/dist/cjs/lib/theme/utils.js +363 -0
  311. package/dist/cjs/lib/types/index.js +3 -0
  312. package/dist/cjs/lib/utils/attachment-loader.js +82 -0
  313. package/dist/cjs/lib/utils/client-lead-utils.js +61 -0
  314. package/dist/cjs/lib/utils/device-detection.js +110 -0
  315. package/dist/cjs/lib/utils/logout-cleanup.js +312 -0
  316. package/dist/cjs/lib/utils/planning-prefs.js +31 -0
  317. package/dist/cjs/lib/utils.js +70 -0
  318. package/dist/cjs/lib/vision/dieline-extractor.js +321 -0
  319. package/dist/cjs/lib/vision/reference-grid.js +245 -0
  320. package/dist/cjs/locales/de.json +79 -0
  321. package/dist/cjs/locales/en.json +2217 -0
  322. package/dist/cjs/locales/es.json +79 -0
  323. package/dist/cjs/locales/fr.json +78 -0
  324. package/dist/cjs/locales/hi.json +1599 -0
  325. package/dist/cjs/package.json +1 -0
  326. package/dist/cjs/providers.js +43 -0
  327. package/dist/cjs/services/GlobalLoadingService.js +220 -0
  328. package/{src → dist/cjs}/styles/grid-themes.css +345 -345
  329. package/{src → dist/cjs}/styles/sidebar-scrollbar.css +45 -45
  330. package/{src → dist/cjs}/styles/tokens.css +712 -711
  331. package/dist/cjs/types/approval.js +22 -0
  332. package/dist/cjs/types/audit.js +50 -0
  333. package/dist/cjs/types/draft.js +22 -0
  334. package/dist/cjs/types/master.js +4 -0
  335. package/dist/cjs/types/shipper-planning.js +7 -0
  336. package/dist/components/auth/ProtectedRoute.d.ts +6 -0
  337. package/dist/components/auth/ProtectedRoute.js +45 -0
  338. package/dist/components/auth/UnauthorizedPage.d.ts +6 -0
  339. package/dist/components/auth/UnauthorizedPage.js +15 -0
  340. package/dist/components/auth/index.d.ts +2 -0
  341. package/dist/components/auth/index.js +3 -0
  342. package/dist/components/chat/ai-messages.d.ts +32 -0
  343. package/dist/components/chat/ai-messages.js +265 -0
  344. package/dist/components/chat/chat-prompt-navigator.d.ts +9 -0
  345. package/dist/components/chat/chat-prompt-navigator.js +107 -0
  346. package/dist/components/chat/chat.d.ts +46 -0
  347. package/dist/components/chat/chat.js +1029 -0
  348. package/dist/components/chat/index.d.ts +5 -0
  349. package/dist/components/chat/index.js +13 -0
  350. package/dist/components/chat/multimodal-input.d.ts +12 -0
  351. package/dist/components/chat/multimodal-input.js +116 -0
  352. package/dist/components/dashboard/DrillDownModal.d.ts +15 -0
  353. package/dist/components/dashboard/DrillDownModal.js +33 -0
  354. package/dist/components/dashboard/FilterBar.d.ts +108 -0
  355. package/dist/components/dashboard/FilterBar.js +428 -0
  356. package/dist/components/dashboard/Tooltip.d.ts +24 -0
  357. package/dist/components/dashboard/Tooltip.js +50 -0
  358. package/dist/components/dashboard/charts/Area.d.ts +28 -0
  359. package/dist/components/dashboard/charts/Area.js +121 -0
  360. package/dist/components/dashboard/charts/Bar.d.ts +27 -0
  361. package/dist/components/dashboard/charts/Bar.js +105 -0
  362. package/dist/components/dashboard/charts/BoxPlot.d.ts +23 -0
  363. package/dist/components/dashboard/charts/BoxPlot.js +112 -0
  364. package/dist/components/dashboard/charts/Bubble.d.ts +36 -0
  365. package/dist/components/dashboard/charts/Bubble.js +96 -0
  366. package/dist/components/dashboard/charts/DashboardCard.d.ts +12 -0
  367. package/dist/components/dashboard/charts/DashboardCard.js +9 -0
  368. package/dist/components/dashboard/charts/Donut.d.ts +23 -0
  369. package/dist/components/dashboard/charts/Donut.js +124 -0
  370. package/dist/components/dashboard/charts/FlowMap.d.ts +38 -0
  371. package/dist/components/dashboard/charts/FlowMap.js +199 -0
  372. package/dist/components/dashboard/charts/Funnel.d.ts +30 -0
  373. package/dist/components/dashboard/charts/Funnel.js +35 -0
  374. package/dist/components/dashboard/charts/Gantt.d.ts +26 -0
  375. package/dist/components/dashboard/charts/Gantt.js +265 -0
  376. package/dist/components/dashboard/charts/Gauge.d.ts +25 -0
  377. package/dist/components/dashboard/charts/Gauge.js +137 -0
  378. package/dist/components/dashboard/charts/GeoMap.d.ts +38 -0
  379. package/dist/components/dashboard/charts/GeoMap.js +125 -0
  380. package/dist/components/dashboard/charts/Heatmap.d.ts +31 -0
  381. package/dist/components/dashboard/charts/Heatmap.js +110 -0
  382. package/dist/components/dashboard/charts/Line.d.ts +33 -0
  383. package/dist/components/dashboard/charts/Line.js +69 -0
  384. package/dist/components/dashboard/charts/Pareto.d.ts +21 -0
  385. package/dist/components/dashboard/charts/Pareto.js +104 -0
  386. package/dist/components/dashboard/charts/Radar.d.ts +32 -0
  387. package/dist/components/dashboard/charts/Radar.js +88 -0
  388. package/dist/components/dashboard/charts/Sankey.d.ts +43 -0
  389. package/dist/components/dashboard/charts/Sankey.js +86 -0
  390. package/dist/components/dashboard/charts/Scatter.d.ts +38 -0
  391. package/dist/components/dashboard/charts/Scatter.js +122 -0
  392. package/dist/components/dashboard/charts/Sparkline.d.ts +37 -0
  393. package/dist/components/dashboard/charts/Sparkline.js +128 -0
  394. package/dist/components/dashboard/charts/Treemap.d.ts +30 -0
  395. package/dist/components/dashboard/charts/Treemap.js +98 -0
  396. package/dist/components/dashboard/charts/index.d.ts +38 -0
  397. package/dist/components/dashboard/charts/index.js +23 -0
  398. package/dist/components/dashboard/charts/india-map.d.ts +22 -0
  399. package/dist/components/dashboard/charts/india-map.js +461 -0
  400. package/dist/components/dashboard/charts/theme.d.ts +107 -0
  401. package/dist/components/dashboard/charts/theme.js +124 -0
  402. package/dist/components/dashboard/config.d.ts +96 -0
  403. package/dist/components/dashboard/config.js +113 -0
  404. package/dist/components/dashboard/index.d.ts +10 -0
  405. package/dist/components/dashboard/index.js +13 -0
  406. package/dist/components/dashboard/kpi/KpiBeforeAfter.d.ts +31 -0
  407. package/dist/components/dashboard/kpi/KpiBeforeAfter.js +13 -0
  408. package/dist/components/dashboard/kpi/KpiBreakdown.d.ts +31 -0
  409. package/dist/components/dashboard/kpi/KpiBreakdown.js +39 -0
  410. package/dist/components/dashboard/kpi/KpiComparison.d.ts +36 -0
  411. package/dist/components/dashboard/kpi/KpiComparison.js +38 -0
  412. package/dist/components/dashboard/kpi/KpiQuickStats.d.ts +30 -0
  413. package/dist/components/dashboard/kpi/KpiQuickStats.js +38 -0
  414. package/dist/components/dashboard/kpi/KpiRating.d.ts +46 -0
  415. package/dist/components/dashboard/kpi/KpiRating.js +35 -0
  416. package/dist/components/dashboard/kpi/KpiScroll.d.ts +63 -0
  417. package/dist/components/dashboard/kpi/KpiScroll.js +80 -0
  418. package/dist/components/dashboard/kpi/KpiTrend.d.ts +28 -0
  419. package/dist/components/dashboard/kpi/KpiTrend.js +34 -0
  420. package/dist/components/dashboard/kpi/index.d.ts +16 -0
  421. package/dist/components/dashboard/kpi/index.js +10 -0
  422. package/dist/components/dashboard/kpi/kpi-shell.d.ts +44 -0
  423. package/dist/components/dashboard/kpi/kpi-shell.js +108 -0
  424. package/dist/components/dashboard/time-range.d.ts +12 -0
  425. package/dist/components/dashboard/time-range.js +118 -0
  426. package/dist/components/datagrid/DataGrid.d.ts +126 -0
  427. package/dist/components/datagrid/DataGrid.js +1577 -0
  428. package/dist/components/datagrid/cells/BooleanCell.d.ts +15 -0
  429. package/dist/components/datagrid/cells/BooleanCell.js +39 -0
  430. package/dist/components/datagrid/cells/CellRenderer.d.ts +25 -0
  431. package/dist/components/datagrid/cells/CellRenderer.js +139 -0
  432. package/dist/components/datagrid/cells/EditableCell.d.ts +35 -0
  433. package/dist/components/datagrid/cells/EditableCell.js +179 -0
  434. package/dist/components/datagrid/cells/SelectionCell.d.ts +11 -0
  435. package/dist/components/datagrid/cells/SelectionCell.js +58 -0
  436. package/dist/components/datagrid/cells/index.d.ts +1 -0
  437. package/dist/components/datagrid/cells/index.js +2 -0
  438. package/dist/components/datagrid/columns/ActionsColumn.d.ts +174 -0
  439. package/dist/components/datagrid/columns/ActionsColumn.js +448 -0
  440. package/dist/components/datagrid/columns/ColumnContextMenu.d.ts +16 -0
  441. package/dist/components/datagrid/columns/ColumnContextMenu.js +338 -0
  442. package/dist/components/datagrid/columns/DraggableColumnHeader.d.ts +19 -0
  443. package/dist/components/datagrid/columns/DraggableColumnHeader.js +147 -0
  444. package/dist/components/datagrid/controls/AutoResizeButton.d.ts +8 -0
  445. package/dist/components/datagrid/controls/AutoResizeButton.js +7 -0
  446. package/dist/components/datagrid/controls/PaginationControls.d.ts +13 -0
  447. package/dist/components/datagrid/controls/PaginationControls.js +34 -0
  448. package/dist/components/datagrid/controls/SummaryControls.d.ts +10 -0
  449. package/dist/components/datagrid/controls/SummaryControls.js +27 -0
  450. package/dist/components/datagrid/controls/menu/ActionsMenu.d.ts +31 -0
  451. package/dist/components/datagrid/controls/menu/ActionsMenu.js +13 -0
  452. package/dist/components/datagrid/controls/menu/column/ColumnChooserModal.d.ts +13 -0
  453. package/dist/components/datagrid/controls/menu/column/ColumnChooserModal.js +22 -0
  454. package/dist/components/datagrid/controls/menu/column/ColumnSection.d.ts +9 -0
  455. package/dist/components/datagrid/controls/menu/column/ColumnSection.js +7 -0
  456. package/dist/components/datagrid/controls/menu/export/ExportSection.d.ts +7 -0
  457. package/dist/components/datagrid/controls/menu/export/ExportSection.js +16 -0
  458. package/dist/components/datagrid/controls/menu/export/export.d.ts +21 -0
  459. package/dist/components/datagrid/controls/menu/export/export.js +187 -0
  460. package/dist/components/datagrid/controls/menu/filter/AdvancedFilterModal.d.ts +29 -0
  461. package/dist/components/datagrid/controls/menu/filter/AdvancedFilterModal.js +369 -0
  462. package/dist/components/datagrid/controls/menu/filter/FilterSection.d.ts +12 -0
  463. package/dist/components/datagrid/controls/menu/filter/FilterSection.js +6 -0
  464. package/dist/components/datagrid/controls/menu/grouping/GroupingSection.d.ts +10 -0
  465. package/dist/components/datagrid/controls/menu/grouping/GroupingSection.js +20 -0
  466. package/dist/components/datagrid/controls/menu/grouping/index.d.ts +1 -0
  467. package/dist/components/datagrid/controls/menu/grouping/index.js +2 -0
  468. package/dist/components/datagrid/controls/menu/import/ImportSection.d.ts +6 -0
  469. package/dist/components/datagrid/controls/menu/import/ImportSection.js +72 -0
  470. package/dist/components/datagrid/controls/menu/import/import.d.ts +27 -0
  471. package/dist/components/datagrid/controls/menu/import/import.js +193 -0
  472. package/dist/components/datagrid/controls/menu/index.d.ts +10 -0
  473. package/dist/components/datagrid/controls/menu/index.js +11 -0
  474. package/dist/components/datagrid/controls/menu/view/CardView.d.ts +17 -0
  475. package/dist/components/datagrid/controls/menu/view/CardView.js +173 -0
  476. package/dist/components/datagrid/controls/menu/view/ChartView.d.ts +9 -0
  477. package/dist/components/datagrid/controls/menu/view/ChartView.js +363 -0
  478. package/dist/components/datagrid/controls/menu/view/ViewSection.d.ts +7 -0
  479. package/dist/components/datagrid/controls/menu/view/ViewSection.js +9 -0
  480. package/dist/components/datagrid/hooks/useCellRangeSelection.d.ts +20 -0
  481. package/dist/components/datagrid/hooks/useCellRangeSelection.js +124 -0
  482. package/dist/components/datagrid/hooks/useClipboard.d.ts +15 -0
  483. package/dist/components/datagrid/hooks/useClipboard.js +151 -0
  484. package/dist/components/datagrid/hooks/useDataGridState.d.ts +46 -0
  485. package/dist/components/datagrid/hooks/useDataGridState.js +112 -0
  486. package/dist/components/datagrid/hooks/useKeyboardNavigation.d.ts +18 -0
  487. package/dist/components/datagrid/hooks/useKeyboardNavigation.js +117 -0
  488. package/dist/components/datagrid/index.d.ts +34 -0
  489. package/dist/components/datagrid/index.js +41 -0
  490. package/dist/components/datagrid/rows/DraggableRow.d.ts +33 -0
  491. package/dist/components/datagrid/rows/DraggableRow.js +31 -0
  492. package/dist/components/datagrid/rows/ExpandableRow.d.ts +48 -0
  493. package/dist/components/datagrid/rows/ExpandableRow.js +178 -0
  494. package/dist/components/datagrid/rows/FilterRow.d.ts +10 -0
  495. package/dist/components/datagrid/rows/FilterRow.js +185 -0
  496. package/dist/components/datagrid/rows/SelectColumn.d.ts +2 -0
  497. package/dist/components/datagrid/rows/SelectColumn.js +31 -0
  498. package/dist/components/datagrid/rows/SummaryRow.d.ts +12 -0
  499. package/dist/components/datagrid/rows/SummaryRow.js +31 -0
  500. package/dist/components/datagrid/rows/summary.d.ts +9 -0
  501. package/dist/components/datagrid/rows/summary.js +63 -0
  502. package/dist/components/datagrid/search/InlineSearchCell.d.ts +13 -0
  503. package/dist/components/datagrid/search/InlineSearchCell.js +96 -0
  504. package/dist/components/datagrid/search/SearchHighlighter.d.ts +16 -0
  505. package/dist/components/datagrid/search/SearchHighlighter.js +124 -0
  506. package/dist/components/datagrid/search/SearchNavigator.d.ts +24 -0
  507. package/dist/components/datagrid/search/SearchNavigator.js +148 -0
  508. package/dist/components/datagrid/search/SearchNewModal.d.ts +12 -0
  509. package/dist/components/datagrid/search/SearchNewModal.js +202 -0
  510. package/dist/components/datagrid/search/advancedSearch.d.ts +23 -0
  511. package/dist/components/datagrid/search/advancedSearch.js +109 -0
  512. package/dist/components/datagrid/utils/grid-helpers.d.ts +34 -0
  513. package/dist/components/datagrid/utils/grid-helpers.js +94 -0
  514. package/dist/components/datagrid/utils/grid-types.d.ts +157 -0
  515. package/dist/components/datagrid/utils/grid-types.js +2 -0
  516. package/dist/components/draft/AutoSaveIndicator.d.ts +28 -0
  517. package/dist/components/draft/AutoSaveIndicator.js +67 -0
  518. package/dist/components/draft/DraftModal.d.ts +27 -0
  519. package/dist/components/draft/DraftModal.js +184 -0
  520. package/dist/components/forms/date-picker/CalendarView.d.ts +17 -0
  521. package/dist/components/forms/date-picker/CalendarView.js +46 -0
  522. package/dist/components/forms/date-picker/DatePicker.d.ts +35 -0
  523. package/dist/components/forms/date-picker/DatePicker.js +712 -0
  524. package/dist/components/forms/date-picker/DateTimePicker.d.ts +15 -0
  525. package/dist/components/forms/date-picker/DateTimePicker.js +138 -0
  526. package/dist/components/forms/date-picker/index.d.ts +7 -0
  527. package/dist/components/forms/date-picker/index.js +9 -0
  528. package/dist/components/forms/date-picker/shared-utils.d.ts +6 -0
  529. package/dist/components/forms/date-picker/shared-utils.js +19 -0
  530. package/dist/components/forms/dropdown/Dropdown.d.ts +144 -0
  531. package/dist/components/forms/dropdown/Dropdown.js +384 -0
  532. package/dist/components/forms/dropdown/MultiSelect.d.ts +29 -0
  533. package/dist/components/forms/dropdown/MultiSelect.js +100 -0
  534. package/dist/components/forms/dropdown/SingleSelect.d.ts +39 -0
  535. package/dist/components/forms/dropdown/SingleSelect.js +218 -0
  536. package/dist/components/forms/dropdown/hooks/useDropdownCreate.d.ts +8 -0
  537. package/dist/components/forms/dropdown/hooks/useDropdownCreate.js +52 -0
  538. package/dist/components/forms/dropdown/hooks/useDropdownFiltering.d.ts +5 -0
  539. package/dist/components/forms/dropdown/hooks/useDropdownFiltering.js +51 -0
  540. package/dist/components/forms/dropdown/hooks/useDropdownState.d.ts +7 -0
  541. package/dist/components/forms/dropdown/hooks/useDropdownState.js +27 -0
  542. package/dist/components/forms/dropdown/index.d.ts +2 -0
  543. package/dist/components/forms/dropdown/index.js +2 -0
  544. package/dist/components/forms/dropdown/types.d.ts +67 -0
  545. package/dist/components/forms/dropdown/types.js +2 -0
  546. package/dist/components/forms/file-attachment/EmailPreview.d.ts +5 -0
  547. package/dist/components/forms/file-attachment/EmailPreview.js +383 -0
  548. package/dist/components/forms/file-attachment/FileAttachment.d.ts +30 -0
  549. package/dist/components/forms/file-attachment/FileAttachment.js +930 -0
  550. package/dist/components/forms/file-attachment/index.d.ts +2 -0
  551. package/dist/components/forms/file-attachment/index.js +2 -0
  552. package/dist/components/forms/index.d.ts +9 -0
  553. package/dist/components/forms/index.js +7 -0
  554. package/dist/components/forms/quantity-input-popup.d.ts +10 -0
  555. package/dist/components/forms/quantity-input-popup.js +99 -0
  556. package/dist/components/forms/remark-input/RemarkInput.d.ts +58 -0
  557. package/dist/components/forms/remark-input/RemarkInput.js +258 -0
  558. package/dist/components/forms/remark-input/index.d.ts +1 -0
  559. package/dist/components/forms/remark-input/index.js +2 -0
  560. package/dist/components/forms/unified-currency-dropdown.d.ts +26 -0
  561. package/dist/components/forms/unified-currency-dropdown.js +166 -0
  562. package/dist/components/index.d.ts +14 -0
  563. package/dist/components/index.js +15 -0
  564. package/dist/components/layout/SidebarContextMenu.d.ts +18 -0
  565. package/dist/components/layout/SidebarContextMenu.js +142 -0
  566. package/dist/components/layout/app-shell.d.ts +32 -0
  567. package/dist/components/layout/app-shell.js +43 -0
  568. package/dist/components/layout/bottom-nav.d.ts +28 -0
  569. package/dist/components/layout/bottom-nav.js +219 -0
  570. package/dist/components/layout/floating-action-button.d.ts +10 -0
  571. package/dist/components/layout/floating-action-button.js +74 -0
  572. package/dist/components/layout/footer.d.ts +37 -0
  573. package/dist/components/layout/footer.js +56 -0
  574. package/dist/components/layout/index.d.ts +10 -0
  575. package/dist/components/layout/index.js +7 -0
  576. package/dist/components/layout/mobile-menu-sheet.d.ts +7 -0
  577. package/dist/components/layout/mobile-menu-sheet.js +159 -0
  578. package/dist/components/layout/side-panel.d.ts +50 -0
  579. package/dist/components/layout/side-panel.js +115 -0
  580. package/dist/components/layout/sidebar.d.ts +12 -0
  581. package/dist/components/layout/sidebar.js +542 -0
  582. package/dist/components/layout/top-header.d.ts +8 -0
  583. package/dist/components/layout/top-header.js +234 -0
  584. package/dist/components/layout/userprofile-dropdown.d.ts +1 -0
  585. package/dist/components/layout/userprofile-dropdown.js +97 -0
  586. package/dist/components/master/editable-cells/EditableCell.d.ts +43 -0
  587. package/dist/components/master/editable-cells/EditableCell.js +66 -0
  588. package/dist/components/master/editable-cells/index.d.ts +9 -0
  589. package/dist/components/master/editable-cells/index.js +10 -0
  590. package/dist/components/master/index.d.ts +1 -0
  591. package/dist/components/master/index.js +3 -0
  592. package/dist/components/messaging/conversation-list.d.ts +13 -0
  593. package/dist/components/messaging/conversation-list.js +103 -0
  594. package/dist/components/messaging/create-conversation-modal.d.ts +9 -0
  595. package/dist/components/messaging/create-conversation-modal.js +109 -0
  596. package/dist/components/messaging/message-bubble.d.ts +15 -0
  597. package/dist/components/messaging/message-bubble.js +66 -0
  598. package/dist/components/messaging/message-input.d.ts +17 -0
  599. package/dist/components/messaging/message-input.js +151 -0
  600. package/dist/components/messaging/message-thread.d.ts +10 -0
  601. package/dist/components/messaging/message-thread.js +121 -0
  602. package/dist/components/messaging/messaging-panel-content.d.ts +5 -0
  603. package/dist/components/messaging/messaging-panel-content.js +66 -0
  604. package/dist/components/messaging/thread-panel.d.ts +10 -0
  605. package/dist/components/messaging/thread-panel.js +47 -0
  606. package/dist/components/modals/3DModal.d.ts +39 -0
  607. package/dist/components/modals/3DModal.js +32 -0
  608. package/dist/components/modals/ImageModal.d.ts +28 -0
  609. package/dist/components/modals/ImageModal.js +551 -0
  610. package/dist/components/modals/Modal.d.ts +92 -0
  611. package/dist/components/modals/Modal.js +264 -0
  612. package/dist/components/modals/StandardModal.d.ts +27 -0
  613. package/dist/components/modals/StandardModal.js +25 -0
  614. package/dist/components/modals/api-config-modal.d.ts +7 -0
  615. package/dist/components/modals/api-config-modal.js +117 -0
  616. package/dist/components/modals/global-api-config-modal.d.ts +7 -0
  617. package/dist/components/modals/global-api-config-modal.js +124 -0
  618. package/dist/components/modals/index.d.ts +7 -0
  619. package/dist/components/modals/index.js +8 -0
  620. package/dist/components/modals/logout-modal.d.ts +32 -0
  621. package/dist/components/modals/logout-modal.js +42 -0
  622. package/dist/components/modals/modal-alert.d.ts +139 -0
  623. package/dist/components/modals/modal-alert.js +250 -0
  624. package/dist/components/modals/password-reset-modal.d.ts +11 -0
  625. package/dist/components/modals/password-reset-modal.js +109 -0
  626. package/dist/components/modals/session-expiry-warning.d.ts +12 -0
  627. package/dist/components/modals/session-expiry-warning.js +15 -0
  628. package/dist/components/providers/api-provider.d.ts +10 -0
  629. package/dist/components/providers/api-provider.js +15 -0
  630. package/dist/components/providers/query-provider.d.ts +3 -0
  631. package/dist/components/providers/query-provider.js +26 -0
  632. package/dist/components/providers/session-provider.d.ts +7 -0
  633. package/dist/components/providers/session-provider.js +116 -0
  634. package/dist/components/theme/ThemeCustomizer.d.ts +37 -0
  635. package/dist/components/theme/ThemeCustomizer.js +178 -0
  636. package/dist/components/ui/buttons/button.d.ts +59 -0
  637. package/dist/components/ui/buttons/button.js +228 -0
  638. package/dist/components/ui/card.d.ts +8 -0
  639. package/dist/components/ui/card.js +17 -0
  640. package/dist/components/ui/chart.d.ts +83 -0
  641. package/dist/components/ui/chart.js +113 -0
  642. package/dist/components/ui/display/boolean-badge.d.ts +7 -0
  643. package/dist/components/ui/display/boolean-badge.js +23 -0
  644. package/dist/components/ui/display/card.d.ts +10 -0
  645. package/dist/components/ui/display/card.js +11 -0
  646. package/dist/components/ui/display/collapsible.d.ts +6 -0
  647. package/dist/components/ui/display/collapsible.js +6 -0
  648. package/dist/components/ui/display/separator.d.ts +4 -0
  649. package/dist/components/ui/display/separator.js +8 -0
  650. package/dist/components/ui/display/stats-card.d.ts +22 -0
  651. package/dist/components/ui/display/stats-card.js +25 -0
  652. package/dist/components/ui/display/text.d.ts +14 -0
  653. package/dist/components/ui/display/text.js +57 -0
  654. package/dist/components/ui/feedback/alert.d.ts +8 -0
  655. package/dist/components/ui/feedback/alert.js +23 -0
  656. package/dist/components/ui/feedback/badge.d.ts +49 -0
  657. package/dist/components/ui/feedback/badge.js +87 -0
  658. package/dist/components/ui/feedback/progress.d.ts +4 -0
  659. package/dist/components/ui/feedback/progress.js +8 -0
  660. package/dist/components/ui/feedback/reminder-button.d.ts +22 -0
  661. package/dist/components/ui/feedback/reminder-button.js +75 -0
  662. package/dist/components/ui/feedback/skeleton-table.d.ts +18 -0
  663. package/dist/components/ui/feedback/skeleton-table.js +17 -0
  664. package/dist/components/ui/feedback/skeleton.d.ts +53 -0
  665. package/dist/components/ui/feedback/skeleton.js +48 -0
  666. package/dist/components/ui/feedback/tooltip.d.ts +15 -0
  667. package/dist/components/ui/feedback/tooltip.js +14 -0
  668. package/dist/components/ui/form-toggle.d.ts +57 -0
  669. package/dist/components/ui/form-toggle.js +44 -0
  670. package/dist/components/ui/forms/checkbox.d.ts +6 -0
  671. package/dist/components/ui/forms/checkbox.js +17 -0
  672. package/dist/components/ui/forms/input.d.ts +18 -0
  673. package/dist/components/ui/forms/input.js +75 -0
  674. package/dist/components/ui/forms/label.d.ts +5 -0
  675. package/dist/components/ui/forms/label.js +6 -0
  676. package/dist/components/ui/forms/switch.d.ts +10 -0
  677. package/dist/components/ui/forms/switch.js +22 -0
  678. package/dist/components/ui/forms/textarea.d.ts +8 -0
  679. package/dist/components/ui/forms/textarea.js +13 -0
  680. package/dist/components/ui/index.d.ts +49 -0
  681. package/dist/components/ui/index.js +62 -0
  682. package/dist/components/ui/navigation/dropdown-menu.d.ts +27 -0
  683. package/dist/components/ui/navigation/dropdown-menu.js +34 -0
  684. package/dist/components/ui/navigation/header-steps.d.ts +16 -0
  685. package/dist/components/ui/navigation/header-steps.js +15 -0
  686. package/dist/components/ui/navigation/tabs.d.ts +40 -0
  687. package/dist/components/ui/navigation/tabs.js +59 -0
  688. package/dist/components/ui/overlays/loading.d.ts +47 -0
  689. package/dist/components/ui/overlays/loading.js +131 -0
  690. package/dist/components/ui/select.d.ts +13 -0
  691. package/dist/components/ui/select.js +27 -0
  692. package/dist/config/api.d.ts +30 -0
  693. package/dist/config/api.js +58 -0
  694. package/dist/contexts/AppConfigContext.d.ts +13 -0
  695. package/dist/contexts/AppConfigContext.js +33 -0
  696. package/dist/contexts/CurrencyContext.d.ts +43 -0
  697. package/dist/contexts/CurrencyContext.js +331 -0
  698. package/dist/contexts/DeviceContext.d.ts +12 -0
  699. package/dist/contexts/DeviceContext.js +69 -0
  700. package/dist/contexts/EmailContext.d.ts +112 -0
  701. package/dist/contexts/EmailContext.js +720 -0
  702. package/dist/contexts/GlobalAlertContext.d.ts +67 -0
  703. package/dist/contexts/GlobalAlertContext.js +192 -0
  704. package/dist/contexts/ImpactAnalysisContext.d.ts +11 -0
  705. package/dist/contexts/ImpactAnalysisContext.js +23 -0
  706. package/dist/contexts/LanguageContext.d.ts +21 -0
  707. package/dist/contexts/LanguageContext.js +66 -0
  708. package/dist/contexts/MessagingContext.d.ts +70 -0
  709. package/dist/contexts/MessagingContext.js +722 -0
  710. package/dist/contexts/ModuleAuthContext.d.ts +42 -0
  711. package/dist/contexts/ModuleAuthContext.js +278 -0
  712. package/dist/contexts/NavigationContext.d.ts +26 -0
  713. package/dist/contexts/NavigationContext.js +143 -0
  714. package/dist/contexts/NetworkStatusContext.d.ts +18 -0
  715. package/dist/contexts/NetworkStatusContext.js +87 -0
  716. package/dist/contexts/NotificationContext.d.ts +47 -0
  717. package/dist/contexts/NotificationContext.js +165 -0
  718. package/dist/contexts/PageTitleContext.d.ts +11 -0
  719. package/dist/contexts/PageTitleContext.js +23 -0
  720. package/dist/contexts/SearchPreferencesContext.d.ts +11 -0
  721. package/dist/contexts/SearchPreferencesContext.js +38 -0
  722. package/dist/contexts/SessionAdapterContext.d.ts +39 -0
  723. package/dist/contexts/SessionAdapterContext.js +20 -0
  724. package/dist/contexts/SidebarPreferencesContext.d.ts +19 -0
  725. package/dist/contexts/SidebarPreferencesContext.js +112 -0
  726. package/dist/contexts/ThemeContext.d.ts +63 -0
  727. package/dist/contexts/ThemeContext.js +153 -0
  728. package/dist/hooks/index.d.ts +23 -0
  729. package/dist/hooks/index.js +18 -0
  730. package/dist/hooks/useApproval.d.ts +47 -0
  731. package/dist/hooks/useApproval.js +247 -0
  732. package/dist/hooks/useBacchaSearch.d.ts +57 -0
  733. package/dist/hooks/useBacchaSearch.js +254 -0
  734. package/dist/hooks/useBusinessAudit.d.ts +24 -0
  735. package/dist/hooks/useBusinessAudit.js +51 -0
  736. package/dist/hooks/useColumnFreezing.d.ts +85 -0
  737. package/dist/hooks/useColumnFreezing.js +201 -0
  738. package/dist/hooks/useColumnMetadata.d.ts +20 -0
  739. package/dist/hooks/useColumnMetadata.js +44 -0
  740. package/dist/hooks/useConditionalFormatting.d.ts +43 -0
  741. package/dist/hooks/useConditionalFormatting.js +193 -0
  742. package/dist/hooks/useDebounce.d.ts +14 -0
  743. package/dist/hooks/useDebounce.js +45 -0
  744. package/dist/hooks/useDraft.d.ts +46 -0
  745. package/dist/hooks/useDraft.js +178 -0
  746. package/dist/hooks/useFormValidation.d.ts +37 -0
  747. package/dist/hooks/useFormValidation.js +65 -0
  748. package/dist/hooks/useGridSettings.d.ts +26 -0
  749. package/dist/hooks/useGridSettings.js +82 -0
  750. package/dist/hooks/useGridTheme.d.ts +59 -0
  751. package/dist/hooks/useGridTheme.js +199 -0
  752. package/dist/hooks/useId.d.ts +2 -0
  753. package/dist/hooks/useId.js +17 -0
  754. package/dist/hooks/useIntelligentColumnSizing.d.ts +71 -0
  755. package/dist/hooks/useIntelligentColumnSizing.js +310 -0
  756. package/dist/hooks/useKeyboardNavigation.d.ts +33 -0
  757. package/dist/hooks/useKeyboardNavigation.js +189 -0
  758. package/dist/hooks/useNotifications.d.ts +7 -0
  759. package/dist/hooks/useNotifications.js +56 -0
  760. package/dist/hooks/usePrevious.d.ts +9 -0
  761. package/dist/hooks/usePrevious.js +17 -0
  762. package/dist/hooks/useRowSelection.d.ts +45 -0
  763. package/dist/hooks/useRowSelection.js +147 -0
  764. package/dist/hooks/useSignalR.d.ts +13 -0
  765. package/dist/hooks/useSignalR.js +50 -0
  766. package/dist/hooks/useTheme.d.ts +59 -0
  767. package/dist/hooks/useTheme.js +261 -0
  768. package/dist/hooks/useTranslation.d.ts +5 -0
  769. package/dist/hooks/useTranslation.js +17 -0
  770. package/dist/hooks/useUnsavedChanges.d.ts +40 -0
  771. package/dist/hooks/useUnsavedChanges.js +83 -0
  772. package/dist/index.d.ts +2 -3173
  773. package/dist/index.js +4 -25937
  774. package/dist/lib/api/activity/audit/audit.d.ts +34 -0
  775. package/dist/lib/api/activity/audit/audit.js +44 -0
  776. package/dist/lib/api/activity/audit/index.d.ts +6 -0
  777. package/dist/lib/api/activity/audit/index.js +7 -0
  778. package/dist/lib/api/activity/audit/send.d.ts +152 -0
  779. package/dist/lib/api/activity/audit/send.js +403 -0
  780. package/dist/lib/api/activity/email/client.d.ts +167 -0
  781. package/dist/lib/api/activity/email/client.js +455 -0
  782. package/dist/lib/api/activity/email/index.d.ts +7 -0
  783. package/dist/lib/api/activity/email/index.js +10 -0
  784. package/dist/lib/api/activity/email/password-reset.d.ts +8 -0
  785. package/dist/lib/api/activity/email/password-reset.js +55 -0
  786. package/dist/lib/api/activity/email/templates.d.ts +10 -0
  787. package/dist/lib/api/activity/email/templates.js +531 -0
  788. package/dist/lib/api/activity/email/types.d.ts +237 -0
  789. package/dist/lib/api/activity/email/types.js +21 -0
  790. package/dist/lib/api/activity/index.d.ts +12 -0
  791. package/dist/lib/api/activity/index.js +15 -0
  792. package/dist/lib/api/activity/messaging/messaging.d.ts +149 -0
  793. package/dist/lib/api/activity/messaging/messaging.js +245 -0
  794. package/dist/lib/api/activity/notifications/index.d.ts +9 -0
  795. package/dist/lib/api/activity/notifications/index.js +9 -0
  796. package/dist/lib/api/activity/notifications/notifications.d.ts +59 -0
  797. package/dist/lib/api/activity/notifications/notifications.js +218 -0
  798. package/dist/lib/api/activity/notifications/reminders.d.ts +35 -0
  799. package/dist/lib/api/activity/notifications/reminders.js +25 -0
  800. package/dist/lib/api/activity/notifications/send.d.ts +122 -0
  801. package/dist/lib/api/activity/notifications/send.js +252 -0
  802. package/dist/lib/api/activity/notifications/types.d.ts +119 -0
  803. package/dist/lib/api/activity/notifications/types.js +62 -0
  804. package/dist/lib/api/activity/notify-and-log.d.ts +50 -0
  805. package/dist/lib/api/activity/notify-and-log.js +60 -0
  806. package/dist/lib/api/activity/remarks/index.d.ts +2 -0
  807. package/dist/lib/api/activity/remarks/index.js +2 -0
  808. package/dist/lib/api/activity/remarks/remarks.d.ts +83 -0
  809. package/dist/lib/api/activity/remarks/remarks.js +179 -0
  810. package/dist/lib/api/activity/storage.d.ts +28 -0
  811. package/dist/lib/api/activity/storage.js +79 -0
  812. package/dist/lib/api/ai/chat.d.ts +67 -0
  813. package/dist/lib/api/ai/chat.js +212 -0
  814. package/dist/lib/api/ai/types.d.ts +69 -0
  815. package/dist/lib/api/ai/types.js +5 -0
  816. package/dist/lib/api/approval/approvals.d.ts +66 -0
  817. package/dist/lib/api/approval/approvals.js +205 -0
  818. package/dist/lib/api/approval/index.d.ts +5 -0
  819. package/dist/lib/api/approval/index.js +6 -0
  820. package/dist/lib/api/auth/auth.d.ts +12 -0
  821. package/dist/lib/api/auth/auth.js +148 -0
  822. package/dist/lib/api/auth/index.d.ts +1 -0
  823. package/dist/lib/api/auth/index.js +4 -0
  824. package/dist/lib/api/auth/password-reset-otp.d.ts +49 -0
  825. package/dist/lib/api/auth/password-reset-otp.js +185 -0
  826. package/dist/lib/api/auth/two-factor-auth.d.ts +55 -0
  827. package/dist/lib/api/auth/two-factor-auth.js +84 -0
  828. package/dist/lib/api/auth/two-factor.d.ts +41 -0
  829. package/dist/lib/api/auth/two-factor.js +180 -0
  830. package/dist/lib/api/core/auth-helpers.d.ts +13 -0
  831. package/dist/lib/api/core/auth-helpers.js +137 -0
  832. package/dist/lib/api/core/client.d.ts +37 -0
  833. package/dist/lib/api/core/client.js +301 -0
  834. package/dist/lib/api/core/config.d.ts +46 -0
  835. package/dist/lib/api/core/config.js +238 -0
  836. package/dist/lib/api/core/index.d.ts +6 -0
  837. package/dist/lib/api/core/index.js +11 -0
  838. package/dist/lib/api/core/session-validator.d.ts +55 -0
  839. package/dist/lib/api/core/session-validator.js +94 -0
  840. package/dist/lib/api/core/types.d.ts +192 -0
  841. package/dist/lib/api/core/types.js +3 -0
  842. package/dist/lib/api/core/utils.d.ts +15 -0
  843. package/dist/lib/api/core/utils.js +64 -0
  844. package/dist/lib/api/dashboard/costing.d.ts +129 -0
  845. package/dist/lib/api/dashboard/costing.js +8 -0
  846. package/dist/lib/api/dashboard/management.d.ts +91 -0
  847. package/dist/lib/api/dashboard/management.js +5 -0
  848. package/dist/lib/api/dashboard/sales.d.ts +87 -0
  849. package/dist/lib/api/dashboard/sales.js +5 -0
  850. package/dist/lib/api/draft/drafts.d.ts +49 -0
  851. package/dist/lib/api/draft/drafts.js +274 -0
  852. package/dist/lib/api/draft/index.d.ts +5 -0
  853. package/dist/lib/api/draft/index.js +6 -0
  854. package/dist/lib/api/enquiry/enquiry.d.ts +324 -0
  855. package/dist/lib/api/enquiry/enquiry.js +617 -0
  856. package/dist/lib/api/enquiry/index.d.ts +2 -0
  857. package/dist/lib/api/enquiry/index.js +4 -0
  858. package/dist/lib/api/enquiry/rate-enquiry.d.ts +97 -0
  859. package/dist/lib/api/enquiry/rate-enquiry.js +69 -0
  860. package/dist/lib/api/estimation/categories.d.ts +28 -0
  861. package/dist/lib/api/estimation/categories.js +104 -0
  862. package/dist/lib/api/estimation/category-defaults.d.ts +56 -0
  863. package/dist/lib/api/estimation/category-defaults.js +41 -0
  864. package/dist/lib/api/estimation/company-config.d.ts +59 -0
  865. package/dist/lib/api/estimation/company-config.js +19 -0
  866. package/dist/lib/api/estimation/content.d.ts +103 -0
  867. package/dist/lib/api/estimation/content.js +203 -0
  868. package/dist/lib/api/estimation/freight.d.ts +34 -0
  869. package/dist/lib/api/estimation/freight.js +18 -0
  870. package/dist/lib/api/estimation/grid-costing-drafts.d.ts +38 -0
  871. package/dist/lib/api/estimation/grid-costing-drafts.js +21 -0
  872. package/dist/lib/api/estimation/grid-costing.d.ts +353 -0
  873. package/dist/lib/api/estimation/grid-costing.js +126 -0
  874. package/dist/lib/api/estimation/index.d.ts +10 -0
  875. package/dist/lib/api/estimation/index.js +22 -0
  876. package/dist/lib/api/estimation/legacy-costing.d.ts +42 -0
  877. package/dist/lib/api/estimation/legacy-costing.js +46 -0
  878. package/dist/lib/api/estimation/machines.d.ts +32 -0
  879. package/dist/lib/api/estimation/machines.js +67 -0
  880. package/dist/lib/api/estimation/planning.d.ts +479 -0
  881. package/dist/lib/api/estimation/planning.js +385 -0
  882. package/dist/lib/api/estimation/qualities.d.ts +128 -0
  883. package/dist/lib/api/estimation/qualities.js +229 -0
  884. package/dist/lib/api/estimation/quotation-load.d.ts +30 -0
  885. package/dist/lib/api/estimation/quotation-load.js +46 -0
  886. package/dist/lib/api/estimation/quotation-save.d.ts +88 -0
  887. package/dist/lib/api/estimation/quotation-save.js +101 -0
  888. package/dist/lib/api/estimation/quote-check.d.ts +19 -0
  889. package/dist/lib/api/estimation/quote-check.js +28 -0
  890. package/dist/lib/api/estimation/quotepanel.d.ts +304 -0
  891. package/dist/lib/api/estimation/quotepanel.js +489 -0
  892. package/dist/lib/api/estimation/shipper-planning.d.ts +71 -0
  893. package/dist/lib/api/estimation/shipper-planning.js +208 -0
  894. package/dist/lib/api/estimation/wastage.d.ts +40 -0
  895. package/dist/lib/api/estimation/wastage.js +40 -0
  896. package/dist/lib/api/index.d.ts +7 -0
  897. package/dist/lib/api/index.js +17 -0
  898. package/dist/lib/api/integration/proxy.d.ts +7 -0
  899. package/dist/lib/api/integration/proxy.js +34 -0
  900. package/dist/lib/api/master/category.d.ts +126 -0
  901. package/dist/lib/api/master/category.js +208 -0
  902. package/dist/lib/api/master/company.d.ts +167 -0
  903. package/dist/lib/api/master/company.js +368 -0
  904. package/dist/lib/api/master/hsn.d.ts +36 -0
  905. package/dist/lib/api/master/hsn.js +54 -0
  906. package/dist/lib/api/master/index.d.ts +12 -0
  907. package/dist/lib/api/master/index.js +27 -0
  908. package/dist/lib/api/master/item.d.ts +158 -0
  909. package/dist/lib/api/master/item.js +135 -0
  910. package/dist/lib/api/master/ledger.d.ts +173 -0
  911. package/dist/lib/api/master/ledger.js +391 -0
  912. package/dist/lib/api/master/logistics.d.ts +117 -0
  913. package/dist/lib/api/master/logistics.js +107 -0
  914. package/dist/lib/api/master/machine.d.ts +406 -0
  915. package/dist/lib/api/master/machine.js +570 -0
  916. package/dist/lib/api/master/material-group.d.ts +97 -0
  917. package/dist/lib/api/master/material-group.js +96 -0
  918. package/dist/lib/api/master/other.d.ts +65 -0
  919. package/dist/lib/api/master/other.js +56 -0
  920. package/dist/lib/api/master/process-types.d.ts +178 -0
  921. package/dist/lib/api/master/process-types.js +4 -0
  922. package/dist/lib/api/master/process.d.ts +94 -0
  923. package/dist/lib/api/master/process.js +124 -0
  924. package/dist/lib/api/master/production-units.d.ts +10 -0
  925. package/dist/lib/api/master/production-units.js +15 -0
  926. package/dist/lib/api/master/rate.d.ts +174 -0
  927. package/dist/lib/api/master/rate.js +196 -0
  928. package/dist/lib/api/master/tool.d.ts +48 -0
  929. package/dist/lib/api/master/tool.js +80 -0
  930. package/dist/lib/api/master/user.d.ts +473 -0
  931. package/dist/lib/api/master/user.js +147 -0
  932. package/dist/lib/api/settings/erp-parameters.d.ts +33 -0
  933. package/dist/lib/api/settings/erp-parameters.js +61 -0
  934. package/dist/lib/api/utility/index.d.ts +1 -0
  935. package/dist/lib/api/utility/index.js +5 -0
  936. package/dist/lib/api/utility/menu.d.ts +32 -0
  937. package/dist/lib/api/utility/menu.js +128 -0
  938. package/dist/lib/auth.d.ts +3 -0
  939. package/dist/lib/auth.js +7 -0
  940. package/dist/lib/pwa.d.ts +8 -0
  941. package/dist/lib/pwa.js +53 -0
  942. package/dist/lib/react-query-config.d.ts +140 -0
  943. package/dist/lib/react-query-config.js +131 -0
  944. package/dist/lib/security/audit-logger.d.ts +71 -0
  945. package/dist/lib/security/audit-logger.js +173 -0
  946. package/dist/lib/security/rate-limiter.d.ts +28 -0
  947. package/dist/lib/security/rate-limiter.js +118 -0
  948. package/dist/lib/server-url.d.ts +18 -0
  949. package/dist/lib/server-url.js +70 -0
  950. package/dist/lib/svg-utils.d.ts +62 -0
  951. package/dist/lib/svg-utils.js +206 -0
  952. package/dist/lib/theme/types.d.ts +109 -0
  953. package/dist/lib/theme/types.js +231 -0
  954. package/dist/lib/theme/utils.d.ts +73 -0
  955. package/dist/lib/theme/utils.js +343 -0
  956. package/dist/lib/types/index.d.ts +58 -0
  957. package/dist/lib/types/index.js +2 -0
  958. package/dist/lib/utils/attachment-loader.d.ts +27 -0
  959. package/dist/lib/utils/attachment-loader.js +79 -0
  960. package/dist/lib/utils/client-lead-utils.d.ts +24 -0
  961. package/dist/lib/utils/client-lead-utils.js +56 -0
  962. package/dist/lib/utils/device-detection.d.ts +19 -0
  963. package/dist/lib/utils/device-detection.js +105 -0
  964. package/dist/lib/utils/logout-cleanup.d.ts +63 -0
  965. package/dist/lib/utils/logout-cleanup.js +297 -0
  966. package/dist/lib/utils/planning-prefs.d.ts +10 -0
  967. package/dist/lib/utils/planning-prefs.js +27 -0
  968. package/dist/lib/utils.d.ts +20 -0
  969. package/dist/lib/utils.js +60 -0
  970. package/dist/lib/vision/dieline-extractor.d.ts +38 -0
  971. package/dist/lib/vision/dieline-extractor.js +313 -0
  972. package/dist/lib/vision/reference-grid.d.ts +52 -0
  973. package/dist/lib/vision/reference-grid.js +241 -0
  974. package/dist/locales/de.json +79 -0
  975. package/dist/locales/en.json +2217 -0
  976. package/dist/locales/es.json +79 -0
  977. package/dist/locales/fr.json +78 -0
  978. package/dist/locales/hi.json +1599 -0
  979. package/dist/providers.d.ts +14 -0
  980. package/dist/providers.js +15 -0
  981. package/dist/services/GlobalLoadingService.d.ts +216 -0
  982. package/dist/services/GlobalLoadingService.js +216 -0
  983. package/dist/styles/grid-themes.css +346 -0
  984. package/dist/styles/index.css +5 -0
  985. package/dist/{sidebar-scrollbar-NBCB2OO2.css → styles/sidebar-scrollbar.css} +45 -45
  986. package/dist/styles/tokens.css +713 -0
  987. package/dist/types/approval.d.ts +201 -0
  988. package/dist/types/approval.js +19 -0
  989. package/dist/types/audit.d.ts +87 -0
  990. package/dist/types/audit.js +47 -0
  991. package/dist/types/draft.d.ts +142 -0
  992. package/dist/types/draft.js +19 -0
  993. package/dist/types/master.d.ts +154 -0
  994. package/dist/types/master.js +3 -0
  995. package/dist/types/shipper-planning.d.ts +277 -0
  996. package/dist/types/shipper-planning.js +6 -0
  997. package/package.json +187 -119
  998. package/dist/chunk-4PEFU7N7.js +0 -16
  999. package/dist/chunk-4PEFU7N7.js.map +0 -1
  1000. package/dist/de-EKT7SUK5.js +0 -106
  1001. package/dist/de-EKT7SUK5.js.map +0 -1
  1002. package/dist/en-QRFSIEHD.js +0 -1685
  1003. package/dist/en-QRFSIEHD.js.map +0 -1
  1004. package/dist/es-KHZMWGUI.js +0 -106
  1005. package/dist/es-KHZMWGUI.js.map +0 -1
  1006. package/dist/fr-X2XUXSHK.js +0 -105
  1007. package/dist/fr-X2XUXSHK.js.map +0 -1
  1008. package/dist/hi-YRATOE5Q.js +0 -415
  1009. package/dist/hi-YRATOE5Q.js.map +0 -1
  1010. package/dist/index.cjs +0 -28216
  1011. package/dist/index.cjs.map +0 -1
  1012. package/dist/index.d.cts +0 -3173
  1013. package/dist/index.js.map +0 -1
  1014. /package/{src → dist/cjs}/styles/index.css +0 -0
@@ -0,0 +1,1613 @@
1
+ 'use client';
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.DataGrid = DataGrid;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const react_1 = __importStar(require("react"));
40
+ const navigation_1 = require("next/navigation");
41
+ const framer_motion_1 = require("framer-motion");
42
+ const react_table_1 = require("@tanstack/react-table");
43
+ const useIntelligentColumnSizing_1 = require("../../hooks/useIntelligentColumnSizing.js");
44
+ const DeviceContext_1 = require("../../contexts/DeviceContext.js");
45
+ const utils_1 = require("../../lib/utils.js");
46
+ // Import new pagination and selection components
47
+ const PaginationControls_1 = require("./controls/PaginationControls.js");
48
+ const SelectionCell_1 = require("./cells/SelectionCell.js");
49
+ const menu_1 = require("./controls/menu/index.js");
50
+ const AutoResizeButton_1 = require("./controls/AutoResizeButton.js");
51
+ // Virtual scrolling
52
+ const react_virtual_1 = require("@tanstack/react-virtual");
53
+ const core_1 = require("@dnd-kit/core");
54
+ const sortable_1 = require("@dnd-kit/sortable");
55
+ const modifiers_1 = require("@dnd-kit/modifiers");
56
+ const lucide_react_1 = require("lucide-react");
57
+ const ui_1 = require("../ui/index.js");
58
+ const DatePicker_1 = require("../forms/date-picker/DatePicker.js");
59
+ const ui_2 = require("../ui/index.js");
60
+ const ui_3 = require("../ui/index.js");
61
+ const skeleton_1 = require("../ui/feedback/skeleton.js");
62
+ // Advanced Filter Modal
63
+ const AdvancedFilterModal_1 = require("./controls/menu/filter/AdvancedFilterModal.js");
64
+ // Column Chooser Modal (now integrated into AdvancedFilterModal)
65
+ // Data Visualization Component (Chart View)
66
+ // Chart view pulls in ECharts; load it only when the user switches to the chart view.
67
+ const DataVisualization = react_1.default.lazy(() => Promise.resolve().then(() => __importStar(require('./controls/menu/view/ChartView.js'))).then((m) => ({ default: m.ChartView })));
68
+ // Export/Import - Now handled via ActionsMenu (ExportSection/ImportSection)
69
+ // Draggable Column Header
70
+ const DraggableColumnHeader_1 = require("./columns/DraggableColumnHeader.js");
71
+ // Draggable Row Component
72
+ const DraggableRow_1 = require("./rows/DraggableRow.js");
73
+ const CellRenderer_1 = require("./cells/CellRenderer.js");
74
+ // Card View Component
75
+ const CardView_1 = require("./controls/menu/view/CardView.js");
76
+ // Column Context Menu Component
77
+ const ColumnContextMenu_1 = require("./columns/ColumnContextMenu.js");
78
+ // Baccha Search Components
79
+ const InlineSearchCell_1 = require("./search/InlineSearchCell.js");
80
+ const SearchNavigator_1 = require("./search/SearchNavigator.js");
81
+ const SearchHighlighter_1 = require("./search/SearchHighlighter.js");
82
+ const SearchNewModal_1 = require("./search/SearchNewModal.js");
83
+ const SearchPreferencesContext_1 = require("../../contexts/SearchPreferencesContext.js");
84
+ const ModuleAuthContext_1 = require("../../contexts/ModuleAuthContext.js");
85
+ const advancedSearch_1 = require("./search/advancedSearch.js");
86
+ // Expandable Row Component
87
+ const ExpandableRow_1 = require("./rows/ExpandableRow.js");
88
+ // Summary Row Component
89
+ const SummaryRow_1 = require("./rows/SummaryRow.js");
90
+ // Filter Row Component
91
+ const FilterRow_1 = require("./rows/FilterRow.js");
92
+ const VALUELESS_OPERATORS = new Set([
93
+ 'is_empty', 'is_not_empty', 'is_true', 'is_false',
94
+ 'last_7_days', 'last_30_days', 'this_month', 'this_year',
95
+ ]);
96
+ function conditionHasValue(v) {
97
+ if (v === '' || v === null || v === undefined)
98
+ return false;
99
+ if (Array.isArray(v))
100
+ return v.length > 0;
101
+ if (typeof v === 'object')
102
+ return Object.values(v).some(x => x !== '' && x !== null && x !== undefined);
103
+ return true;
104
+ }
105
+ /**
106
+ * Whether a cell value is worth attempting date parsing on.
107
+ *
108
+ * `new Date(297)` is a valid Date (297ms after the epoch), so passing plain numbers
109
+ * to the date matcher made every numeric cell resolve to 01/01/1970 — and since that
110
+ * string contains 0, 1, 7 and 9, filtering a number column by any of those digits
111
+ * matched every row. Only Date objects and date-shaped strings qualify.
112
+ */
113
+ function looksLikeDate(value) {
114
+ if (value instanceof Date)
115
+ return true;
116
+ if (typeof value !== 'string')
117
+ return false;
118
+ const s = value.trim();
119
+ if (s === '')
120
+ return false;
121
+ // A bare number as a string ("297") is a number, not a date.
122
+ if (/^-?\d+(\.\d+)?$/.test(s))
123
+ return false;
124
+ // Needs a date separator or a month name to be plausibly a date.
125
+ return /[/-]/.test(s) || /\d{1,2}:\d{2}/.test(s) ||
126
+ /\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i.test(s);
127
+ }
128
+ /** Evaluate one condition against a row's cell value. Mirrors the inline advancedFilterFn operators. */
129
+ function evaluateCondition(cellValue, operator, value) {
130
+ const cellString = String(cellValue ?? '');
131
+ const lc = (s) => String(s ?? '').toLowerCase();
132
+ switch (operator) {
133
+ case 'contains': return lc(cellString).includes(lc(value));
134
+ case 'not_contains': return !lc(cellString).includes(lc(value));
135
+ case 'equals': return cellValue == value;
136
+ case 'not_equals': return cellValue != value;
137
+ case 'starts_with': return lc(cellString).startsWith(lc(value));
138
+ case 'ends_with': return lc(cellString).endsWith(lc(value));
139
+ case 'is_empty': return !cellValue || cellString.trim() === '';
140
+ case 'is_not_empty': return !!cellValue && cellString.trim() !== '';
141
+ case 'greater_than': return Number(cellValue) > Number(value);
142
+ case 'greater_than_equal': return Number(cellValue) >= Number(value);
143
+ case 'less_than': return Number(cellValue) < Number(value);
144
+ case 'less_than_equal': return Number(cellValue) <= Number(value);
145
+ case 'between': return Number(cellValue) >= Number(value?.min ?? value?.[0]) && Number(cellValue) <= Number(value?.max ?? value?.[1]);
146
+ case 'not_between': return Number(cellValue) < Number(value?.min ?? value?.[0]) || Number(cellValue) > Number(value?.max ?? value?.[1]);
147
+ case 'is_true': return cellValue === true || cellValue === 'true' || cellValue === 1;
148
+ case 'is_false': return cellValue === false || cellValue === 'false' || cellValue === 0;
149
+ default: return true;
150
+ }
151
+ }
152
+ /**
153
+ * Evaluate all advanced conditions against a row, honoring per-condition AND/OR connectors.
154
+ * Left-to-right evaluation (AND binds the same as OR — no precedence), which matches how
155
+ * users read a stacked condition list top to bottom.
156
+ */
157
+ function evaluateConditions(row, conditions) {
158
+ const active = conditions.filter(c => c.column && (VALUELESS_OPERATORS.has(c.operator) || conditionHasValue(c.value)));
159
+ if (active.length === 0)
160
+ return true;
161
+ let result = evaluateCondition(row[active[0].column], active[0].operator, active[0].value);
162
+ for (let i = 1; i < active.length; i++) {
163
+ const c = active[i];
164
+ const matches = evaluateCondition(row[c.column], c.operator, c.value);
165
+ result = c.connector === 'OR' ? (result || matches) : (result && matches);
166
+ }
167
+ return result;
168
+ }
169
+ function DataGrid({ data, columns: initialColumns, onRowClick, onRowContextMenu, onRowSelect, onImport, selectedRowIds = [], getRowId, getRowProps, enableViewToggle = false, viewMode = 'all', onViewModeChange, enableVirtualization = true, enableColumnResizing = true, enableColumnReordering = true, enableColumnFreezing = false, frozenColumns = [], rightFrozenColumns = [], enableGrouping = false, groupByColumns = [], onGroupingChange, enableExport = true, enableImport = true, enableVisualization = true, enableStickyActions = false, enableRowSelection = true, enableSorting = true, defaultSortBy, defaultSortOrder = 'asc', initialColumnVisibility, persistKey, enableSearch = true, enableFiltering = true, enableColumnVisibility = true, pageSize = 50, stickyHeader = true, className = '', title, description, headerActions, headerActionsRight, toolbarActions, onRefresh, isRefreshing: isRefreshingProp, preToggleActions, loading = false, hideHeader = false, compactHeader = true, columnResizeMode = 'onChange', style, compactMode = false, minHeight = 60, maxHeight = "calc(100vh - 300px)", // Default: standard mode, responsive to screen height
170
+ rowHeight = 24.75,
171
+ // Baccha Search props
172
+ mainColumns, enableBacchaSearch = true, searchType,
173
+ // NEW: Pagination props
174
+ enablePagination = true, paginationPageSize = PaginationControls_1.DEFAULT_PAGE_SIZE, paginationPageSizeOptions = PaginationControls_1.DEFAULT_PAGE_SIZE_OPTIONS,
175
+ // NEW: Circular checkboxes
176
+ circularCheckboxes = false,
177
+ // NEW: Auto-resize
178
+ enableAutoResize = true,
179
+ // NEW: Row selection modes
180
+ rowSelectionMode = 'multi', enableRowClickSelection = true, enableCtrlClickMultiSelect = true, enableShiftClickRange = true, singleSelectionStyle = 'radio',
181
+ // NEW: Row reordering
182
+ enableRowReordering = false, onRowOrderChange, hideSelectionInSelectedView = true,
183
+ // NEW: Row Expansion
184
+ renderSubComponent, getRowCanExpand, expandMode = 'basic', getSubData, getSubRowId, onSubRowClick, onSubRowSelect, defaultExpandAll = false,
185
+ // NEW: Date Filter
186
+ enableDateFilter = false, preDateActions,
187
+ // NEW: Summary/Footer row
188
+ enableSummary = false, summaryConfig, dateFrom, dateTo, onDateFromChange, onDateToChange,
189
+ // NEW: Filter Row
190
+ enableFilterRow = false, initialColumnFilters, }) {
191
+ // Persisted view prefs (show/hide, order, width, sort). Falls back to an auto key
192
+ // (route + column-id fingerprint) so every grid persists without an explicit persistKey.
193
+ const pathname = (0, navigation_1.usePathname)();
194
+ const autoPersistKey = (0, react_1.useMemo)(() => {
195
+ const ids = initialColumns
196
+ .map((c, i) => c.id || c.accessorKey || `col-${i}`)
197
+ .join('|');
198
+ // Cheap stable hash of the column-id list (djb2).
199
+ let hash = 5381;
200
+ for (let i = 0; i < ids.length; i++)
201
+ hash = ((hash << 5) + hash + ids.charCodeAt(i)) | 0;
202
+ return `${pathname || 'route'}:${(hash >>> 0).toString(36)}`;
203
+ }, [initialColumns, pathname]);
204
+ const persistStorageKey = `datagrid-view:${persistKey || autoPersistKey}`;
205
+ const savedView = (0, react_1.useMemo)(() => {
206
+ if (!persistStorageKey || typeof window === 'undefined')
207
+ return null;
208
+ try {
209
+ const raw = window.localStorage.getItem(persistStorageKey);
210
+ return raw ? JSON.parse(raw) : null;
211
+ }
212
+ catch {
213
+ return null;
214
+ }
215
+ }, [persistStorageKey]);
216
+ // Device detection for mobile-specific column behaviour
217
+ const { isMobile } = (0, DeviceContext_1.useDevice)();
218
+ // Get user search preferences
219
+ const { defaultSearchType } = (0, SearchPreferencesContext_1.useSearchPreferences)();
220
+ // Page-level permissions — used to gate export when enableExport is not explicitly set to false
221
+ const pageAccess = (0, ModuleAuthContext_1.usePageAccess)();
222
+ // Determine which search type to use: explicit prop > user preference > 'advanced' fallback
223
+ const effectiveSearchType = searchType || defaultSearchType || 'advanced';
224
+ // Normalize columns: ensure all columns have explicit IDs for consistent drag/drop behavior
225
+ // This fixes the issue where some columns have only accessorKey (auto-generated ID)
226
+ // and others have explicit ID, causing drag/drop to fail inconsistently
227
+ const normalizedColumns = (0, react_1.useMemo)(() => {
228
+ return initialColumns.map((col, index) => {
229
+ // If column already has an id, use it
230
+ let normalized = col;
231
+ if (!col.id) {
232
+ if (col.accessorKey) {
233
+ normalized = { ...col, id: col.accessorKey };
234
+ }
235
+ else {
236
+ const header = typeof col.header === 'string' ? col.header : `column`;
237
+ normalized = { ...col, id: `${header.toLowerCase().replace(/\s+/g, '-')}-${index}` };
238
+ }
239
+ }
240
+ // On mobile, shrink the actions column to just fit the dropdown trigger
241
+ if (isMobile && (normalized.id === 'actions' || normalized.accessorKey === 'actions')) {
242
+ normalized = { ...normalized, size: 30, minSize: 30, maxSize: 30 };
243
+ }
244
+ // Auto-apply date sorting for columns with "Date" in accessor key;
245
+ // otherwise default to numeric-aware natural sort so "10" sorts after "9".
246
+ const accessorKey = normalized.accessorKey;
247
+ if (!normalized.sortingFn) {
248
+ if (accessorKey && /date/i.test(accessorKey)) {
249
+ normalized = { ...normalized, sortingFn: 'dateSort' };
250
+ }
251
+ else {
252
+ normalized = { ...normalized, sortingFn: 'naturalSort' };
253
+ }
254
+ }
255
+ return normalized;
256
+ });
257
+ }, [initialColumns, isMobile]);
258
+ // Create initial row selection state from selectedRowIds
259
+ const initialRowSelection = (0, react_1.useMemo)(() => {
260
+ const selection = {};
261
+ data.forEach((row, index) => {
262
+ // Use getRowId if provided, otherwise fall back to .id or index
263
+ const rowId = getRowId ? getRowId(row) : (row.id || index.toString());
264
+ if (selectedRowIds.includes(rowId)) {
265
+ // ✅ FIX: Use rowId as key (not index) when getRowId is provided
266
+ // TanStack Table expects ID-based selection when getRowId is configured
267
+ selection[rowId] = true;
268
+ }
269
+ });
270
+ return selection;
271
+ }, [selectedRowIds, data, getRowId]);
272
+ // Row reordering state - must be declared before filteredData
273
+ const [reorderedData, setReorderedData] = (0, react_1.useState)(null);
274
+ // Sync reorderedData with external data prop changes (e.g. cell edits update parent data)
275
+ // Preserves custom row order while reflecting updated values
276
+ (0, react_1.useEffect)(() => {
277
+ if (!reorderedData || !enableRowReordering)
278
+ return;
279
+ // Build a map of updated data by ID for O(n) lookup
280
+ const dataMap = new Map();
281
+ data.forEach(item => {
282
+ const id = getRowId ? getRowId(item) : item.id || '';
283
+ dataMap.set(String(id), item);
284
+ });
285
+ // Update reorderedData values while preserving order
286
+ // Also handle additions/removals
287
+ const synced = [];
288
+ const seenIds = new Set();
289
+ for (const item of reorderedData) {
290
+ const id = String(getRowId ? getRowId(item) : item.id || '');
291
+ const updated = dataMap.get(id);
292
+ if (updated) {
293
+ synced.push(updated);
294
+ seenIds.add(id);
295
+ }
296
+ // If item was removed from data, skip it
297
+ }
298
+ // Add any new items from data that weren't in reorderedData
299
+ for (const item of data) {
300
+ const id = String(getRowId ? getRowId(item) : item.id || '');
301
+ if (!seenIds.has(id)) {
302
+ synced.push(item);
303
+ }
304
+ }
305
+ // Only update if there's an actual difference to avoid infinite loops
306
+ const hasChanges = synced.length !== reorderedData.length ||
307
+ synced.some((item, i) => item !== reorderedData[i]);
308
+ if (hasChanges) {
309
+ setReorderedData(synced);
310
+ }
311
+ }, [data, enableRowReordering]); // eslint-disable-line react-hooks/exhaustive-deps
312
+ // Row Expansion state — defaultExpandAll expands every row on mount
313
+ const [expanded, setExpanded] = (0, react_1.useState)(defaultExpandAll ? true : {});
314
+ // Advanced filter conditions (from the Filters modal). Evaluated together with per-condition
315
+ // AND/OR connectors in `filteredData` — kept separate from column/search filters so OR works.
316
+ const [advancedConditions, setAdvancedConditions] = (0, react_1.useState)([]);
317
+ // Filter data based on view mode if view toggle is enabled
318
+ const filteredData = (0, react_1.useMemo)(() => {
319
+ // Use reordered data if available and reordering is enabled (in selected view OR when viewToggle is disabled)
320
+ const useReorderedData = enableRowReordering && (viewMode === 'selected' || !enableViewToggle) && reorderedData;
321
+ const baseData = useReorderedData ? reorderedData : data;
322
+ // Advanced filter pass: evaluate all conditions with their AND/OR connectors.
323
+ // Applied before view-toggle so it composes with both 'all' and 'selected' views.
324
+ const applyAdvanced = (rows) => advancedConditions.length > 0 ? rows.filter(r => evaluateConditions(r, advancedConditions)) : rows;
325
+ if (!enableViewToggle || viewMode === 'all') {
326
+ return applyAdvanced(baseData);
327
+ }
328
+ // If in 'selected' mode, filter to only show selected rows
329
+ if (selectedRowIds.length === 0) {
330
+ return []; // Show empty grid when no selections in 'selected' mode
331
+ }
332
+ // Filter for selected view
333
+ const selectedIdsSet = new Set(selectedRowIds);
334
+ const filtered = baseData.filter(item => {
335
+ const itemId = getRowId ? getRowId(item) : item.id || baseData.indexOf(item).toString();
336
+ return selectedIdsSet.has(itemId);
337
+ });
338
+ return applyAdvanced(filtered);
339
+ }, [enableViewToggle, viewMode, data, selectedRowIds, getRowId, enableRowReordering, reorderedData, advancedConditions]);
340
+ // Intelligent column sizing based on cell content only
341
+ const { enhancedColumns: intelligentColumns, autoResizeAllColumns } = (0, useIntelligentColumnSizing_1.useIntelligentColumnSizing)(filteredData, normalizedColumns, useIntelligentColumnSizing_1.COLUMN_SIZING_PRESETS.standard);
342
+ // State management
343
+ const [sorting, setSorting] = (0, react_1.useState)(() => {
344
+ if (savedView?.sorting) {
345
+ return savedView.sorting;
346
+ }
347
+ // Initialize with default sort if provided
348
+ if (defaultSortBy) {
349
+ return [{ id: defaultSortBy, desc: defaultSortOrder === 'desc' }];
350
+ }
351
+ return [];
352
+ });
353
+ const [columnFilters, setColumnFilters] = (0, react_1.useState)(initialColumnFilters || []);
354
+ // Re-seed column filters when the caller passes a new initialColumnFilters reference
355
+ // (e.g. modal reopening for a different row). Identity-based check: skip when undefined.
356
+ (0, react_1.useEffect)(() => {
357
+ if (initialColumnFilters) {
358
+ setColumnFilters(initialColumnFilters);
359
+ }
360
+ // eslint-disable-next-line react-hooks/exhaustive-deps
361
+ }, [initialColumnFilters]);
362
+ const [columnVisibility, setColumnVisibility] = (0, react_1.useState)(savedView?.columnVisibility || initialColumnVisibility || {});
363
+ const [rowSelection, setRowSelection] = (0, react_1.useState)(initialRowSelection);
364
+ const [globalFilter, setGlobalFilter] = (0, react_1.useState)('');
365
+ const [frozenColumnsState, setFrozenColumnsState] = (0, react_1.useState)(new Set(frozenColumns));
366
+ // Grouping state
367
+ const [grouping, setGrouping] = (0, react_1.useState)(groupByColumns || []);
368
+ // Column Pinning State
369
+ const [columnPinning, setColumnPinning] = (0, react_1.useState)({
370
+ left: frozenColumns || [],
371
+ right: [...(rightFrozenColumns || []), 'actions'] // Right-frozen + auto-pin actions
372
+ });
373
+ // NEW: Pagination state
374
+ const [pagination, setPagination] = (0, react_1.useState)({
375
+ pageIndex: 0,
376
+ pageSize: enablePagination ? paginationPageSize : filteredData.length,
377
+ });
378
+ // Sync frozen columns state with prop changes (but allow user overrides)
379
+ (0, react_1.useEffect)(() => {
380
+ if (frozenColumns && frozenColumns.length > 0) {
381
+ setFrozenColumnsState(prev => {
382
+ const newSet = new Set(prev);
383
+ frozenColumns.forEach(colId => newSet.add(colId));
384
+ return newSet;
385
+ });
386
+ }
387
+ }, [frozenColumns]);
388
+ // Sync right frozen columns with pinning state
389
+ (0, react_1.useEffect)(() => {
390
+ if (rightFrozenColumns && rightFrozenColumns.length > 0) {
391
+ setColumnPinning(prev => ({
392
+ ...prev,
393
+ right: [...new Set([...(rightFrozenColumns || []), 'actions'])]
394
+ }));
395
+ }
396
+ }, [rightFrozenColumns]);
397
+ // Baccha Search state
398
+ const [columnSearches, setColumnSearches] = (0, react_1.useState)({});
399
+ const [isColumnSearchActive, setIsColumnSearchActive] = (0, react_1.useState)({});
400
+ // Voice search
401
+ const [isListening, setIsListening] = (0, react_1.useState)(false);
402
+ const [speechSupported, setSpeechSupported] = (0, react_1.useState)(false);
403
+ const recognitionRef = (0, react_1.useRef)(null);
404
+ const searchHandlerRef = (0, react_1.useRef)(null);
405
+ (0, react_1.useEffect)(() => {
406
+ setSpeechSupported(typeof window !== 'undefined' &&
407
+ !!(window.SpeechRecognition || window.webkitSpeechRecognition));
408
+ }, []);
409
+ const handleVoiceSearch = (0, react_1.useCallback)(() => {
410
+ const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
411
+ if (!SpeechRecognition)
412
+ return;
413
+ if (isListening) {
414
+ recognitionRef.current?.stop();
415
+ setIsListening(false);
416
+ return;
417
+ }
418
+ const recognition = new SpeechRecognition();
419
+ recognition.continuous = false;
420
+ recognition.interimResults = false;
421
+ recognition.lang = 'en-IN';
422
+ recognition.onresult = (event) => {
423
+ const transcript = event.results[0]?.[0]?.transcript;
424
+ if (transcript)
425
+ searchHandlerRef.current?.(transcript.trim());
426
+ setIsListening(false);
427
+ recognitionRef.current = null;
428
+ };
429
+ recognition.onerror = () => { setIsListening(false); recognitionRef.current = null; };
430
+ recognition.onend = () => { setIsListening(false); recognitionRef.current = null; };
431
+ recognitionRef.current = recognition;
432
+ recognition.start();
433
+ setIsListening(true);
434
+ }, [isListening]);
435
+ // Search navigation
436
+ const searchInputRef = (0, react_1.useRef)(null);
437
+ const { navigationState, updateSearchResults, navigate: navigateSearch, selectRow: selectSearchRow, clearNavigation } = (0, SearchNavigator_1.useSearchNavigation)();
438
+ // Parse main columns from comma-separated string
439
+ const mainColumnsArray = (0, react_1.useMemo)(() => {
440
+ if (!mainColumns)
441
+ return [];
442
+ return mainColumns.split(',').map(col => col.trim()).filter(Boolean);
443
+ }, [mainColumns]);
444
+ // ✅ DISABLED: This was causing selection to reset on every change
445
+ // Let the DataGrid manage its own selection state internally
446
+ // Parent component gets notified via onRowSelect callback
447
+ /*
448
+ React.useEffect(() => {
449
+ if (!selectedRowIds || selectedRowIds.length === 0) return
450
+
451
+ const newSelection: Record<string, boolean> = {}
452
+ data.forEach((row, index) => {
453
+ const rowId = (row as any).id || index.toString()
454
+ if (selectedRowIds.includes(rowId)) {
455
+ newSelection[index.toString()] = true
456
+ }
457
+ })
458
+
459
+ const newKeys = Object.keys(newSelection).sort().join(',')
460
+ const currentKeys = Object.keys(rowSelection).filter(k => rowSelection[k]).sort().join(',')
461
+
462
+ if (newKeys !== currentKeys) {
463
+ setRowSelection(newSelection)
464
+ }
465
+ }, [selectedRowIds])
466
+ */
467
+ // Ensure toggle visibility is always stable
468
+ const toggleShouldBeVisible = (0, react_1.useMemo)(() => {
469
+ return Boolean(enableViewToggle && enableRowSelection);
470
+ }, [enableViewToggle, enableRowSelection]);
471
+ // Safe selectedRowIds count to prevent undefined errors
472
+ const safeSelectedCount = (0, react_1.useMemo)(() => {
473
+ const count = Array.isArray(selectedRowIds) ? selectedRowIds.length : 0;
474
+ // console.log('🔢 [DataGrid] safeSelectedCount recalculated:', {
475
+ // count,
476
+ // selectedRowIds,
477
+ // isArray: Array.isArray(selectedRowIds)
478
+ // })
479
+ return count;
480
+ }, [selectedRowIds]);
481
+ // Note: full selectedRowIds sync is disabled to allow internal selection state
482
+ // management. Removal-only sync below: when the external selectedRowIds shrink
483
+ // (parent removed rows), delete ONLY those keys — never rebuild or blanket-clear.
484
+ const prevSelectedRowIdsRef = react_1.default.useRef(selectedRowIds);
485
+ react_1.default.useEffect(() => {
486
+ if (!enableRowSelection) {
487
+ prevSelectedRowIdsRef.current = selectedRowIds;
488
+ return;
489
+ }
490
+ const prev = prevSelectedRowIdsRef.current;
491
+ prevSelectedRowIdsRef.current = selectedRowIds;
492
+ const removed = prev.filter(id => !selectedRowIds.includes(id));
493
+ if (removed.length === 0)
494
+ return;
495
+ setRowSelection(current => {
496
+ const next = { ...current };
497
+ let changed = false;
498
+ for (const id of removed) {
499
+ if (next[id]) {
500
+ delete next[id];
501
+ changed = true;
502
+ }
503
+ }
504
+ return changed ? next : current;
505
+ });
506
+ // eslint-disable-next-line react-hooks/exhaustive-deps
507
+ }, [selectedRowIds]);
508
+ // Preserve row selection state during view mode transitions
509
+ const stableRowSelection = (0, react_1.useMemo)(() => {
510
+ if (!enableViewToggle)
511
+ return rowSelection;
512
+ // In 'selected' mode, ensure selection state remains consistent.
513
+ // MUST be keyed by rowId (the table registers rows via getRowId) — keying by
514
+ // index made getSelectedRowModel() return [] and any internal state change
515
+ // fired onRowSelect([]), wiping the parent's selection.
516
+ if (viewMode === 'selected' && selectedRowIds.length > 0) {
517
+ const preservedSelection = {};
518
+ filteredData.forEach((item) => {
519
+ const itemId = getRowId ? getRowId(item) : (item.id || data.indexOf(item).toString());
520
+ if (selectedRowIds.includes(itemId)) {
521
+ preservedSelection[itemId] = true;
522
+ }
523
+ });
524
+ return preservedSelection;
525
+ }
526
+ return rowSelection;
527
+ }, [enableViewToggle, viewMode, selectedRowIds, filteredData, rowSelection, getRowId, data]);
528
+ // Helper function to format dates as "12 Oct, 2025"
529
+ const formatDateCell = (dateString) => {
530
+ if (!dateString)
531
+ return '-';
532
+ try {
533
+ const date = new Date(dateString);
534
+ if (isNaN(date.getTime()))
535
+ return dateString;
536
+ const day = date.getDate();
537
+ const month = date.toLocaleDateString('en-US', { month: 'short' });
538
+ const year = date.getFullYear();
539
+ return `${day} ${month}, ${year}`;
540
+ }
541
+ catch {
542
+ return dateString;
543
+ }
544
+ };
545
+ // Create columns with selection column if needed
546
+ const enhancedColumns = (0, react_1.useMemo)(() => {
547
+ let baseColumns = intelligentColumns || normalizedColumns;
548
+ // Auto-format date columns (columns ending with "Date")
549
+ baseColumns = baseColumns.map((col) => {
550
+ const accessorKey = col.accessorKey;
551
+ const header = col.header;
552
+ // Check if column name ends with "Date" or header contains "Date"
553
+ const isDateColumn = (accessorKey && (accessorKey.endsWith('Date') || accessorKey.toLowerCase().includes('date'))) ||
554
+ (typeof header === 'string' && header.toLowerCase().includes('date'));
555
+ // If it's a date column and doesn't have a custom cell renderer, add date formatting
556
+ if (isDateColumn && !col.cell) {
557
+ return {
558
+ ...col,
559
+ cell: ({ row }) => {
560
+ const value = row.getValue(accessorKey);
561
+ const formattedValue = formatDateCell(value);
562
+ // Center the dash if it's an empty value
563
+ return ((0, jsx_runtime_1.jsx)("span", { className: formattedValue === '-' ? 'flex justify-center w-full' : '', children: formattedValue }));
564
+ }
565
+ };
566
+ }
567
+ return col;
568
+ });
569
+ // Hide selection column in Selected view if hideSelectionInSelectedView is true
570
+ const shouldHideSelection = hideSelectionInSelectedView && viewMode === 'selected';
571
+ if (!enableRowSelection || shouldHideSelection)
572
+ return baseColumns;
573
+ // Check if there's already a selection column
574
+ const hasSelectionColumn = baseColumns.some(col => col.id === 'select' ||
575
+ col.accessorKey === 'select' ||
576
+ (col.meta && col.meta.isSelectColumn));
577
+ if (hasSelectionColumn) {
578
+ return baseColumns;
579
+ }
580
+ const selectionColumn = {
581
+ id: 'select',
582
+ header: ({ table }) => ((0, jsx_runtime_1.jsx)("div", { className: "w-full h-full flex items-center justify-center", children: rowSelectionMode === 'multi' ? ((0, jsx_runtime_1.jsx)(SelectionCell_1.SelectionCell, { checked: table.getIsAllRowsSelected(), indeterminate: table.getIsSomeRowsSelected(), onChange: (checked) => {
583
+ table.toggleAllRowsSelected(checked);
584
+ }, circular: circularCheckboxes, mode: "checkbox" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-5 h-5" }) /* Empty space in single mode */) })),
585
+ cell: ({ row }) => ((0, jsx_runtime_1.jsx)("div", { className: "w-full h-full flex items-center justify-center", children: (0, jsx_runtime_1.jsx)(SelectionCell_1.SelectionCell, { checked: row.getIsSelected(), onChange: (checked) => {
586
+ row.toggleSelected(checked);
587
+ }, circular: circularCheckboxes, mode: rowSelectionMode === 'single' ? 'radio' : 'checkbox' }) })),
588
+ enableSorting: false,
589
+ enableHiding: false,
590
+ size: 30, // 1.875rem (30px ÷ 16)
591
+ minSize: 30,
592
+ maxSize: 30,
593
+ };
594
+ const result = [selectionColumn, ...baseColumns];
595
+ return result;
596
+ }, [intelligentColumns, normalizedColumns, enableRowSelection, hideSelectionInSelectedView, viewMode, rowSelectionMode, circularCheckboxes]);
597
+ // Auto-prepend expand column when getRowCanExpand is provided
598
+ const columnsWithExpand = (0, react_1.useMemo)(() => {
599
+ if (!getRowCanExpand)
600
+ return enhancedColumns;
601
+ // Check if there's already an expand column
602
+ const hasExpandColumn = enhancedColumns.some(col => col.id === 'expand');
603
+ if (hasExpandColumn)
604
+ return enhancedColumns;
605
+ const expandColumn = {
606
+ id: 'expand',
607
+ header: ({ table }) => ((0, jsx_runtime_1.jsx)("div", { className: "w-full h-full flex items-center justify-center", children: (0, jsx_runtime_1.jsx)(ExpandableRow_1.ExpansionToggleHeader, { table: table }) })),
608
+ cell: ({ row }) => (0, jsx_runtime_1.jsx)(ExpandableRow_1.ExpansionToggleCell, { row: row }),
609
+ enableSorting: false,
610
+ enableHiding: false,
611
+ enableColumnFilter: false,
612
+ size: 36,
613
+ minSize: 36,
614
+ maxSize: 36,
615
+ };
616
+ // Insert after select column if it exists, otherwise prepend
617
+ const selectIndex = enhancedColumns.findIndex(col => col.id === 'select');
618
+ if (selectIndex >= 0) {
619
+ const result = [...enhancedColumns];
620
+ result.splice(selectIndex + 1, 0, expandColumn);
621
+ return result;
622
+ }
623
+ return [expandColumn, ...enhancedColumns];
624
+ }, [enhancedColumns, getRowCanExpand]);
625
+ // For column reordering, we need mutable state - but keep it simple.
626
+ // Lazily seed from a persisted column order (by id) when persistKey is set.
627
+ // Store only the ORDER (string ids), never a snapshot of column objects — otherwise
628
+ // the frozen snapshot keeps stale `cell` closures (over old state/props), which made
629
+ // edited cells render/write stale data (e.g. corrugation flute stuck "Loading", reel
630
+ // wiped on edit). `columns` is re-derived from the FRESH columnsWithExpand every render.
631
+ const colId = (col) => col.id || col.accessorKey;
632
+ const [columnOrderState, setColumnOrderState] = (0, react_1.useState)(() => {
633
+ const order = savedView?.columnOrder;
634
+ return order && order.length > 0 ? order : null;
635
+ });
636
+ const columns = (0, react_1.useMemo)(() => {
637
+ if (!columnOrderState || columnOrderState.length === 0)
638
+ return columnsWithExpand;
639
+ const currentIds = columnsWithExpand.map(colId);
640
+ // Only apply a saved order that matches the current column set exactly.
641
+ if (columnOrderState.length !== currentIds.length || !columnOrderState.every((id) => currentIds.includes(id))) {
642
+ return columnsWithExpand;
643
+ }
644
+ return [...columnsWithExpand].sort((a, b) => columnOrderState.indexOf(colId(a)) - columnOrderState.indexOf(colId(b)));
645
+ }, [columnsWithExpand, columnOrderState]);
646
+ // Search hook - handles all search state and logic (must be after columns definition)
647
+ const { searchValue, setSearchValue, currentSearchTerm, selectedDuringSearch, debouncedSearchValue, handleGlobalSearchChange, handleRowSelectionChange, clearSearch } = (0, advancedSearch_1.advancedSearch)({
648
+ data,
649
+ columns,
650
+ mainColumnsArray,
651
+ enableSearch,
652
+ totalSearchResults: navigationState.totalResults,
653
+ updateSearchResults,
654
+ clearNavigation,
655
+ setGlobalFilter
656
+ });
657
+ // Keep voice search handler ref in sync
658
+ searchHandlerRef.current = handleGlobalSearchChange;
659
+ // (Column order is re-derived from fresh columns each render; no snapshot to reset.)
660
+ const [showAdvancedFilter, setShowAdvancedFilter] = (0, react_1.useState)(false);
661
+ const [settingsInitialTab, setSettingsInitialTab] = (0, react_1.useState)('filters');
662
+ const [currentView, setCurrentView] = (0, react_1.useState)('grid');
663
+ const handleViewChange = (0, react_1.useCallback)((view) => {
664
+ setCurrentView(view);
665
+ }, []);
666
+ // Column sizing state - initialize with explicit sizes from column definitions for SSR consistency
667
+ const [columnSizing, setColumnSizing] = (0, react_1.useState)(() => {
668
+ const initialSizing = {};
669
+ columns.forEach((col) => {
670
+ // Only set size if explicitly defined in column
671
+ if (col.id && col.size !== undefined) {
672
+ initialSizing[col.id] = col.size;
673
+ }
674
+ });
675
+ return { ...initialSizing, ...(savedView?.columnSizing || {}) };
676
+ });
677
+ // Persist view preferences (show/hide, order, width, sort) to localStorage when persistKey is set
678
+ const columnOrderIds = (0, react_1.useMemo)(() => columns.map((col) => col.id || col.accessorKey).filter(Boolean), [columns]);
679
+ (0, react_1.useEffect)(() => {
680
+ if (!persistStorageKey || typeof window === 'undefined')
681
+ return;
682
+ try {
683
+ window.localStorage.setItem(persistStorageKey, JSON.stringify({
684
+ columnVisibility,
685
+ columnSizing,
686
+ sorting,
687
+ columnOrder: columnOrderIds,
688
+ }));
689
+ }
690
+ catch {
691
+ // localStorage unavailable (private mode / quota) — view just won't persist
692
+ }
693
+ }, [persistStorageKey, columnVisibility, columnSizing, sorting, columnOrderIds]);
694
+ // Track selected rows during search - now handled by useDataGridSearch hook
695
+ // Track last clicked row for Shift+Click range selection
696
+ const [lastClickedRowIndex, setLastClickedRowIndex] = react_1.default.useState(null);
697
+ // Auto-sizing calculation (FIXED: Now includes summary row, borders, and proper height calculations)
698
+ const calculateOptimalHeight = (0, react_1.useMemo)(() => {
699
+ // Only enable auto-sizing in compactMode (for modals/dialogs)
700
+ // Default mode uses flex with minHeight/maxHeight
701
+ if (!compactMode)
702
+ return null;
703
+ // When search/filter is active, maintain minimum height to prevent grid collapse
704
+ const hasActiveSearch = globalFilter && globalFilter.trim().length > 0;
705
+ const minRowsForSearch = 8; // Minimum rows to show when searching to prevent collapse
706
+ const actualDataLength = filteredData.length;
707
+ const dataLength = hasActiveSearch
708
+ ? Math.max(Math.min(actualDataLength, pageSize), minRowsForSearch)
709
+ : Math.min(actualDataLength, pageSize);
710
+ // ========================================
711
+ // HEIGHT COMPONENTS (All in pixels)
712
+ // ========================================
713
+ // 1. Toolbar/Header height
714
+ const toolbarHeight = hideHeader ? 0 : (compactHeader ? 48 : 60);
715
+ // 2. Table header row height
716
+ const headerRowHeight = 44; // From DraggableColumnHeader (h-11 = 2.75rem = 44px)
717
+ // 3. Filter row height (if enabled): h-8 = 32px
718
+ const filterRowHeight = enableFilterRow ? 32 : 0;
719
+ // 4. Data rows height
720
+ const dataRowsHeight = dataLength * rowHeight;
721
+ // 5. Summary row height (if enabled)
722
+ const summaryRowCount = (enableSummary && summaryConfig)
723
+ ? (Array.isArray(summaryConfig) ? summaryConfig.length : 1)
724
+ : 0;
725
+ const summaryRowHeight = summaryRowCount * 24.75; // Summary rows use py-1 same as data rows (~24.75px)
726
+ // 6. Pagination height (if enabled)
727
+ const paginationHeight = enablePagination ? 56 : 0;
728
+ // 7. Borders and spacing
729
+ const borderAndSpacing = 4; // Top and bottom borders (2px each)
730
+ // Total content height
731
+ const contentHeight = toolbarHeight +
732
+ headerRowHeight +
733
+ filterRowHeight +
734
+ dataRowsHeight +
735
+ summaryRowHeight +
736
+ paginationHeight +
737
+ borderAndSpacing;
738
+ // ========================================
739
+ // HEIGHT LOGIC
740
+ // ========================================
741
+ // Special handling for no data or 1 row — let grid size naturally
742
+ if (dataLength <= 1) {
743
+ return null;
744
+ }
745
+ // Threshold: ~10 rows before scrolling kicks in
746
+ const compactThreshold = 10;
747
+ if (dataLength <= compactThreshold) {
748
+ // Small dataset: return null to let grid size naturally (no fixed height constraint)
749
+ // This prevents scrolling when actual row content is taller than estimated rowHeight
750
+ return null;
751
+ }
752
+ else {
753
+ // Use configured max height for larger datasets (allow scrolling): 500px default
754
+ const maxHeightValue = typeof maxHeight === 'number' ? maxHeight : 500;
755
+ return Math.min(contentHeight, maxHeightValue);
756
+ }
757
+ }, [compactMode, filteredData.length, pageSize, hideHeader, compactHeader, maxHeight, rowHeight, enablePagination, enableSummary, summaryConfig, globalFilter, enableFilterRow]);
758
+ // Column context menu state
759
+ const [contextMenu, setContextMenu] = (0, react_1.useState)({
760
+ column: null,
761
+ isVisible: false,
762
+ position: { x: 0, y: 0 }
763
+ });
764
+ // DnD sensors
765
+ const sensors = (0, core_1.useSensors)((0, core_1.useSensor)(core_1.PointerSensor), (0, core_1.useSensor)(core_1.KeyboardSensor, {
766
+ coordinateGetter: sortable_1.sortableKeyboardCoordinates,
767
+ }));
768
+ // Custom filter function for advanced filters
769
+ const advancedFilterFn = react_1.default.useCallback((row, columnId, filterValue) => {
770
+ if (!filterValue)
771
+ return true;
772
+ // Handle plain string filter values (from FilterRow inline search)
773
+ if (typeof filterValue === 'string') {
774
+ const cellValue = row.getValue(columnId);
775
+ const cellString = String(cellValue ?? '');
776
+ const filterLower = filterValue.toLowerCase();
777
+ // Standard string matching first
778
+ if (cellString.toLowerCase().includes(filterLower))
779
+ return true;
780
+ // Date-aware matching: try to parse cell value as date and match against common formats
781
+ // This handles cases where raw value is "2026-02-14T00:00:00" but user types "14 Feb" or "Feb 2026"
782
+ //
783
+ // Only attempt this on values that actually look like dates. new Date(297) is a VALID
784
+ // date (297ms after epoch → 01/01/1970), so feeding plain numbers here made every
785
+ // numeric cell match any digit the user typed — filtering a number column did nothing.
786
+ if (cellValue && looksLikeDate(cellValue)) {
787
+ const dateObj = new Date(cellValue);
788
+ if (!isNaN(dateObj.getTime())) {
789
+ const day = dateObj.getDate();
790
+ const month = dateObj.getMonth(); // 0-indexed
791
+ const year = dateObj.getFullYear();
792
+ const monthNames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
793
+ const monthFull = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
794
+ const dd = String(day).padStart(2, '0');
795
+ const mm = String(month + 1).padStart(2, '0');
796
+ // Generate searchable date strings in common formats
797
+ const dateFormats = [
798
+ `${dd}/${mm}/${year}`, // 14/02/2026
799
+ `${mm}/${dd}/${year}`, // 02/14/2026
800
+ `${dd}-${mm}-${year}`, // 14-02-2026
801
+ `${day} ${monthNames[month]} ${year}`, // 14 feb 2026
802
+ `${monthNames[month]} ${day}, ${year}`, // feb 14, 2026
803
+ `${day} ${monthFull[month]} ${year}`, // 14 february 2026
804
+ `${monthFull[month]} ${day}, ${year}`, // february 14, 2026
805
+ `${monthNames[month]} ${year}`, // feb 2026
806
+ `${monthFull[month]} ${year}`, // february 2026
807
+ `${dd}/${mm}`, // 14/02
808
+ `${day} ${monthNames[month]}`, // 14 feb
809
+ ];
810
+ if (dateFormats.some(fmt => fmt.toLowerCase().includes(filterLower)))
811
+ return true;
812
+ }
813
+ }
814
+ return false;
815
+ }
816
+ if (typeof filterValue !== 'object')
817
+ return true;
818
+ const { operator, value, type } = filterValue;
819
+ const cellValue = row.getValue(columnId);
820
+ const cellString = String(cellValue || '');
821
+ // Handle 'type' field (from Quick Filter)
822
+ if (type && !operator) {
823
+ switch (type) {
824
+ case 'contains':
825
+ return cellString.toLowerCase().includes(String(value).toLowerCase());
826
+ case 'equals':
827
+ return cellString.toLowerCase() === String(value).toLowerCase();
828
+ case 'starts_with':
829
+ return cellString.toLowerCase().startsWith(String(value).toLowerCase());
830
+ case 'greater_than':
831
+ return Number(cellValue) > Number(value);
832
+ case 'less_than':
833
+ return Number(cellValue) < Number(value);
834
+ case 'in':
835
+ // Check if cellValue is in the array of values
836
+ return Array.isArray(value) && value.map(v => String(v)).includes(cellString);
837
+ default:
838
+ return true;
839
+ }
840
+ }
841
+ // Handle different operators (from Advanced Filter)
842
+ switch (operator) {
843
+ case 'contains':
844
+ return cellString.toLowerCase().includes(String(value).toLowerCase());
845
+ case 'not_contains':
846
+ return !cellString.toLowerCase().includes(String(value).toLowerCase());
847
+ case 'equals':
848
+ return cellValue == value;
849
+ case 'not_equals':
850
+ return cellValue != value;
851
+ case 'starts_with':
852
+ return cellString.toLowerCase().startsWith(String(value).toLowerCase());
853
+ case 'ends_with':
854
+ return cellString.toLowerCase().endsWith(String(value).toLowerCase());
855
+ case 'is_empty':
856
+ return !cellValue || cellString.trim() === '';
857
+ case 'is_not_empty':
858
+ return cellValue && cellString.trim() !== '';
859
+ case 'greater_than':
860
+ return Number(cellValue) > Number(value);
861
+ case 'greater_than_equal':
862
+ return Number(cellValue) >= Number(value);
863
+ case 'less_than':
864
+ return Number(cellValue) < Number(value);
865
+ case 'less_than_equal':
866
+ return Number(cellValue) <= Number(value);
867
+ case 'between':
868
+ return Number(cellValue) >= Number(value[0]) && Number(cellValue) <= Number(value[1]);
869
+ case 'not_between':
870
+ return Number(cellValue) < Number(value[0]) || Number(cellValue) > Number(value[1]);
871
+ case 'is_true':
872
+ return cellValue === true || cellValue === 'true' || cellValue === 1;
873
+ case 'is_false':
874
+ return cellValue === false || cellValue === 'false' || cellValue === 0;
875
+ default:
876
+ return true;
877
+ }
878
+ }, []);
879
+ // Table instance with intelligent selection handler
880
+ const table = (0, react_table_1.useReactTable)({
881
+ data: filteredData,
882
+ columns,
883
+ getRowId: getRowId || ((row) => row.id || data.indexOf(row).toString()),
884
+ defaultColumn: {
885
+ size: 150, // Ensure consistent default size for SSR/CSR
886
+ minSize: 30,
887
+ maxSize: 2000, // High limit allows users to drag columns wider than auto-calculated width
888
+ filterFn: 'advancedFilter', // Use custom filter function for all columns
889
+ },
890
+ onSortingChange: setSorting,
891
+ onColumnFiltersChange: setColumnFilters,
892
+ getCoreRowModel: (0, react_table_1.getCoreRowModel)(),
893
+ getSortedRowModel: (0, react_table_1.getSortedRowModel)(),
894
+ getFilteredRowModel: (0, react_table_1.getFilteredRowModel)(),
895
+ filterFns: {
896
+ advancedFilter: advancedFilterFn,
897
+ },
898
+ sortingFns: {
899
+ // Numeric-aware text sort so "10" sorts after "9", not after "1".
900
+ naturalSort: (rowA, rowB, columnId) => (0, utils_1.naturalCompare)(rowA.getValue(columnId), rowB.getValue(columnId)),
901
+ // Date-aware sort: parses DD/MM/YYYY, ISO, and other common date formats
902
+ dateSort: (rowA, rowB, columnId) => {
903
+ const parseDate = (val) => {
904
+ if (!val)
905
+ return 0;
906
+ const s = String(val);
907
+ // DD/MM/YYYY or DD/MM/YY
908
+ if (s.includes('/')) {
909
+ const parts = s.split('/');
910
+ if (parts.length === 3) {
911
+ const y = parseInt(parts[2]);
912
+ return new Date(y < 100 ? 2000 + y : y, parseInt(parts[1]) - 1, parseInt(parts[0])).getTime();
913
+ }
914
+ }
915
+ const d = new Date(s);
916
+ return isNaN(d.getTime()) ? 0 : d.getTime();
917
+ };
918
+ return parseDate(rowA.getValue(columnId)) - parseDate(rowB.getValue(columnId));
919
+ },
920
+ },
921
+ getPaginationRowModel: enablePagination ? (0, react_table_1.getPaginationRowModel)() : undefined,
922
+ onPaginationChange: enablePagination ? setPagination : undefined,
923
+ autoResetPageIndex: false,
924
+ // Grouping
925
+ getGroupedRowModel: enableGrouping ? (0, react_table_1.getGroupedRowModel)() : undefined,
926
+ onGroupingChange: (updater) => {
927
+ const newGrouping = typeof updater === 'function' ? updater(grouping) : updater;
928
+ setGrouping(newGrouping);
929
+ onGroupingChange?.(newGrouping);
930
+ },
931
+ // Expanding (also used for grouped rows)
932
+ getExpandedRowModel: (0, react_table_1.getExpandedRowModel)(),
933
+ onExpandedChange: setExpanded,
934
+ getRowCanExpand: getRowCanExpand || ((row) => !!renderSubComponent || row.subRows?.length > 0),
935
+ onColumnVisibilityChange: setColumnVisibility,
936
+ onRowSelectionChange: (updater) => {
937
+ setRowSelection(updater);
938
+ // Track selections and deselections for intelligent search clearing
939
+ if (typeof updater === 'function') {
940
+ const newSelection = updater(rowSelection);
941
+ const oldKeys = Object.keys(rowSelection).filter(key => rowSelection[key]);
942
+ const newKeys = Object.keys(newSelection).filter(key => newSelection[key]);
943
+ // Find newly selected and deselected rows
944
+ const newlySelected = newKeys.filter(key => !oldKeys.includes(key));
945
+ const newlyDeselected = oldKeys.filter(key => !newKeys.includes(key));
946
+ if (currentSearchTerm.trim()) {
947
+ // Handle newly selected rows
948
+ newlySelected.forEach(rowIndexStr => {
949
+ const rowIndex = parseInt(rowIndexStr, 10);
950
+ const rowData = filteredData[rowIndex];
951
+ const rowId = rowData?.id || rowIndexStr;
952
+ handleRowSelectionChange(rowId, true);
953
+ });
954
+ // Handle newly deselected rows
955
+ newlyDeselected.forEach(rowIndexStr => {
956
+ const rowIndex = parseInt(rowIndexStr, 10);
957
+ const rowData = filteredData[rowIndex];
958
+ const rowId = rowData?.id || rowIndexStr;
959
+ handleRowSelectionChange(rowId, false);
960
+ });
961
+ }
962
+ }
963
+ },
964
+ onGlobalFilterChange: setGlobalFilter,
965
+ onColumnSizingChange: setColumnSizing,
966
+ globalFilterFn: 'includesString',
967
+ state: {
968
+ sorting,
969
+ columnFilters,
970
+ columnVisibility,
971
+ rowSelection: stableRowSelection,
972
+ globalFilter,
973
+ columnSizing,
974
+ expanded,
975
+ columnPinning,
976
+ grouping,
977
+ ...(enablePagination && { pagination }),
978
+ },
979
+ onColumnPinningChange: setColumnPinning,
980
+ enableRowSelection: true,
981
+ enableMultiRowSelection: rowSelectionMode === 'multi',
982
+ enableColumnResizing: enableColumnResizing,
983
+ columnResizeMode: columnResizeMode,
984
+ });
985
+ // Table rows
986
+ const { rows } = table.getRowModel();
987
+ // Virtual scrolling setup
988
+ const tableContainerRef = (0, react_1.useRef)(null);
989
+ const headerScrollRef = (0, react_1.useRef)(null);
990
+ // Track if data has ever been loaded (non-empty) to distinguish initial empty vs result empty
991
+ const hasEverHadDataRef = (0, react_1.useRef)(false);
992
+ if (data.length > 0) {
993
+ hasEverHadDataRef.current = true;
994
+ }
995
+ // Force re-render state for virtualizer (workaround for React 19 flushSync issue)
996
+ const [, forceRerender] = react_1.default.useReducer((x) => x + 1, 0);
997
+ const rowVirtualizer = (0, react_virtual_1.useVirtualizer)({
998
+ count: rows.length,
999
+ getScrollElement: () => tableContainerRef.current,
1000
+ estimateSize: () => rowHeight,
1001
+ overscan: 20,
1002
+ enabled: enableVirtualization && currentView === 'grid',
1003
+ // React 19 fix: never allow synchronous flushSync from inside render.
1004
+ // All virtualizer-triggered re-renders go through a microtask so they
1005
+ // happen after the current render cycle completes.
1006
+ onChange: (_instance, sync) => {
1007
+ if (sync) {
1008
+ queueMicrotask(forceRerender);
1009
+ }
1010
+ else {
1011
+ forceRerender();
1012
+ }
1013
+ },
1014
+ // Override the scroll offset observer to avoid flushSync during render.
1015
+ // Default implementation calls flushSync when scroll events fire while
1016
+ // React is already rendering. Using rAF breaks the synchronous chain.
1017
+ observeElementOffset: (instance, cb) => {
1018
+ const el = instance.scrollElement;
1019
+ if (!el)
1020
+ return;
1021
+ let rafId;
1022
+ const handler = () => {
1023
+ cancelAnimationFrame(rafId);
1024
+ rafId = requestAnimationFrame(() => cb(el.scrollTop, false));
1025
+ };
1026
+ cb(el.scrollTop, false);
1027
+ el.addEventListener('scroll', handler, { passive: true });
1028
+ return () => {
1029
+ el.removeEventListener('scroll', handler);
1030
+ cancelAnimationFrame(rafId);
1031
+ };
1032
+ },
1033
+ });
1034
+ // Column reordering handler
1035
+ const handleColumnReorder = (0, react_1.useCallback)((event) => {
1036
+ const { active, over } = event;
1037
+ if (!over)
1038
+ return;
1039
+ // Use accessor keys for matching since that's what we're using as IDs
1040
+ const activeIndex = columns.findIndex((col) => col.accessorKey === active.id || col.id === active.id);
1041
+ const overIndex = columns.findIndex((col) => col.accessorKey === over.id || col.id === over.id);
1042
+ if (activeIndex !== overIndex && activeIndex !== -1 && overIndex !== -1) {
1043
+ // Persist the new ORDER (ids), not the column objects.
1044
+ const currentIds = columns.map(colId);
1045
+ setColumnOrderState((0, sortable_1.arrayMove)(currentIds, activeIndex, overIndex));
1046
+ }
1047
+ }, [columns]);
1048
+ // Row reordering handler
1049
+ const handleRowReorder = (0, react_1.useCallback)((event) => {
1050
+ const { active, over } = event;
1051
+ if (!over)
1052
+ return;
1053
+ const currentData = reorderedData || filteredData;
1054
+ const activeIndex = currentData.findIndex(item => {
1055
+ const itemId = getRowId ? getRowId(item) : item.id;
1056
+ return itemId === active.id;
1057
+ });
1058
+ const overIndex = currentData.findIndex(item => {
1059
+ const itemId = getRowId ? getRowId(item) : item.id;
1060
+ return itemId === over.id;
1061
+ });
1062
+ if (activeIndex !== overIndex && activeIndex !== -1 && overIndex !== -1) {
1063
+ const newData = (0, sortable_1.arrayMove)(currentData, activeIndex, overIndex);
1064
+ setReorderedData(newData);
1065
+ onRowOrderChange?.(newData);
1066
+ }
1067
+ }, [filteredData, reorderedData, getRowId, onRowOrderChange]);
1068
+ // Selected rows data - use getSelectedRowModel() to get ALL selected rows, not just filtered ones
1069
+ const selectedRows = (0, react_1.useMemo)(() => {
1070
+ return table.getSelectedRowModel().rows.map(row => row.original);
1071
+ }, [table, rowSelection]);
1072
+ // Notify parent of selected rows
1073
+ react_1.default.useEffect(() => {
1074
+ onRowSelect?.(selectedRows);
1075
+ }, [selectedRows, onRowSelect]);
1076
+ // Filtered and sorted data for visualization
1077
+ const processedData = (0, react_1.useMemo)(() => {
1078
+ return table.getFilteredRowModel().rows.map(row => row.original);
1079
+ }, [table]);
1080
+ // Export rows: mirror what's on screen — only visible columns, in display order,
1081
+ // keyed by their header label, over the filtered + sorted rows.
1082
+ const exportRows = (0, react_1.useMemo)(() => {
1083
+ const exportable = table.getVisibleLeafColumns().filter((col) => col.id !== 'select' && col.id !== 'actions' && col.id !== 'expand');
1084
+ const headerOf = (col) => {
1085
+ const h = col.columnDef?.header;
1086
+ return typeof h === 'string' && h.trim() ? h : col.id;
1087
+ };
1088
+ return table.getSortedRowModel().rows.map((row) => {
1089
+ const out = {};
1090
+ exportable.forEach((col) => {
1091
+ out[headerOf(col)] = row.getValue(col.id);
1092
+ });
1093
+ return out;
1094
+ });
1095
+ // Recompute when filters, sorting, visibility, order, or data change
1096
+ }, [table, columnFilters, sorting, columnVisibility, columnSizing, globalFilter, data, columnOrderState]);
1097
+ const handleExport = (format) => {
1098
+ // Export functionality will be implemented in ExportImportButtons
1099
+ };
1100
+ const handleImport = (importedData) => {
1101
+ // Pass imported data to parent component
1102
+ onImport?.(importedData);
1103
+ };
1104
+ // Row click handler for selection
1105
+ const handleRowClick = (0, react_1.useCallback)((row, rowIndex, event) => {
1106
+ if (!enableRowClickSelection)
1107
+ return;
1108
+ // Prevent selection if clicking on a button or input (but allow checkbox clicks)
1109
+ const target = event.target;
1110
+ if (target.closest('button') || target.closest('a')) {
1111
+ return;
1112
+ }
1113
+ // Prevent selection if clicking on an editable cell (double-click area)
1114
+ if (target.closest('[data-editable-cell="true"]')) {
1115
+ return;
1116
+ }
1117
+ // ✅ FIX: Don't block row clicks in Selected view - only block if clicking the row itself (not checkbox)
1118
+ // The checkbox click should always work, even in Selected view
1119
+ if (viewMode === 'selected' && !target.closest('input[type="checkbox"]')) {
1120
+ return;
1121
+ }
1122
+ const isCtrlOrCmd = event.ctrlKey || event.metaKey;
1123
+ const isShift = event.shiftKey;
1124
+ if (rowSelectionMode === 'single') {
1125
+ // Single mode: just toggle this row
1126
+ row.toggleSelected();
1127
+ setLastClickedRowIndex(rowIndex);
1128
+ }
1129
+ else {
1130
+ // Multi mode
1131
+ if (isShift && enableShiftClickRange && lastClickedRowIndex !== null) {
1132
+ // Shift+Click: select range
1133
+ const start = Math.min(lastClickedRowIndex, rowIndex);
1134
+ const end = Math.max(lastClickedRowIndex, rowIndex);
1135
+ const allRows = table.getRowModel().rows;
1136
+ for (let i = start; i <= end; i++) {
1137
+ if (allRows[i]) {
1138
+ allRows[i].toggleSelected(true);
1139
+ }
1140
+ }
1141
+ }
1142
+ else if (isCtrlOrCmd && enableCtrlClickMultiSelect) {
1143
+ // Ctrl+Click: toggle individual row
1144
+ row.toggleSelected();
1145
+ setLastClickedRowIndex(rowIndex);
1146
+ }
1147
+ else {
1148
+ // Regular click: toggle this row only
1149
+ row.toggleSelected();
1150
+ setLastClickedRowIndex(rowIndex);
1151
+ }
1152
+ }
1153
+ }, [enableRowClickSelection, viewMode, rowSelectionMode, enableShiftClickRange, enableCtrlClickMultiSelect, lastClickedRowIndex, table]);
1154
+ // Keyboard handler for Space key selection
1155
+ (0, react_1.useEffect)(() => {
1156
+ const handleKeyDown = (event) => {
1157
+ // Removed spacebar row selection - was causing performance issues and unwanted behavior
1158
+ // Ctrl+A to select all rows - but ONLY if not in an input/textarea/contenteditable
1159
+ if ((event.ctrlKey || event.metaKey) && event.key === 'a' && rowSelectionMode === 'multi') {
1160
+ const target = event.target;
1161
+ const isInputField = target.tagName === 'INPUT' ||
1162
+ target.tagName === 'TEXTAREA' ||
1163
+ target.isContentEditable;
1164
+ // Only handle Ctrl+A for grid if user is NOT in an input field
1165
+ // This allows standard browser Ctrl+A to work in input fields
1166
+ if (!isInputField) {
1167
+ event.preventDefault();
1168
+ table.toggleAllRowsSelected(true);
1169
+ }
1170
+ }
1171
+ };
1172
+ window.addEventListener('keydown', handleKeyDown);
1173
+ return () => window.removeEventListener('keydown', handleKeyDown);
1174
+ }, [table, rowSelectionMode]);
1175
+ // Context menu handlers
1176
+ const handleColumnRightClick = (0, react_1.useCallback)((header, event) => {
1177
+ setContextMenu({
1178
+ column: header.column,
1179
+ isVisible: true,
1180
+ position: { x: event.clientX, y: event.clientY }
1181
+ });
1182
+ }, []);
1183
+ const handleCloseContextMenu = (0, react_1.useCallback)(() => {
1184
+ setContextMenu(prev => ({ ...prev, isVisible: false }));
1185
+ }, []);
1186
+ const handleApplyColumnFilter = (0, react_1.useCallback)((columnId, filterType, value) => {
1187
+ const column = table.getColumn(columnId);
1188
+ if (!column)
1189
+ return;
1190
+ switch (filterType) {
1191
+ case 'contains':
1192
+ column.setFilterValue(value);
1193
+ break;
1194
+ case 'equals':
1195
+ column.setFilterValue((old) => ({ type: 'equals', value }));
1196
+ break;
1197
+ case 'starts_with':
1198
+ column.setFilterValue((old) => ({ type: 'starts_with', value }));
1199
+ break;
1200
+ case 'greater_than':
1201
+ column.setFilterValue((old) => ({ type: 'greater_than', value: Number(value) }));
1202
+ break;
1203
+ case 'less_than':
1204
+ column.setFilterValue((old) => ({ type: 'less_than', value: Number(value) }));
1205
+ break;
1206
+ case 'in':
1207
+ column.setFilterValue((old) => ({ type: 'in', value }));
1208
+ break;
1209
+ default:
1210
+ column.setFilterValue(value);
1211
+ }
1212
+ }, [table]);
1213
+ const handleAdvancedFilter = (conditions) => {
1214
+ // Conditions are evaluated together in filteredData with their AND/OR connectors,
1215
+ // so OR actually works (TanStack's columnFilters can only AND independent columns).
1216
+ setAdvancedConditions(conditions);
1217
+ setShowAdvancedFilter(false);
1218
+ };
1219
+ // Baccha Search handlers
1220
+ const handleColumnSearch = (0, react_1.useCallback)((columnId, searchTerm) => {
1221
+ setColumnSearches(prev => ({
1222
+ ...prev,
1223
+ [columnId]: searchTerm
1224
+ }));
1225
+ setIsColumnSearchActive(prev => ({
1226
+ ...prev,
1227
+ [columnId]: searchTerm.length > 0
1228
+ }));
1229
+ // Apply column-specific filter
1230
+ const column = table.getColumn(columnId);
1231
+ if (column) {
1232
+ column.setFilterValue(searchTerm || undefined);
1233
+ }
1234
+ }, [table]);
1235
+ // Spin the refresh icon while the caller's handler is in flight. Callers that
1236
+ // already track their own loading state can drive it via the isRefreshing prop.
1237
+ const [isRefreshingInternal, setIsRefreshingInternal] = (0, react_1.useState)(false);
1238
+ const refreshSpinning = isRefreshingProp || isRefreshingInternal;
1239
+ const handleRefreshClick = (0, react_1.useCallback)(async () => {
1240
+ if (!onRefresh || refreshSpinning)
1241
+ return;
1242
+ try {
1243
+ const result = onRefresh();
1244
+ if (result && typeof result.then === 'function') {
1245
+ setIsRefreshingInternal(true);
1246
+ await result;
1247
+ }
1248
+ }
1249
+ finally {
1250
+ setIsRefreshingInternal(false);
1251
+ }
1252
+ }, [onRefresh, refreshSpinning]);
1253
+ const handleClearColumnSearch = (0, react_1.useCallback)((columnId) => {
1254
+ setColumnSearches(prev => {
1255
+ const newSearches = { ...prev };
1256
+ delete newSearches[columnId];
1257
+ return newSearches;
1258
+ });
1259
+ setIsColumnSearchActive(prev => ({
1260
+ ...prev,
1261
+ [columnId]: false
1262
+ }));
1263
+ // Clear column filter
1264
+ const column = table.getColumn(columnId);
1265
+ if (column) {
1266
+ column.setFilterValue(undefined);
1267
+ }
1268
+ }, [table]);
1269
+ // Clear ALL filters (global search + column filters)
1270
+ // Total active filters for the badge / clear-all visibility: column filters + advanced conditions.
1271
+ const totalActiveFilters = columnFilters.length + advancedConditions.length;
1272
+ const handleClearAllFilters = (0, react_1.useCallback)(() => {
1273
+ // Clear global filter/search (clearSearch also resets the debounced value,
1274
+ // which otherwise re-applies the old filter 300ms later)
1275
+ clearSearch();
1276
+ // Clear all column filters
1277
+ setColumnFilters([]);
1278
+ // Clear advanced filter conditions
1279
+ setAdvancedConditions([]);
1280
+ // Clear column search states
1281
+ setColumnSearches({});
1282
+ setIsColumnSearchActive({});
1283
+ }, [clearSearch]);
1284
+ // Navigation handlers
1285
+ const handleSearchNavigation = (0, react_1.useCallback)((direction) => {
1286
+ navigateSearch(direction);
1287
+ }, [navigateSearch]);
1288
+ const handleSearchSelection = (0, react_1.useCallback)((rowId) => {
1289
+ // Find the row in the current filtered view
1290
+ const filteredRows = table.getRowModel().rows;
1291
+ const targetRow = filteredRows.find(row => {
1292
+ const currentRowId = row.original.id || row.id;
1293
+ return currentRowId === rowId;
1294
+ });
1295
+ if (targetRow) {
1296
+ const isCurrentlySelected = targetRow.getIsSelected();
1297
+ const newSelectionState = !isCurrentlySelected;
1298
+ // Toggle selection - this will trigger handleRowSelectionChange via table callback
1299
+ targetRow.toggleSelected(newSelectionState);
1300
+ // Optionally call onRowClick if provided
1301
+ if (onRowClick) {
1302
+ onRowClick(targetRow.original);
1303
+ }
1304
+ }
1305
+ }, [table, onRowClick]);
1306
+ // No default height class - rely on maxHeight style for responsiveness
1307
+ const hasHeightClass = className && /h-\[|h-\d|h-full|h-screen|h-auto/.test(className);
1308
+ const finalClassName = `border border-[rgb(var(--bd-default))] rounded-lg overflow-hidden flex flex-col ${className || ''}`;
1309
+ return ((0, jsx_runtime_1.jsxs)(framer_motion_1.motion.div, { initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.3 }, className: finalClassName, style: {
1310
+ ...style,
1311
+ isolation: 'isolate',
1312
+ position: 'relative',
1313
+ zIndex: 0
1314
+ }, children: [!hideHeader && ((0, jsx_runtime_1.jsxs)("div", { className: `flex flex-row items-center justify-between gap-1.5 sm:gap-0 py-2 sm:py-1.5 px-2 sm:px-3 border-b border-bd-default bg-bg-subtle transition-colors ${enableGrouping ? 'group-drop-zone' : ''}`, onDragOver: enableGrouping ? (e) => {
1315
+ e.preventDefault();
1316
+ e.currentTarget.classList.add('bg-[rgb(var(--color-primary))]/5', 'border-[rgb(var(--color-primary))]');
1317
+ } : undefined, onDragLeave: enableGrouping ? (e) => {
1318
+ e.currentTarget.classList.remove('bg-[rgb(var(--color-primary))]/5', 'border-[rgb(var(--color-primary))]');
1319
+ } : undefined, onDrop: enableGrouping ? (e) => {
1320
+ e.preventDefault();
1321
+ e.currentTarget.classList.remove('bg-[rgb(var(--color-primary))]/5', 'border-[rgb(var(--color-primary))]');
1322
+ const columnId = e.dataTransfer.getData('text/plain');
1323
+ if (columnId && !grouping.includes(columnId)) {
1324
+ setGrouping(prev => [...prev, columnId]);
1325
+ }
1326
+ } : undefined, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-nowrap sm:flex-wrap items-center gap-1.5 sm:gap-4 min-w-0 shrink sm:flex-1", children: [title && ((0, jsx_runtime_1.jsx)("h3", { className: "text-sm sm:text-base font-medium text-fg-default truncate", children: title })), enableGrouping && grouping.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1 flex-wrap", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Layers, { className: "h-3.5 w-3.5 text-[rgb(var(--fg-muted))]" }), grouping.map((columnId, index) => {
1327
+ const column = table.getColumn(columnId);
1328
+ const header = typeof column?.columnDef.header === 'string'
1329
+ ? column.columnDef.header
1330
+ : columnId;
1331
+ return ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [index > 0 && ((0, jsx_runtime_1.jsx)("span", { className: "text-[rgb(var(--fg-muted))] text-xs", children: "\u2192" })), (0, jsx_runtime_1.jsxs)("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium bg-[rgb(var(--color-primary))]/10 text-[rgb(var(--color-primary))] border border-[rgb(var(--color-primary))]/30", children: [header, (0, jsx_runtime_1.jsx)("button", { onClick: () => setGrouping(prev => prev.filter(id => id !== columnId)), className: "hover:bg-[rgb(var(--color-primary))]/20 rounded p-0.5 -mr-1", "aria-label": "Remove grouping", children: (0, jsx_runtime_1.jsx)(lucide_react_1.XCircle, { className: "h-3 w-3" }) })] })] }, columnId));
1332
+ })] })), enableGrouping && grouping.length === 0 && ((0, jsx_runtime_1.jsx)("span", { className: "text-xs text-[rgb(var(--fg-muted))] italic hidden sm:inline", children: "Drag column headers here to group" })), headerActions && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap items-center gap-1.5 sm:gap-2", children: headerActions })), preToggleActions && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-nowrap sm:flex-wrap items-center gap-1.5 sm:gap-2 min-w-0 shrink", children: preToggleActions }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1.5 sm:gap-2 flex-1 min-w-0 justify-end", children: [toggleShouldBeVisible && ((0, jsx_runtime_1.jsxs)("div", { className: "inline-flex items-center bg-[rgb(var(--bg-subtle))] rounded-full border border-[rgb(var(--bd-default))] p-0.5", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => {
1333
+ try {
1334
+ onViewModeChange?.('all');
1335
+ }
1336
+ catch (error) {
1337
+ console.error('Error switching to All view:', error);
1338
+ }
1339
+ }, className: `px-2 sm:px-4 py-1 sm:py-1.5 text-[10px] sm:text-xs font-medium rounded-full transition-all duration-150 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/50 whitespace-nowrap ${viewMode === 'all'
1340
+ ? 'bg-primary text-white shadow-sm'
1341
+ : 'text-[rgb(var(--fg-muted))] hover:bg-[rgb(var(--bg-hover))] hover:text-[rgb(var(--fg-default))]'}`, "aria-label": "View all items", children: "All" }), (0, jsx_runtime_1.jsxs)("button", { onClick: () => {
1342
+ try {
1343
+ // Clear search/filters so the Selected view shows every selected
1344
+ // row, not just those matching a leftover filter
1345
+ handleClearAllFilters();
1346
+ // Always allow switching to selected mode, even with 0 selections
1347
+ // This prevents the toggle from becoming unresponsive
1348
+ onViewModeChange?.('selected');
1349
+ }
1350
+ catch (error) {
1351
+ console.error('Error switching to Selected view:', error);
1352
+ }
1353
+ }, className: `px-2 sm:px-4 py-1 sm:py-1.5 text-[10px] sm:text-xs font-medium rounded-full transition-all duration-150 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/50 whitespace-nowrap ${viewMode === 'selected'
1354
+ ? 'bg-primary text-white shadow-sm'
1355
+ : 'text-[rgb(var(--fg-muted))] hover:bg-[rgb(var(--bg-hover))] hover:text-[rgb(var(--fg-default))]'}`, "aria-label": `View selected items (${safeSelectedCount} selected)`, children: [(0, jsx_runtime_1.jsx)("span", { className: "hidden sm:inline", children: "Selected " }), "(", safeSelectedCount, ")"] })] }, "view-toggle")), preDateActions, enableSearch && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)("div", { className: "min-w-0 flex-1", children: effectiveSearchType === 'advanced' ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ui_3.TooltipProvider, { delayDuration: 100, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center h-8 rounded-full border border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] px-3 focus-within:border-[rgb(var(--color-primary))] focus-within:ring-1 focus-within:ring-[rgb(var(--color-primary)/0.2)] transition-all", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1.5 flex-1 min-w-0", children: [speechSupported && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleVoiceSearch, className: `flex-shrink-0 transition-colors ${isListening ? 'text-[rgb(var(--color-error))] animate-pulse' : 'text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))]'}`, title: isListening ? 'Stop listening' : 'Voice search', children: isListening ? (0, jsx_runtime_1.jsx)(lucide_react_1.MicOff, { className: "h-3.5 w-3.5" }) : (0, jsx_runtime_1.jsx)(lucide_react_1.Mic, { className: "h-3.5 w-3.5" }) })), (0, jsx_runtime_1.jsx)("input", { ref: searchInputRef, placeholder: speechSupported ? 'Type or speak to search...' : 'Search...', value: searchValue, onChange: (e) => handleGlobalSearchChange(e.target.value), className: "flex-1 min-w-0 w-full bg-transparent border-none outline-none text-xs text-[rgb(var(--fg-default))] placeholder:text-[rgb(var(--fg-muted))]" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 flex-shrink-0 ml-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-4 bg-[rgb(var(--bd-default))]" }), enableDateFilter && ((0, jsx_runtime_1.jsx)(DatePicker_1.DatePicker, { mode: "range", value: { from: dateFrom || undefined, to: dateTo || undefined }, onChange: (range) => {
1356
+ if (range && typeof range === 'object' && 'from' in range) {
1357
+ onDateFromChange?.(range.from || null);
1358
+ onDateToChange?.(range.to || null);
1359
+ }
1360
+ }, iconOnly: true })), enableDateFilter && (0, jsx_runtime_1.jsx)("div", { className: "w-px h-4 bg-[rgb(var(--bd-default))]" }), (0, jsx_runtime_1.jsxs)(ui_3.Tooltip, { children: [(0, jsx_runtime_1.jsx)(ui_3.TooltipTrigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)("button", { onClick: () => { setSettingsInitialTab('filters'); setShowAdvancedFilter(true); }, className: "relative flex items-center gap-1 text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.ListFilter, { className: "h-3.5 w-3.5" }), (0, jsx_runtime_1.jsx)("span", { className: "hidden sm:inline text-xs", children: "Filters" }), totalActiveFilters > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-1 -right-1 h-3 w-3 bg-[rgb(var(--color-primary))] rounded-full flex items-center justify-center", children: (0, jsx_runtime_1.jsx)("span", { className: "text-[8px] text-white font-bold", children: totalActiveFilters }) }))] }) }), (0, jsx_runtime_1.jsx)(ui_3.TooltipContent, { children: totalActiveFilters > 0 ? `Filters (${totalActiveFilters} active)` : 'Filters' })] }), compactHeader && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-4 bg-[rgb(var(--bd-default))]" }), (0, jsx_runtime_1.jsxs)(ui_3.Tooltip, { children: [(0, jsx_runtime_1.jsx)(ui_3.TooltipTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)("span", { className: "inline-flex", children: (0, jsx_runtime_1.jsx)(menu_1.ActionsMenu, { enableVisualization: enableVisualization, currentView: currentView, onViewChange: handleViewChange, enableExport: enableExport && pageAccess.canExport, enableImport: enableImport, data: exportRows, filename: typeof title === 'string' && title ? title : 'data-export', onImportComplete: (importedData) => { if (onImport)
1361
+ onImport(importedData); }, enableColumnVisibility: enableColumnVisibility, onOpenColumnChooser: () => { setSettingsInitialTab('columns'); setShowAdvancedFilter(true); }, enableAutoResize: enableAutoResize, onAutoResize: () => { if (autoResizeAllColumns)
1362
+ autoResizeAllColumns(table); }, enableDateFilter: enableDateFilter, dateFrom: dateFrom, dateTo: dateTo, onDateFromChange: onDateFromChange, onDateToChange: onDateToChange, enableFiltering: enableFiltering, onOpenAdvancedFilter: () => { setSettingsInitialTab('filters'); setShowAdvancedFilter(true); }, activeFiltersCount: totalActiveFilters, enableGrouping: enableGrouping, columns: table.getAllColumns(), grouping: grouping, onGroupingChange: (columnId) => {
1363
+ setGrouping((prev) => prev.includes(columnId) ? prev.filter((id) => id !== columnId) : [...prev, columnId]);
1364
+ }, onClearGrouping: () => setGrouping([]) }) }) }), (0, jsx_runtime_1.jsx)(ui_3.TooltipContent, { children: "Options" })] })] })), onRefresh && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-4 bg-[rgb(var(--bd-default))]" }), (0, jsx_runtime_1.jsxs)(ui_3.Tooltip, { children: [(0, jsx_runtime_1.jsx)(ui_3.TooltipTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleRefreshClick, disabled: refreshSpinning, "aria-label": "Refresh", className: "flex items-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors disabled:opacity-50 disabled:cursor-not-allowed", children: (0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: `h-3.5 w-3.5 ${refreshSpinning ? 'animate-spin' : ''}` }) }) }), (0, jsx_runtime_1.jsx)(ui_3.TooltipContent, { children: "Refresh" })] })] })), toolbarActions && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-4 bg-[rgb(var(--bd-default))]" }), toolbarActions] }))] })] }) }), (0, jsx_runtime_1.jsx)(SearchNavigator_1.SearchNavigator, { navigationState: navigationState, onNavigate: handleSearchNavigation, onSelect: handleSearchSelection, onClear: clearNavigation, searchInputRef: searchInputRef, enabled: enableSearch })] })) : (
1365
+ // Search New (top header modal style)
1366
+ (0, jsx_runtime_1.jsx)(SearchNewModal_1.SearchNewModal, { data: processedData, columns: columns, mainColumns: mainColumns, onRowSelect: handleSearchSelection, selectedRows: new Set(Object.keys(rowSelection).filter(key => rowSelection[key])), className: "w-full" })) }), (globalFilter || totalActiveFilters > 0) && ((0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "action-cancel", size: "xs", onClick: handleClearAllFilters, className: "h-8 rounded-full whitespace-nowrap", "aria-label": "Clear all filters", children: "Clear" }))] })), !compactHeader && (
1367
+ /* LEGACY FULL HEADER: Show all buttons */
1368
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [enableVisualization && ((0, jsx_runtime_1.jsxs)(ui_2.DropdownMenu, { children: [(0, jsx_runtime_1.jsx)(ui_2.DropdownMenuTrigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)(ui_1.Button, { variant: "outline", size: "sm", className: "w-9 h-8 p-0", children: [currentView === 'grid' && (0, jsx_runtime_1.jsx)(lucide_react_1.Grid3X3, { className: "h-4 w-4" }), currentView === 'cards' && (0, jsx_runtime_1.jsx)(lucide_react_1.LayoutGrid, { className: "h-4 w-4" }), currentView === 'chart' && (0, jsx_runtime_1.jsx)(lucide_react_1.BarChart3, { className: "h-4 w-4" })] }) }), (0, jsx_runtime_1.jsxs)(ui_2.DropdownMenuContent, { align: "start", children: [(0, jsx_runtime_1.jsxs)(ui_2.DropdownMenuItem, { onClick: () => handleViewChange('grid'), children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Grid3X3, { className: "mr-2 h-4 w-4" }), (0, jsx_runtime_1.jsx)("span", { children: "Grid" })] }), (0, jsx_runtime_1.jsxs)(ui_2.DropdownMenuItem, { onClick: () => handleViewChange('cards'), children: [(0, jsx_runtime_1.jsx)(lucide_react_1.LayoutGrid, { className: "mr-2 h-4 w-4" }), (0, jsx_runtime_1.jsx)("span", { children: "Cards" })] }), (0, jsx_runtime_1.jsxs)(ui_2.DropdownMenuItem, { onClick: () => handleViewChange('chart'), children: [(0, jsx_runtime_1.jsx)(lucide_react_1.BarChart3, { className: "mr-2 h-4 w-4" }), (0, jsx_runtime_1.jsx)("span", { children: "Charts" })] })] })] })), enableColumnVisibility && ((0, jsx_runtime_1.jsxs)(ui_2.DropdownMenu, { children: [(0, jsx_runtime_1.jsx)(ui_2.DropdownMenuTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "outline", size: "sm", className: "w-9 h-8 p-0", children: (0, jsx_runtime_1.jsx)(lucide_react_1.LayoutGrid, { className: "h-5 w-5" }) }) }), (0, jsx_runtime_1.jsx)(ui_2.DropdownMenuContent, { align: "end", className: "w-56 max-h-96 overflow-y-auto", children: (() => {
1369
+ const allColumns = table.getAllColumns().filter((column) => column.getCanHide());
1370
+ const frozenColumns = allColumns.filter((column) => frozenColumnsState.has(column.id) && column.id !== 'select');
1371
+ const availableColumns = allColumns.filter((column) => !frozenColumnsState.has(column.id));
1372
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-1", children: [(0, jsx_runtime_1.jsx)("div", { className: "px-3 py-2 border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-subtle))]", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-xs font-medium text-[rgb(var(--fg-default))]", children: "Column Management" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center space-x-1", children: [frozenColumns.length > 0 && ((0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "ghost", size: "sm", className: "h-6 px-2 text-xs text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] cursor-pointer", onClick: (e) => {
1373
+ e.stopPropagation();
1374
+ setFrozenColumnsState(new Set());
1375
+ }, "aria-label": "Unfreeze all columns", children: "Unfreeze All" })), (0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "ghost", size: "sm", className: "h-6 px-2 text-xs text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] cursor-pointer", onClick: (e) => {
1376
+ e.stopPropagation();
1377
+ autoResizeAllColumns?.(table);
1378
+ }, "aria-label": "Auto-size all columns to fit content", children: "Auto-size" })] })] }) }), enableColumnFreezing && frozenColumns.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "px-2 py-1", children: (0, jsx_runtime_1.jsx)("div", { className: "bg-[rgb(var(--color-primary-subtle))] rounded-md p-1 space-y-0.5", children: frozenColumns.map((column) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between px-2 py-1.5 hover:bg-[rgb(var(--bg-selected))]/50 rounded group cursor-pointer", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center space-x-2 flex-1", children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: column.getIsVisible(), onChange: (e) => {
1379
+ e.stopPropagation();
1380
+ column.toggleVisibility(e.target.checked);
1381
+ }, className: "w-3 h-3 rounded border-[rgb(var(--bd-default))] text-[rgb(var(--color-primary))] focus:ring-[rgb(var(--color-primary))] cursor-pointer" }), (0, jsx_runtime_1.jsx)("span", { className: "text-sm font-medium text-[rgb(var(--fg-default))] capitalize truncate", children: column.id })] }), (0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0 text-[rgb(var(--color-primary))] hover:text-[rgb(var(--color-primary-hover))] hover:bg-[rgb(var(--bg-selected))] opacity-70 group-hover:opacity-100 transition-opacity cursor-pointer", onClick: (e) => {
1382
+ e.stopPropagation();
1383
+ const newFrozenColumns = new Set(frozenColumnsState);
1384
+ newFrozenColumns.delete(column.id);
1385
+ setFrozenColumnsState(newFrozenColumns);
1386
+ }, "aria-label": "Unfreeze this column", children: (0, jsx_runtime_1.jsx)(lucide_react_1.PinOff, { className: "h-4 w-4" }) })] }, column.id))) }) })), availableColumns.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "px-2 py-1", children: (0, jsx_runtime_1.jsx)("div", { className: "space-y-0.5", children: availableColumns.map((column) => {
1387
+ const isSelectColumn = column.id === 'select';
1388
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between px-2 py-1.5 hover:bg-[rgb(var(--bg-subtle))] rounded group cursor-pointer", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center space-x-2 flex-1", children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: column.getIsVisible(), onChange: (e) => {
1389
+ e.stopPropagation();
1390
+ column.toggleVisibility(e.target.checked);
1391
+ }, className: "w-3 h-3 rounded border-[rgb(var(--bd-default))] text-[rgb(var(--color-primary))] focus:ring-[rgb(var(--color-primary))] cursor-pointer" }), (0, jsx_runtime_1.jsx)("span", { className: "text-sm text-[rgb(var(--fg-default))] capitalize truncate", children: column.id })] }), enableColumnFreezing && !isSelectColumn && ((0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0 text-[rgb(var(--color-icon))] hover:text-[rgb(var(--color-icon-hover))] hover:bg-[rgb(var(--bg-hover))] opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer", onClick: (e) => {
1392
+ e.stopPropagation();
1393
+ const newFrozenColumns = new Set(frozenColumnsState);
1394
+ newFrozenColumns.add(column.id);
1395
+ setFrozenColumnsState(newFrozenColumns);
1396
+ }, "aria-label": "Freeze this column to the left", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Pin, { className: "h-4 w-4" }) }))] }, column.id));
1397
+ }) }) }))] }));
1398
+ })() })] }))] })), !compactHeader && enableAutoResize && ((0, jsx_runtime_1.jsx)(AutoResizeButton_1.AutoResizeButton, { onAutoResize: () => {
1399
+ if (autoResizeAllColumns) {
1400
+ autoResizeAllColumns(table);
1401
+ }
1402
+ } })), headerActionsRight && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap items-center gap-1.5 sm:gap-2", children: headerActionsRight }))] })] })), (0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden bg-bg-surface flex-1 flex flex-col", children: (0, jsx_runtime_1.jsx)(framer_motion_1.AnimatePresence, { mode: "wait", children: currentView === 'grid' ? ((0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, className: "flex-1 flex flex-col min-h-0", children: (0, jsx_runtime_1.jsx)("div", { className: "flex-1 flex flex-col min-h-0 overflow-hidden", children: (() => {
1403
+ // Determine if row reordering is active
1404
+ // Allow reordering when: 1) viewMode is 'selected', OR 2) viewToggle is disabled (simple mode)
1405
+ const isRowReorderingActive = enableRowReordering && (viewMode === 'selected' || !enableViewToggle) && !loading && table.getRowModel().rows.length > 0;
1406
+ return ((0, jsx_runtime_1.jsx)(core_1.DndContext, { sensors: sensors, collisionDetection: core_1.closestCenter, onDragEnd: isRowReorderingActive ? handleRowReorder : handleColumnReorder, modifiers: isRowReorderingActive ? [modifiers_1.restrictToVerticalAxis] : [modifiers_1.restrictToHorizontalAxis], children: (0, jsx_runtime_1.jsxs)("div", { ref: tableContainerRef, className: `${compactMode ? '' : 'flex-1'} scrollbar-thin relative`, style: {
1407
+ overscrollBehavior: 'contain',
1408
+ WebkitOverflowScrolling: 'touch',
1409
+ overflowX: 'auto',
1410
+ overflowY: compactMode && data.length === 0 ? 'hidden' : 'auto',
1411
+ // Removed scrollBehavior: 'smooth' - can cause lag with virtualization
1412
+ willChange: 'scroll-position',
1413
+ ...(calculateOptimalHeight && { height: `${calculateOptimalHeight}px` }),
1414
+ ...(!compactMode && {
1415
+ // Default mode: use standard minHeight/maxHeight (grid won't collapse due to flex-1)
1416
+ minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,
1417
+ maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight
1418
+ })
1419
+ }, children: [(0, jsx_runtime_1.jsxs)("table", { className: "w-full border-collapse", style: { tableLayout: 'fixed' }, children: [(0, jsx_runtime_1.jsxs)("colgroup", { children: [isRowReorderingActive && ((0, jsx_runtime_1.jsx)("col", { style: { width: '1.875rem', minWidth: '1.875rem', maxWidth: '1.875rem' } })), table.getHeaderGroups()[0]?.headers.map((header) => ((0, jsx_runtime_1.jsx)("col", { style: { width: `${header.getSize()}px` }, suppressHydrationWarning: true }, header.id)))] }), (0, jsx_runtime_1.jsxs)("thead", { className: "bg-[color-mix(in_srgb,rgb(var(--color-primary))_10%,white)] dark:bg-[color-mix(in_srgb,rgb(var(--color-primary))_10%,rgb(var(--bg-surface)))] sticky top-0 z-10", children: [table.getHeaderGroups().map((headerGroup) => {
1420
+ // Only use SortableContext for column reordering when row reordering is NOT active
1421
+ if (isRowReorderingActive) {
1422
+ return ((0, jsx_runtime_1.jsxs)("tr", { className: "border-b border-[rgb(var(--bd-default))]", children: [(0, jsx_runtime_1.jsx)("th", { className: "text-center relative after:content-[''] after:absolute after:right-0 after:top-[20%] after:bottom-[20%] after:w-[1px] after:bg-[rgb(var(--bd-medium))]", style: {
1423
+ width: '1.875rem',
1424
+ minWidth: '1.875rem',
1425
+ maxWidth: '1.875rem',
1426
+ } }), headerGroup.headers.map((header, headerIndex) => {
1427
+ const isFrozen = frozenColumnsState.has(header.id);
1428
+ const isPinnedRight = header.column.getIsPinned() === 'right';
1429
+ // Check if this is the last column
1430
+ const isLastColumn = headerIndex === headerGroup.headers.length - 1;
1431
+ // Check if this is the last frozen column
1432
+ const isLastFrozenColumn = isFrozen && (headerIndex === headerGroup.headers.length - 1 ||
1433
+ !frozenColumnsState.has(headerGroup.headers[headerIndex + 1]?.id));
1434
+ // Check if this is the first right-pinned column
1435
+ const isFirstPinnedRight = isPinnedRight && (headerIndex === 0 ||
1436
+ headerGroup.headers[headerIndex - 1]?.column.getIsPinned() !== 'right');
1437
+ // Calculate left position for frozen columns
1438
+ let leftPosition = 0;
1439
+ if (isFrozen) {
1440
+ // Add select column width if row selection is enabled
1441
+ if (enableRowSelection && !hideSelectionInSelectedView) {
1442
+ leftPosition = 30; // Select column width
1443
+ }
1444
+ // Sum up widths of all previous frozen columns (excluding select column)
1445
+ for (let i = 0; i < headerIndex; i++) {
1446
+ const prevHeader = headerGroup.headers[i];
1447
+ if (frozenColumnsState.has(prevHeader.id) && prevHeader.id !== 'select') {
1448
+ leftPosition += prevHeader.getSize();
1449
+ }
1450
+ }
1451
+ }
1452
+ // Calculate right position for right-pinned columns
1453
+ let rightPosition = 0;
1454
+ if (isPinnedRight) {
1455
+ for (let i = headerIndex + 1; i < headerGroup.headers.length; i++) {
1456
+ const nextHeader = headerGroup.headers[i];
1457
+ if (nextHeader.column.getIsPinned() === 'right') {
1458
+ rightPosition += nextHeader.getSize();
1459
+ }
1460
+ }
1461
+ }
1462
+ return ((0, jsx_runtime_1.jsx)(DraggableColumnHeader_1.DraggableColumnHeader, { header: header, enableReordering: enableColumnReordering, enableResizing: enableColumnResizing, enableFreezing: enableColumnFreezing, enableGrouping: enableGrouping, isGrouped: grouping.includes(header.column.id), isFrozen: isFrozen, isLastFrozen: isLastFrozenColumn, isFirstPinnedRight: isFirstPinnedRight, isLastColumn: isLastColumn, onRightClick: handleColumnRightClick, onFilterClick: handleColumnRightClick, style: {
1463
+ ...(isFrozen && {
1464
+ position: 'sticky',
1465
+ left: `${leftPosition}px`,
1466
+ zIndex: 11,
1467
+ transform: 'translateZ(0)',
1468
+ willChange: 'transform'
1469
+ }),
1470
+ ...(isPinnedRight && {
1471
+ position: 'sticky',
1472
+ right: `${rightPosition}px`,
1473
+ zIndex: 12,
1474
+ backgroundColor: 'color-mix(in srgb, rgb(var(--color-primary)) 10%, rgb(var(--bg-surface)))',
1475
+ transform: 'translateZ(0)',
1476
+ willChange: 'transform'
1477
+ })
1478
+ } }, header.id));
1479
+ })] }, headerGroup.id));
1480
+ }
1481
+ else {
1482
+ // Column reordering mode - use SortableContext
1483
+ return ((0, jsx_runtime_1.jsx)(sortable_1.SortableContext, { items: headerGroup.headers.map(header => header.column.id), strategy: sortable_1.horizontalListSortingStrategy, children: (0, jsx_runtime_1.jsx)("tr", { className: "border-b border-[rgb(var(--bd-default))]", children: headerGroup.headers.map((header, headerIndex) => {
1484
+ const isFrozen = frozenColumnsState.has(header.id);
1485
+ const isPinnedRight = header.column.getIsPinned() === 'right';
1486
+ // Check if this is the last column
1487
+ const isLastColumn = headerIndex === headerGroup.headers.length - 1;
1488
+ // Check if this is the last frozen column
1489
+ const isLastFrozenColumn = isFrozen && (headerIndex === headerGroup.headers.length - 1 ||
1490
+ !frozenColumnsState.has(headerGroup.headers[headerIndex + 1]?.id));
1491
+ // Check if this is the first right-pinned column
1492
+ const isFirstPinnedRight = isPinnedRight && (headerIndex === 0 ||
1493
+ headerGroup.headers[headerIndex - 1]?.column.getIsPinned() !== 'right');
1494
+ // Calculate left position for frozen columns
1495
+ let leftPosition = 0;
1496
+ if (isFrozen) {
1497
+ // Sum up widths of all previous frozen columns
1498
+ for (let i = 0; i < headerIndex; i++) {
1499
+ const prevHeader = headerGroup.headers[i];
1500
+ if (frozenColumnsState.has(prevHeader.id)) {
1501
+ leftPosition += prevHeader.getSize();
1502
+ }
1503
+ }
1504
+ }
1505
+ // Calculate right position for right-pinned columns
1506
+ let rightPosition = 0;
1507
+ if (isPinnedRight) {
1508
+ for (let i = headerIndex + 1; i < headerGroup.headers.length; i++) {
1509
+ const nextHeader = headerGroup.headers[i];
1510
+ if (nextHeader.column.getIsPinned() === 'right') {
1511
+ rightPosition += nextHeader.getSize();
1512
+ }
1513
+ }
1514
+ }
1515
+ return ((0, jsx_runtime_1.jsx)(DraggableColumnHeader_1.DraggableColumnHeader, { header: header, enableReordering: enableColumnReordering, enableResizing: enableColumnResizing, enableFreezing: enableColumnFreezing, enableGrouping: enableGrouping, isGrouped: grouping.includes(header.column.id), isFrozen: isFrozen, isLastFrozen: isLastFrozenColumn, isFirstPinnedRight: isFirstPinnedRight, isLastColumn: isLastColumn, onRightClick: handleColumnRightClick, onFilterClick: handleColumnRightClick, style: {
1516
+ ...(isFrozen && {
1517
+ position: 'sticky',
1518
+ left: `${leftPosition}px`,
1519
+ zIndex: 11,
1520
+ transform: 'translateZ(0)',
1521
+ willChange: 'transform'
1522
+ }),
1523
+ ...(isPinnedRight && {
1524
+ position: 'sticky',
1525
+ right: `${rightPosition}px`,
1526
+ zIndex: 12,
1527
+ backgroundColor: 'color-mix(in srgb, rgb(var(--color-primary)) 10%, rgb(var(--bg-surface)))',
1528
+ transform: 'translateZ(0)',
1529
+ willChange: 'transform'
1530
+ })
1531
+ } }, header.id));
1532
+ }) }) }, headerGroup.id));
1533
+ }
1534
+ }), enableFilterRow && ((0, jsx_runtime_1.jsx)(FilterRow_1.FilterRow, { table: table, frozenColumnsState: frozenColumnsState, isRowReorderingActive: isRowReorderingActive, onColumnFilterChange: () => {
1535
+ // Clear global filter when column filter is used - they should work independently
1536
+ if (globalFilter) {
1537
+ setGlobalFilter('');
1538
+ setSearchValue('');
1539
+ }
1540
+ } }))] }), (0, jsx_runtime_1.jsx)("tbody", { children: (() => {
1541
+ // Allow reordering when: 1) viewMode is 'selected', OR 2) viewToggle is disabled (simple mode)
1542
+ const isRowReorderingActive = enableRowReordering && (viewMode === 'selected' || !enableViewToggle) && !loading && table.getRowModel().rows.length > 0;
1543
+ const showDragHandle = isRowReorderingActive;
1544
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: loading ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: Array.from({ length: compactMode ? 3 : Math.min(pageSize || 10, 10) }).map((_, skeletonIndex) => ((0, jsx_runtime_1.jsxs)("tr", { className: "hover:bg-[rgb(var(--bg-hover))] transition-colors", style: { height: `${rowHeight}px` }, children: [showDragHandle && ((0, jsx_runtime_1.jsx)("td", { className: "px-1 py-1 border-b border-[rgb(var(--bd-subtle))]", style: { width: '2.5rem' }, children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { width: "20px", height: "12px" }) })), table.getVisibleFlatColumns().map((column, colIndex) => ((0, jsx_runtime_1.jsx)("td", { className: "px-1 py-1 border-b border-[rgb(var(--bd-subtle))]", children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { width: colIndex === 0 ? '60%' : '85%', height: "12px" }) }, column.id)))] }, `skeleton-${skeletonIndex}`))) })) : table.getRowModel().rows.length === 0 ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: Array.from({ length: compactMode ? 3 : Math.min(pageSize || 10, 10) }).map((_, skeletonIndex) => ((0, jsx_runtime_1.jsxs)("tr", { className: "transition-colors", style: { height: `${rowHeight}px` }, children: [showDragHandle && ((0, jsx_runtime_1.jsx)("td", { className: "px-1 py-1 border-b border-[rgb(var(--bd-subtle))]", style: { width: '2.5rem' }, children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { width: "20px", height: "12px" }) })), table.getVisibleFlatColumns().map((column, colIndex) => ((0, jsx_runtime_1.jsx)("td", { className: "px-1 py-1 border-b border-[rgb(var(--bd-subtle))]", children: (0, jsx_runtime_1.jsx)(skeleton_1.Skeleton, { width: colIndex === 0 ? '60%' : '85%', height: "12px" }) }, column.id)))] }, `empty-skeleton-${skeletonIndex}`))) })) : isRowReorderingActive ? (
1545
+ /* Row reordering mode - DndContext is at table level */
1546
+ (0, jsx_runtime_1.jsx)(sortable_1.SortableContext, { items: rows.map(row => row.original.id || row.id), strategy: sortable_1.verticalListSortingStrategy, children: rows.map((row, rowIndex) => {
1547
+ const rowId = row.original.id || row.id;
1548
+ const isHighlighted = navigationState.highlightedRowId === rowId;
1549
+ const isSelected = row.getIsSelected();
1550
+ return ((0, jsx_runtime_1.jsx)(DraggableRow_1.DraggableRow, { row: row, rowIndex: rowIndex, enableBacchaSearch: enableBacchaSearch, mainColumnsArray: mainColumnsArray, frozenColumnsState: frozenColumnsState, isHighlighted: isHighlighted, isSelected: isSelected, onRowClick: (e) => handleRowClick(row, rowIndex, e), onRowDoubleClick: () => onRowClick?.(row.original), onRowContextMenu: (e) => {
1551
+ if (onRowContextMenu) {
1552
+ e.preventDefault();
1553
+ onRowContextMenu(row.original, e);
1554
+ }
1555
+ }, showDragHandle: showDragHandle, navigationState: navigationState, columnSearches: columnSearches, isColumnSearchActive: isColumnSearchActive, onColumnSearch: handleColumnSearch, onClearColumnSearch: handleClearColumnSearch, SearchHighlighter: SearchHighlighter_1.SearchHighlighter, InlineSearchCell: InlineSearchCell_1.InlineSearchCell, className: getRowProps?.(row.original)?.className, rowStyle: getRowProps?.(row.original)?.style }, row.id));
1556
+ }) })) : (
1557
+ /* Virtualized row rendering */
1558
+ (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: enableVirtualization && currentView === 'grid' ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [rowVirtualizer.getVirtualItems().length > 0 && ((0, jsx_runtime_1.jsx)("tr", { children: (0, jsx_runtime_1.jsx)("td", { colSpan: table.getVisibleFlatColumns().length, style: { height: `${rowVirtualizer.getVirtualItems()[0]?.start ?? 0}px` } }) })), rowVirtualizer.getVirtualItems().map((virtualRow) => {
1559
+ const row = rows[virtualRow.index];
1560
+ const rowIndex = virtualRow.index;
1561
+ const rowId = row.original.id || row.id;
1562
+ const isHighlighted = navigationState.highlightedRowId === rowId;
1563
+ const isSelected = row.getIsSelected();
1564
+ return ((0, jsx_runtime_1.jsx)(ExpandableRow_1.ExpandableRow, { row: row, renderSubComponent: renderSubComponent, expandMode: expandMode, subData: getSubData && !globalFilter && columnFilters.length === 0 ? getSubData(row.original) : undefined, subColumns: columns, getSubRowId: getSubRowId, getSubRowProps: getRowProps, onSubRowClick: onSubRowClick, onSubRowSelect: onSubRowSelect, onRowClick: (e) => handleRowClick(row, rowIndex, e), onRowDoubleClick: () => onRowClick?.(row.original), onRowContextMenu: (e) => {
1565
+ if (onRowContextMenu) {
1566
+ e.preventDefault();
1567
+ onRowContextMenu(row.original, e);
1568
+ }
1569
+ }, style: getRowProps?.(row.original)?.style, className: `
1570
+ cursor-pointer group
1571
+ transition-colors duration-150 ease-out
1572
+ ${isHighlighted
1573
+ ? 'border-2 border-[rgb(var(--color-primary))] bg-gradient-to-r from-[rgb(var(--color-primary))]/10 to-[rgb(var(--color-primary))]/20 shadow-lg relative'
1574
+ : isSelected
1575
+ ? 'bg-[color-mix(in_srgb,rgb(var(--color-primary))_8%,rgb(var(--bg-surface)))] shadow-sm hover:bg-[color-mix(in_srgb,rgb(var(--color-primary))_15%,rgb(var(--bg-surface)))]'
1576
+ : 'hover:bg-[color-mix(in_srgb,rgb(var(--color-primary))_5%,rgb(var(--bg-surface)))]'}
1577
+ ${getRowProps?.(row.original)?.className ?? ''}
1578
+ `, children: row.getVisibleCells().map((cell, cellIndex) => ((0, jsx_runtime_1.jsx)(CellRenderer_1.CellRenderer, { cell: cell, cellIndex: cellIndex, row: row, enableBacchaSearch: enableBacchaSearch, mainColumnsArray: mainColumnsArray, frozenColumnsState: frozenColumnsState, navigationState: navigationState, columnSearches: columnSearches, isColumnSearchActive: isColumnSearchActive, onColumnSearch: handleColumnSearch, onClearColumnSearch: handleClearColumnSearch, SearchHighlighter: SearchHighlighter_1.SearchHighlighter, InlineSearchCell: InlineSearchCell_1.InlineSearchCell, isSelected: isSelected }, cell.id))) }, row.id));
1579
+ }), rowVirtualizer.getVirtualItems().length > 0 && ((0, jsx_runtime_1.jsx)("tr", { children: (0, jsx_runtime_1.jsx)("td", { colSpan: table.getVisibleFlatColumns().length, style: {
1580
+ height: `${rowVirtualizer.getTotalSize() -
1581
+ (rowVirtualizer.getVirtualItems()[rowVirtualizer.getVirtualItems().length - 1]?.end ?? 0)}px`,
1582
+ } }) }))] })) : (
1583
+ /* Non-virtualized rendering (fallback) */
1584
+ rows.map((row, rowIndex) => {
1585
+ const rowId = row.original.id || row.id;
1586
+ const isHighlighted = navigationState.highlightedRowId === rowId;
1587
+ const isSelected = row.getIsSelected();
1588
+ return ((0, jsx_runtime_1.jsx)(ExpandableRow_1.ExpandableRow, { row: row, renderSubComponent: renderSubComponent, expandMode: expandMode, subData: getSubData && !globalFilter && columnFilters.length === 0 ? getSubData(row.original) : undefined, subColumns: columns, getSubRowId: getSubRowId, getSubRowProps: getRowProps, onSubRowClick: onSubRowClick, onSubRowSelect: onSubRowSelect, onRowClick: (e) => handleRowClick(row, rowIndex, e), onRowDoubleClick: () => onRowClick?.(row.original), onRowContextMenu: (e) => {
1589
+ if (onRowContextMenu) {
1590
+ e.preventDefault();
1591
+ onRowContextMenu(row.original, e);
1592
+ }
1593
+ }, rowHeight: rowHeight, style: getRowProps?.(row.original)?.style, className: `
1594
+ cursor-pointer group
1595
+ transition-colors duration-150 ease-out
1596
+ ${isHighlighted
1597
+ ? 'border-2 border-primary bg-gradient-to-r from-primary/10 to-primary/20 shadow-lg relative z-10'
1598
+ : isSelected
1599
+ ? 'bg-[rgb(var(--bg-selected))] shadow-sm hover:bg-[rgb(var(--bg-hover))]'
1600
+ : 'hover:bg-[rgb(var(--bg-hover))]'}
1601
+ ${getRowProps?.(row.original)?.className ?? ''}
1602
+ `, children: row.getVisibleCells().map((cell, cellIndex) => ((0, jsx_runtime_1.jsx)(CellRenderer_1.CellRenderer, { cell: cell, cellIndex: cellIndex, row: row, enableBacchaSearch: enableBacchaSearch, mainColumnsArray: mainColumnsArray, frozenColumnsState: frozenColumnsState, navigationState: navigationState, columnSearches: columnSearches, isColumnSearchActive: isColumnSearchActive, onColumnSearch: handleColumnSearch, onClearColumnSearch: handleClearColumnSearch, SearchHighlighter: SearchHighlighter_1.SearchHighlighter, InlineSearchCell: InlineSearchCell_1.InlineSearchCell, isSelected: isSelected }, cell.id))) }, row.id));
1603
+ })) })) }));
1604
+ })() }), enableSummary && summaryConfig && ((0, jsx_runtime_1.jsx)(SummaryRow_1.SummaryRow, { table: table, data: processedData, config: summaryConfig, enableRowSelection: enableRowSelection, showDragHandle: isRowReorderingActive }))] }), !loading && table.getRowModel().rows.length === 0 && ((0, jsx_runtime_1.jsx)("div", { className: "absolute left-0 right-0 bottom-0 flex items-center justify-center pointer-events-none z-10", style: { top: '44px' }, children: (0, jsx_runtime_1.jsx)("span", { className: "text-[rgb(var(--fg-muted))] text-sm", children: "No data available" }) }))] }) }));
1605
+ })() }) }, "grid")) : currentView === 'cards' ? ((0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, children: (0, jsx_runtime_1.jsx)(CardView_1.CardView, { data: table.getFilteredRowModel().rows.map(row => row.original), columns: columns, onRowClick: onRowClick, selectedRows: selectedRows, cardSize: "compact", circularCheckboxes: circularCheckboxes, getCardClassName: getRowProps ? (item) => getRowProps(item).className : undefined, onRowSelect: (item, selected) => {
1606
+ const rowIndex = table.getFilteredRowModel().rows.findIndex(row => row.original === item);
1607
+ if (rowIndex !== -1) {
1608
+ table.getFilteredRowModel().rows[rowIndex].toggleSelected(selected);
1609
+ }
1610
+ } }) }, "cards")) : ((0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2 }, children: (0, jsx_runtime_1.jsx)(react_1.default.Suspense, { fallback: (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center p-6", children: (0, jsx_runtime_1.jsx)("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-[rgb(var(--color-primary))] border-t-transparent" }) }), children: (0, jsx_runtime_1.jsx)(DataVisualization, { data: processedData, columns: columns, title: "Data Insights" }) }) }, "chart")) }) }), (0, jsx_runtime_1.jsx)(AdvancedFilterModal_1.AdvancedFilterModal, { isOpen: showAdvancedFilter, onClose: () => setShowAdvancedFilter(false), onApply: handleAdvancedFilter, columns: columns, data: filteredData, initialTab: settingsInitialTab, table: table, sorting: sorting, onSortingChange: setSorting, enableGrouping: enableGrouping, grouping: grouping, onGroupingChange: (columnId) => {
1611
+ setGrouping((prev) => prev.includes(columnId) ? prev.filter((id) => id !== columnId) : [...prev, columnId]);
1612
+ }, onClearGrouping: () => setGrouping([]) }), contextMenu.column && ((0, jsx_runtime_1.jsx)(ColumnContextMenu_1.ColumnContextMenu, { column: contextMenu.column, table: table, data: data, isVisible: contextMenu.isVisible, position: contextMenu.position, onClose: handleCloseContextMenu, onApplyFilter: handleApplyColumnFilter })), enablePagination && currentView === 'grid' && ((0, jsx_runtime_1.jsx)(PaginationControls_1.PaginationControls, { pageIndex: table.getState().pagination.pageIndex, pageSize: table.getState().pagination.pageSize, totalRows: filteredData.length, pageSizeOptions: paginationPageSizeOptions, onPageChange: (pageIndex) => table.setPageIndex(pageIndex), onPageSizeChange: (pageSize) => table.setPageSize(pageSize) }))] }));
1613
+ }