@m5kdev/web-ui 0.8.11 → 0.9.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 (214) hide show
  1. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.mts +11 -1
  2. package/dist/packages/backend/dist/src/modules/base/base.procedure.d.ts +11 -1
  3. package/dist/packages/backend/dist/src/modules/base/base.service.d.mts +1 -1
  4. package/dist/packages/backend/dist/src/modules/base/base.service.d.ts +1 -1
  5. package/dist/src/components/AvatarUpload.js +1 -1
  6. package/dist/src/components/AvatarUpload.mjs +2 -2
  7. package/dist/src/components/AvatarUpload.mjs.map +1 -1
  8. package/dist/src/components/Calendar.d.mts +1 -1
  9. package/dist/src/components/CardsSelect.js +1 -1
  10. package/dist/src/components/CardsSelect.mjs +1 -1
  11. package/dist/src/components/CollapsibleSidebarMenuItem.d.mts +1 -1
  12. package/dist/src/components/ColorPicker.d.mts +1 -1
  13. package/dist/src/components/ColorPicker.js +1 -1
  14. package/dist/src/components/ColorPicker.mjs +1 -1
  15. package/dist/src/components/CopyButton.d.mts +1 -1
  16. package/dist/src/components/CopyButton.js +1 -1
  17. package/dist/src/components/CopyButton.mjs +2 -2
  18. package/dist/src/components/CopyButton.mjs.map +1 -1
  19. package/dist/src/components/CropDialog.js +1 -1
  20. package/dist/src/components/CropDialog.mjs +1 -1
  21. package/dist/src/components/DialogProvider.d.mts +1 -1
  22. package/dist/src/components/DialogProvider.js +1 -1
  23. package/dist/src/components/DialogProvider.mjs +2 -2
  24. package/dist/src/components/DialogProvider.mjs.map +1 -1
  25. package/dist/src/components/FileDropzone.js +1 -1
  26. package/dist/src/components/FileDropzone.mjs +3 -3
  27. package/dist/src/components/FileDropzone.mjs.map +1 -1
  28. package/dist/src/components/MultiSelectDropdown.js +1 -1
  29. package/dist/src/components/MultiSelectDropdown.mjs +7 -7
  30. package/dist/src/components/MultiSelectDropdown.mjs.map +1 -1
  31. package/dist/src/components/Orb.js +1 -1
  32. package/dist/src/components/Orb.mjs +1 -1
  33. package/dist/src/components/PageAlert.d.mts +1 -1
  34. package/dist/src/components/PageAlert.d.ts +1 -1
  35. package/dist/src/components/PageAlert.js +1 -1
  36. package/dist/src/components/PageAlert.mjs +1 -1
  37. package/dist/src/components/SelectChips.d.mts +1 -1
  38. package/dist/src/components/SelectChips.js +1 -1
  39. package/dist/src/components/SelectChips.mjs +1 -1
  40. package/dist/src/components/SidebarItem.d.mts +1 -1
  41. package/dist/src/components/TablerIconPicker.d.mts +1 -1
  42. package/dist/src/components/TablerIconPicker.js +1 -1
  43. package/dist/src/components/TablerIconPicker.mjs +1 -1
  44. package/dist/src/components/app-header.js +1 -1
  45. package/dist/src/components/app-header.mjs +2 -2
  46. package/dist/src/components/app-header.mjs.map +1 -1
  47. package/dist/src/components/blur-card.d.mts +1 -1
  48. package/dist/src/components/blur-card.js +1 -1
  49. package/dist/src/components/blur-card.mjs +1 -1
  50. package/dist/src/components/features-section-demo-1.js +1 -1
  51. package/dist/src/components/features-section-demo-1.mjs +1 -1
  52. package/dist/src/components/features-section-demo-3.js +1 -1
  53. package/dist/src/components/features-section-demo-3.mjs +1 -1
  54. package/dist/src/components/shared/ButtonCopy.js +1 -1
  55. package/dist/src/components/shared/ButtonCopy.mjs +2 -2
  56. package/dist/src/components/shared/ButtonCopy.mjs.map +1 -1
  57. package/dist/src/components/team-switcher.d.mts +1 -1
  58. package/dist/src/components/team-switcher.js +1 -1
  59. package/dist/src/components/team-switcher.mjs +1 -1
  60. package/dist/src/components/theme-provider.js +1 -1
  61. package/dist/src/components/theme-provider.mjs +1 -1
  62. package/dist/src/components/typewriter.js +1 -1
  63. package/dist/src/components/typewriter.mjs +1 -1
  64. package/dist/src/components/ui/alert-dialog.d.mts +1 -1
  65. package/dist/src/components/ui/alert.d.mts +1 -1
  66. package/dist/src/components/ui/avatar.js +1 -1
  67. package/dist/src/components/ui/avatar.mjs +1 -1
  68. package/dist/src/components/ui/badge.d.mts +1 -1
  69. package/dist/src/components/ui/bento-grid2.d.mts +1 -1
  70. package/dist/src/components/ui/breadcrumb.d.mts +1 -1
  71. package/dist/src/components/ui/breadcrumb.js +1 -1
  72. package/dist/src/components/ui/breadcrumb.mjs +1 -1
  73. package/dist/src/components/ui/button.js +1 -1
  74. package/dist/src/components/ui/button.mjs +1 -1
  75. package/dist/src/components/ui/card.js +1 -1
  76. package/dist/src/components/ui/card.mjs +1 -1
  77. package/dist/src/components/ui/checkbox.js +1 -1
  78. package/dist/src/components/ui/checkbox.mjs +1 -1
  79. package/dist/src/components/ui/dialog.d.mts +1 -1
  80. package/dist/src/components/ui/dropdown-menu.d.mts +1 -1
  81. package/dist/src/components/ui/dropdown-menu.js +1 -1
  82. package/dist/src/components/ui/dropdown-menu.mjs +1 -1
  83. package/dist/src/components/ui/floating-navbar.d.mts +1 -1
  84. package/dist/src/components/ui/floating-navbar.js +1 -1
  85. package/dist/src/components/ui/floating-navbar.mjs +1 -1
  86. package/dist/src/components/ui/form.d.mts +1 -1
  87. package/dist/src/components/ui/form.js +1 -1
  88. package/dist/src/components/ui/form.mjs +1 -1
  89. package/dist/src/components/ui/image.js +1 -1
  90. package/dist/src/components/ui/image.mjs +1 -1
  91. package/dist/src/components/ui/input.js +1 -1
  92. package/dist/src/components/ui/input.mjs +1 -1
  93. package/dist/src/components/ui/label.js +1 -1
  94. package/dist/src/components/ui/label.mjs +1 -1
  95. package/dist/src/components/ui/pagination.d.mts +1 -1
  96. package/dist/src/components/ui/progress.js +1 -1
  97. package/dist/src/components/ui/progress.mjs +1 -1
  98. package/dist/src/components/ui/resizable-navbar.d.mts +1 -1
  99. package/dist/src/components/ui/resizable-navbar.js +1 -1
  100. package/dist/src/components/ui/resizable-navbar.mjs +1 -1
  101. package/dist/src/components/ui/segment-control.js +1 -1
  102. package/dist/src/components/ui/segment-control.mjs +3 -3
  103. package/dist/src/components/ui/segment-control.mjs.map +1 -1
  104. package/dist/src/components/ui/select.js +1 -1
  105. package/dist/src/components/ui/select.mjs +1 -1
  106. package/dist/src/components/ui/separator.js +1 -1
  107. package/dist/src/components/ui/separator.mjs +1 -1
  108. package/dist/src/components/ui/sheet.d.mts +1 -1
  109. package/dist/src/components/ui/sheet.js +1 -1
  110. package/dist/src/components/ui/sheet.mjs +1 -1
  111. package/dist/src/components/ui/sidebar.js +1 -1
  112. package/dist/src/components/ui/sidebar.mjs +1 -1
  113. package/dist/src/components/ui/slider.js +1 -1
  114. package/dist/src/components/ui/slider.mjs +1 -1
  115. package/dist/src/components/ui/spinner.d.mts +1 -1
  116. package/dist/src/components/ui/switch.js +1 -1
  117. package/dist/src/components/ui/switch.mjs +1 -1
  118. package/dist/src/components/ui/table.d.mts +1 -1
  119. package/dist/src/components/ui/tabs.d.mts +1 -1
  120. package/dist/src/components/ui/textarea.d.mts +1 -1
  121. package/dist/src/components/ui/timeline.d.mts +1 -1
  122. package/dist/src/components/ui/timeline.js +1 -1
  123. package/dist/src/components/ui/timeline.mjs +1 -1
  124. package/dist/src/components/ui/toast.js +1 -1
  125. package/dist/src/components/ui/toast.mjs +1 -1
  126. package/dist/src/components/ui/tooltip.d.mts +1 -1
  127. package/dist/src/components/ui/typewriter-effect.js +1 -1
  128. package/dist/src/components/ui/typewriter-effect.mjs +1 -1
  129. package/dist/src/icons/GoogleIcon.d.mts +1 -1
  130. package/dist/src/icons/LinkedInIcon.d.mts +1 -1
  131. package/dist/src/icons/MicrosoftIcon.d.mts +1 -1
  132. package/dist/src/modules/app/components/AppLoader.d.mts +1 -1
  133. package/dist/src/modules/app/components/AppLoader.js +1 -1
  134. package/dist/src/modules/app/components/AppLoader.mjs +1 -1
  135. package/dist/src/modules/app/components/AppShell.d.mts +1 -1
  136. package/dist/src/modules/app/components/AppSidebar.d.mts +1 -1
  137. package/dist/src/modules/app/components/AppSidebarHeader.js +1 -1
  138. package/dist/src/modules/app/components/AppSidebarHeader.mjs +1 -1
  139. package/dist/src/modules/app/components/AppSidebarInvites.js +1 -1
  140. package/dist/src/modules/app/components/AppSidebarInvites.mjs +1 -1
  141. package/dist/src/modules/auth/components/AdminUserManagement.js +2 -2
  142. package/dist/src/modules/auth/components/AdminUserManagement.mjs +6 -6
  143. package/dist/src/modules/auth/components/AdminUserManagement.mjs.map +1 -1
  144. package/dist/src/modules/auth/components/AdminWaitlist.js +1 -1
  145. package/dist/src/modules/auth/components/AdminWaitlist.mjs +3 -3
  146. package/dist/src/modules/auth/components/AdminWaitlist.mjs.map +1 -1
  147. package/dist/src/modules/auth/components/AuthLayout.d.mts +1 -1
  148. package/dist/src/modules/auth/components/AuthProviders.js +1 -1
  149. package/dist/src/modules/auth/components/AuthProviders.mjs +1 -1
  150. package/dist/src/modules/auth/components/AuthRouter.d.mts +1 -1
  151. package/dist/src/modules/auth/components/ClaimAccountRoute.js +1 -1
  152. package/dist/src/modules/auth/components/ClaimAccountRoute.mjs +1 -1
  153. package/dist/src/modules/auth/components/ErrorAuthRoute.js +1 -1
  154. package/dist/src/modules/auth/components/ErrorAuthRoute.mjs +1 -1
  155. package/dist/src/modules/auth/components/ForgotPasswordForm.js +1 -1
  156. package/dist/src/modules/auth/components/ForgotPasswordForm.mjs +1 -1
  157. package/dist/src/modules/auth/components/ForgotPasswordRoute.js +1 -1
  158. package/dist/src/modules/auth/components/ForgotPasswordRoute.mjs +1 -1
  159. package/dist/src/modules/auth/components/InviteFriends.js +1 -1
  160. package/dist/src/modules/auth/components/InviteFriends.mjs +1 -1
  161. package/dist/src/modules/auth/components/LastUsedBadge.d.mts +1 -1
  162. package/dist/src/modules/auth/components/LastUsedBadge.js +1 -1
  163. package/dist/src/modules/auth/components/LastUsedBadge.mjs +1 -1
  164. package/dist/src/modules/auth/components/LoginForm.js +1 -1
  165. package/dist/src/modules/auth/components/LoginForm.mjs +1 -1
  166. package/dist/src/modules/auth/components/LoginRoute.js +1 -1
  167. package/dist/src/modules/auth/components/LoginRoute.mjs +1 -1
  168. package/dist/src/modules/auth/components/LogoutRoute.js +1 -1
  169. package/dist/src/modules/auth/components/LogoutRoute.mjs +1 -1
  170. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js +1 -1
  171. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.mjs +1 -1
  172. package/dist/src/modules/auth/components/OrganizationMembersRoute.js +2 -2
  173. package/dist/src/modules/auth/components/OrganizationMembersRoute.mjs +2 -2
  174. package/dist/src/modules/auth/components/OrganizationPreferences.js +1 -1
  175. package/dist/src/modules/auth/components/OrganizationPreferences.mjs +1 -1
  176. package/dist/src/modules/auth/components/OrganizationSettingsRoute.js +2 -2
  177. package/dist/src/modules/auth/components/OrganizationSettingsRoute.mjs +2 -2
  178. package/dist/src/modules/auth/components/OrganizationSwitcher.js +2 -2
  179. package/dist/src/modules/auth/components/OrganizationSwitcher.mjs +2 -2
  180. package/dist/src/modules/auth/components/PreferencesEditor.js +1 -1
  181. package/dist/src/modules/auth/components/PreferencesEditor.mjs +1 -1
  182. package/dist/src/modules/auth/components/ProfileRoute.js +1 -1
  183. package/dist/src/modules/auth/components/ProfileRoute.mjs +1 -1
  184. package/dist/src/modules/auth/components/RangeNuqsDatePicker.js +1 -1
  185. package/dist/src/modules/auth/components/RangeNuqsDatePicker.mjs +1 -1
  186. package/dist/src/modules/auth/components/ResetPasswordForm.js +1 -1
  187. package/dist/src/modules/auth/components/ResetPasswordForm.mjs +1 -1
  188. package/dist/src/modules/auth/components/ResetPasswordRoute.js +1 -1
  189. package/dist/src/modules/auth/components/ResetPasswordRoute.mjs +1 -1
  190. package/dist/src/modules/auth/components/SignupFormRoute.js +1 -1
  191. package/dist/src/modules/auth/components/SignupFormRoute.mjs +1 -1
  192. package/dist/src/modules/auth/components/SignupRoute.js +1 -1
  193. package/dist/src/modules/auth/components/SignupRoute.mjs +1 -1
  194. package/dist/src/modules/auth/components/WaitlistCard.js +1 -1
  195. package/dist/src/modules/auth/components/WaitlistCard.mjs +1 -1
  196. package/dist/src/modules/auth/components/WaitlistCodeValidation.js +1 -1
  197. package/dist/src/modules/auth/components/WaitlistCodeValidation.mjs +1 -1
  198. package/dist/src/modules/billing/components/BillingBetaPage.d.mts +1 -1
  199. package/dist/src/modules/billing/components/BillingInvoicePage.js +2 -2
  200. package/dist/src/modules/billing/components/BillingInvoicePage.mjs +2 -2
  201. package/dist/src/modules/billing/components/BillingSinglePlanSelect.js +1 -1
  202. package/dist/src/modules/billing/components/BillingSinglePlanSelect.mjs +1 -1
  203. package/dist/src/modules/table/components/ColumnOrderAndVisibility.js +1 -1
  204. package/dist/src/modules/table/components/ColumnOrderAndVisibility.mjs +1 -1
  205. package/dist/src/modules/table/components/NuqsTable.js +1 -1
  206. package/dist/src/modules/table/components/NuqsTable.mjs +3 -3
  207. package/dist/src/modules/table/components/NuqsTable.mjs.map +1 -1
  208. package/dist/src/modules/table/components/TableFiltering.js +1 -1
  209. package/dist/src/modules/table/components/TableFiltering.mjs +1 -1
  210. package/dist/src/modules/table/components/TableGroupBy.js +1 -1
  211. package/dist/src/modules/table/components/TableGroupBy.mjs +1 -1
  212. package/dist/src/modules/table/components/TablePagination.js +1 -1
  213. package/dist/src/modules/table/components/TablePagination.mjs +1 -1
  214. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"NuqsTable.mjs","names":["Button","Table","TableHeader","TableRow","TableBody","TableCell"],"sources":["../../../../../src/modules/table/components/NuqsTable.tsx"],"sourcesContent":["import { Checkbox, Input, Popover, PopoverContent, PopoverTrigger } from \"@heroui/react\";\r\nimport type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { FilterMethods } from \"@m5kdev/commons/modules/table/filter.types\";\r\nimport type { TableParams } from \"@m5kdev/frontend/modules/table/hooks/useNuqsTable\";\r\nimport type { ColumnDef } from \"@tanstack/react-table\";\r\nimport {\r\n type ColumnOrderState,\r\n type ExpandedState,\r\n flexRender,\r\n getCoreRowModel,\r\n getExpandedRowModel,\r\n getGroupedRowModel,\r\n getPaginationRowModel,\r\n type Table as ReactTable,\r\n useReactTable,\r\n type VisibilityState,\r\n} from \"@tanstack/react-table\";\r\nimport { ChevronDown, ChevronRight, ChevronUp, Search } from \"lucide-react\";\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { Button } from \"../../../components/ui/button\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"../../../components/ui/table\";\r\nimport { ColumnOrderAndVisibility } from \"./ColumnOrderAndVisibility\";\r\nimport { TableFiltering } from \"./TableFiltering\";\r\nimport { TableGroupBy } from \"./TableGroupBy\";\r\nimport { TablePagination } from \"./TablePagination\";\r\nimport type { ColumnDataType, ColumnItem } from \"./table.types\";\r\n\r\nfunction getStorageKey(columnIds: string[]): string {\r\n const sortedIds = [...columnIds].sort().join(\",\");\r\n return `table-column-layout-${sortedIds}`;\r\n}\r\n\r\nfunction loadLayoutFromStorage(\r\n columnIds: string[]\r\n): { order: string[]; visibility: Record<string, boolean> } | null {\r\n if (typeof window === \"undefined\") return null;\r\n try {\r\n const key = getStorageKey(columnIds);\r\n const stored = localStorage.getItem(key);\r\n if (!stored) return null;\r\n const parsed = JSON.parse(stored) as { order: string[]; visibility: Record<string, boolean> };\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction saveLayoutToStorage(\r\n columnIds: string[],\r\n order: string[],\r\n visibility: Record<string, boolean>\r\n): void {\r\n if (typeof window === \"undefined\") return;\r\n try {\r\n const key = getStorageKey(columnIds);\r\n localStorage.setItem(key, JSON.stringify({ order, visibility }));\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n}\r\n\r\nexport type NuqsTableColumn<T> = ColumnDef<T> & {\r\n visible?: boolean;\r\n type?: ColumnDataType;\r\n options?: { label: string; value: string }[];\r\n endColumnId?: string;\r\n groupable?: boolean;\r\n};\r\n\r\ntype NuqsTableParams<T> = {\r\n data: T[];\r\n total?: number;\r\n columns: NuqsTableColumn<T>[];\r\n tableProps: TableParams;\r\n /** When true, shows URL-synced global search; enable only if the list API applies `q` server-side. */\r\n showGlobalSearch?: boolean;\r\n singleFilter?: boolean;\r\n filterMethods?: Partial<FilterMethods>;\r\n};\r\n\r\nfunction applyOrder(prev: ColumnItem[], nextOrder: string[]): ColumnItem[] {\r\n const byId = new Map(prev.map((i) => [i.id, i]));\r\n const ordered = nextOrder.map((id) => byId.get(id)).filter(Boolean) as ColumnItem[];\r\n // append any newly added columns (if any appear later)\r\n for (const item of prev) if (!nextOrder.includes(item.id)) ordered.push(item);\r\n return ordered;\r\n}\r\n\r\nfunction applyVisibility(prev: ColumnItem[], visibility: VisibilityState): ColumnItem[] {\r\n return prev.map((column) => ({\r\n ...column,\r\n visibility: visibility[String(column.id)] ?? column.visibility,\r\n }));\r\n}\r\n\r\nexport const NuqsTable = <T,>({\r\n data,\r\n total,\r\n columns,\r\n tableProps,\r\n showGlobalSearch = false,\r\n singleFilter = false,\r\n filterMethods,\r\n}: NuqsTableParams<T>) => {\r\n const columnIds = useMemo(() => columns.map((col) => String(col.id)), [columns]);\r\n // const columnsWithId = useMemo(() => {\r\n // const idColumn: NuqsTableColumn<T> = {\r\n // id: \"__row_id\",\r\n // accessorKey: \"id\",\r\n // header: \"\",\r\n // enableSorting: false,\r\n // enableHiding: false,\r\n // visible: false,\r\n // };\r\n // return [idColumn, ...columns];\r\n // }, [columns]);\r\n\r\n const initialLayout = useMemo(() => {\r\n const defaultLayout = columns.map((column) => ({\r\n id: String(column.id),\r\n label: column.header as string,\r\n visibility: column.visible !== undefined ? column.visible : true,\r\n options: column.options ?? [],\r\n type: column.type ?? undefined,\r\n }));\r\n\r\n const saved = loadLayoutFromStorage(columnIds);\r\n if (!saved) return defaultLayout;\r\n\r\n // Merge saved layout with default layout\r\n const savedById = new Map<string, { order: number; visibility: boolean }>();\r\n saved.order.forEach((id, index) => {\r\n savedById.set(id, { order: index, visibility: saved.visibility[id] ?? true });\r\n });\r\n\r\n const merged: ColumnItem[] = [];\r\n const processedIds = new Set<string>();\r\n\r\n // Add columns in saved order\r\n saved.order.forEach((id) => {\r\n const defaultCol = defaultLayout.find((col) => col.id === id);\r\n if (defaultCol) {\r\n merged.push({\r\n ...defaultCol,\r\n visibility: saved.visibility[id] ?? defaultCol.visibility,\r\n });\r\n processedIds.add(id);\r\n }\r\n });\r\n\r\n // Add any new columns that weren't in saved layout\r\n defaultLayout.forEach((col) => {\r\n if (!processedIds.has(col.id)) {\r\n merged.push(col);\r\n }\r\n });\r\n\r\n return merged;\r\n }, [columns, columnIds]);\r\n\r\n const [layout, setLayout] = useState<ColumnItem[]>(initialLayout);\r\n\r\n // Sync layout when columns change\r\n useEffect(() => {\r\n setLayout(initialLayout);\r\n }, [initialLayout]);\r\n\r\n // Save to localStorage whenever layout changes\r\n useEffect(() => {\r\n const order = layout.map((col) => col.id);\r\n const visibility = Object.fromEntries(layout.map((col) => [col.id, col.visibility]));\r\n saveLayoutToStorage(columnIds, order, visibility);\r\n }, [layout, columnIds]);\r\n\r\n const columnOrder = useMemo(() => layout.map((column) => column.id), [layout]);\r\n const columnVisibility = useMemo(\r\n () => Object.fromEntries(layout.map((column) => [column.id, column.visibility])),\r\n [layout]\r\n );\r\n\r\n const {\r\n limit = 10,\r\n page = 1,\r\n sorting,\r\n setSorting,\r\n setPagination,\r\n pagination,\r\n rowSelection,\r\n setRowSelection,\r\n setFilters,\r\n filters,\r\n grouping,\r\n setGrouping,\r\n q,\r\n setQ,\r\n } = tableProps;\r\n\r\n const skipFirstGlobalSearchPageReset = useRef(true);\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset page when `q` changes (incl. back/forward)\r\n useEffect(() => {\r\n if (!showGlobalSearch) return;\r\n if (skipFirstGlobalSearchPageReset.current) {\r\n skipFirstGlobalSearchPageReset.current = false;\r\n return;\r\n }\r\n setPagination?.({ pageIndex: 0, pageSize: limit });\r\n }, [showGlobalSearch, q, limit, setPagination]);\r\n\r\n const isGrouped = grouping.length > 0;\r\n const [expanded, setExpanded] = useState<ExpandedState>({});\r\n\r\n // Redirect back if we're on an empty page (past the last page)\r\n useEffect(() => {\r\n if (!isGrouped && data.length === 0 && page > 1 && total !== undefined) {\r\n setPagination?.({ pageIndex: page - 2, pageSize: limit });\r\n }\r\n }, [data.length, page, limit, total, setPagination, isGrouped]);\r\n\r\n // When grouped, TanStack handles pagination client-side; otherwise use server total\r\n const serverPageCount =\r\n total !== undefined\r\n ? Math.ceil(total / limit) || 1\r\n : data.length === limit\r\n ? page + 1\r\n : Math.max(page, Math.ceil(data.length / limit));\r\n\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n getRowId: (row) => String((row as { id: string | number }).id),\r\n manualSorting: true,\r\n manualPagination: !isGrouped,\r\n state: { pagination, sorting, rowSelection, columnOrder, columnVisibility, grouping, expanded },\r\n ...(isGrouped ? {} : { pageCount: serverPageCount }),\r\n manualFiltering: true,\r\n enableGrouping: true,\r\n groupedColumnMode: false,\r\n autoResetExpanded: false,\r\n onSortingChange: setSorting,\r\n onPaginationChange: setPagination,\r\n onRowSelectionChange: setRowSelection,\r\n onGroupingChange: setGrouping,\r\n onExpandedChange: setExpanded,\r\n getCoreRowModel: getCoreRowModel(),\r\n getGroupedRowModel: getGroupedRowModel(),\r\n getExpandedRowModel: getExpandedRowModel(),\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onColumnOrderChange: (updater) => {\r\n setLayout((prev) =>\r\n applyOrder(prev, typeof updater === \"function\" ? updater(prev.map((i) => i.id)) : updater)\r\n );\r\n },\r\n onColumnVisibilityChange: (updater) => {\r\n setLayout((prev) =>\r\n applyVisibility(\r\n prev,\r\n typeof updater === \"function\"\r\n ? updater(Object.fromEntries(prev.map((i) => [i.id, i.visibility])))\r\n : updater\r\n )\r\n );\r\n },\r\n }) as ReactTable<T>;\r\n\r\n const onChangeOrder = (order: ColumnOrderState) => {\r\n setLayout((prev) => applyOrder(prev, order));\r\n };\r\n const onChangeVisibility = (visibility: VisibilityState) => {\r\n setLayout((prev) => applyVisibility(prev, visibility));\r\n };\r\n\r\n const onFiltersChange = (filters: QueryFilters) => {\r\n setFilters?.(filters);\r\n };\r\n\r\n const filterableColumns = useMemo(() => {\r\n const baseColumns = columns\r\n .filter((column) => Boolean(column.type))\r\n .map((column) => ({\r\n id: String(column.id),\r\n label: String(column.header),\r\n type: column.type,\r\n options: column.options ?? [],\r\n endColumnId: column.endColumnId,\r\n periodStartColumnId: null,\r\n periodEndColumnId: null,\r\n }));\r\n\r\n // Add Period pseudo-columns for date columns with endColumnId\r\n const periodColumns = columns\r\n .filter((column) => column.type === \"date\" && column.endColumnId)\r\n .map((column) => ({\r\n id: `${String(column.id)}__period`,\r\n label: \"Period\",\r\n type: \"date\" as ColumnDataType,\r\n options: [],\r\n endColumnId: null,\r\n periodStartColumnId: String(column.id),\r\n periodEndColumnId: column.endColumnId,\r\n }));\r\n\r\n return [...baseColumns, ...periodColumns];\r\n }, [columns]);\r\n\r\n const groupableColumns = useMemo(\r\n () =>\r\n columns\r\n .filter((col) => col.groupable)\r\n .map((col) => ({ id: String(col.id), label: String(col.header) })),\r\n [columns]\r\n );\r\n\r\n const hasGrouping = grouping.length > 0;\r\n\r\n const [isFiltersOpen, setIsFiltersOpen] = useState(false);\r\n const [isColumnsOpen, setIsColumnsOpen] = useState(false);\r\n const [isGroupByOpen, setIsGroupByOpen] = useState(false);\r\n\r\n return (\r\n <>\r\n <div className=\"flex w-full flex-wrap items-center justify-between gap-2\">\r\n <div className=\"flex min-w-0 flex-1 items-center\">\r\n {showGlobalSearch ? (\r\n <Input\r\n size=\"sm\"\r\n className=\"max-w-xs\"\r\n placeholder=\"Search…\"\r\n value={q ?? \"\"}\r\n onValueChange={(v) => {\r\n setQ?.(v === \"\" ? null : v);\r\n }}\r\n startContent={<Search className=\"h-4 w-4 shrink-0 text-default-400\" aria-hidden />}\r\n aria-label=\"Search table\"\r\n />\r\n ) : null}\r\n </div>\r\n <div className=\"flex shrink-0 items-center gap-2\">\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isFiltersOpen}\r\n onOpenChange={setIsFiltersOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n Filters\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <TableFiltering\r\n columns={filterableColumns}\r\n onFiltersChange={onFiltersChange}\r\n filters={filters ?? []}\r\n onClose={() => setIsFiltersOpen(false)}\r\n singleFilter={singleFilter}\r\n filterMethods={filterMethods}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n {groupableColumns.length > 0 && (\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isGroupByOpen}\r\n onOpenChange={setIsGroupByOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant={hasGrouping ? \"secondary\" : \"outline\"} size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n {hasGrouping\r\n ? `Grouped by: ${grouping.map((id) => groupableColumns.find((c) => c.id === id)?.label ?? id).join(\" → \")}`\r\n : \"Group by\"}\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <TableGroupBy\r\n columns={groupableColumns}\r\n activeGrouping={grouping}\r\n onGroupingChange={(columnIds) => {\r\n setGrouping(columnIds);\r\n setExpanded({});\r\n setPagination?.({ pageIndex: 0, pageSize: limit });\r\n }}\r\n onClose={() => setIsGroupByOpen(false)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n )}\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isColumnsOpen}\r\n onOpenChange={setIsColumnsOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n Columns\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <ColumnOrderAndVisibility\r\n layout={layout}\r\n onChangeOrder={onChangeOrder}\r\n onChangeVisibility={onChangeVisibility}\r\n onClose={() => setIsColumnsOpen(false)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n </div>\r\n <Table>\r\n <TableHeader>\r\n <TableRow>\r\n <TableHead>\r\n <Checkbox\r\n isSelected={table.getIsAllRowsSelected()}\r\n onValueChange={(checked) => {\r\n table.toggleAllRowsSelected(checked);\r\n }}\r\n />\r\n </TableHead>\r\n {table.getHeaderGroups()[0].headers.map((header) => (\r\n <TableHead\r\n onClick={\r\n header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined\r\n }\r\n key={header.id}\r\n >\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n {header.column.getCanSort() && (\r\n <>\r\n {header.column.getIsSorted() === \"asc\" && (\r\n <ChevronUp className=\"h-4 w-4 inline ml-1\" />\r\n )}\r\n {header.column.getIsSorted() === \"desc\" && (\r\n <ChevronDown className=\"h-4 w-4 inline ml-1\" />\r\n )}\r\n </>\r\n )}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {table.getRowModel().rows.map((row) => {\r\n if (row.getIsGrouped()) {\r\n return (\r\n <TableRow\r\n key={row.id}\r\n className=\"bg-muted/40 font-medium cursor-pointer hover:bg-muted/60\"\r\n onClick={() => row.toggleExpanded()}\r\n >\r\n <TableCell />\r\n {row.getVisibleCells().map((cell) => {\r\n if (cell.getIsGrouped()) {\r\n return (\r\n <TableCell key={cell.id}>\r\n <span className=\"flex items-center gap-1.5\">\r\n {row.getIsExpanded() ? (\r\n <ChevronDown className=\"h-4 w-4 shrink-0\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 shrink-0\" />\r\n )}\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n <span className=\"text-muted-foreground font-normal ml-1\">\r\n ({row.subRows.length})\r\n </span>\r\n </span>\r\n </TableCell>\r\n );\r\n }\r\n if (cell.getIsAggregated()) {\r\n return (\r\n <TableCell key={cell.id}>\r\n {flexRender(\r\n cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,\r\n cell.getContext()\r\n )}\r\n </TableCell>\r\n );\r\n }\r\n return <TableCell key={cell.id} />;\r\n })}\r\n </TableRow>\r\n );\r\n }\r\n\r\n return (\r\n <TableRow key={row.id}>\r\n <TableCell>\r\n <Checkbox\r\n isSelected={row.getIsSelected()}\r\n onValueChange={(checked) => {\r\n row.toggleSelected(checked);\r\n }}\r\n />\r\n </TableCell>\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell key={cell.id}>\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n <TablePagination\r\n pageCount={\r\n isGrouped\r\n ? Math.ceil(table.getPrePaginationRowModel().rows.length / limit) || 1\r\n : serverPageCount\r\n }\r\n page={isGrouped ? table.getState().pagination.pageIndex + 1 : page}\r\n limit={limit}\r\n setPagination={setPagination}\r\n />\r\n </>\r\n );\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"NuqsTable.mjs","names":["Button","Table","TableHeader","TableRow","TableBody","TableCell"],"sources":["../../../../../src/modules/table/components/NuqsTable.tsx"],"sourcesContent":["import { Checkbox, Input, Popover, PopoverContent, PopoverTrigger } from \"@heroui/react\";\r\nimport type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { FilterMethods } from \"@m5kdev/commons/modules/table/filter.types\";\r\nimport type { TableParams } from \"@m5kdev/frontend/modules/table/hooks/useNuqsTable\";\r\nimport type { ColumnDef } from \"@tanstack/react-table\";\r\nimport {\r\n type ColumnOrderState,\r\n type ExpandedState,\r\n flexRender,\r\n getCoreRowModel,\r\n getExpandedRowModel,\r\n getGroupedRowModel,\r\n getPaginationRowModel,\r\n type Table as ReactTable,\r\n useReactTable,\r\n type VisibilityState,\r\n} from \"@tanstack/react-table\";\r\nimport { ChevronDown, ChevronRight, ChevronUp, Search } from \"lucide-react\";\r\nimport { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { Button } from \"../../../components/ui/button\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableHeader,\r\n TableRow,\r\n} from \"../../../components/ui/table\";\r\nimport { ColumnOrderAndVisibility } from \"./ColumnOrderAndVisibility\";\r\nimport { TableFiltering } from \"./TableFiltering\";\r\nimport { TableGroupBy } from \"./TableGroupBy\";\r\nimport { TablePagination } from \"./TablePagination\";\r\nimport type { ColumnDataType, ColumnItem } from \"./table.types\";\r\n\r\nfunction getStorageKey(columnIds: string[]): string {\r\n const sortedIds = [...columnIds].sort().join(\",\");\r\n return `table-column-layout-${sortedIds}`;\r\n}\r\n\r\nfunction loadLayoutFromStorage(\r\n columnIds: string[]\r\n): { order: string[]; visibility: Record<string, boolean> } | null {\r\n if (typeof window === \"undefined\") return null;\r\n try {\r\n const key = getStorageKey(columnIds);\r\n const stored = localStorage.getItem(key);\r\n if (!stored) return null;\r\n const parsed = JSON.parse(stored) as { order: string[]; visibility: Record<string, boolean> };\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction saveLayoutToStorage(\r\n columnIds: string[],\r\n order: string[],\r\n visibility: Record<string, boolean>\r\n): void {\r\n if (typeof window === \"undefined\") return;\r\n try {\r\n const key = getStorageKey(columnIds);\r\n localStorage.setItem(key, JSON.stringify({ order, visibility }));\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n}\r\n\r\nexport type NuqsTableColumn<T> = ColumnDef<T> & {\r\n visible?: boolean;\r\n type?: ColumnDataType;\r\n options?: { label: string; value: string }[];\r\n endColumnId?: string;\r\n groupable?: boolean;\r\n};\r\n\r\ntype NuqsTableParams<T> = {\r\n data: T[];\r\n total?: number;\r\n columns: NuqsTableColumn<T>[];\r\n tableProps: TableParams;\r\n /** When true, shows URL-synced global search; enable only if the list API applies `q` server-side. */\r\n showGlobalSearch?: boolean;\r\n singleFilter?: boolean;\r\n filterMethods?: Partial<FilterMethods>;\r\n};\r\n\r\nfunction applyOrder(prev: ColumnItem[], nextOrder: string[]): ColumnItem[] {\r\n const byId = new Map(prev.map((i) => [i.id, i]));\r\n const ordered = nextOrder.map((id) => byId.get(id)).filter(Boolean) as ColumnItem[];\r\n // append any newly added columns (if any appear later)\r\n for (const item of prev) if (!nextOrder.includes(item.id)) ordered.push(item);\r\n return ordered;\r\n}\r\n\r\nfunction applyVisibility(prev: ColumnItem[], visibility: VisibilityState): ColumnItem[] {\r\n return prev.map((column) => ({\r\n ...column,\r\n visibility: visibility[String(column.id)] ?? column.visibility,\r\n }));\r\n}\r\n\r\nexport const NuqsTable = <T,>({\r\n data,\r\n total,\r\n columns,\r\n tableProps,\r\n showGlobalSearch = false,\r\n singleFilter = false,\r\n filterMethods,\r\n}: NuqsTableParams<T>) => {\r\n const columnIds = useMemo(() => columns.map((col) => String(col.id)), [columns]);\r\n // const columnsWithId = useMemo(() => {\r\n // const idColumn: NuqsTableColumn<T> = {\r\n // id: \"__row_id\",\r\n // accessorKey: \"id\",\r\n // header: \"\",\r\n // enableSorting: false,\r\n // enableHiding: false,\r\n // visible: false,\r\n // };\r\n // return [idColumn, ...columns];\r\n // }, [columns]);\r\n\r\n const initialLayout = useMemo(() => {\r\n const defaultLayout = columns.map((column) => ({\r\n id: String(column.id),\r\n label: column.header as string,\r\n visibility: column.visible !== undefined ? column.visible : true,\r\n options: column.options ?? [],\r\n type: column.type ?? undefined,\r\n }));\r\n\r\n const saved = loadLayoutFromStorage(columnIds);\r\n if (!saved) return defaultLayout;\r\n\r\n // Merge saved layout with default layout\r\n const savedById = new Map<string, { order: number; visibility: boolean }>();\r\n saved.order.forEach((id, index) => {\r\n savedById.set(id, { order: index, visibility: saved.visibility[id] ?? true });\r\n });\r\n\r\n const merged: ColumnItem[] = [];\r\n const processedIds = new Set<string>();\r\n\r\n // Add columns in saved order\r\n saved.order.forEach((id) => {\r\n const defaultCol = defaultLayout.find((col) => col.id === id);\r\n if (defaultCol) {\r\n merged.push({\r\n ...defaultCol,\r\n visibility: saved.visibility[id] ?? defaultCol.visibility,\r\n });\r\n processedIds.add(id);\r\n }\r\n });\r\n\r\n // Add any new columns that weren't in saved layout\r\n defaultLayout.forEach((col) => {\r\n if (!processedIds.has(col.id)) {\r\n merged.push(col);\r\n }\r\n });\r\n\r\n return merged;\r\n }, [columns, columnIds]);\r\n\r\n const [layout, setLayout] = useState<ColumnItem[]>(initialLayout);\r\n\r\n // Sync layout when columns change\r\n useEffect(() => {\r\n setLayout(initialLayout);\r\n }, [initialLayout]);\r\n\r\n // Save to localStorage whenever layout changes\r\n useEffect(() => {\r\n const order = layout.map((col) => col.id);\r\n const visibility = Object.fromEntries(layout.map((col) => [col.id, col.visibility]));\r\n saveLayoutToStorage(columnIds, order, visibility);\r\n }, [layout, columnIds]);\r\n\r\n const columnOrder = useMemo(() => layout.map((column) => column.id), [layout]);\r\n const columnVisibility = useMemo(\r\n () => Object.fromEntries(layout.map((column) => [column.id, column.visibility])),\r\n [layout]\r\n );\r\n\r\n const {\r\n limit = 10,\r\n page = 1,\r\n sorting,\r\n setSorting,\r\n setPagination,\r\n pagination,\r\n rowSelection,\r\n setRowSelection,\r\n setFilters,\r\n filters,\r\n grouping,\r\n setGrouping,\r\n q,\r\n setQ,\r\n } = tableProps;\r\n\r\n const skipFirstGlobalSearchPageReset = useRef(true);\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset page when `q` changes (incl. back/forward)\r\n useEffect(() => {\r\n if (!showGlobalSearch) return;\r\n if (skipFirstGlobalSearchPageReset.current) {\r\n skipFirstGlobalSearchPageReset.current = false;\r\n return;\r\n }\r\n setPagination?.({ pageIndex: 0, pageSize: limit });\r\n }, [showGlobalSearch, q, limit, setPagination]);\r\n\r\n const isGrouped = grouping.length > 0;\r\n const [expanded, setExpanded] = useState<ExpandedState>({});\r\n\r\n // Redirect back if we're on an empty page (past the last page)\r\n useEffect(() => {\r\n if (!isGrouped && data.length === 0 && page > 1 && total !== undefined) {\r\n setPagination?.({ pageIndex: page - 2, pageSize: limit });\r\n }\r\n }, [data.length, page, limit, total, setPagination, isGrouped]);\r\n\r\n // When grouped, TanStack handles pagination client-side; otherwise use server total\r\n const serverPageCount =\r\n total !== undefined\r\n ? Math.ceil(total / limit) || 1\r\n : data.length === limit\r\n ? page + 1\r\n : Math.max(page, Math.ceil(data.length / limit));\r\n\r\n const table = useReactTable({\r\n data,\r\n columns,\r\n getRowId: (row) => String((row as { id: string | number }).id),\r\n manualSorting: true,\r\n manualPagination: !isGrouped,\r\n state: { pagination, sorting, rowSelection, columnOrder, columnVisibility, grouping, expanded },\r\n ...(isGrouped ? {} : { pageCount: serverPageCount }),\r\n manualFiltering: true,\r\n enableGrouping: true,\r\n groupedColumnMode: false,\r\n autoResetExpanded: false,\r\n onSortingChange: setSorting,\r\n onPaginationChange: setPagination,\r\n onRowSelectionChange: setRowSelection,\r\n onGroupingChange: setGrouping,\r\n onExpandedChange: setExpanded,\r\n getCoreRowModel: getCoreRowModel(),\r\n getGroupedRowModel: getGroupedRowModel(),\r\n getExpandedRowModel: getExpandedRowModel(),\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onColumnOrderChange: (updater) => {\r\n setLayout((prev) =>\r\n applyOrder(prev, typeof updater === \"function\" ? updater(prev.map((i) => i.id)) : updater)\r\n );\r\n },\r\n onColumnVisibilityChange: (updater) => {\r\n setLayout((prev) =>\r\n applyVisibility(\r\n prev,\r\n typeof updater === \"function\"\r\n ? updater(Object.fromEntries(prev.map((i) => [i.id, i.visibility])))\r\n : updater\r\n )\r\n );\r\n },\r\n }) as ReactTable<T>;\r\n\r\n const onChangeOrder = (order: ColumnOrderState) => {\r\n setLayout((prev) => applyOrder(prev, order));\r\n };\r\n const onChangeVisibility = (visibility: VisibilityState) => {\r\n setLayout((prev) => applyVisibility(prev, visibility));\r\n };\r\n\r\n const onFiltersChange = (filters: QueryFilters) => {\r\n setFilters?.(filters);\r\n };\r\n\r\n const filterableColumns = useMemo(() => {\r\n const baseColumns = columns\r\n .filter((column) => Boolean(column.type))\r\n .map((column) => ({\r\n id: String(column.id),\r\n label: String(column.header),\r\n type: column.type,\r\n options: column.options ?? [],\r\n endColumnId: column.endColumnId,\r\n periodStartColumnId: null,\r\n periodEndColumnId: null,\r\n }));\r\n\r\n // Add Period pseudo-columns for date columns with endColumnId\r\n const periodColumns = columns\r\n .filter((column) => column.type === \"date\" && column.endColumnId)\r\n .map((column) => ({\r\n id: `${String(column.id)}__period`,\r\n label: \"Period\",\r\n type: \"date\" as ColumnDataType,\r\n options: [],\r\n endColumnId: null,\r\n periodStartColumnId: String(column.id),\r\n periodEndColumnId: column.endColumnId,\r\n }));\r\n\r\n return [...baseColumns, ...periodColumns];\r\n }, [columns]);\r\n\r\n const groupableColumns = useMemo(\r\n () =>\r\n columns\r\n .filter((col) => col.groupable)\r\n .map((col) => ({ id: String(col.id), label: String(col.header) })),\r\n [columns]\r\n );\r\n\r\n const hasGrouping = grouping.length > 0;\r\n\r\n const [isFiltersOpen, setIsFiltersOpen] = useState(false);\r\n const [isColumnsOpen, setIsColumnsOpen] = useState(false);\r\n const [isGroupByOpen, setIsGroupByOpen] = useState(false);\r\n\r\n return (\r\n <>\r\n <div className=\"flex w-full flex-wrap items-center justify-between gap-2\">\r\n <div className=\"flex min-w-0 flex-1 items-center\">\r\n {showGlobalSearch ? (\r\n <Input\r\n size=\"sm\"\r\n className=\"max-w-xs\"\r\n placeholder=\"Search…\"\r\n value={q ?? \"\"}\r\n onValueChange={(v) => {\r\n setQ?.(v === \"\" ? null : v);\r\n }}\r\n startContent={<Search className=\"h-4 w-4 shrink-0 text-default-400\" aria-hidden />}\r\n aria-label=\"Search table\"\r\n />\r\n ) : null}\r\n </div>\r\n <div className=\"flex shrink-0 items-center gap-2\">\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isFiltersOpen}\r\n onOpenChange={setIsFiltersOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n Filters\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <TableFiltering\r\n columns={filterableColumns}\r\n onFiltersChange={onFiltersChange}\r\n filters={filters ?? []}\r\n onClose={() => setIsFiltersOpen(false)}\r\n singleFilter={singleFilter}\r\n filterMethods={filterMethods}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n {groupableColumns.length > 0 && (\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isGroupByOpen}\r\n onOpenChange={setIsGroupByOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant={hasGrouping ? \"secondary\" : \"outline\"} size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n {hasGrouping\r\n ? `Grouped by: ${grouping.map((id) => groupableColumns.find((c) => c.id === id)?.label ?? id).join(\" → \")}`\r\n : \"Group by\"}\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <TableGroupBy\r\n columns={groupableColumns}\r\n activeGrouping={grouping}\r\n onGroupingChange={(columnIds) => {\r\n setGrouping(columnIds);\r\n setExpanded({});\r\n setPagination?.({ pageIndex: 0, pageSize: limit });\r\n }}\r\n onClose={() => setIsGroupByOpen(false)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n )}\r\n <Popover\r\n placement=\"bottom\"\r\n isOpen={isColumnsOpen}\r\n onOpenChange={setIsColumnsOpen}\r\n portalContainer={document.body}\r\n >\r\n <PopoverTrigger>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <div className=\"flex items-center gap-2\">\r\n Columns\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </div>\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent>\r\n <ColumnOrderAndVisibility\r\n layout={layout}\r\n onChangeOrder={onChangeOrder}\r\n onChangeVisibility={onChangeVisibility}\r\n onClose={() => setIsColumnsOpen(false)}\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n </div>\r\n </div>\r\n <Table>\r\n <TableHeader>\r\n <TableRow>\r\n <TableHead>\r\n <Checkbox\r\n isSelected={table.getIsAllRowsSelected()}\r\n onValueChange={(checked) => {\r\n table.toggleAllRowsSelected(checked);\r\n }}\r\n />\r\n </TableHead>\r\n {table.getHeaderGroups()[0].headers.map((header) => (\r\n <TableHead\r\n onClick={\r\n header.column.getCanSort() ? header.column.getToggleSortingHandler() : undefined\r\n }\r\n key={header.id}\r\n >\r\n {flexRender(header.column.columnDef.header, header.getContext())}\r\n {header.column.getCanSort() && (\r\n <>\r\n {header.column.getIsSorted() === \"asc\" && (\r\n <ChevronUp className=\"h-4 w-4 inline ml-1\" />\r\n )}\r\n {header.column.getIsSorted() === \"desc\" && (\r\n <ChevronDown className=\"h-4 w-4 inline ml-1\" />\r\n )}\r\n </>\r\n )}\r\n </TableHead>\r\n ))}\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {table.getRowModel().rows.map((row) => {\r\n if (row.getIsGrouped()) {\r\n return (\r\n <TableRow\r\n key={row.id}\r\n className=\"bg-muted/40 font-medium cursor-pointer hover:bg-muted/60\"\r\n onClick={() => row.toggleExpanded()}\r\n >\r\n <TableCell />\r\n {row.getVisibleCells().map((cell) => {\r\n if (cell.getIsGrouped()) {\r\n return (\r\n <TableCell key={cell.id}>\r\n <span className=\"flex items-center gap-1.5\">\r\n {row.getIsExpanded() ? (\r\n <ChevronDown className=\"h-4 w-4 shrink-0\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 shrink-0\" />\r\n )}\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n <span className=\"text-muted-foreground font-normal ml-1\">\r\n ({row.subRows.length})\r\n </span>\r\n </span>\r\n </TableCell>\r\n );\r\n }\r\n if (cell.getIsAggregated()) {\r\n return (\r\n <TableCell key={cell.id}>\r\n {flexRender(\r\n cell.column.columnDef.aggregatedCell ?? cell.column.columnDef.cell,\r\n cell.getContext()\r\n )}\r\n </TableCell>\r\n );\r\n }\r\n return <TableCell key={cell.id} />;\r\n })}\r\n </TableRow>\r\n );\r\n }\r\n\r\n return (\r\n <TableRow key={row.id}>\r\n <TableCell>\r\n <Checkbox\r\n isSelected={row.getIsSelected()}\r\n onValueChange={(checked) => {\r\n row.toggleSelected(checked);\r\n }}\r\n />\r\n </TableCell>\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell key={cell.id}>\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n <TablePagination\r\n pageCount={\r\n isGrouped\r\n ? Math.ceil(table.getPrePaginationRowModel().rows.length / limit) || 1\r\n : serverPageCount\r\n }\r\n page={isGrouped ? table.getState().pagination.pageIndex + 1 : page}\r\n limit={limit}\r\n setPagination={setPagination}\r\n />\r\n </>\r\n );\r\n};\r\n"],"mappings":"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"}
