@alveole/components 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/generated/version.d.ts +1 -1
  2. package/dist/generated/version.d.ts.map +1 -1
  3. package/dist/generated/version.js +1 -1
  4. package/dist/stories/index.d.ts +1 -0
  5. package/dist/stories/index.d.ts.map +1 -1
  6. package/dist/stories/index.js +1 -0
  7. package/dist/ui/ActionMenu/ActionMenu.stories.d.ts +1 -0
  8. package/dist/ui/ActionMenu/ActionMenu.stories.d.ts.map +1 -1
  9. package/dist/ui/ActionMenu/ActionMenu.stories.js +2 -1
  10. package/dist/ui/Button/Button.d.ts +4 -2
  11. package/dist/ui/Button/Button.d.ts.map +1 -1
  12. package/dist/ui/Button/Button.js +19 -10
  13. package/dist/ui/Button/Button.stories.d.ts +6 -1
  14. package/dist/ui/Button/Button.stories.d.ts.map +1 -1
  15. package/dist/ui/Button/Button.stories.js +2 -0
  16. package/dist/ui/Button/Button.stories.sources.d.ts +2 -0
  17. package/dist/ui/Button/Button.stories.sources.d.ts.map +1 -1
  18. package/dist/ui/Button/Button.stories.sources.js +3 -0
  19. package/dist/ui/Button/Button.styles.d.ts +3 -0
  20. package/dist/ui/Button/Button.styles.d.ts.map +1 -1
  21. package/dist/ui/Button/Button.styles.js +3 -0
  22. package/dist/ui/Checkbox/Checkbox.d.ts +2 -1
  23. package/dist/ui/Checkbox/Checkbox.d.ts.map +1 -1
  24. package/dist/ui/Checkbox/Checkbox.js +3 -4
  25. package/dist/ui/Checkbox/Checkbox.stories.d.ts +3 -2
  26. package/dist/ui/Checkbox/Checkbox.stories.d.ts.map +1 -1
  27. package/dist/ui/Checkbox/Checkbox.stories.js +1 -1
  28. package/dist/ui/Checkbox/Checkbox.stories.sources.d.ts +2 -2
  29. package/dist/ui/Checkbox/Checkbox.stories.sources.d.ts.map +1 -1
  30. package/dist/ui/Checkbox/Checkbox.stories.sources.js +2 -2
  31. package/dist/ui/Checkbox/Checkbox.utils.d.ts +5 -0
  32. package/dist/ui/Checkbox/Checkbox.utils.d.ts.map +1 -0
  33. package/dist/ui/Checkbox/Checkbox.utils.js +7 -0
  34. package/dist/ui/Checkbox/CheckboxContainer.d.ts +7 -2
  35. package/dist/ui/Checkbox/CheckboxContainer.d.ts.map +1 -1
  36. package/dist/ui/Checkbox/CheckboxContainer.js +4 -2
  37. package/dist/ui/Checkbox/CheckboxIndicator.d.ts +4 -1
  38. package/dist/ui/Checkbox/CheckboxIndicator.d.ts.map +1 -1
  39. package/dist/ui/Checkbox/CheckboxIndicator.js +5 -3
  40. package/dist/ui/Checkbox/CheckboxLabel.d.ts +4 -1
  41. package/dist/ui/Checkbox/CheckboxLabel.d.ts.map +1 -1
  42. package/dist/ui/Checkbox/CheckboxLabel.js +4 -2
  43. package/dist/ui/DataTable/DataTable.d.ts +27 -0
  44. package/dist/ui/DataTable/DataTable.d.ts.map +1 -0
  45. package/dist/ui/DataTable/DataTable.js +58 -0
  46. package/dist/ui/DataTable/DataTable.stories.d.ts +205 -0
  47. package/dist/ui/DataTable/DataTable.stories.d.ts.map +1 -0
  48. package/dist/ui/DataTable/DataTable.stories.js +499 -0
  49. package/dist/ui/DataTable/DataTable.stories.sources.d.ts +25 -0
  50. package/dist/ui/DataTable/DataTable.stories.sources.d.ts.map +1 -0
  51. package/dist/ui/DataTable/DataTable.stories.sources.js +27 -0
  52. package/dist/ui/DataTable/DataTable.styles.d.ts +175 -0
  53. package/dist/ui/DataTable/DataTable.styles.d.ts.map +1 -0
  54. package/dist/ui/DataTable/DataTable.styles.js +163 -0
  55. package/dist/ui/DataTable/DataTable.types.d.ts +20 -0
  56. package/dist/ui/DataTable/DataTable.types.d.ts.map +1 -0
  57. package/dist/ui/DataTable/DataTable.types.js +1 -0
  58. package/dist/ui/DataTable/DataTableCell.d.ts +12 -0
  59. package/dist/ui/DataTable/DataTableCell.d.ts.map +1 -0
  60. package/dist/ui/DataTable/DataTableCell.js +18 -0
  61. package/dist/ui/DataTable/DataTableFooter.d.ts +8 -0
  62. package/dist/ui/DataTable/DataTableFooter.d.ts.map +1 -0
  63. package/dist/ui/DataTable/DataTableFooter.js +26 -0
  64. package/dist/ui/DataTable/DataTableHeaderCell.d.ts +9 -0
  65. package/dist/ui/DataTable/DataTableHeaderCell.d.ts.map +1 -0
  66. package/dist/ui/DataTable/DataTableHeaderCell.js +12 -0
  67. package/dist/ui/DataTable/DataTablePagination.d.ts +12 -0
  68. package/dist/ui/DataTable/DataTablePagination.d.ts.map +1 -0
  69. package/dist/ui/DataTable/DataTablePagination.js +78 -0
  70. package/dist/ui/DataTable/DataTableRow.d.ts +16 -0
  71. package/dist/ui/DataTable/DataTableRow.d.ts.map +1 -0
  72. package/dist/ui/DataTable/DataTableRow.js +26 -0
  73. package/dist/ui/DataTable/index.d.ts +5 -0
  74. package/dist/ui/DataTable/index.d.ts.map +1 -0
  75. package/dist/ui/DataTable/index.js +4 -0
  76. package/dist/ui/index.d.ts +1 -0
  77. package/dist/ui/index.d.ts.map +1 -1
  78. package/dist/ui/index.js +1 -0
  79. package/package.json +7 -7
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { ScrollView } from 'react-native';
4
+ import { Box, Typography } from '../../core';
5
+ import { CheckboxContainer, CheckboxIndicator } from '../Checkbox';
6
+ import { useStyles } from './DataTable.styles';
7
+ import { DataTableHeaderCell } from './DataTableHeaderCell';
8
+ import { DataTableRow } from './DataTableRow';
9
+ const headerSelectionCellStyleBySize = {
10
+ sm: 'headerSelectionCellSm',
11
+ md: 'headerSelectionCellMd',
12
+ lg: 'headerSelectionCellLg',
13
+ };
14
+ const headerRowStyleBySize = {
15
+ sm: 'headerRowSm',
16
+ md: 'headerRowMd',
17
+ lg: 'headerRowLg',
18
+ };
19
+ export const DataTable = (props) => {
20
+ const { columns, data, keyExtractor, size = 'md', selectable = false, selectedKeys: controlledSelectedKeys, onSelectionChange, sort: controlledSort, onSortChange, onRowPress, hideHeader = false, renderNoContent, footer, } = props;
21
+ const styles = useStyles();
22
+ const [internalSelectedKeys, setInternalSelectedKeys] = React.useState([]);
23
+ const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys;
24
+ const setSelectedKeys = (keys) => {
25
+ onSelectionChange?.(keys);
26
+ if (controlledSelectedKeys === undefined)
27
+ setInternalSelectedKeys(keys);
28
+ };
29
+ const [internalSort, setInternalSort] = React.useState(null);
30
+ const sort = controlledSort !== undefined ? controlledSort : internalSort;
31
+ const setSort = (next) => {
32
+ onSortChange?.(next);
33
+ if (controlledSort === undefined)
34
+ setInternalSort(next);
35
+ };
36
+ const rowKeys = React.useMemo(() => data.map((row, index) => keyExtractor(row, index)), [data, keyExtractor]);
37
+ const allSelected = selectable && rowKeys.length > 0 && rowKeys.every(key => selectedKeys.includes(key));
38
+ const someSelected = selectable && !allSelected && rowKeys.some(key => selectedKeys.includes(key));
39
+ const toggleAll = () => setSelectedKeys(allSelected ? [] : rowKeys);
40
+ const toggleRow = (rowKey, checked) => {
41
+ setSelectedKeys(checked ? [...selectedKeys, rowKey] : selectedKeys.filter(key => key !== rowKey));
42
+ };
43
+ const handleHeaderPress = (column) => {
44
+ if (sort?.columnId !== column.id) {
45
+ setSort({ columnId: column.id, direction: 'asc' });
46
+ }
47
+ else if (sort.direction === 'asc') {
48
+ setSort({ columnId: column.id, direction: 'desc' });
49
+ }
50
+ else {
51
+ setSort(null);
52
+ }
53
+ };
54
+ return (_jsxs(Box, { tag: "data-table", style: styles.table, children: [_jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: true, contentContainerStyle: styles.scrollContent, children: [!hideHeader && (_jsxs(Box, { tag: "data-table-header-row", style: [styles.headerRow, styles[headerRowStyleBySize[size]]], children: [selectable && (_jsx(Box, { tag: "data-table-header-selection-cell", style: [styles.headerSelectionCell, styles[headerSelectionCellStyleBySize[size]]], children: _jsx(CheckboxContainer, { id: "data-table--select-all", variant: "small", checked: someSelected ? 'indeterminate' : allSelected, onCheckedChange: toggleAll, children: _jsx(CheckboxIndicator, { variant: "small", indeterminate: someSelected }) }) })), columns.map(column => (_jsx(DataTableHeaderCell, { column: column, sortDirection: sort?.columnId === column.id ? sort.direction : undefined, size: size, onPress: () => handleHeaderPress(column) }, column.id)))] })), data.map((row, index) => {
55
+ const rowKey = rowKeys[index];
56
+ return (_jsx(DataTableRow, { row: row, rowIndex: index, rowKey: rowKey, columns: columns, selectable: selectable, selected: selectedKeys.includes(rowKey), size: size, noBorderBottom: !footer && index === data.length - 1, onSelectedChange: checked => toggleRow(rowKey, checked), onPress: onRowPress ? () => onRowPress(row, index) : undefined }, rowKey));
57
+ })] }), data.length === 0 && (_jsx(Box, { tag: "data-table-empty", style: styles.emptyState, children: renderNoContent ? renderNoContent() : _jsx(Typography, { style: styles.emptyStateLabel, children: "Aucune donn\u00E9e" }) })), footer] }));
58
+ };
@@ -0,0 +1,205 @@
1
+ import React from 'react';
2
+ declare const _default: {
3
+ title: string;
4
+ tags: "ui"[];
5
+ experimental: false;
6
+ figmaURL: string;
7
+ description: string;
8
+ shortDescription: string;
9
+ component: <Row>(props: import("./DataTable").DataTableProps<Row>) => React.JSX.Element;
10
+ styleFn: () => {
11
+ table: {
12
+ display: "flex";
13
+ flexDirection: "column";
14
+ borderWidth: number;
15
+ borderColor: string;
16
+ borderRadius: import("@alveole/theme").Radius;
17
+ overflow: "hidden";
18
+ backgroundColor: string;
19
+ };
20
+ scrollContent: {
21
+ display: "flex";
22
+ flexDirection: "column";
23
+ flexGrow: number;
24
+ minWidth: string;
25
+ };
26
+ headerRow: {
27
+ display: "flex";
28
+ flexDirection: "row";
29
+ alignItems: "stretch";
30
+ backgroundColor: string;
31
+ borderBottomWidth: number;
32
+ borderBottomColor: string;
33
+ };
34
+ headerRowSm: {
35
+ minHeight: number;
36
+ };
37
+ headerRowMd: {
38
+ minHeight: number;
39
+ };
40
+ headerRowLg: {
41
+ minHeight: number;
42
+ };
43
+ headerCell: {
44
+ display: "flex";
45
+ flexDirection: "row";
46
+ alignItems: "center";
47
+ gap: string | number;
48
+ };
49
+ headerCellSm: {
50
+ paddingLeft: string | number;
51
+ paddingRight: string | number;
52
+ };
53
+ headerCellMd: {
54
+ paddingLeft: string | number;
55
+ paddingRight: string | number;
56
+ };
57
+ headerCellLg: {
58
+ paddingLeft: string | number;
59
+ paddingRight: string | number;
60
+ };
61
+ headerLabel: {
62
+ color: string;
63
+ fontSize: 12;
64
+ lineHeight: 20;
65
+ letterSpacing: 0;
66
+ fontFamily: string;
67
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
68
+ };
69
+ headerLabelActive: {
70
+ color: string;
71
+ };
72
+ headerSelectionCell: {
73
+ display: "flex";
74
+ flexDirection: "row";
75
+ alignItems: "center";
76
+ justifyContent: "center";
77
+ };
78
+ headerSelectionCellSm: {
79
+ width: number;
80
+ paddingLeft: string | number;
81
+ paddingRight: string | number;
82
+ };
83
+ headerSelectionCellMd: {
84
+ width: number;
85
+ paddingLeft: string | number;
86
+ paddingRight: string | number;
87
+ };
88
+ headerSelectionCellLg: {
89
+ width: number;
90
+ paddingLeft: string | number;
91
+ paddingRight: string | number;
92
+ };
93
+ row: {
94
+ display: "flex";
95
+ flexDirection: "row";
96
+ alignItems: "stretch";
97
+ backgroundColor: string;
98
+ borderBottomWidth: number;
99
+ borderBottomColor: string;
100
+ };
101
+ rowSm: {
102
+ minHeight: number;
103
+ };
104
+ rowMd: {
105
+ minHeight: number;
106
+ };
107
+ rowLg: {
108
+ minHeight: number;
109
+ };
110
+ rowHoverable: {
111
+ cursor: "pointer";
112
+ };
113
+ rowHover: {
114
+ backgroundColor: string;
115
+ };
116
+ rowSelected: {
117
+ backgroundColor: string;
118
+ };
119
+ cell: {
120
+ display: "flex";
121
+ flexDirection: "row";
122
+ alignItems: "center";
123
+ minWidth: number;
124
+ };
125
+ cellSm: {
126
+ paddingLeft: string | number;
127
+ paddingRight: string | number;
128
+ };
129
+ cellMd: {
130
+ paddingLeft: string | number;
131
+ paddingRight: string | number;
132
+ };
133
+ cellLg: {
134
+ paddingLeft: string | number;
135
+ paddingRight: string | number;
136
+ };
137
+ cellAlignEnd: {
138
+ justifyContent: "flex-end";
139
+ };
140
+ cellText: {
141
+ color: string;
142
+ fontSize: 14;
143
+ lineHeight: 20;
144
+ letterSpacing: 0;
145
+ fontFamily: string;
146
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
147
+ };
148
+ selectionCell: {
149
+ display: "flex";
150
+ flexDirection: "row";
151
+ alignItems: "center";
152
+ justifyContent: "center";
153
+ };
154
+ selectionCellSm: {
155
+ width: number;
156
+ paddingLeft: string | number;
157
+ paddingRight: string | number;
158
+ };
159
+ selectionCellMd: {
160
+ width: number;
161
+ paddingLeft: string | number;
162
+ paddingRight: string | number;
163
+ };
164
+ selectionCellLg: {
165
+ width: number;
166
+ paddingLeft: string | number;
167
+ paddingRight: string | number;
168
+ };
169
+ emptyState: {
170
+ display: "flex";
171
+ alignItems: "center";
172
+ justifyContent: "center";
173
+ padding: string | number;
174
+ };
175
+ emptyStateLabel: {
176
+ color: string;
177
+ fontSize: 14;
178
+ lineHeight: 20;
179
+ letterSpacing: 0;
180
+ fontFamily: string;
181
+ fontWeight?: import("react-native").TextStyle["fontWeight"];
182
+ };
183
+ };
184
+ };
185
+ export default _default;
186
+ export declare const Default: () => React.JSX.Element;
187
+ export declare const WithSelection: () => React.JSX.Element;
188
+ export declare const Sizes: () => React.JSX.Element;
189
+ export declare const ManyColumns: () => React.JSX.Element;
190
+ export declare const WithSorting: () => React.JSX.Element;
191
+ export declare const WithCustomCells: () => React.JSX.Element;
192
+ export declare const WithoutHeader: () => React.JSX.Element;
193
+ export declare const WithPagination: () => React.JSX.Element;
194
+ /**
195
+ * Reproduction de la vue "Deployments" de Vercel avec nos composants : `Tag` pour les pastilles
196
+ * d'environnement, `Badge` pour le statut, `Avatar` pour l'auteur, `ActionMenu` pour le menu contextuel
197
+ * "..." de chaque ligne, et `Popover` sur la date pour afficher le détail (temps relatif + horodatage
198
+ * UTC et fuseau local), comme chez Vercel. Le pied de page est ici un simple slot `footer` (pas
199
+ * `DataTableFooter`, qui sert au duo compteur+pagination) : un bouton pleine largeur, puis une note de
200
+ * rétention accompagnée d'une action.
201
+ */
202
+ export declare const AsDeploymentList: () => React.JSX.Element;
203
+ export declare const Empty: () => React.JSX.Element;
204
+ export * as Sources from './DataTable.stories.sources';
205
+ //# sourceMappingURL=DataTable.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.stories.d.ts","sourceRoot":"","sources":["../../../src/ui/DataTable/DataTable.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiB1B,wBAiBkB;AA+ElB,eAAO,MAAM,OAAO,yBAA+F,CAAC;AAEpH,eAAO,MAAM,aAAa,yBAEzB,CAAC;AAEF,eAAO,MAAM,KAAK,yBAejB,CAAC;AAgNF,eAAO,MAAM,WAAW,yBAEvB,CAAC;AAEF,eAAO,MAAM,WAAW,yBAsBvB,CAAC;AAEF,eAAO,MAAM,eAAe,yBAmC3B,CAAC;AAEF,eAAO,MAAM,aAAa,yBAEzB,CAAC;AAEF,eAAO,MAAM,cAAc,yBAe1B,CAAC;AAuLF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,yBAkH5B,CAAC;AAEF,eAAO,MAAM,KAAK,yBAajB,CAAC;AAEF,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC"}