@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 RentnerKev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,159 @@
1
- # Temporary Holding Version
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/banner.png" alt="RentnerTable — React Tables" width="100%">
3
+ </p>
2
4
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
5
+ <p align="center">
6
+ <a href="https://github.com/RentnerKev/RentnerTable/actions/workflows/ci.yml"><img src="https://github.com/RentnerKev/RentnerTable/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
7
+ <a href="https://github.com/RentnerKev/RentnerTable/actions/workflows/codeql.yml"><img src="https://github.com/RentnerKev/RentnerTable/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL"></a>
8
+ <a href="https://www.npmjs.com/package/@rentnerkev/table"><img src="https://img.shields.io/npm/v/@rentnerkev/table" alt="npm version"></a>
9
+ <a href="https://www.npmjs.com/package/@rentnerkev/table"><img src="https://img.shields.io/npm/dm/@rentnerkev/table" alt="npm downloads"></a>
10
+ <a href="https://react.dev"><img src="https://img.shields.io/badge/React-19-61dafb" alt="React 19"></a>
11
+ <a href="https://tailwindcss.com"><img src="https://img.shields.io/badge/Tailwind_CSS-4-38bdf8" alt="Tailwind CSS 4"></a>
12
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
13
+ </p>
14
+
15
+ Accessible, typed React tables built with TanStack Table 9 and shared RentnerKev styling. Define your columns once and reuse search, filters, selection, pagination and actions across your projects.
16
+
17
+ ## Installation
18
+
19
+ Requires React 19, React DOM 19, and Tailwind CSS 4. Components use the existing RentnerKev input, select, menu and calendar packages.
20
+
21
+ ```bash
22
+ npm install @rentnerkev/table
23
+ # or with Bun
24
+ bun add @rentnerkev/table
25
+ ```
26
+
27
+ The package contains compiled ESM, declarations, styles and usage documentation.
28
+
29
+ Import the package styles after Tailwind in your app stylesheet:
30
+
31
+ ```css
32
+ @import 'tailwindcss';
33
+ @import '@rentnerkev/table/tailwind.css';
34
+ ```
35
+
36
+ The stylesheet includes the styles of the controls used by the table.
37
+
38
+ ## Quick start
39
+
40
+ ```tsx
41
+ 'use client'
42
+
43
+ import { DataTable, createTableColumnHelper } from '@rentnerkev/table'
44
+
45
+ type Member = {
46
+ id: string
47
+ name: string
48
+ role: string
49
+ joined: string
50
+ }
51
+
52
+ const column = createTableColumnHelper<Member>()
53
+ const columns = column.columns([
54
+ column.accessor('name', {
55
+ header: 'Member',
56
+ meta: { filter: { type: 'text' } },
57
+ }),
58
+ column.accessor('role', {
59
+ header: 'Role',
60
+ meta: {
61
+ filter: {
62
+ type: 'select',
63
+ options: [
64
+ { value: 'Developer', label: 'Developer' },
65
+ { value: 'Designer', label: 'Designer' },
66
+ ],
67
+ },
68
+ },
69
+ }),
70
+ column.accessor('joined', {
71
+ header: 'Joined',
72
+ meta: { filter: { type: 'dateRange' } },
73
+ }),
74
+ ])
75
+
76
+ export function TeamTable({ members }: { members: readonly Member[] }) {
77
+ return (
78
+ <DataTable
79
+ data={members}
80
+ columns={columns}
81
+ getRowId={(member) => member.id}
82
+ getRowLabel={(member) => member.name}
83
+ title="Team overview"
84
+ description="Manage your team and roles."
85
+ locale="en"
86
+ selectable
87
+ />
88
+ )
89
+ }
90
+ ```
91
+
92
+ Keep column definitions and input data stable between unrelated renders. Use real record IDs for selection and expanded details.
93
+
94
+ ## Screenshots
95
+
96
+ | Dark theme | Light theme, filters and selection |
97
+ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
98
+ | [![Dark team table](https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/screenshots/dark-table.png)](https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/screenshots/dark-table.png) | [![Light team table with filters and selection](https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/screenshots/light-table.png)](https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/screenshots/light-table.png) |
99
+
100
+ Screenshots come from the local playground with example data.
101
+
102
+ <details>
103
+ <summary>Mobile layout</summary>
104
+
105
+ <p align="center">
106
+ <img src="https://raw.githubusercontent.com/RentnerKev/RentnerTable/main/assets/readme/screenshots/mobile-table.png" alt="Mobile table with horizontal scrolling inside its viewport" width="350">
107
+ </p>
108
+
109
+ </details>
110
+
111
+ [Full API & usage](./docs/usage.md) · [Local playground](./playground) · [Repository automation](./.github/AUTOMATION.md) · [MIT license](./LICENSE)
112
+
113
+ ## Features
114
+
115
+ - Typed accessor, display and grouped columns through `createTableColumnHelper`.
116
+ - Global search, independent text/select/date-range filters and custom filter renderers.
117
+ - Keyboard sorting, Shift multi-sort, column visibility and configurable page sizes.
118
+ - Stable row selection across pages, selectable-row predicates and bulk actions.
119
+ - Row action menus, expandable details and custom cell renderers.
120
+ - Loading, refreshing, error/retry, empty and no-results states.
121
+ - German and English messages with per-message overrides.
122
+ - Shared `--rentner-*` theme tokens, scoped popup containers, three densities and striped rows.
123
+ - Native table semantics, SSR, headless composition and controlled server pagination/filtering/sorting.
124
+ - Paginated rendering and query preparation before row filtering. Calendar controls load on demand.
125
+
126
+ `Table` provides the minimal sortable table without a toolbar or pagination. `DataTable` adds the reusable management interface; `useDataTableLogic` and `TableSurface` support custom composition.
127
+
128
+ ## Development
129
+
130
+ Requires Bun 1.4.4 with native `bun fmt` support.
131
+
132
+ ```bash
133
+ bun install --frozen-lockfile
134
+ bun run playground:install
135
+ bun run playground:dev
136
+ ```
137
+
138
+ Open **http://127.0.0.1:4179**. Try filters, bulk actions, row details, light/dark themes, density, language and the loading/error/empty states.
139
+
140
+ ```bash
141
+ bunx playwright install chromium firefox webkit
142
+ bun run verify
143
+ ```
144
+
145
+ Verification includes typechecks, lint, formatting, tests, package build, an isolated installed consumer, production playground build, and Chromium/Firefox/WebKit tests with accessibility scans. CI also checks React 19.0.0 and 19.3.1.
146
+
147
+ Library components, hooks and types live under `src/shared/Table`, UI-free helpers under `src/lib`, and tests mirror these owners in `src/tests`. Playground source and marketing images stay outside the published package.
148
+
149
+ ## Releases and maintenance
150
+
151
+ Dependabot checks both Bun packages and GitHub Actions daily. Verified minor/patch updates receive automatic approval and guarded squash auto-merge after the protected branch's checks pass. Major updates require maintainer review.
152
+
153
+ Publishing a stable GitHub release named `vMAJOR.MINOR.PATCH` triggers exact-tag verification, tag-derived package versioning and npm publication with provenance. A separate workflow generates release notes and uploads the project banner. Pushing commits or tags alone does not publish a package.
154
+
155
+ The npm Trusted Publisher authorizes GitHub owner `RentnerKev`, repository `RentnerTable` and workflow filename `npm-publish.yml`. Future releases use OIDC rather than a stored npm token. See [automation setup](./.github/AUTOMATION.md) for the repository settings, update policy and release procedure.
156
+
157
+ ## License
158
+
159
+ MIT © RentnerKev
@@ -0,0 +1,17 @@
1
+ export { Table } from './shared/Table/Components/Table.tsx';
2
+ export { DataTable } from './shared/Table/Components/DataTable.tsx';
3
+ export { TableRowActions } from './shared/Table/Components/TableRowActions.tsx';
4
+ export { useDataTableLogic } from './shared/Table/Hooks/useDataTableLogic.ts';
5
+ export { TableSurface } from './shared/Table/Components/TableSurface.tsx';
6
+ export { TableProvider } from './shared/Table/Components/TableProvider.tsx';
7
+ export type { TableProviderProps } from './shared/Table/Types/dataTable.types.ts';
8
+ export { DataTableToolbar } from './shared/Table/Components/DataTableToolbar.tsx';
9
+ export { DataTablePagination } from './shared/Table/Components/DataTablePagination.tsx';
10
+ export { tableTextFilter, tableEqualsFilter, tableDateRangeFilter, } from './lib/Table/filters.ts';
11
+ export type { TableColumnMeta, TableColumnFilter, TableDateRange, } from './shared/Table/Types/column.types.ts';
12
+ export type { DataTableProps, DataTableLogicOptions, DataTableLogicResult, DataTableContext, DataTableClassNames, TableRow, TableColumnInstance, TableSurfaceProps, DataTableToolbarProps, DataTablePaginationProps, TableRowActionsProps, } from './shared/Table/Types/dataTable.types.ts';
13
+ export { useTableLogic } from './shared/Table/Hooks/useTableLogic.ts';
14
+ export { createTableColumnHelper } from './lib/Table/table.ts';
15
+ export { getTableMessages } from './lib/Messages/tableMessages.ts';
16
+ export type { TableColumn, TableLocale, TableLogicOptions, TableLogicResult, TableMessages, TableProps, TableSize, RentnerTableInstance, RentnerTableOptions, } from './shared/Table/Types/table.types.ts';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AAC3E,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AACvF,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACvB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EACR,eAAe,EACf,iBAAiB,EACjB,cAAc,GACjB,MAAM,sCAAsC,CAAA;AAC7C,YAAY,EACR,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACvB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,YAAY,EACR,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,mBAAmB,GACtB,MAAM,qCAAqC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { Table } from './shared/Table/Components/Table.js';
2
+ export { DataTable } from './shared/Table/Components/DataTable.js';
3
+ export { TableRowActions } from './shared/Table/Components/TableRowActions.js';
4
+ export { useDataTableLogic } from './shared/Table/Hooks/useDataTableLogic.js';
5
+ export { TableSurface } from './shared/Table/Components/TableSurface.js';
6
+ export { TableProvider } from './shared/Table/Components/TableProvider.js';
7
+ export { DataTableToolbar } from './shared/Table/Components/DataTableToolbar.js';
8
+ export { DataTablePagination } from './shared/Table/Components/DataTablePagination.js';
9
+ export { tableTextFilter, tableEqualsFilter, tableDateRangeFilter, } from './lib/Table/filters.js';
10
+ export { useTableLogic } from './shared/Table/Hooks/useTableLogic.js';
11
+ export { createTableColumnHelper } from './lib/Table/table.js';
12
+ export { getTableMessages } from './lib/Messages/tableMessages.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAqC,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAyC,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA+C,CAAA;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA4C,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA6C,CAAA;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAAgD,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAmD,CAAA;AACvF,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACvB,MAAM,wBAAwB,CAAA;AAmB/B,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA","sourcesContent":["export { Table } from './shared/Table/Components/Table.tsx'\nexport { DataTable } from './shared/Table/Components/DataTable.tsx'\nexport { TableRowActions } from './shared/Table/Components/TableRowActions.tsx'\nexport { useDataTableLogic } from './shared/Table/Hooks/useDataTableLogic.ts'\nexport { TableSurface } from './shared/Table/Components/TableSurface.tsx'\nexport { TableProvider } from './shared/Table/Components/TableProvider.tsx'\nexport type { TableProviderProps } from './shared/Table/Types/dataTable.types.ts'\nexport { DataTableToolbar } from './shared/Table/Components/DataTableToolbar.tsx'\nexport { DataTablePagination } from './shared/Table/Components/DataTablePagination.tsx'\nexport {\n tableTextFilter,\n tableEqualsFilter,\n tableDateRangeFilter,\n} from './lib/Table/filters.ts'\nexport type {\n TableColumnMeta,\n TableColumnFilter,\n TableDateRange,\n} from './shared/Table/Types/column.types.ts'\nexport type {\n DataTableProps,\n DataTableLogicOptions,\n DataTableLogicResult,\n DataTableContext,\n DataTableClassNames,\n TableRow,\n TableColumnInstance,\n TableSurfaceProps,\n DataTableToolbarProps,\n DataTablePaginationProps,\n TableRowActionsProps,\n} from './shared/Table/Types/dataTable.types.ts'\nexport { useTableLogic } from './shared/Table/Hooks/useTableLogic.ts'\nexport { createTableColumnHelper } from './lib/Table/table.ts'\nexport { getTableMessages } from './lib/Messages/tableMessages.ts'\nexport type {\n TableColumn,\n TableLocale,\n TableLogicOptions,\n TableLogicResult,\n TableMessages,\n TableProps,\n TableSize,\n RentnerTableInstance,\n RentnerTableOptions,\n} from './shared/Table/Types/table.types.ts'\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TableLocale, TableMessages } from '../../shared/Table/Types/table.types.ts';
2
+ export declare function getTableMessages(locale?: TableLocale): TableMessages;
3
+ export declare function resolveTableMessages(locale?: TableLocale, overrides?: Partial<TableMessages>): TableMessages;
4
+ //# sourceMappingURL=tableMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableMessages.d.ts","sourceRoot":"","sources":["../../../src/lib/Messages/tableMessages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,aAAa,EAChB,MAAM,yCAAyC,CAAA;AAkFhD,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,WAAkB,GAAG,aAAa,CAE1E;AAED,wBAAgB,oBAAoB,CAChC,MAAM,GAAE,WAAkB,EAC1B,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACnC,aAAa,CASf"}
@@ -0,0 +1,81 @@
1
+ const messages = {
2
+ de: {
3
+ empty: 'Keine Einträge vorhanden.',
4
+ loading: 'Einträge werden geladen …',
5
+ sortAscending: 'Aufsteigend sortieren',
6
+ sortDescending: 'Absteigend sortieren',
7
+ clearSorting: 'Sortierung aufheben',
8
+ title: 'Datentabelle',
9
+ search: 'Tabelle durchsuchen',
10
+ searchPlaceholder: 'Einträge durchsuchen …',
11
+ filters: 'Filter',
12
+ columns: 'Spalten',
13
+ resetFilters: 'Filter zurücksetzen',
14
+ noResults: 'Keine Ergebnisse gefunden',
15
+ noResultsDescription: 'Passe deine Suche oder Filter an.',
16
+ emptyDescription: 'Sobald Daten vorhanden sind, erscheinen sie hier.',
17
+ error: 'Die Einträge konnten nicht geladen werden.',
18
+ retry: 'Erneut versuchen',
19
+ all: 'Alle',
20
+ filterColumn: (label) => `${label} filtern`,
21
+ rowsPerPage: 'Zeilen pro Seite',
22
+ firstPage: 'Erste Seite',
23
+ previousPage: 'Vorherige Seite',
24
+ nextPage: 'Nächste Seite',
25
+ lastPage: 'Letzte Seite',
26
+ pageInfo: (page, pages) => pages === null ? `Seite ${page}` : `Seite ${page} von ${pages}`,
27
+ rowRange: (first, last, total) => total === null
28
+ ? `${first}–${last} Einträge`
29
+ : `${first}–${last} von ${total} Einträgen`,
30
+ results: (count) => `${count} Einträge`,
31
+ selected: (count) => `${count} ausgewählt`,
32
+ clearSelection: 'Auswahl aufheben',
33
+ selectPage: 'Alle Zeilen auf dieser Seite auswählen',
34
+ selectRow: (label) => `${label} auswählen`,
35
+ expandRow: (label) => `Details für ${label} öffnen`,
36
+ collapseRow: (label) => `Details für ${label} schließen`,
37
+ },
38
+ en: {
39
+ empty: 'No entries found.',
40
+ loading: 'Loading entries …',
41
+ sortAscending: 'Sort ascending',
42
+ sortDescending: 'Sort descending',
43
+ clearSorting: 'Clear sorting',
44
+ title: 'Data table',
45
+ search: 'Search table',
46
+ searchPlaceholder: 'Search entries …',
47
+ filters: 'Filters',
48
+ columns: 'Columns',
49
+ resetFilters: 'Reset filters',
50
+ noResults: 'No results found',
51
+ noResultsDescription: 'Try another search or adjust your filters.',
52
+ emptyDescription: 'Your entries will appear here when data is available.',
53
+ error: 'Entries could not be loaded.',
54
+ retry: 'Try again',
55
+ all: 'All',
56
+ filterColumn: (label) => `Filter ${label}`,
57
+ rowsPerPage: 'Rows per page',
58
+ firstPage: 'First page',
59
+ previousPage: 'Previous page',
60
+ nextPage: 'Next page',
61
+ lastPage: 'Last page',
62
+ pageInfo: (page, pages) => pages === null ? `Page ${page}` : `Page ${page} of ${pages}`,
63
+ rowRange: (first, last, total) => total === null
64
+ ? `${first}–${last} entries`
65
+ : `${first}–${last} of ${total} entries`,
66
+ results: (count) => `${count} entries`,
67
+ selected: (count) => `${count} selected`,
68
+ clearSelection: 'Clear selection',
69
+ selectPage: 'Select all rows on this page',
70
+ selectRow: (label) => `Select ${label}`,
71
+ expandRow: (label) => `Expand details for ${label}`,
72
+ collapseRow: (label) => `Collapse details for ${label}`,
73
+ },
74
+ };
75
+ export function getTableMessages(locale = 'en') {
76
+ return { ...messages[locale] };
77
+ }
78
+ export function resolveTableMessages(locale = 'en', overrides) {
79
+ return Object.assign(getTableMessages(locale), Object.fromEntries(Object.entries(overrides ?? {}).filter(([, value]) => value !== undefined)));
80
+ }
81
+ //# sourceMappingURL=tableMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableMessages.js","sourceRoot":"","sources":["../../../src/lib/Messages/tableMessages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n TableLocale,\n TableMessages,\n} from '../../shared/Table/Types/table.types.ts'\n\nconst messages: Record<TableLocale, TableMessages> = {\n de: {\n empty: 'Keine Einträge vorhanden.',\n loading: 'Einträge werden geladen …',\n sortAscending: 'Aufsteigend sortieren',\n sortDescending: 'Absteigend sortieren',\n clearSorting: 'Sortierung aufheben',\n title: 'Datentabelle',\n search: 'Tabelle durchsuchen',\n searchPlaceholder: 'Einträge durchsuchen …',\n filters: 'Filter',\n columns: 'Spalten',\n resetFilters: 'Filter zurücksetzen',\n noResults: 'Keine Ergebnisse gefunden',\n noResultsDescription: 'Passe deine Suche oder Filter an.',\n emptyDescription: 'Sobald Daten vorhanden sind, erscheinen sie hier.',\n error: 'Die Einträge konnten nicht geladen werden.',\n retry: 'Erneut versuchen',\n all: 'Alle',\n filterColumn: (label) => `${label} filtern`,\n rowsPerPage: 'Zeilen pro Seite',\n firstPage: 'Erste Seite',\n previousPage: 'Vorherige Seite',\n nextPage: 'Nächste Seite',\n lastPage: 'Letzte Seite',\n pageInfo: (page, pages) =>\n pages === null ? `Seite ${page}` : `Seite ${page} von ${pages}`,\n rowRange: (first, last, total) =>\n total === null\n ? `${first}–${last} Einträge`\n : `${first}–${last} von ${total} Einträgen`,\n results: (count) => `${count} Einträge`,\n selected: (count) => `${count} ausgewählt`,\n clearSelection: 'Auswahl aufheben',\n selectPage: 'Alle Zeilen auf dieser Seite auswählen',\n selectRow: (label) => `${label} auswählen`,\n expandRow: (label) => `Details für ${label} öffnen`,\n collapseRow: (label) => `Details für ${label} schließen`,\n },\n en: {\n empty: 'No entries found.',\n loading: 'Loading entries …',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n clearSorting: 'Clear sorting',\n title: 'Data table',\n search: 'Search table',\n searchPlaceholder: 'Search entries …',\n filters: 'Filters',\n columns: 'Columns',\n resetFilters: 'Reset filters',\n noResults: 'No results found',\n noResultsDescription: 'Try another search or adjust your filters.',\n emptyDescription:\n 'Your entries will appear here when data is available.',\n error: 'Entries could not be loaded.',\n retry: 'Try again',\n all: 'All',\n filterColumn: (label) => `Filter ${label}`,\n rowsPerPage: 'Rows per page',\n firstPage: 'First page',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n lastPage: 'Last page',\n pageInfo: (page, pages) =>\n pages === null ? `Page ${page}` : `Page ${page} of ${pages}`,\n rowRange: (first, last, total) =>\n total === null\n ? `${first}–${last} entries`\n : `${first}–${last} of ${total} entries`,\n results: (count) => `${count} entries`,\n selected: (count) => `${count} selected`,\n clearSelection: 'Clear selection',\n selectPage: 'Select all rows on this page',\n selectRow: (label) => `Select ${label}`,\n expandRow: (label) => `Expand details for ${label}`,\n collapseRow: (label) => `Collapse details for ${label}`,\n },\n}\n\nexport function getTableMessages(locale: TableLocale = 'en'): TableMessages {\n return { ...messages[locale] }\n}\n\nexport function resolveTableMessages(\n locale: TableLocale = 'en',\n overrides?: Partial<TableMessages>,\n): TableMessages {\n return Object.assign(\n getTableMessages(locale),\n Object.fromEntries(\n Object.entries(overrides ?? {}).filter(\n ([, value]) => value !== undefined,\n ),\n ),\n )\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { TableDateRange } from '../../shared/Table/Types/column.types.ts';
2
+ export declare const tableTextFilter: ((row: {
3
+ getValue: (id: string) => unknown;
4
+ }, columnId: string, value: unknown) => boolean) & {
5
+ autoRemove: (value: unknown) => boolean;
6
+ resolveFilterValue: (value: unknown) => unknown;
7
+ };
8
+ export declare const tableEqualsFilter: ((row: {
9
+ getValue: (id: string) => unknown;
10
+ }, columnId: string, value: unknown) => boolean) & {
11
+ autoRemove: (value: unknown) => value is "" | null | undefined;
12
+ };
13
+ export declare function getTableDateRange(value: unknown): TableDateRange;
14
+ export declare const tableDateRangeFilter: ((row: {
15
+ getValue: (id: string) => unknown;
16
+ }, columnId: string, value: unknown) => boolean) & {
17
+ resolveFilterValue: (value: unknown) => unknown;
18
+ autoRemove: (value: unknown) => boolean;
19
+ };
20
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/lib/Table/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAwB9E,eAAO,MAAM,eAAe,SAEf;IAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,YAChC,MAAM,SACT,OAAO;wBAcM,OAAO;gCACC,OAAO,KAAG,OAAO;CAGpD,CAAA;AAED,eAAO,MAAM,iBAAiB,SAEjB;IAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,YAChC,MAAM,SACT,OAAO;wBAEI,OAAO;CAChC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAYhE;AA4CD,eAAO,MAAM,oBAAoB,SAEpB;IAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,YAChC,MAAM,SACT,OAAO;gCAkBc,OAAO,KAAG,OAAO;wBAEzB,OAAO;CAKlC,CAAA"}
@@ -0,0 +1,102 @@
1
+ const resolvedText = Symbol('tableTextFilter');
2
+ const resolvedDateRange = Symbol('tableDateRangeFilter');
3
+ function searchableValue(value) {
4
+ if (value instanceof Date)
5
+ return Number.isFinite(value.getTime()) ? value.toISOString() : '';
6
+ if (typeof value === 'string' ||
7
+ typeof value === 'number' ||
8
+ typeof value === 'boolean' ||
9
+ typeof value === 'bigint')
10
+ return String(value);
11
+ return '';
12
+ }
13
+ function resolveTextFilterValue(value) {
14
+ return {
15
+ [resolvedText]: searchableValue(value).trim().toLocaleLowerCase(),
16
+ };
17
+ }
18
+ export const tableTextFilter = Object.assign((row, columnId, value) => {
19
+ const query = typeof value === 'object' &&
20
+ value !== null &&
21
+ resolvedText in value &&
22
+ typeof value[resolvedText] === 'string'
23
+ ? value[resolvedText]
24
+ : resolveTextFilterValue(value)[resolvedText];
25
+ return searchableValue(row.getValue(columnId))
26
+ .toLocaleLowerCase()
27
+ .includes(query);
28
+ }, {
29
+ autoRemove: (value) => searchableValue(value).trim() === '',
30
+ resolveFilterValue: (value) => resolveTextFilterValue(value),
31
+ });
32
+ export const tableEqualsFilter = Object.assign((row, columnId, value) => searchableValue(row.getValue(columnId)) === searchableValue(value), { autoRemove: (value) => value == null || value === '' });
33
+ export function getTableDateRange(value) {
34
+ if (typeof value !== 'object' || value === null)
35
+ return {};
36
+ return {
37
+ from: 'from' in value && typeof value.from === 'string'
38
+ ? value.from
39
+ : undefined,
40
+ to: 'to' in value && typeof value.to === 'string'
41
+ ? value.to
42
+ : undefined,
43
+ };
44
+ }
45
+ function dateBoundary(value, end) {
46
+ const parts = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
47
+ if (!parts)
48
+ return Number.NaN;
49
+ const year = Number(parts[1]);
50
+ const month = Number(parts[2]) - 1;
51
+ const day = Number(parts[3]);
52
+ const date = new Date(0);
53
+ date.setFullYear(year, month, day);
54
+ date.setHours(0, 0, 0, 0);
55
+ if (date.getFullYear() !== year ||
56
+ date.getMonth() !== month ||
57
+ date.getDate() !== day)
58
+ return Number.NaN;
59
+ if (end)
60
+ date.setHours(23, 59, 59, 999);
61
+ return date.getTime();
62
+ }
63
+ function resolveDateRangeFilterValue(value) {
64
+ const range = getTableDateRange(value);
65
+ return {
66
+ [resolvedDateRange]: true,
67
+ from: range.from ? dateBoundary(range.from, false) : -Infinity,
68
+ to: range.to ? dateBoundary(range.to, true) : Infinity,
69
+ };
70
+ }
71
+ function isResolvedDateRange(value) {
72
+ return (typeof value === 'object' &&
73
+ value !== null &&
74
+ resolvedDateRange in value &&
75
+ 'from' in value &&
76
+ 'to' in value &&
77
+ typeof value.from === 'number' &&
78
+ typeof value.to === 'number');
79
+ }
80
+ export const tableDateRangeFilter = Object.assign((row, columnId, value) => {
81
+ const range = isResolvedDateRange(value)
82
+ ? value
83
+ : resolveDateRangeFilterValue(value);
84
+ const raw = row.getValue(columnId);
85
+ const timestamp = raw instanceof Date
86
+ ? raw.getTime()
87
+ : typeof raw === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(raw)
88
+ ? dateBoundary(raw, false)
89
+ : typeof raw === 'string' || typeof raw === 'number'
90
+ ? new Date(raw).getTime()
91
+ : Number.NaN;
92
+ if (!Number.isFinite(timestamp))
93
+ return false;
94
+ return timestamp >= range.from && timestamp <= range.to;
95
+ }, {
96
+ resolveFilterValue: (value) => resolveDateRangeFilterValue(value),
97
+ autoRemove: (value) => {
98
+ const range = getTableDateRange(value);
99
+ return !range.from && !range.to;
100
+ },
101
+ });
102
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/lib/Table/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TableDateRange } from '../../shared/Table/Types/column.types.ts'\n\nconst resolvedText = Symbol('tableTextFilter')\nconst resolvedDateRange = Symbol('tableDateRangeFilter')\n\nfunction searchableValue(value: unknown): string {\n if (value instanceof Date)\n return Number.isFinite(value.getTime()) ? value.toISOString() : ''\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n )\n return String(value)\n return ''\n}\n\nfunction resolveTextFilterValue(value: unknown) {\n return {\n [resolvedText]: searchableValue(value).trim().toLocaleLowerCase(),\n }\n}\n\nexport const tableTextFilter = Object.assign(\n (\n row: { getValue: (id: string) => unknown },\n columnId: string,\n value: unknown,\n ) => {\n const query =\n typeof value === 'object' &&\n value !== null &&\n resolvedText in value &&\n typeof value[resolvedText] === 'string'\n ? value[resolvedText]\n : resolveTextFilterValue(value)[resolvedText]\n return searchableValue(row.getValue(columnId))\n .toLocaleLowerCase()\n .includes(query)\n },\n {\n autoRemove: (value: unknown) => searchableValue(value).trim() === '',\n resolveFilterValue: (value: unknown): unknown =>\n resolveTextFilterValue(value),\n },\n)\n\nexport const tableEqualsFilter = Object.assign(\n (\n row: { getValue: (id: string) => unknown },\n columnId: string,\n value: unknown,\n ) => searchableValue(row.getValue(columnId)) === searchableValue(value),\n { autoRemove: (value: unknown) => value == null || value === '' },\n)\n\nexport function getTableDateRange(value: unknown): TableDateRange {\n if (typeof value !== 'object' || value === null) return {}\n return {\n from:\n 'from' in value && typeof value.from === 'string'\n ? value.from\n : undefined,\n to:\n 'to' in value && typeof value.to === 'string'\n ? value.to\n : undefined,\n }\n}\n\nfunction dateBoundary(value: string, end: boolean): number {\n const parts = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (!parts) return Number.NaN\n const year = Number(parts[1])\n const month = Number(parts[2]) - 1\n const day = Number(parts[3])\n const date = new Date(0)\n date.setFullYear(year, month, day)\n date.setHours(0, 0, 0, 0)\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day\n )\n return Number.NaN\n if (end) date.setHours(23, 59, 59, 999)\n return date.getTime()\n}\n\nfunction resolveDateRangeFilterValue(value: unknown) {\n const range = getTableDateRange(value)\n return {\n [resolvedDateRange]: true,\n from: range.from ? dateBoundary(range.from, false) : -Infinity,\n to: range.to ? dateBoundary(range.to, true) : Infinity,\n }\n}\n\nfunction isResolvedDateRange(\n value: unknown,\n): value is ReturnType<typeof resolveDateRangeFilterValue> {\n return (\n typeof value === 'object' &&\n value !== null &&\n resolvedDateRange in value &&\n 'from' in value &&\n 'to' in value &&\n typeof value.from === 'number' &&\n typeof value.to === 'number'\n )\n}\n\nexport const tableDateRangeFilter = Object.assign(\n (\n row: { getValue: (id: string) => unknown },\n columnId: string,\n value: unknown,\n ) => {\n const range = isResolvedDateRange(value)\n ? value\n : resolveDateRangeFilterValue(value)\n const raw = row.getValue(columnId)\n const timestamp =\n raw instanceof Date\n ? raw.getTime()\n : typeof raw === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(raw)\n ? dateBoundary(raw, false)\n : typeof raw === 'string' || typeof raw === 'number'\n ? new Date(raw).getTime()\n : Number.NaN\n if (!Number.isFinite(timestamp)) return false\n return timestamp >= range.from && timestamp <= range.to\n },\n {\n resolveFilterValue: (value: unknown): unknown =>\n resolveDateRangeFilterValue(value),\n autoRemove: (value: unknown) => {\n const range = getTableDateRange(value)\n return !range.from && !range.to\n },\n },\n)\n"]}
@@ -0,0 +1,7 @@
1
+ import type { RowData } from '@tanstack/react-table';
2
+ import type { RentnerTableInstance, TableColumn, TableLogicResult, TableMessages } from '../../shared/Table/Types/table.types.ts';
3
+ import type { TableColumnInstance } from '../../shared/Table/Types/dataTable.types.ts';
4
+ export declare function getColumnLabel<TData extends RowData>(column: TableColumnInstance<TData>): string;
5
+ export declare function prepareTableColumns<TData extends RowData>(columns: readonly TableColumn<TData>[]): TableColumn<TData>[];
6
+ export declare function getTableView<TData extends RowData>(table: RentnerTableInstance<TData>, messages: TableMessages, extraColumns?: number): TableLogicResult<TData>['state'];
7
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/lib/Table/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EACR,oBAAoB,EACpB,WAAW,EAEX,gBAAgB,EAChB,aAAa,EAChB,MAAM,yCAAyC,CAAA;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAA;AAEtF,wBAAgB,cAAc,CAAC,KAAK,SAAS,OAAO,EAChD,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,GACnC,MAAM,CAOR;AAED,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,OAAO,EACrD,OAAO,EAAE,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,GACvC,WAAW,CAAC,KAAK,CAAC,EAAE,CActB;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,OAAO,EAC9C,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,EAClC,QAAQ,EAAE,aAAa,EACvB,YAAY,SAAI,GACjB,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAyClC"}
@@ -0,0 +1,63 @@
1
+ export function getColumnLabel(column) {
2
+ return (column.columnDef.meta?.label ??
3
+ (typeof column.columnDef.header === 'string'
4
+ ? column.columnDef.header
5
+ : column.id));
6
+ }
7
+ export function prepareTableColumns(columns) {
8
+ return columns.map((column) => {
9
+ const kind = column.meta?.filter?.type;
10
+ let filterFn = 'text';
11
+ if (kind === 'select')
12
+ filterFn = 'equals';
13
+ if (kind === 'dateRange')
14
+ filterFn = 'dateRange';
15
+ return {
16
+ ...column,
17
+ filterFn: column.filterFn ?? filterFn,
18
+ ...('columns' in column && column.columns
19
+ ? { columns: prepareTableColumns(column.columns) }
20
+ : {}),
21
+ };
22
+ });
23
+ }
24
+ export function getTableView(table, messages, extraColumns = 0) {
25
+ return {
26
+ headerGroups: table.getHeaderGroups().map((group) => ({
27
+ id: group.id,
28
+ headers: group.headers.map((header) => {
29
+ const sorted = header.column.getIsSorted();
30
+ const next = header.column.getNextSortingOrder();
31
+ let sortDirection;
32
+ let sortIndicator = '↕';
33
+ let sortAction = messages.clearSorting;
34
+ if (sorted === 'asc') {
35
+ sortDirection = 'ascending';
36
+ sortIndicator = '↑';
37
+ }
38
+ if (sorted === 'desc') {
39
+ sortDirection = 'descending';
40
+ sortIndicator = '↓';
41
+ }
42
+ if (next === 'asc')
43
+ sortAction = messages.sortAscending;
44
+ if (next === 'desc')
45
+ sortAction = messages.sortDescending;
46
+ return {
47
+ header,
48
+ canSort: !header.isPlaceholder && header.column.getCanSort(),
49
+ sortDirection: !header.isPlaceholder &&
50
+ header.column.getSortIndex() === 0
51
+ ? sortDirection
52
+ : undefined,
53
+ sortAction,
54
+ sortIndicator,
55
+ };
56
+ }),
57
+ })),
58
+ rows: table.getRowModel().rows,
59
+ columnCount: Math.max(1, table.getVisibleLeafColumns().length + extraColumns),
60
+ messages,
61
+ };
62
+ }
63
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/lib/Table/presentation.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,cAAc,CAC1B,MAAkC;IAElC,OAAO,CACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK;QAC5B,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ;YACxC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;YACzB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CACnB,CAAA;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAC/B,OAAsC;IAEtC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAA;QACtC,IAAI,QAAQ,GAAoC,MAAM,CAAA;QACtD,IAAI,IAAI,KAAK,QAAQ;YAAE,QAAQ,GAAG,QAAQ,CAAA;QAC1C,IAAI,IAAI,KAAK,WAAW;YAAE,QAAQ,GAAG,WAAW,CAAA;QAChD,OAAO;YACH,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ;YACrC,GAAG,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO;gBACrC,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gBAClD,CAAC,CAAC,EAAE,CAAC;SACZ,CAAA;IACL,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,YAAY,CACxB,KAAkC,EAClC,QAAuB,EACvB,YAAY,GAAG,CAAC;IAEhB,OAAO;QACH,YAAY,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClD,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAA2B,EAAE;gBAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;gBAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAA;gBAChD,IAAI,aAAuD,CAAA;gBAC3D,IAAI,aAAa,GAAG,GAAG,CAAA;gBACvB,IAAI,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAA;gBACtC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACnB,aAAa,GAAG,WAAW,CAAA;oBAC3B,aAAa,GAAG,GAAG,CAAA;gBACvB,CAAC;gBACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACpB,aAAa,GAAG,YAAY,CAAA;oBAC5B,aAAa,GAAG,GAAG,CAAA;gBACvB,CAAC;gBACD,IAAI,IAAI,KAAK,KAAK;oBAAE,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAA;gBACvD,IAAI,IAAI,KAAK,MAAM;oBAAE,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAA;gBACzD,OAAO;oBACH,MAAM;oBACN,OAAO,EACH,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;oBACvD,aAAa,EACT,CAAC,MAAM,CAAC,aAAa;wBACrB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC;wBAC9B,CAAC,CAAC,aAAa;wBACf,CAAC,CAAC,SAAS;oBACnB,UAAU;oBACV,aAAa;iBAChB,CAAA;YACL,CAAC,CAAC;SACL,CAAC,CAAC;QACH,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI;QAC9B,WAAW,EAAE,IAAI,CAAC,GAAG,CACjB,CAAC,EACD,KAAK,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,YAAY,CACtD;QACD,QAAQ;KACX,CAAA;AACL,CAAC","sourcesContent":["import type { RowData } from '@tanstack/react-table'\nimport type {\n RentnerTableInstance,\n TableColumn,\n TableHeaderState,\n TableLogicResult,\n TableMessages,\n} from '../../shared/Table/Types/table.types.ts'\nimport type { TableColumnInstance } from '../../shared/Table/Types/dataTable.types.ts'\n\nexport function getColumnLabel<TData extends RowData>(\n column: TableColumnInstance<TData>,\n): string {\n return (\n column.columnDef.meta?.label ??\n (typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id)\n )\n}\n\nexport function prepareTableColumns<TData extends RowData>(\n columns: readonly TableColumn<TData>[],\n): TableColumn<TData>[] {\n return columns.map((column) => {\n const kind = column.meta?.filter?.type\n let filterFn: 'text' | 'equals' | 'dateRange' = 'text'\n if (kind === 'select') filterFn = 'equals'\n if (kind === 'dateRange') filterFn = 'dateRange'\n return {\n ...column,\n filterFn: column.filterFn ?? filterFn,\n ...('columns' in column && column.columns\n ? { columns: prepareTableColumns(column.columns) }\n : {}),\n }\n })\n}\n\nexport function getTableView<TData extends RowData>(\n table: RentnerTableInstance<TData>,\n messages: TableMessages,\n extraColumns = 0,\n): TableLogicResult<TData>['state'] {\n return {\n headerGroups: table.getHeaderGroups().map((group) => ({\n id: group.id,\n headers: group.headers.map((header): TableHeaderState<TData> => {\n const sorted = header.column.getIsSorted()\n const next = header.column.getNextSortingOrder()\n let sortDirection: TableHeaderState<TData>['sortDirection']\n let sortIndicator = '↕'\n let sortAction = messages.clearSorting\n if (sorted === 'asc') {\n sortDirection = 'ascending'\n sortIndicator = '↑'\n }\n if (sorted === 'desc') {\n sortDirection = 'descending'\n sortIndicator = '↓'\n }\n if (next === 'asc') sortAction = messages.sortAscending\n if (next === 'desc') sortAction = messages.sortDescending\n return {\n header,\n canSort:\n !header.isPlaceholder && header.column.getCanSort(),\n sortDirection:\n !header.isPlaceholder &&\n header.column.getSortIndex() === 0\n ? sortDirection\n : undefined,\n sortAction,\n sortIndicator,\n }\n }),\n })),\n rows: table.getRowModel().rows,\n columnCount: Math.max(\n 1,\n table.getVisibleLeafColumns().length + extraColumns,\n ),\n messages,\n }\n}\n"]}