@@ -2,9 +2,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../../_virtual/_rolldown/runtime.js");
3
3
  const require_src_components_ui_button = require("../../../components/ui/button.js");
4
4
  const require_src_modules_table_filterTransformers = require("../filterTransformers.js");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
5
6
  let react = require("react");
6
7
  let _heroui_react = require("@heroui/react");
7
- let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let lucide_react = require("lucide-react");
9
9
  let _internationalized_date = require("@internationalized/date");
10
10
  //#region src/modules/table/components/TableFiltering.tsx
@@ -1,8 +1,8 @@
1
1
  import { Button as Button$1 } from "../../../components/ui/button.mjs";
2
2
  import { transformFiltersFromHeroUI, transformFiltersToHeroUI } from "../filterTransformers.mjs";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
3
4
  import { useCallback, useEffect, useMemo, useState } from "react";
4
5
  import { DatePicker, DateRangePicker, Input, Select, SelectItem } from "@heroui/react";
5
- import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { PlusIcon, XIcon } from "lucide-react";
7
7
  import { getLocalTimeZone, today } from "@internationalized/date";
8
8
  //#region src/modules/table/components/TableFiltering.tsx
@@ -2,8 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../../_virtual/_rolldown/runtime.js");
3
3
  const require_src_lib_utils = require("../../../lib/utils.js");
