@addev-be/ui 0.10.12 → 0.11.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.
- package/package.json +1 -1
- package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +14 -3
- package/src/components/data/DataGrid/DataGridFooter.tsx +2 -1
- package/src/components/data/DataGrid/DataGridHeader.tsx +21 -19
- package/src/components/data/DataGrid/DataGridHeaderCell.tsx +7 -5
- package/src/components/data/DataGrid/constants.ts +6 -0
- package/src/components/data/DataGrid/hooks/useDataGrid.tsx +5 -2
- package/src/components/data/DataGrid/index.tsx +19 -1
- package/src/components/data/DataGrid/styles.ts +54 -11
- package/src/components/data/DataGrid/types.ts +1 -0
- package/src/components/data/SqlRequestDataGrid/index.tsx +2 -2
- package/src/components/data/VirtualScroller/index.tsx +2 -2
- package/src/components/data/VirtualScroller/styles.ts +0 -2
package/package.json
CHANGED
|
@@ -87,9 +87,20 @@ export const FilterValuesScroller = ({
|
|
|
87
87
|
() => getCheckboxes(values, '', renderer, formatter, groups),
|
|
88
88
|
[values, groups, renderer, formatter]
|
|
89
89
|
);
|
|
90
|
-
const visibleCheckboxes =
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
const visibleCheckboxes = useMemo(
|
|
91
|
+
() => [
|
|
92
|
+
{
|
|
93
|
+
title: 'Sélectionner tout',
|
|
94
|
+
values: checkboxes.map((checkbox) => checkbox.values).flat(),
|
|
95
|
+
displayValue: 'Sélectionner tout',
|
|
96
|
+
level: 0,
|
|
97
|
+
},
|
|
98
|
+
...checkboxes.slice(
|
|
99
|
+
Math.max(0, index - tolerance),
|
|
100
|
+
index + length + 1 + tolerance
|
|
101
|
+
),
|
|
102
|
+
],
|
|
103
|
+
[checkboxes, index, length, tolerance]
|
|
93
104
|
);
|
|
94
105
|
const firstCheckboxTop = Math.max(0, index - tolerance) * rowHeight;
|
|
95
106
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import * as styles from './styles';
|
|
5
5
|
|
|
6
|
+
import { DEFAULT_COLUMN_WIDTH } from './constants';
|
|
6
7
|
import { DataGridContext } from './types';
|
|
7
8
|
import { useDataGridContext } from './hooks';
|
|
8
9
|
|
|
@@ -32,7 +33,7 @@ export const DataGridFooter = <R,>({
|
|
|
32
33
|
{visibleColumns.map(([key, col]) => (
|
|
33
34
|
<styles.DataGridHeaderCellContainer
|
|
34
35
|
key={key}
|
|
35
|
-
style={{ width: (col.width ??
|
|
36
|
+
style={{ width: (col.width ?? DEFAULT_COLUMN_WIDTH) + 'px' }}
|
|
36
37
|
>
|
|
37
38
|
{footerFunctions?.[key]?.(rows, sortedRows, selectedRows)}
|
|
38
39
|
</styles.DataGridHeaderCellContainer>
|
|
@@ -69,27 +69,29 @@ export const DataGridHeader = <R,>({
|
|
|
69
69
|
|
|
70
70
|
const toolsRow = (
|
|
71
71
|
<styles.DataGridToolsRow>
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<
|
|
76
|
-
|
|
72
|
+
<styles.DataGridToolsRowButtonsContainer>
|
|
73
|
+
<Loading visible={isLoadingVisible} />
|
|
74
|
+
{refresh && (
|
|
75
|
+
<Button size="small" onClick={refresh}>
|
|
76
|
+
<ArrowsRotateIcon />
|
|
77
|
+
Rafraîchir
|
|
78
|
+
</Button>
|
|
79
|
+
)}
|
|
80
|
+
<Button $color="emerald" size="small" onClick={runCopyTable}>
|
|
81
|
+
<CopyIcon />
|
|
82
|
+
Copier la table
|
|
77
83
|
</Button>
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
Copier la table
|
|
82
|
-
</Button>
|
|
83
|
-
<Button size="small" $color="danger" onClick={() => setFilters({})}>
|
|
84
|
-
<FilterSlashIcon />
|
|
85
|
-
Supprimer les filtres
|
|
86
|
-
</Button>
|
|
87
|
-
{name && (
|
|
88
|
-
<Button $color="info" size="small" onClick={openModal}>
|
|
89
|
-
<TableColumnsIcon />
|
|
90
|
-
Paramètres des colonnes
|
|
84
|
+
<Button size="small" $color="danger" onClick={() => setFilters({})}>
|
|
85
|
+
<FilterSlashIcon />
|
|
86
|
+
Supprimer les filtres
|
|
91
87
|
</Button>
|
|
92
|
-
|
|
88
|
+
{name && (
|
|
89
|
+
<Button $color="info" size="small" onClick={openModal}>
|
|
90
|
+
<TableColumnsIcon />
|
|
91
|
+
Paramètres des colonnes
|
|
92
|
+
</Button>
|
|
93
|
+
)}
|
|
94
|
+
</styles.DataGridToolsRowButtonsContainer>
|
|
93
95
|
</styles.DataGridToolsRow>
|
|
94
96
|
);
|
|
95
97
|
|
|
@@ -6,12 +6,13 @@ import * as styles from './styles';
|
|
|
6
6
|
import { MouseEvent, useCallback, useMemo, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { ChevronDownIcon } from '../../../Icons';
|
|
9
|
-
import {
|
|
10
|
-
import { IconButton } from '../../forms/IconButton';
|
|
11
|
-
import { Dropdown } from '../../layout';
|
|
9
|
+
import { DEFAULT_COLUMN_WIDTH } from './constants';
|
|
12
10
|
import { DataGridFilterMenu } from './DataGridFilterMenu';
|
|
13
|
-
import { useDataGridContext } from './hooks';
|
|
14
11
|
import { DataGridHeaderCellProps } from './types';
|
|
12
|
+
import { Dropdown } from '../../layout';
|
|
13
|
+
import { IconButton } from '../../forms/IconButton';
|
|
14
|
+
import { useDataGridContext } from './hooks';
|
|
15
|
+
import { useUi } from '../../../providers';
|
|
15
16
|
|
|
16
17
|
export const DataGridHeaderCell = <R,>({
|
|
17
18
|
columnKey,
|
|
@@ -36,7 +37,8 @@ export const DataGridHeaderCell = <R,>({
|
|
|
36
37
|
|
|
37
38
|
const onResizeStart = useCallback(
|
|
38
39
|
(e: MouseEvent) => {
|
|
39
|
-
resizingOffset.current =
|
|
40
|
+
resizingOffset.current =
|
|
41
|
+
e.screenX - (column.width || DEFAULT_COLUMN_WIDTH);
|
|
40
42
|
setIsResizing(true);
|
|
41
43
|
},
|
|
42
44
|
[column.width]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
|
|
4
|
+
import { DEFAULT_COLUMN_WIDTH, SELECTION_CELL_WIDTH } from '../constants';
|
|
4
5
|
import {
|
|
5
6
|
DataGridColumns,
|
|
6
7
|
DataGridContext,
|
|
@@ -58,8 +59,10 @@ export const useDataGrid = <R,>(
|
|
|
58
59
|
const gridTemplateColumns = useMemo(
|
|
59
60
|
() =>
|
|
60
61
|
[
|
|
61
|
-
...(selectable ? [
|
|
62
|
-
...visibleColumns.map(
|
|
62
|
+
...(selectable ? [SELECTION_CELL_WIDTH] : []),
|
|
63
|
+
...visibleColumns.map(
|
|
64
|
+
([, col]) => `${col.width ?? DEFAULT_COLUMN_WIDTH}px`
|
|
65
|
+
),
|
|
63
66
|
].join(' '),
|
|
64
67
|
[selectable, visibleColumns]
|
|
65
68
|
);
|
|
@@ -5,8 +5,14 @@ import {
|
|
|
5
5
|
ForwardedRef,
|
|
6
6
|
forwardRef,
|
|
7
7
|
useImperativeHandle,
|
|
8
|
+
useMemo,
|
|
8
9
|
useRef,
|
|
9
10
|
} from 'react';
|
|
11
|
+
import {
|
|
12
|
+
DEFAULT_COLUMN_WIDTH,
|
|
13
|
+
DEFAULT_ROW_HEIGHT,
|
|
14
|
+
SELECTION_CELL_WIDTH,
|
|
15
|
+
} from './constants';
|
|
10
16
|
import { DataGridContextProps, DataGridProps, DataGridRefProps } from './types';
|
|
11
17
|
|
|
12
18
|
import { DataGridFooter } from './DataGridFooter';
|
|
@@ -32,6 +38,7 @@ export const DataGridInner = <R,>(
|
|
|
32
38
|
const [contextProps, DataGridContext] = useDataGrid(props, contextOverride);
|
|
33
39
|
const {
|
|
34
40
|
columns,
|
|
41
|
+
selectable,
|
|
35
42
|
rowHeight = 32,
|
|
36
43
|
headerRowHeight = 40,
|
|
37
44
|
gridTemplateColumns,
|
|
@@ -39,6 +46,7 @@ export const DataGridInner = <R,>(
|
|
|
39
46
|
onVisibleRowsChange,
|
|
40
47
|
refresh,
|
|
41
48
|
setSelectedKeys,
|
|
49
|
+
fixedColumnsCount,
|
|
42
50
|
} = contextProps;
|
|
43
51
|
|
|
44
52
|
useImperativeHandle(
|
|
@@ -51,6 +59,15 @@ export const DataGridInner = <R,>(
|
|
|
51
59
|
);
|
|
52
60
|
|
|
53
61
|
const hasFooter = Object.values(columns).some((col) => col.footer);
|
|
62
|
+
const fixedColumnWidths = useMemo(
|
|
63
|
+
() => [
|
|
64
|
+
...(selectable ? [SELECTION_CELL_WIDTH] : []),
|
|
65
|
+
...Object.values(columns)
|
|
66
|
+
.slice(0, fixedColumnsCount ?? 0)
|
|
67
|
+
.map((col) => col.width ?? DEFAULT_COLUMN_WIDTH),
|
|
68
|
+
],
|
|
69
|
+
[columns, fixedColumnsCount, selectable]
|
|
70
|
+
);
|
|
54
71
|
|
|
55
72
|
const rowTemplate = DataGridRowTemplate;
|
|
56
73
|
|
|
@@ -63,6 +80,7 @@ export const DataGridInner = <R,>(
|
|
|
63
80
|
$rowsCount={contextProps.sortedRows.length}
|
|
64
81
|
$withFooter={hasFooter}
|
|
65
82
|
className={className}
|
|
83
|
+
$fixedColumnWidths={fixedColumnWidths}
|
|
66
84
|
>
|
|
67
85
|
<DataGridHeader context={DataGridContext} />
|
|
68
86
|
<VirtualScroller<R, { context: Context<DataGridContextProps<R>> }>
|
|
@@ -71,7 +89,7 @@ export const DataGridInner = <R,>(
|
|
|
71
89
|
items={sortedRows}
|
|
72
90
|
itemTemplate={rowTemplate}
|
|
73
91
|
itemProps={{ context: DataGridContext }}
|
|
74
|
-
rowHeightInPx={
|
|
92
|
+
rowHeightInPx={DEFAULT_ROW_HEIGHT}
|
|
75
93
|
onRangeChanged={onVisibleRowsChange}
|
|
76
94
|
/>
|
|
77
95
|
{hasFooter && <DataGridFooter context={DataGridContext} />}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_FOOTER_ROW_HEIGHT,
|
|
3
|
+
DEFAULT_HEADER_ROW_HEIGHT,
|
|
4
|
+
DEFAULT_ROW_HEIGHT,
|
|
5
|
+
SELECTION_CELL_WIDTH,
|
|
6
|
+
TOOLBAR_HEIGHT,
|
|
7
|
+
} from './constants';
|
|
1
8
|
import styled, { css } from 'styled-components';
|
|
2
9
|
|
|
3
10
|
import { ThemeColor } from '../../../providers/ThemeProvider/types';
|
|
4
11
|
import { VirtualScrollerFiller } from '../VirtualScroller/styles';
|
|
5
12
|
|
|
6
|
-
export const TOOLBAR_HEIGHT = 40;
|
|
7
|
-
export const DEFAULT_HEADER_ROW_HEIGHT = 40;
|
|
8
|
-
export const DEFAULT_FOOTER_ROW_HEIGHT = 40;
|
|
9
|
-
export const DEFAULT_ROW_HEIGHT = 32;
|
|
10
|
-
|
|
11
13
|
export const DataGridResizeGrip = styled.div<{ $headerColor?: ThemeColor }>`
|
|
12
14
|
position: absolute;
|
|
13
15
|
top: 0;
|
|
@@ -120,16 +122,20 @@ export const DataGridToolsRow = styled.div`
|
|
|
120
122
|
grid-column-end: -1;
|
|
121
123
|
grid-row: 1;
|
|
122
124
|
display: flex;
|
|
123
|
-
gap: var(--space-1);
|
|
124
|
-
padding: 0 var(--space-1);
|
|
125
|
-
align-items: center;
|
|
126
125
|
background-color: var(--color-neutral-200);
|
|
127
126
|
position: sticky;
|
|
128
127
|
top: 0;
|
|
129
|
-
left: 0;
|
|
130
128
|
z-index: 10;
|
|
131
129
|
`;
|
|
132
|
-
|
|
130
|
+
|
|
131
|
+
export const DataGridToolsRowButtonsContainer = styled.div`
|
|
132
|
+
display: inline-flex;
|
|
133
|
+
gap: var(--space-1);
|
|
134
|
+
align-items: center;
|
|
135
|
+
padding: 0 var(--space-1);
|
|
136
|
+
position: sticky;
|
|
137
|
+
left: 0;
|
|
138
|
+
`;
|
|
133
139
|
|
|
134
140
|
export const DataGridContainer = styled.div<{
|
|
135
141
|
$headerRowHeight?: number;
|
|
@@ -137,6 +143,7 @@ export const DataGridContainer = styled.div<{
|
|
|
137
143
|
$rowsCount: number;
|
|
138
144
|
$showToolsHeader?: boolean;
|
|
139
145
|
$withFooter?: boolean;
|
|
146
|
+
$fixedColumnWidths?: (string | number)[];
|
|
140
147
|
}>`
|
|
141
148
|
display: grid;
|
|
142
149
|
width: 100%;
|
|
@@ -168,6 +175,42 @@ export const DataGridContainer = styled.div<{
|
|
|
168
175
|
box-sizing: border-box;
|
|
169
176
|
}
|
|
170
177
|
|
|
178
|
+
${({ $fixedColumnWidths = [] }) =>
|
|
179
|
+
$fixedColumnWidths.map(
|
|
180
|
+
(width, i) => `
|
|
181
|
+
${DataGridHeaderCellContainer}:nth-child(${i + 1}) {
|
|
182
|
+
position: sticky;
|
|
183
|
+
left: ${
|
|
184
|
+
i === 0
|
|
185
|
+
? '0'
|
|
186
|
+
: `calc(${$fixedColumnWidths
|
|
187
|
+
.slice(0, i)
|
|
188
|
+
.map((w) => (typeof w === 'number' ? `${w}px` : w))
|
|
189
|
+
.join(' + ')})`
|
|
190
|
+
};
|
|
191
|
+
background-color: var(--color-neutral-200);
|
|
192
|
+
z-index: 1;
|
|
193
|
+
}`
|
|
194
|
+
)}
|
|
195
|
+
|
|
196
|
+
${({ $fixedColumnWidths = [] }) =>
|
|
197
|
+
$fixedColumnWidths.map(
|
|
198
|
+
(width, i) => `
|
|
199
|
+
${DataGridCell}:nth-child(${i + 1}) {
|
|
200
|
+
position: sticky;
|
|
201
|
+
left: ${
|
|
202
|
+
i === 0
|
|
203
|
+
? '0'
|
|
204
|
+
: `calc(${$fixedColumnWidths
|
|
205
|
+
.slice(0, i)
|
|
206
|
+
.map((w) => (typeof w === 'number' ? `${w}px` : w))
|
|
207
|
+
.join(' + ')})`
|
|
208
|
+
};
|
|
209
|
+
background-color: var(--color-neutral-50);
|
|
210
|
+
z-index: 1;
|
|
211
|
+
}`
|
|
212
|
+
)}
|
|
213
|
+
|
|
171
214
|
${VirtualScrollerFiller} {
|
|
172
215
|
grid-column-start: 1;
|
|
173
216
|
grid-column-end: -1;
|
|
@@ -254,7 +297,7 @@ const selectionCellStyle = css`
|
|
|
254
297
|
|
|
255
298
|
& > input[type='checkbox'] {
|
|
256
299
|
height: var(--space-4);
|
|
257
|
-
width:
|
|
300
|
+
width: ${SELECTION_CELL_WIDTH};
|
|
258
301
|
border-radius: var(--rounded-sm);
|
|
259
302
|
border: 1px solid var(--color-neutral-300);
|
|
260
303
|
color: var(--color-primary-600);
|
|
@@ -122,7 +122,7 @@ export const SqlRequestDataGridInner = <R,>(
|
|
|
122
122
|
conditions: ConditionDTO[] = [],
|
|
123
123
|
orderBy: OrderByDTO[] = [],
|
|
124
124
|
start = 0,
|
|
125
|
-
length =
|
|
125
|
+
length = 0,
|
|
126
126
|
getCount = false
|
|
127
127
|
) => {
|
|
128
128
|
sqlRequest({
|
|
@@ -136,7 +136,7 @@ export const SqlRequestDataGridInner = <R,>(
|
|
|
136
136
|
conditions,
|
|
137
137
|
orderBy,
|
|
138
138
|
start,
|
|
139
|
-
length,
|
|
139
|
+
length: Math.max(length, 0),
|
|
140
140
|
getCount,
|
|
141
141
|
}).then((response) => {
|
|
142
142
|
if (getCount) {
|
|
@@ -11,7 +11,7 @@ type VirtualScrollerProps<R, P extends object> = {
|
|
|
11
11
|
gridTemplateColumns: string;
|
|
12
12
|
items: R[];
|
|
13
13
|
itemTemplate: VirtualScrollerTemplateFC<R, P>;
|
|
14
|
-
rowHeightInPx
|
|
14
|
+
rowHeightInPx: number;
|
|
15
15
|
gap?: string;
|
|
16
16
|
itemsPerRow?: number;
|
|
17
17
|
tolerance?: number;
|
|
@@ -23,7 +23,7 @@ type VirtualScrollerProps<R, P extends object> = {
|
|
|
23
23
|
export const VirtualScroller = <R, P extends object>({
|
|
24
24
|
gridTemplateColumns,
|
|
25
25
|
items,
|
|
26
|
-
rowHeightInPx
|
|
26
|
+
rowHeightInPx,
|
|
27
27
|
itemTemplate: ItemTemplate,
|
|
28
28
|
itemProps,
|
|
29
29
|
onRangeChanged,
|