@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@addev-be/ui",
3
- "version": "0.6.10",
3
+ "version": "0.6.12",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -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-10)'] : []),
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 { Context, useRef } from 'react';
4
- import { DataGridContextProps, DataGridProps } from './types';
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 DataGrid = <R,>({
16
- contextOverride,
17
- ...props
18
- }: DataGridProps<R> & {
19
- contextOverride?: Partial<DataGridContextProps<R>>;
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 SqlRequestDataGrid = <R,>({
22
- onSelectionChange: onSelectionChangeFromProps,
23
- ...props
24
- }: SqlRequestDataGridProps<R>) => {
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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';
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 SqlRequestGrid = <R, P extends object = {}>({
17
- rowHeight = styles.DEFAULT_ROW_HEIGHT,
18
- itemsPerRow,
19
- itemTemplate,
20
- itemProps,
21
- gap,
22
- ...props
23
- }: SqlRequestGridProps<R, P>) => {
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);
@@ -44,3 +44,7 @@ export type SqlRequestGridProps<R, P extends object = {}> = {
44
44
  parser?: (row: SqlRequestRow<R>) => R;
45
45
  itemProps: P;
46
46
  };
47
+
48
+ export type SqlRequestGridRefProps = {
49
+ refresh: () => void;
50
+ };
@@ -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' })`
@@ -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
+ }