4
4
  const require_src_components_ui_button = require("../../../components/ui/button.js");
5
- let react = require("react");
6
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
+ let react = require("react");
7
7
  //#region src/modules/table/components/TableGroupBy.tsx
8
8
  const TableGroupBy = ({ columns, activeGrouping, onGroupingChange, onClose }) => {
9
9
  const [selected, setSelected] = (0, react.useState)(activeGrouping);
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../../../lib/utils.mjs";
2
2
  import { Button } from "../../../components/ui/button.mjs";
3
- import { useState } from "react";
4
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useState } from "react";
5
5
  //#region src/modules/table/components/TableGroupBy.tsx
6
6
  const TableGroupBy = ({ columns, activeGrouping, onGroupingChange, onClose }) => {
7
7
  const [selected, setSelected] = useState(activeGrouping);
@@ -2,8 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../../../_virtual/_rolldown/runtime.js");
3
3
  const require_src_components_ui_input = require("../../../components/ui/input.js");
4
4
  const require_src_components_ui_pagination = require("../../../components/ui/pagination.js");
5
- let react = require("react");
6
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
+ let react = require("react");
7
7
  //#region src/modules/table/components/TablePagination.tsx
8
8
  const TablePagination = ({ pageCount, page = 1, limit = 10, setPagination }) => {
9
9
  const [inputValue, setInputValue] = (0, react.useState)(String(page));
@@ -1,7 +1,7 @@
1
1
  import { Input } from "../../../components/ui/input.mjs";
2
2
  import { Pagination, PaginationContent, PaginationNext, PaginationPrevious } from "../../../components/ui/pagination.mjs";
3
- import { useEffect, useState } from "react";
4
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useState } from "react";
5
5
  //#region src/modules/table/components/TablePagination.tsx
6
6
  const TablePagination = ({ pageCount, page = 1, limit = 10, setPagination }) => {
7
7
  const [inputValue, setInputValue] = useState(String(page));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m5kdev/web-ui",
3
- "version": "0.8.11",
3
+ "version": "0.9.1",
4
4
  "license": "GPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -67,8 +67,8 @@
67
67
  "zod": "4.2.1",
68
68
  "@tanstack/react-query": "5.83.0",
69
69
  "@trpc/tanstack-react-query": "11.4.3",
70
- "@m5kdev/frontend": "0.8.11",
71
- "@m5kdev/commons": "0.8.11"
70
+ "@m5kdev/commons": "0.9.1",
71
+ "@m5kdev/frontend": "0.9.1"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@tsdown/css": "0.21.7",
@@ -80,8 +80,8 @@
80
80
  "globals": "16.3.0",
81
81
  "tsdown": "0.21.7",
82
82
  "vite": "7.0.4",
83
- "@m5kdev/backend": "0.8.11",
84
- "@m5kdev/config": "0.8.11"
83
+ "@m5kdev/config": "0.9.1",
84
+ "@m5kdev/backend": "0.9.1"
85
85
  },
86
86
  "exports": {
87
87
  "./components/*": {