@rentnerkev/table 0.0.0-stage → 0.0.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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -2
  3. package/dist/index.d.ts +17 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +13 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/Messages/tableMessages.d.ts +4 -0
  8. package/dist/lib/Messages/tableMessages.d.ts.map +1 -0
  9. package/dist/lib/Messages/tableMessages.js +81 -0
  10. package/dist/lib/Messages/tableMessages.js.map +1 -0
  11. package/dist/lib/Table/filters.d.ts +20 -0
  12. package/dist/lib/Table/filters.d.ts.map +1 -0
  13. package/dist/lib/Table/filters.js +102 -0
  14. package/dist/lib/Table/filters.js.map +1 -0
  15. package/dist/lib/Table/presentation.d.ts +7 -0
  16. package/dist/lib/Table/presentation.d.ts.map +1 -0
  17. package/dist/lib/Table/presentation.js +63 -0
  18. package/dist/lib/Table/presentation.js.map +1 -0
  19. package/dist/lib/Table/table.d.ts +87 -0
  20. package/dist/lib/Table/table.d.ts.map +1 -0
  21. package/dist/lib/Table/table.js +28 -0
  22. package/dist/lib/Table/table.js.map +1 -0
  23. package/dist/shared/Table/Components/DataTable.d.ts +4 -0
  24. package/dist/shared/Table/Components/DataTable.d.ts.map +1 -0
  25. package/dist/shared/Table/Components/DataTable.js +13 -0
  26. package/dist/shared/Table/Components/DataTable.js.map +1 -0
  27. package/dist/shared/Table/Components/DataTablePagination.d.ts +4 -0
  28. package/dist/shared/Table/Components/DataTablePagination.d.ts.map +1 -0
  29. package/dist/shared/Table/Components/DataTablePagination.js +10 -0
  30. package/dist/shared/Table/Components/DataTablePagination.js.map +1 -0
  31. package/dist/shared/Table/Components/DataTableToolbar.d.ts +4 -0
  32. package/dist/shared/Table/Components/DataTableToolbar.d.ts.map +1 -0
  33. package/dist/shared/Table/Components/DataTableToolbar.js +19 -0
  34. package/dist/shared/Table/Components/DataTableToolbar.js.map +1 -0
  35. package/dist/shared/Table/Components/Table.d.ts +4 -0
  36. package/dist/shared/Table/Components/Table.d.ts.map +1 -0
  37. package/dist/shared/Table/Components/Table.js +17 -0
  38. package/dist/shared/Table/Components/Table.js.map +1 -0
  39. package/dist/shared/Table/Components/TableBody.d.ts +4 -0
  40. package/dist/shared/Table/Components/TableBody.d.ts.map +1 -0
  41. package/dist/shared/Table/Components/TableBody.js +17 -0
  42. package/dist/shared/Table/Components/TableBody.js.map +1 -0
  43. package/dist/shared/Table/Components/TableButton.d.ts +3 -0
  44. package/dist/shared/Table/Components/TableButton.d.ts.map +1 -0
  45. package/dist/shared/Table/Components/TableButton.js +5 -0
  46. package/dist/shared/Table/Components/TableButton.js.map +1 -0
  47. package/dist/shared/Table/Components/TableCheckbox.d.ts +3 -0
  48. package/dist/shared/Table/Components/TableCheckbox.d.ts.map +1 -0
  49. package/dist/shared/Table/Components/TableCheckbox.js +8 -0
  50. package/dist/shared/Table/Components/TableCheckbox.js.map +1 -0
  51. package/dist/shared/Table/Components/TableColumnFilter.d.ts +4 -0
  52. package/dist/shared/Table/Components/TableColumnFilter.d.ts.map +1 -0
  53. package/dist/shared/Table/Components/TableColumnFilter.js +23 -0
  54. package/dist/shared/Table/Components/TableColumnFilter.js.map +1 -0
  55. package/dist/shared/Table/Components/TableDateRangeFilter.d.ts +3 -0
  56. package/dist/shared/Table/Components/TableDateRangeFilter.d.ts.map +1 -0
  57. package/dist/shared/Table/Components/TableDateRangeFilter.js +15 -0
  58. package/dist/shared/Table/Components/TableDateRangeFilter.js.map +1 -0
  59. package/dist/shared/Table/Components/TableHead.d.ts +4 -0
  60. package/dist/shared/Table/Components/TableHead.d.ts.map +1 -0
  61. package/dist/shared/Table/Components/TableHead.js +11 -0
  62. package/dist/shared/Table/Components/TableHead.js.map +1 -0
  63. package/dist/shared/Table/Components/TableProvider.d.ts +3 -0
  64. package/dist/shared/Table/Components/TableProvider.d.ts.map +1 -0
  65. package/dist/shared/Table/Components/TableProvider.js +9 -0
  66. package/dist/shared/Table/Components/TableProvider.js.map +1 -0
  67. package/dist/shared/Table/Components/TableRowActions.d.ts +3 -0
  68. package/dist/shared/Table/Components/TableRowActions.d.ts.map +1 -0
  69. package/dist/shared/Table/Components/TableRowActions.js +9 -0
  70. package/dist/shared/Table/Components/TableRowActions.js.map +1 -0
  71. package/dist/shared/Table/Components/TableStatus.d.ts +3 -0
  72. package/dist/shared/Table/Components/TableStatus.d.ts.map +1 -0
  73. package/dist/shared/Table/Components/TableStatus.js +18 -0
  74. package/dist/shared/Table/Components/TableStatus.js.map +1 -0
  75. package/dist/shared/Table/Components/TableSurface.d.ts +4 -0
  76. package/dist/shared/Table/Components/TableSurface.d.ts.map +1 -0
  77. package/dist/shared/Table/Components/TableSurface.js +11 -0
  78. package/dist/shared/Table/Components/TableSurface.js.map +1 -0
  79. package/dist/shared/Table/Hooks/useDataTableLogic.d.ts +4 -0
  80. package/dist/shared/Table/Hooks/useDataTableLogic.d.ts.map +1 -0
  81. package/dist/shared/Table/Hooks/useDataTableLogic.js +182 -0
  82. package/dist/shared/Table/Hooks/useDataTableLogic.js.map +1 -0
  83. package/dist/shared/Table/Hooks/useTableCheckboxLogic.d.ts +3 -0
  84. package/dist/shared/Table/Hooks/useTableCheckboxLogic.d.ts.map +1 -0
  85. package/dist/shared/Table/Hooks/useTableCheckboxLogic.js +10 -0
  86. package/dist/shared/Table/Hooks/useTableCheckboxLogic.js.map +1 -0
  87. package/dist/shared/Table/Hooks/useTableLogic.d.ts +4 -0
  88. package/dist/shared/Table/Hooks/useTableLogic.d.ts.map +1 -0
  89. package/dist/shared/Table/Hooks/useTableLogic.js +21 -0
  90. package/dist/shared/Table/Hooks/useTableLogic.js.map +1 -0
  91. package/dist/shared/Table/Hooks/useTableOverlay.d.ts +3 -0
  92. package/dist/shared/Table/Hooks/useTableOverlay.d.ts.map +1 -0
  93. package/dist/shared/Table/Hooks/useTableOverlay.js +6 -0
  94. package/dist/shared/Table/Hooks/useTableOverlay.js.map +1 -0
  95. package/dist/shared/Table/Types/column.types.d.ts +35 -0
  96. package/dist/shared/Table/Types/column.types.d.ts.map +1 -0
  97. package/dist/shared/Table/Types/column.types.js +2 -0
  98. package/dist/shared/Table/Types/column.types.js.map +1 -0
  99. package/dist/shared/Table/Types/dataTable.types.d.ts +197 -0
  100. package/dist/shared/Table/Types/dataTable.types.d.ts.map +1 -0
  101. package/dist/shared/Table/Types/dataTable.types.js +2 -0
  102. package/dist/shared/Table/Types/dataTable.types.js.map +1 -0
  103. package/dist/shared/Table/Types/table.types.d.ts +77 -0
  104. package/dist/shared/Table/Types/table.types.d.ts.map +1 -0
  105. package/dist/shared/Table/Types/table.types.js +2 -0
  106. package/dist/shared/Table/Types/table.types.js.map +1 -0
  107. package/dist/types.d.ts +5 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +2 -0
  110. package/dist/types.js.map +1 -0
  111. package/docs/usage.md +130 -0
  112. package/package.json +109 -5
  113. package/tailwind.css +7 -0
  114. package/theme.css +40 -0
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { MenuProvider } from '@rentnerkev/menu/provider';
4
+ import { SelectProvider } from '@rentnerkev/select';
5
+ import { TableOverlayContext } from '../Hooks/useTableOverlay.js';
6
+ export function TableProvider({ children, portalContainer, }) {
7
+ return (_jsx(TableOverlayContext.Provider, { value: portalContainer, children: _jsx(MenuProvider, { portalContainer: portalContainer, children: _jsx(SelectProvider, { portalContainer: portalContainer, children: children }) }) }));
8
+ }
9
+ //# sourceMappingURL=TableProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableProvider.js","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGjE,MAAM,UAAU,aAAa,CAAC,EAC1B,QAAQ,EACR,eAAe,GACE;IACjB,OAAO,CACH,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,eAAe,YAChD,KAAC,YAAY,IAAC,eAAe,EAAE,eAAe,YAC1C,KAAC,cAAc,IAAC,eAAe,EAAE,eAAe,YAC3C,QAAQ,GACI,GACN,GACY,CAClC,CAAA;AACL,CAAC","sourcesContent":["'use client'\n\nimport { MenuProvider } from '@rentnerkev/menu/provider'\nimport { SelectProvider } from '@rentnerkev/select'\nimport { TableOverlayContext } from '../Hooks/useTableOverlay.ts'\nimport type { TableProviderProps } from '../Types/dataTable.types.ts'\n\nexport function TableProvider({\n children,\n portalContainer,\n}: TableProviderProps) {\n return (\n <TableOverlayContext.Provider value={portalContainer}>\n <MenuProvider portalContainer={portalContainer}>\n <SelectProvider portalContainer={portalContainer}>\n {children}\n </SelectProvider>\n </MenuProvider>\n </TableOverlayContext.Provider>\n )\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { TableRowActionsProps } from '../Types/dataTable.types.ts';
2
+ export declare function TableRowActions({ label, items, disabled, }: TableRowActionsProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=TableRowActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableRowActions.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableRowActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,wBAAgB,eAAe,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,QAAQ,GACX,EAAE,oBAAoB,+BAmBtB"}
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Menu } from '@rentnerkev/menu/menu';
4
+ import { Ellipsis } from 'lucide-react';
5
+ import { TableButton } from './TableButton.js';
6
+ export function TableRowActions({ label, items, disabled, }) {
7
+ return (_jsx(Menu, { ariaLabel: label, items: items, disabled: disabled, controlSize: "sm", align: "end", asChild: true, trigger: _jsx(TableButton, { iconOnly: true, className: "border-transparent bg-transparent", children: _jsx(Ellipsis, { "aria-hidden": "true", className: "size-4" }) }) }));
8
+ }
9
+ //# sourceMappingURL=TableRowActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableRowActions.js","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableRowActions.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAmB,CAAA;AAG/C,MAAM,UAAU,eAAe,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,QAAQ,GACW;IACnB,OAAO,CACH,KAAC,IAAI,IACD,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,IAAI,EAChB,KAAK,EAAC,KAAK,EACX,OAAO,QACP,OAAO,EACH,KAAC,WAAW,IACR,QAAQ,QACR,SAAS,EAAC,mCAAmC,YAE7C,KAAC,QAAQ,mBAAa,MAAM,EAAC,SAAS,EAAC,QAAQ,GAAG,GACxC,GAEpB,CACL,CAAA;AACL,CAAC","sourcesContent":["'use client'\n\nimport { Menu } from '@rentnerkev/menu/menu'\nimport { Ellipsis } from 'lucide-react'\nimport { TableButton } from './TableButton.tsx'\nimport type { TableRowActionsProps } from '../Types/dataTable.types.ts'\n\nexport function TableRowActions({\n label,\n items,\n disabled,\n}: TableRowActionsProps) {\n return (\n <Menu\n ariaLabel={label}\n items={items}\n disabled={disabled}\n controlSize=\"sm\"\n align=\"end\"\n asChild\n trigger={\n <TableButton\n iconOnly\n className=\"border-transparent bg-transparent\"\n >\n <Ellipsis aria-hidden=\"true\" className=\"size-4\" />\n </TableButton>\n }\n />\n )\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { TableStatusProps } from '../Types/dataTable.types.ts';
2
+ export declare function TableStatus({ view, isLoading, loadingState, emptyState, noResultsState, hasFilters, error, onRetry, onResetFilters, detailedStates, }: TableStatusProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=TableStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableStatus.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableStatus.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,wBAAgB,WAAW,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACjB,EAAE,gBAAgB,+BA2FlB"}
@@ -0,0 +1,18 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Inbox, RefreshCw, SearchX, TriangleAlert } from 'lucide-react';
3
+ import { TableButton } from './TableButton.js';
4
+ export function TableStatus({ view, isLoading, loadingState, emptyState, noResultsState, hasFilters, error, onRetry, onResetFilters, detailedStates, }) {
5
+ return (_jsx("tbody", { children: _jsx("tr", { children: _jsxs("td", { colSpan: view.columnCount, className: "px-5 py-14 text-center text-rentner-muted", children: [error != null && error !== false ? (_jsxs("div", { role: "alert", className: "flex flex-col items-center gap-3", children: [_jsx(TriangleAlert, { "aria-hidden": "true", className: "size-8 text-rentner-danger" }), _jsx("p", { className: "font-medium text-rentner-foreground", children: error === true ? view.messages.error : error }), onRetry && (_jsxs(TableButton, { onClick: onRetry, children: [_jsx(RefreshCw, { "aria-hidden": "true", className: "size-4" }), view.messages.retry] }))] })) : (_jsx("output", { className: "inline-flex flex-col items-center gap-3", children: isLoading ? (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { "aria-hidden": "true", className: "size-7 motion-safe:animate-spin text-rentner-accent" }), _jsx("span", { children: loadingState ?? view.messages.loading })] })) : !detailedStates ? ((emptyState ?? view.messages.empty)) : (((hasFilters ? noResultsState : emptyState) ?? (_jsxs(_Fragment, { children: [hasFilters ? (_jsx(SearchX, { "aria-hidden": "true", className: "size-8" })) : (_jsx(Inbox, { "aria-hidden": "true", className: "size-8" })), _jsx("span", { className: "font-medium text-rentner-foreground", children: hasFilters
6
+ ? (noResultsState ??
7
+ view.messages.noResults)
8
+ : (emptyState ??
9
+ view.messages.empty) }), _jsx("span", { className: "text-sm", children: hasFilters
10
+ ? view.messages
11
+ .noResultsDescription
12
+ : view.messages
13
+ .emptyDescription })] })))) })), !isLoading &&
14
+ (error == null || error === false) &&
15
+ hasFilters &&
16
+ onResetFilters && (_jsx("div", { className: "mt-4", children: _jsx(TableButton, { onClick: onResetFilters, children: view.messages.resetFilters }) }))] }) }) }));
17
+ }
18
+ //# sourceMappingURL=TableStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableStatus.js","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableStatus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAmB,CAAA;AAG/C,MAAM,UAAU,WAAW,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACC;IACf,OAAO,CACH,0BACI,uBACI,cACI,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,SAAS,EAAC,2CAA2C,aAEpD,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAChC,eACI,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,kCAAkC,aAE5C,KAAC,aAAa,mBACE,MAAM,EAClB,SAAS,EAAC,4BAA4B,GACxC,EACF,YAAG,SAAS,EAAC,qCAAqC,YAC7C,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAC7C,EACH,OAAO,IAAI,CACR,MAAC,WAAW,IAAC,OAAO,EAAE,OAAO,aACzB,KAAC,SAAS,mBACM,MAAM,EAClB,SAAS,EAAC,QAAQ,GACpB,EACD,IAAI,CAAC,QAAQ,CAAC,KAAK,IACV,CACjB,IACC,CACT,CAAC,CAAC,CAAC,CACA,iBAAQ,SAAS,EAAC,yCAAyC,YACtD,SAAS,CAAC,CAAC,CAAC,CACT,8BACI,KAAC,SAAS,mBACM,MAAM,EAClB,SAAS,EAAC,qDAAqD,GACjE,EACF,yBACK,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,GACnC,IACR,CACN,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAClB,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtC,CAAC,CAAC,CAAC,CACA,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAC3C,8BACK,UAAU,CAAC,CAAC,CAAC,CACV,KAAC,OAAO,mBACQ,MAAM,EAClB,SAAS,EAAC,QAAQ,GACpB,CACL,CAAC,CAAC,CAAC,CACA,KAAC,KAAK,mBACU,MAAM,EAClB,SAAS,EAAC,QAAQ,GACpB,CACL,EACD,eAAM,SAAS,EAAC,qCAAqC,YAChD,UAAU;wCACP,CAAC,CAAC,CAAC,cAAc;4CACf,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;wCAC1B,CAAC,CAAC,CAAC,UAAU;4CACX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GACvB,EACP,eAAM,SAAS,EAAC,SAAS,YACpB,UAAU;wCACP,CAAC,CAAC,IAAI,CAAC,QAAQ;6CACR,oBAAoB;wCAC3B,CAAC,CAAC,IAAI,CAAC,QAAQ;6CACR,gBAAgB,GACxB,IACR,CACN,CAAC,CACL,GACI,CACZ,EACA,CAAC,SAAS;wBACP,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;wBAClC,UAAU;wBACV,cAAc,IAAI,CACd,cAAK,SAAS,EAAC,MAAM,YACjB,KAAC,WAAW,IAAC,OAAO,EAAE,cAAc,YAC/B,IAAI,CAAC,QAAQ,CAAC,YAAY,GACjB,GACZ,CACT,IACJ,GACJ,GACD,CACX,CAAA;AACL,CAAC","sourcesContent":["import { Inbox, RefreshCw, SearchX, TriangleAlert } from 'lucide-react'\nimport { TableButton } from './TableButton.tsx'\nimport type { TableStatusProps } from '../Types/dataTable.types.ts'\n\nexport function TableStatus({\n view,\n isLoading,\n loadingState,\n emptyState,\n noResultsState,\n hasFilters,\n error,\n onRetry,\n onResetFilters,\n detailedStates,\n}: TableStatusProps) {\n return (\n <tbody>\n <tr>\n <td\n colSpan={view.columnCount}\n className=\"px-5 py-14 text-center text-rentner-muted\"\n >\n {error != null && error !== false ? (\n <div\n role=\"alert\"\n className=\"flex flex-col items-center gap-3\"\n >\n <TriangleAlert\n aria-hidden=\"true\"\n className=\"size-8 text-rentner-danger\"\n />\n <p className=\"font-medium text-rentner-foreground\">\n {error === true ? view.messages.error : error}\n </p>\n {onRetry && (\n <TableButton onClick={onRetry}>\n <RefreshCw\n aria-hidden=\"true\"\n className=\"size-4\"\n />\n {view.messages.retry}\n </TableButton>\n )}\n </div>\n ) : (\n <output className=\"inline-flex flex-col items-center gap-3\">\n {isLoading ? (\n <>\n <RefreshCw\n aria-hidden=\"true\"\n className=\"size-7 motion-safe:animate-spin text-rentner-accent\"\n />\n <span>\n {loadingState ?? view.messages.loading}\n </span>\n </>\n ) : !detailedStates ? (\n (emptyState ?? view.messages.empty)\n ) : (\n ((hasFilters ? noResultsState : emptyState) ?? (\n <>\n {hasFilters ? (\n <SearchX\n aria-hidden=\"true\"\n className=\"size-8\"\n />\n ) : (\n <Inbox\n aria-hidden=\"true\"\n className=\"size-8\"\n />\n )}\n <span className=\"font-medium text-rentner-foreground\">\n {hasFilters\n ? (noResultsState ??\n view.messages.noResults)\n : (emptyState ??\n view.messages.empty)}\n </span>\n <span className=\"text-sm\">\n {hasFilters\n ? view.messages\n .noResultsDescription\n : view.messages\n .emptyDescription}\n </span>\n </>\n ))\n )}\n </output>\n )}\n {!isLoading &&\n (error == null || error === false) &&\n hasFilters &&\n onResetFilters && (\n <div className=\"mt-4\">\n <TableButton onClick={onResetFilters}>\n {view.messages.resetFilters}\n </TableButton>\n </div>\n )}\n </td>\n </tr>\n </tbody>\n )\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { RowData } from '@tanstack/react-table';
2
+ import type { TableSurfaceProps } from '../Types/dataTable.types.ts';
3
+ export declare function TableSurface<TData extends RowData>({ table, view, caption, size, striped, isLoading, emptyState, loadingState, noResultsState, hasFilters, error, onRetry, onResetFilters, containerClassName, embedded, stickyHeader, classNames, rowClassName, selection, onSelectPage, getRowLabel, renderExpandedRow, detailsId, filters, detailedStates, className, ref, ...tableProps }: TableSurfaceProps<TData>): import("react").JSX.Element;
4
+ //# sourceMappingURL=TableSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableSurface.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableSurface.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,wBAAgB,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAChD,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAW,EACX,OAAe,EACf,SAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,kBAAuB,EACvB,QAAgB,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,cAAc,EACd,SAAc,EACd,GAAG,EACH,GAAG,UAAU,EAChB,EAAE,iBAAiB,CAAC,KAAK,CAAC,+BA8D1B"}
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { TableHead } from './TableHead.js';
4
+ import { TableBody } from './TableBody.js';
5
+ import { TableStatus } from './TableStatus.js';
6
+ export function TableSurface({ table, view, caption, size = 'md', striped = false, isLoading = false, emptyState, loadingState, noResultsState, hasFilters, error, onRetry, onResetFilters, containerClassName = '', embedded = false, stickyHeader, classNames, rowClassName, selection, onSelectPage, getRowLabel, renderExpandedRow, detailsId, filters, detailedStates, className = '', ref, ...tableProps }) {
7
+ return (_jsx("div", { "data-rentner-table-container": "", className: `relative w-full overflow-auto ${embedded ? '' : 'rounded-rentner-control border border-rentner-border bg-rentner-surface'} ${classNames?.viewport ?? ''} ${containerClassName}`, children: _jsxs("table", { ...tableProps, ref: ref, "aria-busy": isLoading || tableProps['aria-busy'], "data-rentner-table": "", "data-size": size, "data-striped": striped, className: `group/table w-full border-collapse text-left text-sm text-rentner-foreground data-[size=sm]:text-xs data-[size=lg]:text-base data-[striped=true]:[&_tbody_tr:nth-child(even)]:bg-rentner-control/25 ${classNames?.table ?? ''} ${className}`, children: [caption != null && (_jsx("caption", { className: "border-b border-rentner-border px-4 py-3 text-left font-medium text-rentner-muted", children: caption })), _jsx(TableHead, { table: table, view: view, selection: selection, onSelectPage: onSelectPage, renderExpandedRow: renderExpandedRow, isLoading: isLoading, filters: filters, classNames: classNames, stickyHeader: stickyHeader }), (error != null && error !== false) ||
8
+ isLoading ||
9
+ view.rows.length === 0 ? (_jsx(TableStatus, { view: view, isLoading: isLoading, loadingState: loadingState, emptyState: emptyState, noResultsState: noResultsState, hasFilters: hasFilters, error: error, onRetry: onRetry, onResetFilters: onResetFilters, detailedStates: detailedStates })) : (_jsx(TableBody, { table: table, view: view, selection: selection, renderExpandedRow: renderExpandedRow, getRowLabel: getRowLabel, detailsId: detailsId, classNames: classNames, rowClassName: rowClassName, isLoading: isLoading }))] }) }));
10
+ }
11
+ //# sourceMappingURL=TableSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableSurface.js","sourceRoot":"","sources":["../../../../src/shared/Table/Components/TableSurface.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAmB,CAAA;AAG/C,MAAM,UAAU,YAAY,CAAwB,EAChD,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,KAAK,EACf,SAAS,GAAG,KAAK,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,GAAG,EAAE,EACvB,QAAQ,GAAG,KAAK,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,cAAc,EACd,SAAS,GAAG,EAAE,EACd,GAAG,EACH,GAAG,UAAU,EACU;IACvB,OAAO,CACH,8CACiC,EAAE,EAC/B,SAAS,EAAE,iCAAiC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yEAAyE,IAAI,UAAU,EAAE,QAAQ,IAAI,EAAE,IAAI,kBAAkB,EAAE,YAE3L,oBACQ,UAAU,EACd,GAAG,EAAE,GAAG,eACG,SAAS,IAAI,UAAU,CAAC,WAAW,CAAC,wBAC5B,EAAE,eACV,IAAI,kBACD,OAAO,EACrB,SAAS,EAAE,uMAAuM,UAAU,EAAE,KAAK,IAAI,EAAE,IAAI,SAAS,EAAE,aAEvP,OAAO,IAAI,IAAI,IAAI,CAChB,kBAAS,SAAS,EAAC,mFAAmF,YACjG,OAAO,GACF,CACb,EACD,KAAC,SAAS,IACN,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,GAC5B,EACD,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;oBACnC,SAAS;oBACT,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,WAAW,IACR,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAChC,CACL,CAAC,CAAC,CAAC,CACA,KAAC,SAAS,IACN,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,GACtB,CACL,IACG,GACN,CACT,CAAA;AACL,CAAC","sourcesContent":["'use client'\n\nimport type { RowData } from '@tanstack/react-table'\nimport { TableHead } from './TableHead.tsx'\nimport { TableBody } from './TableBody.tsx'\nimport { TableStatus } from './TableStatus.tsx'\nimport type { TableSurfaceProps } from '../Types/dataTable.types.ts'\n\nexport function TableSurface<TData extends RowData>({\n table,\n view,\n caption,\n size = 'md',\n striped = false,\n isLoading = false,\n emptyState,\n loadingState,\n noResultsState,\n hasFilters,\n error,\n onRetry,\n onResetFilters,\n containerClassName = '',\n embedded = false,\n stickyHeader,\n classNames,\n rowClassName,\n selection,\n onSelectPage,\n getRowLabel,\n renderExpandedRow,\n detailsId,\n filters,\n detailedStates,\n className = '',\n ref,\n ...tableProps\n}: TableSurfaceProps<TData>) {\n return (\n <div\n data-rentner-table-container=\"\"\n className={`relative w-full overflow-auto ${embedded ? '' : 'rounded-rentner-control border border-rentner-border bg-rentner-surface'} ${classNames?.viewport ?? ''} ${containerClassName}`}\n >\n <table\n {...tableProps}\n ref={ref}\n aria-busy={isLoading || tableProps['aria-busy']}\n data-rentner-table=\"\"\n data-size={size}\n data-striped={striped}\n className={`group/table w-full border-collapse text-left text-sm text-rentner-foreground data-[size=sm]:text-xs data-[size=lg]:text-base data-[striped=true]:[&_tbody_tr:nth-child(even)]:bg-rentner-control/25 ${classNames?.table ?? ''} ${className}`}\n >\n {caption != null && (\n <caption className=\"border-b border-rentner-border px-4 py-3 text-left font-medium text-rentner-muted\">\n {caption}\n </caption>\n )}\n <TableHead\n table={table}\n view={view}\n selection={selection}\n onSelectPage={onSelectPage}\n renderExpandedRow={renderExpandedRow}\n isLoading={isLoading}\n filters={filters}\n classNames={classNames}\n stickyHeader={stickyHeader}\n />\n {(error != null && error !== false) ||\n isLoading ||\n view.rows.length === 0 ? (\n <TableStatus\n view={view}\n isLoading={isLoading}\n loadingState={loadingState}\n emptyState={emptyState}\n noResultsState={noResultsState}\n hasFilters={hasFilters}\n error={error}\n onRetry={onRetry}\n onResetFilters={onResetFilters}\n detailedStates={detailedStates}\n />\n ) : (\n <TableBody\n table={table}\n view={view}\n selection={selection}\n renderExpandedRow={renderExpandedRow}\n getRowLabel={getRowLabel}\n detailsId={detailsId}\n classNames={classNames}\n rowClassName={rowClassName}\n isLoading={isLoading}\n />\n )}\n </table>\n </div>\n )\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { RowData } from '@tanstack/react-table';
2
+ import type { DataTableLogicOptions, DataTableLogicResult } from '../Types/dataTable.types.ts';
3
+ export declare function useDataTableLogic<TData extends RowData>({ data, columns, getRowId, locale, messages: overrides, pagination, pageSize, pageSizeOptions, selectable, renderExpandedRow, initialShowFilters, tableOptions, portalContainer, }: DataTableLogicOptions<TData>): DataTableLogicResult<TData>;
4
+ //# sourceMappingURL=useDataTableLogic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableLogic.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useDataTableLogic.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AASpD,OAAO,KAAK,EACR,qBAAqB,EACrB,oBAAoB,EACvB,MAAM,6BAA6B,CAAA;AAIpC,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,OAAO,EAAE,EACrD,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,MAAa,EACb,QAAQ,EAAE,SAAS,EACnB,UAAiB,EACjB,QAAa,EACb,eAAkC,EAClC,UAAkB,EAClB,iBAAiB,EACjB,kBAA0B,EAC1B,YAAY,EACZ,eAAe,GAClB,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CA4N5D"}
@@ -0,0 +1,182 @@
1
+ 'use client';
2
+ import { useCallback, useEffect, useId, useMemo, useState } from 'react';
3
+ import { useTable } from '@tanstack/react-table';
4
+ import { rentnerTableFeatures } from '../../../lib/Table/table.js';
5
+ import { getColumnLabel, getTableView, prepareTableColumns, } from '../../../lib/Table/presentation.js';
6
+ import { resolveTableMessages } from '../../../lib/Messages/tableMessages.js';
7
+ const defaultPageSizes = [10, 25, 50, 100];
8
+ export function useDataTableLogic({ data, columns, getRowId, locale = 'en', messages: overrides, pagination = true, pageSize = 10, pageSizeOptions = defaultPageSizes, selectable = false, renderExpandedRow, initialShowFilters = false, tableOptions, portalContainer, }) {
9
+ const id = useId();
10
+ const [showFilters, setShowFilters] = useState(initialShowFilters);
11
+ const [root, setRoot] = useState(null);
12
+ const messages = useMemo(() => resolveTableMessages(locale, overrides), [locale, overrides]);
13
+ const preparedColumns = useMemo(() => prepareTableColumns(columns), [columns]);
14
+ const manualPagination = !pagination || tableOptions?.manualPagination === true;
15
+ const table = useTable({
16
+ globalFilterFn: 'text',
17
+ autoResetPageIndex: false,
18
+ ...tableOptions,
19
+ features: rentnerTableFeatures,
20
+ data,
21
+ columns: preparedColumns,
22
+ getRowId,
23
+ enableRowSelection: selectable,
24
+ getRowCanExpand: tableOptions?.getRowCanExpand ?? (() => Boolean(renderExpandedRow)),
25
+ manualPagination,
26
+ initialState: {
27
+ ...tableOptions?.initialState,
28
+ pagination: {
29
+ pageIndex: 0,
30
+ pageSize,
31
+ ...tableOptions?.initialState?.pagination,
32
+ },
33
+ },
34
+ });
35
+ const currentPageSize = table.state.pagination.pageSize;
36
+ const pageIndex = table.state.pagination.pageIndex;
37
+ const pageCount = table.getPageCount();
38
+ const setPageIndex = table.setPageIndex;
39
+ const firstPage = table.firstPage;
40
+ const { sorting, columnFilters, globalFilter, pagination: paginationState, } = table.atoms;
41
+ const resetOnQueryChange = tableOptions?.autoResetPageIndex !== false;
42
+ const resetPageIfNeeded = useCallback(() => {
43
+ if (pagination && paginationState.get().pageIndex > 0)
44
+ firstPage();
45
+ }, [pagination, paginationState, firstPage]);
46
+ useEffect(() => {
47
+ if (!pagination || !resetOnQueryChange)
48
+ return;
49
+ let previousSorting = sorting.get();
50
+ let previousFilters = columnFilters.get();
51
+ let previousSearch = globalFilter.get();
52
+ const handleQueryChange = () => {
53
+ const nextSorting = sorting.get();
54
+ const nextFilters = columnFilters.get();
55
+ const nextSearch = globalFilter.get();
56
+ const sameSorting = previousSorting.length === nextSorting.length &&
57
+ previousSorting.every((item, index) => item.id === nextSorting[index]?.id &&
58
+ item.desc === nextSorting[index]?.desc);
59
+ const sameFilters = previousFilters.length === nextFilters.length &&
60
+ previousFilters.every((item, index) => item.id === nextFilters[index]?.id &&
61
+ Object.is(item.value, nextFilters[index]?.value));
62
+ const sameSearch = Object.is(previousSearch, nextSearch);
63
+ previousSorting = nextSorting;
64
+ previousFilters = nextFilters;
65
+ previousSearch = nextSearch;
66
+ // Derived atoms can notify on option updates without a query change.
67
+ if (!sameSorting || !sameFilters || !sameSearch)
68
+ resetPageIfNeeded();
69
+ };
70
+ const subscriptions = [sorting, columnFilters, globalFilter].map((atom) => atom.subscribe(handleQueryChange));
71
+ return () => {
72
+ for (const subscription of subscriptions)
73
+ subscription.unsubscribe();
74
+ };
75
+ }, [
76
+ pagination,
77
+ resetOnQueryChange,
78
+ sorting,
79
+ columnFilters,
80
+ globalFilter,
81
+ resetPageIfNeeded,
82
+ ]);
83
+ useEffect(() => {
84
+ if (!manualPagination && pageIndex > Math.max(0, pageCount - 1))
85
+ setPageIndex(Math.max(0, pageCount - 1));
86
+ }, [manualPagination, pageCount, pageIndex, setPageIndex]);
87
+ const allColumns = table.getAllLeafColumns();
88
+ const visibleColumns = table.getVisibleLeafColumns();
89
+ const canHideColumns = tableOptions?.enableHiding !== false;
90
+ const columnItems = useMemo(() => allColumns.map((column) => ({
91
+ id: column.id,
92
+ type: 'checkbox',
93
+ label: getColumnLabel(column),
94
+ checked: column.getIsVisible(),
95
+ closeOnSelect: false,
96
+ disabled: !canHideColumns ||
97
+ !column.getCanHide() ||
98
+ (column.getIsVisible() && visibleColumns.length === 1),
99
+ onCheckedChange: (checked) => column.toggleVisibility(checked),
100
+ })), [allColumns, visibleColumns, canHideColumns]);
101
+ const pageSizes = useMemo(() => [...new Set([...pageSizeOptions, currentPageSize])]
102
+ .toSorted((left, right) => left - right)
103
+ .map((value) => ({ value, label: String(value) })), [pageSizeOptions, currentPageSize]);
104
+ if (!Number.isInteger(currentPageSize) ||
105
+ currentPageSize < 1 ||
106
+ pageSizeOptions.some((size) => !Number.isInteger(size) || size < 1))
107
+ throw new Error('Table page sizes must be positive integers');
108
+ const search = typeof table.state.globalFilter === 'string'
109
+ ? table.state.globalFilter
110
+ : '';
111
+ const selectionEnabled = selectable !== false;
112
+ const selectedRows = selectionEnabled
113
+ ? table.getFilteredSelectedRowModel().rows
114
+ : [];
115
+ const view = getTableView(table, messages, Number(selectionEnabled) + Number(Boolean(renderExpandedRow)));
116
+ const totalRows = tableOptions?.manualPagination
117
+ ? (tableOptions.rowCount ?? null)
118
+ : table.getRowCount();
119
+ const firstRow = view.rows.length > 0
120
+ ? (pagination ? pageIndex * currentPageSize : 0) + 1
121
+ : 0;
122
+ const lastRow = view.rows.length > 0 ? firstRow + view.rows.length - 1 : 0;
123
+ const handleResetFilters = () => {
124
+ table.setGlobalFilter('');
125
+ table.setColumnFilters([]);
126
+ resetPageIfNeeded();
127
+ };
128
+ const handleSearch = (value) => {
129
+ const previous = globalFilter.get();
130
+ table.setGlobalFilter(value);
131
+ if (resetOnQueryChange && !Object.is(previous, value))
132
+ resetPageIfNeeded();
133
+ };
134
+ const handlePageSize = (value) => {
135
+ table.setPageSize(value);
136
+ resetPageIfNeeded();
137
+ };
138
+ return {
139
+ table,
140
+ state: {
141
+ ...view,
142
+ id,
143
+ search,
144
+ showFilters,
145
+ hasFilters: search.trim().length > 0 ||
146
+ table.state.columnFilters.length > 0,
147
+ filterCount: table.state.columnFilters.length,
148
+ filterColumns: visibleColumns,
149
+ columnItems,
150
+ selectedRows,
151
+ selectionCount: selectedRows.length,
152
+ selectionEnabled,
153
+ canSelectPage: selectionEnabled && view.rows.some((row) => row.getCanSelect()),
154
+ allPageSelected: selectionEnabled && table.getIsAllPageRowsSelected(),
155
+ somePageSelected: selectionEnabled && table.getIsSomePageRowsSelected(),
156
+ firstRow,
157
+ lastRow: totalRows === null ? lastRow : Math.min(lastRow, totalRows),
158
+ totalRows,
159
+ totalPages: pageCount < 0 ? null : Math.max(1, pageCount),
160
+ page: pageIndex + 1,
161
+ pageSize: currentPageSize,
162
+ pageSizes,
163
+ canPreviousPage: table.getCanPreviousPage(),
164
+ canNextPage: table.getCanNextPage(),
165
+ portalContainer: portalContainer === undefined ? root : portalContainer,
166
+ },
167
+ handler: {
168
+ handleSearch,
169
+ handleResetFilters,
170
+ handlePageSize,
171
+ handleToggleFilters: () => setShowFilters((current) => !current),
172
+ handleClearSelection: () => table.resetRowSelection(true),
173
+ handleSelectPage: () => table.toggleAllPageRowsSelected(!table.getIsAllPageRowsSelected()),
174
+ handleFirstPage: table.firstPage,
175
+ handlePreviousPage: table.previousPage,
176
+ handleNextPage: table.nextPage,
177
+ handleLastPage: table.lastPage,
178
+ },
179
+ refs: { root: setRoot },
180
+ };
181
+ }
182
+ //# sourceMappingURL=useDataTableLogic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableLogic.js","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useDataTableLogic.ts"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport { useCallback, useEffect, useId, useMemo, useState } from 'react'\nimport { useTable } from '@tanstack/react-table'\nimport type { RowData } from '@tanstack/react-table'\nimport type { MenuItem } from '@rentnerkev/menu'\nimport { rentnerTableFeatures } from '../../../lib/Table/table.ts'\nimport {\n getColumnLabel,\n getTableView,\n prepareTableColumns,\n} from '../../../lib/Table/presentation.ts'\nimport { resolveTableMessages } from '../../../lib/Messages/tableMessages.ts'\nimport type {\n DataTableLogicOptions,\n DataTableLogicResult,\n} from '../Types/dataTable.types.ts'\n\nconst defaultPageSizes = [10, 25, 50, 100] as const\n\nexport function useDataTableLogic<TData extends RowData>({\n data,\n columns,\n getRowId,\n locale = 'en',\n messages: overrides,\n pagination = true,\n pageSize = 10,\n pageSizeOptions = defaultPageSizes,\n selectable = false,\n renderExpandedRow,\n initialShowFilters = false,\n tableOptions,\n portalContainer,\n}: DataTableLogicOptions<TData>): DataTableLogicResult<TData> {\n const id = useId()\n const [showFilters, setShowFilters] = useState(initialShowFilters)\n const [root, setRoot] = useState<HTMLElement | null>(null)\n const messages = useMemo(\n () => resolveTableMessages(locale, overrides),\n [locale, overrides],\n )\n const preparedColumns = useMemo(\n () => prepareTableColumns(columns),\n [columns],\n )\n const manualPagination =\n !pagination || tableOptions?.manualPagination === true\n const table = useTable({\n globalFilterFn: 'text',\n autoResetPageIndex: false,\n ...tableOptions,\n features: rentnerTableFeatures,\n data,\n columns: preparedColumns,\n getRowId,\n enableRowSelection: selectable,\n getRowCanExpand:\n tableOptions?.getRowCanExpand ?? (() => Boolean(renderExpandedRow)),\n manualPagination,\n initialState: {\n ...tableOptions?.initialState,\n pagination: {\n pageIndex: 0,\n pageSize,\n ...tableOptions?.initialState?.pagination,\n },\n },\n })\n const currentPageSize = table.state.pagination.pageSize\n const pageIndex = table.state.pagination.pageIndex\n const pageCount = table.getPageCount()\n const setPageIndex = table.setPageIndex\n const firstPage = table.firstPage\n const {\n sorting,\n columnFilters,\n globalFilter,\n pagination: paginationState,\n } = table.atoms\n const resetOnQueryChange = tableOptions?.autoResetPageIndex !== false\n const resetPageIfNeeded = useCallback(() => {\n if (pagination && paginationState.get().pageIndex > 0) firstPage()\n }, [pagination, paginationState, firstPage])\n useEffect(() => {\n if (!pagination || !resetOnQueryChange) return\n let previousSorting = sorting.get()\n let previousFilters = columnFilters.get()\n let previousSearch = globalFilter.get()\n const handleQueryChange = () => {\n const nextSorting = sorting.get()\n const nextFilters = columnFilters.get()\n const nextSearch = globalFilter.get()\n const sameSorting =\n previousSorting.length === nextSorting.length &&\n previousSorting.every(\n (item, index) =>\n item.id === nextSorting[index]?.id &&\n item.desc === nextSorting[index]?.desc,\n )\n const sameFilters =\n previousFilters.length === nextFilters.length &&\n previousFilters.every(\n (item, index) =>\n item.id === nextFilters[index]?.id &&\n Object.is(item.value, nextFilters[index]?.value),\n )\n const sameSearch = Object.is(previousSearch, nextSearch)\n previousSorting = nextSorting\n previousFilters = nextFilters\n previousSearch = nextSearch\n // Derived atoms can notify on option updates without a query change.\n if (!sameSorting || !sameFilters || !sameSearch) resetPageIfNeeded()\n }\n const subscriptions = [sorting, columnFilters, globalFilter].map(\n (atom) => atom.subscribe(handleQueryChange),\n )\n return () => {\n for (const subscription of subscriptions) subscription.unsubscribe()\n }\n }, [\n pagination,\n resetOnQueryChange,\n sorting,\n columnFilters,\n globalFilter,\n resetPageIfNeeded,\n ])\n useEffect(() => {\n if (!manualPagination && pageIndex > Math.max(0, pageCount - 1))\n setPageIndex(Math.max(0, pageCount - 1))\n }, [manualPagination, pageCount, pageIndex, setPageIndex])\n\n const allColumns = table.getAllLeafColumns()\n const visibleColumns = table.getVisibleLeafColumns()\n const canHideColumns = tableOptions?.enableHiding !== false\n const columnItems = useMemo(\n (): MenuItem[] =>\n allColumns.map((column) => ({\n id: column.id,\n type: 'checkbox',\n label: getColumnLabel(column),\n checked: column.getIsVisible(),\n closeOnSelect: false,\n disabled:\n !canHideColumns ||\n !column.getCanHide() ||\n (column.getIsVisible() && visibleColumns.length === 1),\n onCheckedChange: (checked) => column.toggleVisibility(checked),\n })),\n [allColumns, visibleColumns, canHideColumns],\n )\n const pageSizes = useMemo(\n () =>\n [...new Set([...pageSizeOptions, currentPageSize])]\n .toSorted((left, right) => left - right)\n .map((value) => ({ value, label: String(value) })),\n [pageSizeOptions, currentPageSize],\n )\n\n if (\n !Number.isInteger(currentPageSize) ||\n currentPageSize < 1 ||\n pageSizeOptions.some((size) => !Number.isInteger(size) || size < 1)\n )\n throw new Error('Table page sizes must be positive integers')\n const search =\n typeof table.state.globalFilter === 'string'\n ? table.state.globalFilter\n : ''\n const selectionEnabled = selectable !== false\n const selectedRows = selectionEnabled\n ? table.getFilteredSelectedRowModel().rows\n : []\n const view = getTableView(\n table,\n messages,\n Number(selectionEnabled) + Number(Boolean(renderExpandedRow)),\n )\n const totalRows = tableOptions?.manualPagination\n ? (tableOptions.rowCount ?? null)\n : table.getRowCount()\n const firstRow =\n view.rows.length > 0\n ? (pagination ? pageIndex * currentPageSize : 0) + 1\n : 0\n const lastRow = view.rows.length > 0 ? firstRow + view.rows.length - 1 : 0\n const handleResetFilters = () => {\n table.setGlobalFilter('')\n table.setColumnFilters([])\n resetPageIfNeeded()\n }\n const handleSearch = (value: string) => {\n const previous = globalFilter.get()\n table.setGlobalFilter(value)\n if (resetOnQueryChange && !Object.is(previous, value))\n resetPageIfNeeded()\n }\n const handlePageSize = (value: number) => {\n table.setPageSize(value)\n resetPageIfNeeded()\n }\n return {\n table,\n state: {\n ...view,\n id,\n search,\n showFilters,\n hasFilters:\n search.trim().length > 0 ||\n table.state.columnFilters.length > 0,\n filterCount: table.state.columnFilters.length,\n filterColumns: visibleColumns,\n columnItems,\n selectedRows,\n selectionCount: selectedRows.length,\n selectionEnabled,\n canSelectPage:\n selectionEnabled && view.rows.some((row) => row.getCanSelect()),\n allPageSelected:\n selectionEnabled && table.getIsAllPageRowsSelected(),\n somePageSelected:\n selectionEnabled && table.getIsSomePageRowsSelected(),\n firstRow,\n lastRow:\n totalRows === null ? lastRow : Math.min(lastRow, totalRows),\n totalRows,\n totalPages: pageCount < 0 ? null : Math.max(1, pageCount),\n page: pageIndex + 1,\n pageSize: currentPageSize,\n pageSizes,\n canPreviousPage: table.getCanPreviousPage(),\n canNextPage: table.getCanNextPage(),\n portalContainer:\n portalContainer === undefined ? root : portalContainer,\n },\n handler: {\n handleSearch,\n handleResetFilters,\n handlePageSize,\n handleToggleFilters: () => setShowFilters((current) => !current),\n handleClearSelection: () => table.resetRowSelection(true),\n handleSelectPage: () =>\n table.toggleAllPageRowsSelected(\n !table.getIsAllPageRowsSelected(),\n ),\n handleFirstPage: table.firstPage,\n handlePreviousPage: table.previousPage,\n handleNextPage: table.nextPage,\n handleLastPage: table.lastPage,\n },\n refs: { root: setRoot },\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { TableCheckboxLogicResult } from '../Types/dataTable.types.ts';
2
+ export declare function useTableCheckboxLogic(indeterminate: boolean): TableCheckboxLogicResult;
3
+ //# sourceMappingURL=useTableCheckboxLogic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableCheckboxLogic.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableCheckboxLogic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAE3E,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,OAAO,GACvB,wBAAwB,CAM1B"}
@@ -0,0 +1,10 @@
1
+ import { useEffect, useRef } from 'react';
2
+ export function useTableCheckboxLogic(indeterminate) {
3
+ const input = useRef(null);
4
+ useEffect(() => {
5
+ if (input.current)
6
+ input.current.indeterminate = indeterminate;
7
+ }, [indeterminate]);
8
+ return { refs: { input } };
9
+ }
10
+ //# sourceMappingURL=useTableCheckboxLogic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableCheckboxLogic.js","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableCheckboxLogic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAGzC,MAAM,UAAU,qBAAqB,CACjC,aAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC5C,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAA;IAClE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IACnB,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAA;AAC9B,CAAC","sourcesContent":["import { useEffect, useRef } from 'react'\nimport type { TableCheckboxLogicResult } from '../Types/dataTable.types.ts'\n\nexport function useTableCheckboxLogic(\n indeterminate: boolean,\n): TableCheckboxLogicResult {\n const input = useRef<HTMLInputElement>(null)\n useEffect(() => {\n if (input.current) input.current.indeterminate = indeterminate\n }, [indeterminate])\n return { refs: { input } }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { RowData } from '@tanstack/react-table';
2
+ import type { TableLogicOptions, TableLogicResult } from '../Types/table.types.ts';
3
+ export declare function useTableLogic<TData extends RowData>({ data, columns, getRowId, enableSorting, initialSorting, locale, messages, }: TableLogicOptions<TData>): TableLogicResult<TData>;
4
+ //# sourceMappingURL=useTableLogic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableLogic.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableLogic.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAIpD,OAAO,KAAK,EACR,iBAAiB,EACjB,gBAAgB,EACnB,MAAM,yBAAyB,CAAA;AAEhC,wBAAgB,aAAa,CAAC,KAAK,SAAS,OAAO,EAAE,EACjD,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,aAAoB,EACpB,cAAc,EACd,MAAa,EACb,QAAQ,GACX,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAcpD"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { useTable } from '@tanstack/react-table';
3
+ import { rentnerTableFeatures } from '../../../lib/Table/table.js';
4
+ import { getTableView } from '../../../lib/Table/presentation.js';
5
+ import { resolveTableMessages } from '../../../lib/Messages/tableMessages.js';
6
+ export function useTableLogic({ data, columns, getRowId, enableSorting = true, initialSorting, locale = 'en', messages, }) {
7
+ const table = useTable({
8
+ features: rentnerTableFeatures,
9
+ data,
10
+ columns,
11
+ getRowId,
12
+ enableSorting,
13
+ manualPagination: true,
14
+ initialState: { sorting: initialSorting ?? [] },
15
+ });
16
+ return {
17
+ table,
18
+ state: getTableView(table, resolveTableMessages(locale, messages)),
19
+ };
20
+ }
21
+ //# sourceMappingURL=useTableLogic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableLogic.js","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableLogic.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAM7E,MAAM,UAAU,aAAa,CAAwB,EACjD,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,aAAa,GAAG,IAAI,EACpB,cAAc,EACd,MAAM,GAAG,IAAI,EACb,QAAQ,GACe;IACvB,MAAM,KAAK,GAAG,QAAQ,CAAC;QACnB,QAAQ,EAAE,oBAAoB;QAC9B,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,aAAa;QACb,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,EAAE;KAClD,CAAC,CAAA;IACF,OAAO;QACH,KAAK;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACrE,CAAA;AACL,CAAC","sourcesContent":["'use client'\n\nimport { useTable } from '@tanstack/react-table'\nimport type { RowData } from '@tanstack/react-table'\nimport { rentnerTableFeatures } from '../../../lib/Table/table.ts'\nimport { getTableView } from '../../../lib/Table/presentation.ts'\nimport { resolveTableMessages } from '../../../lib/Messages/tableMessages.ts'\nimport type {\n TableLogicOptions,\n TableLogicResult,\n} from '../Types/table.types.ts'\n\nexport function useTableLogic<TData extends RowData>({\n data,\n columns,\n getRowId,\n enableSorting = true,\n initialSorting,\n locale = 'en',\n messages,\n}: TableLogicOptions<TData>): TableLogicResult<TData> {\n const table = useTable({\n features: rentnerTableFeatures,\n data,\n columns,\n getRowId,\n enableSorting,\n manualPagination: true,\n initialState: { sorting: initialSorting ?? [] },\n })\n return {\n table,\n state: getTableView(table, resolveTableMessages(locale, messages)),\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const TableOverlayContext: import("react").Context<DocumentFragment | Element | null | undefined>;
2
+ export declare function useTableOverlay(): DocumentFragment | Element | null | undefined;
3
+ //# sourceMappingURL=useTableOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableOverlay.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableOverlay.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,wEAEpB,CAAA;AAEZ,wBAAgB,eAAe,kDAE9B"}
@@ -0,0 +1,6 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const TableOverlayContext = createContext(undefined);
3
+ export function useTableOverlay() {
4
+ return useContext(TableOverlayContext);
5
+ }
6
+ //# sourceMappingURL=useTableOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableOverlay.js","sourceRoot":"","sources":["../../../../src/shared/Table/Hooks/useTableOverlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAE9C,SAAS,CAAC,CAAA;AAEZ,MAAM,UAAU,eAAe;IAC3B,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAC1C,CAAC","sourcesContent":["import { createContext, useContext } from 'react'\n\nexport const TableOverlayContext = createContext<\n Element | DocumentFragment | null | undefined\n>(undefined)\n\nexport function useTableOverlay() {\n return useContext(TableOverlayContext)\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import type { ReactNode } from 'react';
2
+ export type TableColumnFilter = {
3
+ type: 'text';
4
+ placeholder?: string;
5
+ maxLength?: number;
6
+ } | {
7
+ type: 'select';
8
+ placeholder?: string;
9
+ options: readonly {
10
+ value: string;
11
+ label: string;
12
+ }[];
13
+ } | {
14
+ type: 'dateRange';
15
+ placeholder?: string;
16
+ } | {
17
+ type: 'custom';
18
+ render: (props: {
19
+ value: unknown;
20
+ onValueChange: (value: unknown) => void;
21
+ label: string;
22
+ }) => ReactNode;
23
+ };
24
+ export interface TableColumnMeta {
25
+ label?: string;
26
+ align?: 'left' | 'center' | 'right';
27
+ headerClassName?: string;
28
+ cellClassName?: string;
29
+ filter?: TableColumnFilter;
30
+ }
31
+ export interface TableDateRange {
32
+ from?: string;
33
+ to?: string;
34
+ }
35
+ //# sourceMappingURL=column.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column.types.d.ts","sourceRoot":"","sources":["../../../../src/shared/Table/Types/column.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IACI,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACvD,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C;IACI,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,CAAC,KAAK,EAAE;QACZ,KAAK,EAAE,OAAO,CAAA;QACd,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;QACvC,KAAK,EAAE,MAAM,CAAA;KAChB,KAAK,SAAS,CAAA;CAClB,CAAA;AAEP,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=column.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column.types.js","sourceRoot":"","sources":["../../../../src/shared/Table/Types/column.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReactNode } from 'react'\n\nexport type TableColumnFilter =\n | { type: 'text'; placeholder?: string; maxLength?: number }\n | {\n type: 'select'\n placeholder?: string\n options: readonly { value: string; label: string }[]\n }\n | { type: 'dateRange'; placeholder?: string }\n | {\n type: 'custom'\n render: (props: {\n value: unknown\n onValueChange: (value: unknown) => void\n label: string\n }) => ReactNode\n }\n\nexport interface TableColumnMeta {\n label?: string\n align?: 'left' | 'center' | 'right'\n headerClassName?: string\n cellClassName?: string\n filter?: TableColumnFilter\n}\n\nexport interface TableDateRange {\n from?: string\n to?: string\n}\n"]}