@addev-be/ui 0.6.10 → 0.6.12
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/helpers/columns.tsx +24 -0
- package/src/components/data/DataGrid/hooks/useDataGrid.tsx +5 -1
- package/src/components/data/DataGrid/index.tsx +30 -8
- package/src/components/data/DataGrid/types.ts +6 -0
- package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +25 -2
- package/src/components/data/SqlRequestDataGrid/index.tsx +31 -5
- package/src/components/data/SqlRequestGrid/index.tsx +39 -10
- package/src/components/data/SqlRequestGrid/types.ts +4 -0
- package/src/components/data/index.ts +6 -1
- package/src/components/layout/Modal/styles.ts +11 -0
- package/src/helpers/dates.ts +8 -0
- package/src/typings.d.ts +7 -0
package/package.json
CHANGED
|
@@ -90,6 +90,8 @@ export const dateColumn = <R extends Record<string, any>>(
|
|
|
90
90
|
name: title,
|
|
91
91
|
type: 'date',
|
|
92
92
|
render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
|
|
93
|
+
excelFormatter: () => 'dd/mm/yyyy',
|
|
94
|
+
excelValue: (date) => moment(date).format('DD/MM/YYYY') ?? '',
|
|
93
95
|
getter: (row) => row[key] ?? '',
|
|
94
96
|
sortGetter: (row) => row[key] ?? '',
|
|
95
97
|
footer: (_, filteredRows) => `${filteredRows.length} éléments`,
|
|
@@ -101,6 +103,28 @@ export const dateColumn = <R extends Record<string, any>>(
|
|
|
101
103
|
},
|
|
102
104
|
});
|
|
103
105
|
|
|
106
|
+
export const dateTimeColumn = <R extends Record<string, any>>(
|
|
107
|
+
key: string,
|
|
108
|
+
title: string,
|
|
109
|
+
options?: Partial<DataGridColumn<R>>
|
|
110
|
+
): DataGridColumns<R> => ({
|
|
111
|
+
[key]: {
|
|
112
|
+
name: title,
|
|
113
|
+
type: 'date',
|
|
114
|
+
render: (row) => moment(row[key]).format('DD/MM/YYYY HH:mm:ss') ?? '',
|
|
115
|
+
excelFormatter: () => 'dd/mm/yyyy hh:mm:ss',
|
|
116
|
+
excelValue: (date) => moment(date).format('DD/MM/YYYY HH:mm:ss') ?? '',
|
|
117
|
+
getter: (row) => row[key] ?? '',
|
|
118
|
+
sortGetter: (row) => row[key] ?? '',
|
|
119
|
+
footer: (_, filteredRows) => `${filteredRows.length} éléments`,
|
|
120
|
+
filter: {
|
|
121
|
+
...dateFilter(key),
|
|
122
|
+
renderer: (value) => moment(value).format('DD/MM/YYYY HH:mm:ss') ?? '',
|
|
123
|
+
},
|
|
124
|
+
...options,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
104
128
|
export const monthColumn = <R extends Record<string, any>>(
|
|
105
129
|
key: string,
|
|
106
130
|
title: string,
|
|
@@ -34,6 +34,7 @@ export const useDataGrid = <R,>(
|
|
|
34
34
|
onSortsChanged,
|
|
35
35
|
loadCopyRows,
|
|
36
36
|
onSelectionChange,
|
|
37
|
+
onSelectedRowsChanged,
|
|
37
38
|
selectable,
|
|
38
39
|
initialSorts,
|
|
39
40
|
} = props;
|
|
@@ -57,7 +58,7 @@ export const useDataGrid = <R,>(
|
|
|
57
58
|
const gridTemplateColumns = useMemo(
|
|
58
59
|
() =>
|
|
59
60
|
[
|
|
60
|
-
...(selectable ? ['var(--space-
|
|
61
|
+
...(selectable ? ['var(--space-8)'] : []),
|
|
61
62
|
...visibleColumns.map(([, col]) => `${col.width ?? 150}px`),
|
|
62
63
|
].join(' '),
|
|
63
64
|
[selectable, visibleColumns]
|
|
@@ -87,6 +88,9 @@ export const useDataGrid = <R,>(
|
|
|
87
88
|
useEffect(() => {
|
|
88
89
|
onSelectionChange?.(selectedKeys);
|
|
89
90
|
}, [onSelectionChange, selectedKeys]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
onSelectedRowsChanged?.(selectedRows);
|
|
93
|
+
}, [onSelectedRowsChanged, selectedRows]);
|
|
90
94
|
|
|
91
95
|
const toggleSelection = useCallback(
|
|
92
96
|
(key: string) => {
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import * as styles from './styles';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
Context,
|
|
5
|
+
ForwardedRef,
|
|
6
|
+
forwardRef,
|
|
7
|
+
useImperativeHandle,
|
|
8
|
+
useRef,
|
|
9
|
+
} from 'react';
|
|
10
|
+
import { DataGridContextProps, DataGridProps, DataGridRefProps } from './types';
|
|
5
11
|
|
|
6
12
|
import { DataGridFooter } from './DataGridFooter';
|
|
7
13
|
import { DataGridHeader } from './DataGridHeader';
|
|
@@ -12,12 +18,15 @@ import { useDataGrid } from './hooks';
|
|
|
12
18
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
19
|
/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
|
|
14
20
|
|
|
15
|
-
export const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
export const DataGridInner = <R,>(
|
|
22
|
+
{
|
|
23
|
+
contextOverride,
|
|
24
|
+
...props
|
|
25
|
+
}: DataGridProps<R> & {
|
|
26
|
+
contextOverride?: Partial<DataGridContextProps<R>>;
|
|
27
|
+
},
|
|
28
|
+
ref: ForwardedRef<DataGridRefProps<R>>
|
|
29
|
+
) => {
|
|
21
30
|
const scrollableRef = useRef<HTMLDivElement>(null);
|
|
22
31
|
const { className } = props;
|
|
23
32
|
const [contextProps, DataGridContext] = useDataGrid(props, contextOverride);
|
|
@@ -28,8 +37,19 @@ export const DataGrid = <R,>({
|
|
|
28
37
|
gridTemplateColumns,
|
|
29
38
|
sortedRows,
|
|
30
39
|
onVisibleRowsChange,
|
|
40
|
+
refresh,
|
|
41
|
+
setSelectedKeys,
|
|
31
42
|
} = contextProps;
|
|
32
43
|
|
|
44
|
+
useImperativeHandle(
|
|
45
|
+
ref,
|
|
46
|
+
() => ({
|
|
47
|
+
refresh,
|
|
48
|
+
setSelectedKeys,
|
|
49
|
+
}),
|
|
50
|
+
[refresh, setSelectedKeys]
|
|
51
|
+
);
|
|
52
|
+
|
|
33
53
|
const hasFooter = Object.values(columns).some((col) => col.footer);
|
|
34
54
|
|
|
35
55
|
const rowTemplate = DataGridRowTemplate;
|
|
@@ -58,3 +78,5 @@ export const DataGrid = <R,>({
|
|
|
58
78
|
</DataGridContext.Provider>
|
|
59
79
|
);
|
|
60
80
|
};
|
|
81
|
+
|
|
82
|
+
export const DataGrid = forwardRef(DataGridInner);
|
|
@@ -73,6 +73,7 @@ export type DataGridProps<R> = {
|
|
|
73
73
|
editable?: boolean;
|
|
74
74
|
onRowDoubleClick?: (row: R, e: MouseEvent) => void;
|
|
75
75
|
onSelectionChange?: (keys: string[]) => void;
|
|
76
|
+
onSelectedRowsChanged?: (rows: R[]) => void;
|
|
76
77
|
getAllIds?: () => Promise<string[]>;
|
|
77
78
|
onFiltersChanged?: (filters: DataGridFilters) => void;
|
|
78
79
|
onSortsChanged?: (sorts: Record<string, DataGridSort>) => void;
|
|
@@ -268,3 +269,8 @@ export type DataGridRowTemplateProps<R> = {
|
|
|
268
269
|
toggleSelection?: () => void;
|
|
269
270
|
context: DataGridContext<R>;
|
|
270
271
|
};
|
|
272
|
+
|
|
273
|
+
export type DataGridRefProps<R> = Pick<
|
|
274
|
+
DataGridContextProps<R>,
|
|
275
|
+
'refresh' | 'setSelectedKeys'
|
|
276
|
+
>;
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
numberFilter,
|
|
7
7
|
textFilter,
|
|
8
8
|
} from '../../DataGrid/helpers';
|
|
9
|
+
import { formatDate, formatDateTime } from '../../../../helpers/dates';
|
|
9
10
|
import {
|
|
10
11
|
formatMoney,
|
|
11
12
|
formatNumber,
|
|
@@ -13,8 +14,6 @@ import {
|
|
|
13
14
|
formatPercentage,
|
|
14
15
|
} from '../../../../helpers/numbers';
|
|
15
16
|
|
|
16
|
-
import { formatDate } from '../../../../helpers/dates';
|
|
17
|
-
|
|
18
17
|
export const sqlTextColumn = <R extends Record<string, any>>(
|
|
19
18
|
key: string,
|
|
20
19
|
title: string,
|
|
@@ -121,6 +120,30 @@ export const sqlDateColumn = <R extends Record<string, any>>(
|
|
|
121
120
|
},
|
|
122
121
|
});
|
|
123
122
|
|
|
123
|
+
export const sqlDateTimeColumn = <R extends Record<string, any>>(
|
|
124
|
+
key: string,
|
|
125
|
+
title: string,
|
|
126
|
+
options?: Partial<SqlRequestDataGridColumn<R>>
|
|
127
|
+
): SqlRequestDataGridColumns<R> => ({
|
|
128
|
+
[key]: {
|
|
129
|
+
name: title,
|
|
130
|
+
type: 'date',
|
|
131
|
+
render: (row) => formatDateTime(row[key]),
|
|
132
|
+
getter: (row) => row[key] ?? '',
|
|
133
|
+
sortGetter: (row) => row[key] ?? '',
|
|
134
|
+
excelFormatter: () => 'dd/mm/yyyy hh:mm:ss',
|
|
135
|
+
excelValue: (value) => formatDateTime(value, 'YYYY-MM-DD HH:mm:ss'),
|
|
136
|
+
filter: {
|
|
137
|
+
...textFilter(key),
|
|
138
|
+
getter: (value) => value[key] ?? '',
|
|
139
|
+
formatter: (value) => formatDateTime(value),
|
|
140
|
+
renderer: (value) => formatDateTime(value),
|
|
141
|
+
},
|
|
142
|
+
footer: (rows) => `${rows[0][key]} éléments`,
|
|
143
|
+
...options,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
|
|
124
147
|
export const sqlMonthColumn = <R extends Record<string, any>>(
|
|
125
148
|
key: string,
|
|
126
149
|
title: string,
|
|
@@ -8,20 +8,33 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
DataGridFilters,
|
|
10
10
|
DataGridFooterFunction,
|
|
11
|
+
DataGridRefProps,
|
|
11
12
|
DataGridSort,
|
|
12
13
|
} from '../DataGrid/types';
|
|
14
|
+
import {
|
|
15
|
+
ForwardedRef,
|
|
16
|
+
forwardRef,
|
|
17
|
+
useCallback,
|
|
18
|
+
useEffect,
|
|
19
|
+
useImperativeHandle,
|
|
20
|
+
useMemo,
|
|
21
|
+
useRef,
|
|
22
|
+
useState,
|
|
23
|
+
} from 'react';
|
|
13
24
|
import _, { debounce } from 'lodash';
|
|
14
|
-
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
15
25
|
|
|
16
26
|
import { DataGrid } from '../DataGrid';
|
|
17
27
|
import { SqlRequestDataGridProps } from './types';
|
|
18
28
|
import { convertSqlFiltersToConditions } from './helpers';
|
|
19
29
|
import { isColumnVisible } from '../DataGrid/helpers';
|
|
20
30
|
|
|
21
|
-
export const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
export const SqlRequestDataGridInner = <R,>(
|
|
32
|
+
{
|
|
33
|
+
onSelectionChange: onSelectionChangeFromProps,
|
|
34
|
+
...props
|
|
35
|
+
}: SqlRequestDataGridProps<R>,
|
|
36
|
+
ref: ForwardedRef<DataGridRefProps<R>>
|
|
37
|
+
) => {
|
|
25
38
|
const currentRows = useRef<R[]>([]);
|
|
26
39
|
const [rows, setRows] = useState<R[]>([]);
|
|
27
40
|
const [start, setStart] = useState(0);
|
|
@@ -30,6 +43,7 @@ export const SqlRequestDataGrid = <R,>({
|
|
|
30
43
|
const [sqlRequest, sqlIdRequest, sqlPartialRequest] = useSqlRequestHandler<R>(
|
|
31
44
|
props.type
|
|
32
45
|
);
|
|
46
|
+
const gridRef = useRef<DataGridRefProps<R>>(null);
|
|
33
47
|
|
|
34
48
|
const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
|
|
35
49
|
{}
|
|
@@ -331,8 +345,18 @@ export const SqlRequestDataGrid = <R,>({
|
|
|
331
345
|
[footers, setFooters, footerFunctions]
|
|
332
346
|
);
|
|
333
347
|
|
|
348
|
+
useImperativeHandle(
|
|
349
|
+
ref,
|
|
350
|
+
() => ({
|
|
351
|
+
refresh,
|
|
352
|
+
setSelectedKeys: gridRef.current?.setSelectedKeys ?? (() => {}),
|
|
353
|
+
}),
|
|
354
|
+
[refresh]
|
|
355
|
+
);
|
|
356
|
+
|
|
334
357
|
return (
|
|
335
358
|
<DataGrid
|
|
359
|
+
ref={gridRef}
|
|
336
360
|
onVisibleRowsChange={onVisibleRowsChanged}
|
|
337
361
|
filter={false}
|
|
338
362
|
sort={false}
|
|
@@ -349,3 +373,5 @@ export const SqlRequestDataGrid = <R,>({
|
|
|
349
373
|
/>
|
|
350
374
|
);
|
|
351
375
|
};
|
|
376
|
+
|
|
377
|
+
export const SqlRequestDataGrid = forwardRef(SqlRequestDataGridInner);
|
|
@@ -5,22 +5,34 @@ import {
|
|
|
5
5
|
OrderByDTO,
|
|
6
6
|
useSqlRequestHandler,
|
|
7
7
|
} from '../../../services/sqlRequests';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
ForwardedRef,
|
|
10
|
+
forwardRef,
|
|
11
|
+
useCallback,
|
|
12
|
+
useEffect,
|
|
13
|
+
useImperativeHandle,
|
|
14
|
+
useMemo,
|
|
15
|
+
useRef,
|
|
16
|
+
useState,
|
|
17
|
+
} from 'react';
|
|
18
|
+
import { SqlRequestGridProps, SqlRequestGridRefProps } from './types';
|
|
9
19
|
|
|
10
|
-
import { SqlRequestGridProps } from './types';
|
|
11
20
|
import { VirtualScroller } from '../VirtualScroller';
|
|
12
21
|
import { debounce } from 'lodash';
|
|
13
22
|
import { isColumnVisible } from '../DataGrid/helpers';
|
|
14
23
|
|
|
15
24
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
16
|
-
export const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
export const SqlRequestGridInner = <R, P extends object = {}>(
|
|
26
|
+
{
|
|
27
|
+
rowHeight = styles.DEFAULT_ROW_HEIGHT,
|
|
28
|
+
itemsPerRow,
|
|
29
|
+
itemTemplate,
|
|
30
|
+
itemProps,
|
|
31
|
+
gap,
|
|
32
|
+
...props
|
|
33
|
+
}: SqlRequestGridProps<R, P>,
|
|
34
|
+
ref: ForwardedRef<SqlRequestGridRefProps>
|
|
35
|
+
) => {
|
|
24
36
|
const currentRows = useRef<R[]>([]);
|
|
25
37
|
const [rows, setRows] = useState<R[]>([]);
|
|
26
38
|
const [start, setStart] = useState(0);
|
|
@@ -128,6 +140,21 @@ export const SqlRequestGrid = <R, P extends object = {}>({
|
|
|
128
140
|
[length, start]
|
|
129
141
|
);
|
|
130
142
|
|
|
143
|
+
const refresh = useCallback(() => {
|
|
144
|
+
setRows([]);
|
|
145
|
+
setStart(0);
|
|
146
|
+
setLength(50);
|
|
147
|
+
setCount(-1);
|
|
148
|
+
}, []);
|
|
149
|
+
|
|
150
|
+
useImperativeHandle(
|
|
151
|
+
ref,
|
|
152
|
+
() => ({
|
|
153
|
+
refresh,
|
|
154
|
+
}),
|
|
155
|
+
[refresh]
|
|
156
|
+
);
|
|
157
|
+
|
|
131
158
|
return (
|
|
132
159
|
<styles.SqlRequestGridContainer>
|
|
133
160
|
<VirtualScroller
|
|
@@ -143,3 +170,5 @@ export const SqlRequestGrid = <R, P extends object = {}>({
|
|
|
143
170
|
</styles.SqlRequestGridContainer>
|
|
144
171
|
);
|
|
145
172
|
};
|
|
173
|
+
|
|
174
|
+
export const SqlRequestGrid = forwardRef(SqlRequestGridInner);
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
export * from './DataGrid';
|
|
2
2
|
export * from './DataGrid/helpers';
|
|
3
3
|
export * from './DataGrid/styles';
|
|
4
|
+
export * from './DataGrid/types';
|
|
5
|
+
|
|
4
6
|
export * from './AdvancedRequestDataGrid';
|
|
7
|
+
export * from './AdvancedRequestDataGrid/helpers';
|
|
8
|
+
|
|
5
9
|
export * from './SqlRequestDataGrid';
|
|
6
10
|
export * from './SqlRequestDataGrid/helpers';
|
|
7
11
|
export * from './SqlRequestDataGrid/types';
|
|
12
|
+
|
|
8
13
|
export * from './SqlRequestGrid';
|
|
9
14
|
export * from './SqlRequestGrid/types';
|
|
15
|
+
|
|
10
16
|
export * from './VirtualScroller';
|
|
11
17
|
export * from './VirtualScroller/types';
|
|
12
|
-
export * from './AdvancedRequestDataGrid/helpers';
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import styled, { css } from 'styled-components';
|
|
2
2
|
|
|
3
|
+
import { ThemeColor } from '../../../providers';
|
|
4
|
+
|
|
3
5
|
export const ModalBackdrop = styled.div.attrs({
|
|
4
6
|
className: 'ModalBackdrop',
|
|
5
7
|
})`
|
|
@@ -20,6 +22,7 @@ export type ModalContainerProps = {
|
|
|
20
22
|
$height?: number;
|
|
21
23
|
$zIndex?: number;
|
|
22
24
|
$fullscreen?: boolean;
|
|
25
|
+
$color?: ThemeColor;
|
|
23
26
|
};
|
|
24
27
|
|
|
25
28
|
export const ModalContainer = styled.div.attrs({
|
|
@@ -51,6 +54,14 @@ export const ModalContainer = styled.div.attrs({
|
|
|
51
54
|
width: ${$width ? `${$width}px` : 'auto'};
|
|
52
55
|
height: ${$height ? `${$height}px` : 'auto'};
|
|
53
56
|
`}
|
|
57
|
+
|
|
58
|
+
${({ $color }) =>
|
|
59
|
+
$color
|
|
60
|
+
? css`
|
|
61
|
+
border: 1px solid var(--color-${$color}-500);
|
|
62
|
+
box-shadow: 0 0 var(--space-3) var(--color-${$color}-500);
|
|
63
|
+
`
|
|
64
|
+
: null}
|
|
54
65
|
`;
|
|
55
66
|
|
|
56
67
|
export const ModalHeader = styled.div.attrs({ className: 'ModalHeader' })`
|
package/src/helpers/dates.ts
CHANGED
|
@@ -7,3 +7,11 @@ export const formatDate = (
|
|
|
7
7
|
const m = moment.utc(date);
|
|
8
8
|
return m.isValid() ? m.format(format) : '';
|
|
9
9
|
};
|
|
10
|
+
|
|
11
|
+
export const formatDateTime = (
|
|
12
|
+
date: moment.MomentInput,
|
|
13
|
+
format: string = 'DD/MM/YYYY HH:mm:ss'
|
|
14
|
+
): string => {
|
|
15
|
+
const m = moment.utc(date);
|
|
16
|
+
return m.isValid() ? m.format(format) : '';
|
|
17
|
+
};
|
package/src/typings.d.ts
CHANGED
|
@@ -4,3 +4,10 @@
|
|
|
4
4
|
export type DeepPartial<T> = {
|
|
5
5
|
[P in keyof T]?: DeepPartial<T[P]>;
|
|
6
6
|
};
|
|
7
|
+
|
|
8
|
+
declare module 'react' {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
10
|
+
function forwardRef<T, P = {}>(
|
|
11
|
+
render: (props: P, ref: React.Ref<T>) => React.ReactNode | null
|
|
12
|
+
): (props: P & React.RefAttributes<T>) => React.ReactNode | null;
|
|
13
|
+
}
|