@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@addev-be/ui",
3
- "version": "0.10.12",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -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 = checkboxes.slice(
91
- Math.max(0, index - tolerance),
92
- index + length + 1 + tolerance
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 ?? 150) + 'px' }}
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
- <Loading visible={isLoadingVisible} />
73
- {refresh && (
74
- <Button size="small" onClick={refresh}>
75
- <ArrowsRotateIcon />
76
- Rafraîchir
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
- <Button $color="emerald" size="small" onClick={runCopyTable}>
80
- <CopyIcon />
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 { useUi } from '../../../providers';
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 = e.screenX - (column.width || 150);
40
+ resizingOffset.current =
41
+ e.screenX - (column.width || DEFAULT_COLUMN_WIDTH);
40
42
  setIsResizing(true);
41
43
  },
42
44
  [column.width]
@@ -0,0 +1,6 @@
1
+ export const TOOLBAR_HEIGHT = 40;
2
+ export const DEFAULT_HEADER_ROW_HEIGHT = 40;
3
+ export const DEFAULT_FOOTER_ROW_HEIGHT = 40;
4
+ export const DEFAULT_ROW_HEIGHT = 32;
5
+ export const SELECTION_CELL_WIDTH = 'var(--space-8)';
6
+ export const DEFAULT_COLUMN_WIDTH = 150;
@@ -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 ? ['var(--space-8)'] : []),
62
- ...visibleColumns.map(([, col]) => `${col.width ?? 150}px`),
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={styles.DEFAULT_ROW_HEIGHT}
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
- DataGridToolsRow.displayName = 'DataGridToolsRow';
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: var(--space-4);
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);
@@ -100,6 +100,7 @@ export type DataGridProps<R> = {
100
100
  loadCopyRows?: () => Promise<R[]>;
101
101
  refresh?: () => void;
102
102
  headerColor?: ThemeColor;
103
+ fixedColumnsCount?: number;
103
104
  };
104
105
 
105
106
  export type DataGridContextProps<R> = DataGridProps<R> & {
@@ -122,7 +122,7 @@ export const SqlRequestDataGridInner = <R,>(
122
122
  conditions: ConditionDTO[] = [],
123
123
  orderBy: OrderByDTO[] = [],
124
124
  start = 0,
125
- length = 100,
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?: number;
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 = styles.DEFAULT_ROW_HEIGHT,
26
+ rowHeightInPx,
27
27
  itemTemplate: ItemTemplate,
28
28
  itemProps,
29
29
  onRangeChanged,
@@ -1,7 +1,5 @@
1
1
  import styled from 'styled-components';
2
2
 
3
- export const DEFAULT_ROW_HEIGHT = 32;
4
-
5
3
  export const TopPaddingItem = styled.div``;
6
4
  export const BottomPaddingItem = styled.div``;
7
5