@addev-be/ui 0.2.5 → 0.2.7

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 (166) hide show
  1. package/assets/icons/arrow-down-1-9.svg +1 -0
  2. package/assets/icons/arrow-down-a-z.svg +1 -1
  3. package/assets/icons/arrow-down-big-small.svg +1 -0
  4. package/assets/icons/arrow-up-9-1.svg +1 -0
  5. package/assets/icons/arrow-up-big-small.svg +1 -0
  6. package/assets/icons/arrow-up-z-a.svg +1 -1
  7. package/assets/icons/check.svg +1 -1
  8. package/assets/icons/chevron-down.svg +1 -0
  9. package/assets/icons/down.svg +1 -1
  10. package/assets/icons/ellipsis.svg +1 -0
  11. package/assets/icons/filter-full.svg +1 -1
  12. package/assets/icons/filter.svg +1 -1
  13. package/assets/icons/hashtag.svg +1 -1
  14. package/assets/icons/image-slash.svg +1 -1
  15. package/assets/icons/left.svg +1 -1
  16. package/assets/icons/magnifier.svg +1 -1
  17. package/assets/icons/phone.svg +1 -1
  18. package/assets/icons/right.svg +1 -1
  19. package/assets/icons/sigma.svg +1 -0
  20. package/assets/icons/spinner-third.svg +1 -1
  21. package/assets/icons/table-columns.svg +1 -1
  22. package/assets/icons/table-footer-slash.svg +5 -0
  23. package/assets/icons/table-footer.svg +4 -0
  24. package/assets/icons/table.svg +1 -0
  25. package/assets/icons/tally.svg +1 -0
  26. package/assets/icons/up.svg +1 -1
  27. package/assets/icons/user-tie.svg +1 -1
  28. package/assets/icons/x-bar.svg +4 -0
  29. package/dist/Icons.d.ts +13 -1
  30. package/dist/Icons.js +25 -1
  31. package/dist/components/data/AdvancedRequestDataGrid/index.js +3 -3
  32. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +1 -2
  33. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +3 -5
  34. package/dist/components/data/DataGrid/DataGridCell.d.ts +1 -1
  35. package/dist/components/data/DataGrid/DataGridCell.js +5 -5
  36. package/dist/components/data/DataGrid/DataGridColumnsModal/hooks.js +2 -1
  37. package/dist/components/data/DataGrid/DataGridEditableCell.js +2 -7
  38. package/dist/components/data/DataGrid/DataGridFilterMenu/index.js +90 -10
  39. package/dist/components/data/DataGrid/DataGridFilterMenu/styles.d.ts +3 -9
  40. package/dist/components/data/DataGrid/DataGridFilterMenu/styles.js +10 -37
  41. package/dist/components/data/DataGrid/DataGridFooter.d.ts +1 -1
  42. package/dist/components/data/DataGrid/DataGridFooter.js +35 -22
  43. package/dist/components/data/DataGrid/DataGridHeader.js +1 -3
  44. package/dist/components/data/DataGrid/DataGridHeaderCell.js +8 -23
  45. package/dist/components/data/DataGrid/FilterModalContent/index.d.ts +5 -5
  46. package/dist/components/data/DataGrid/FilterModalContent/index.js +11 -9
  47. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +8 -7
  48. package/dist/components/data/DataGrid/FilterValuesScroller.js +5 -6
  49. package/dist/components/data/DataGrid/helpers/columns.d.ts +1 -1
  50. package/dist/components/data/DataGrid/helpers/columns.js +72 -20
  51. package/dist/components/data/DataGrid/helpers/filters.d.ts +4 -3
  52. package/dist/components/data/DataGrid/helpers/filters.js +13 -5
  53. package/dist/components/data/DataGrid/hooks/useDataGrid.d.ts +1 -1
  54. package/dist/components/data/DataGrid/hooks/useDataGrid.js +60 -30
  55. package/dist/components/data/DataGrid/hooks/useDataGridCopy.d.ts +2 -2
  56. package/dist/components/data/DataGrid/hooks/useDataGridCopy.js +41 -40
  57. package/dist/components/data/DataGrid/hooks/useDataGridSettings.js +0 -1
  58. package/dist/components/data/DataGrid/index.d.ts +4 -2
  59. package/dist/components/data/DataGrid/index.js +38 -17
  60. package/dist/components/data/DataGrid/styles.d.ts +12 -5
  61. package/dist/components/data/DataGrid/styles.js +31 -18
  62. package/dist/components/data/DataGrid/types.d.ts +28 -16
  63. package/dist/components/data/SqlRequestDataGrid/helpers/columns.d.ts +1 -1
  64. package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +30 -19
  65. package/dist/components/data/SqlRequestDataGrid/index.js +125 -37
  66. package/dist/components/data/SqlRequestDataGrid/types.d.ts +1 -0
  67. package/dist/components/data/index.d.ts +2 -0
  68. package/dist/components/data/index.js +2 -0
  69. package/dist/components/ui/ContextMenu/index.d.ts +11 -0
  70. package/dist/components/ui/ContextMenu/index.js +58 -0
  71. package/dist/components/ui/ContextMenu/styles.d.ts +18 -0
  72. package/dist/components/ui/ContextMenu/styles.js +56 -0
  73. package/dist/helpers/dates.d.ts +2 -0
  74. package/dist/helpers/dates.js +13 -0
  75. package/dist/services/advancedRequests.d.ts +1 -1
  76. package/dist/services/sqlRequests.d.ts +9 -4
  77. package/dist/services/sqlRequests.js +1 -0
  78. package/package.json +1 -1
  79. package/src/Icons.tsx +104 -80
  80. package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +93 -93
  81. package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +262 -262
  82. package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +2 -2
  83. package/src/components/data/AdvancedRequestDataGrid/index.tsx +267 -269
  84. package/src/components/data/AdvancedRequestDataGrid/types.ts +47 -47
  85. package/src/components/data/DataGrid/DataGridCell.tsx +73 -73
  86. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +14 -14
  87. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -58
  88. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +181 -181
  89. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  90. package/src/components/data/DataGrid/DataGridEditableCell.tsx +43 -54
  91. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +75 -75
  92. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +364 -190
  93. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +49 -100
  94. package/src/components/data/DataGrid/DataGridFooter.tsx +42 -64
  95. package/src/components/data/DataGrid/DataGridHeader.tsx +126 -126
  96. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +132 -167
  97. package/src/components/data/DataGrid/FilterModalContent/index.tsx +124 -125
  98. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  99. package/src/components/data/DataGrid/FilterValuesScroller.tsx +133 -131
  100. package/src/components/data/DataGrid/VirtualScroller.tsx +46 -46
  101. package/src/components/data/DataGrid/helpers/columns.tsx +287 -196
  102. package/src/components/data/DataGrid/helpers/filters.ts +220 -207
  103. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  104. package/src/components/data/DataGrid/hooks/index.ts +30 -30
  105. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +305 -264
  106. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +170 -165
  107. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  108. package/src/components/data/DataGrid/index.tsx +139 -132
  109. package/src/components/data/DataGrid/styles.ts +347 -326
  110. package/src/components/data/DataGrid/types.ts +260 -240
  111. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +259 -224
  112. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  113. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  114. package/src/components/data/SqlRequestDataGrid/index.tsx +347 -252
  115. package/src/components/data/SqlRequestDataGrid/types.ts +47 -47
  116. package/src/components/data/index.ts +8 -8
  117. package/src/components/forms/Button.tsx +99 -99
  118. package/src/components/forms/IconButton.tsx +56 -56
  119. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  120. package/src/components/forms/Select.tsx +40 -40
  121. package/src/components/forms/index.ts +5 -5
  122. package/src/components/forms/styles.ts +20 -20
  123. package/src/components/index.ts +3 -3
  124. package/src/components/layout/Dropdown/index.tsx +79 -79
  125. package/src/components/layout/Dropdown/styles.ts +44 -44
  126. package/src/components/layout/Loading/index.tsx +29 -29
  127. package/src/components/layout/Loading/styles.ts +29 -29
  128. package/src/components/layout/Modal/index.tsx +51 -51
  129. package/src/components/layout/Modal/styles.ts +110 -110
  130. package/src/components/layout/index.ts +3 -3
  131. package/src/components/ui/ContextMenu/index.tsx +73 -0
  132. package/src/components/ui/ContextMenu/styles.ts +115 -0
  133. package/src/config/index.ts +14 -14
  134. package/src/helpers/dates.ts +9 -9
  135. package/src/helpers/getScrollbarSize.ts +14 -14
  136. package/src/helpers/numbers.ts +20 -20
  137. package/src/hooks/index.ts +2 -2
  138. package/src/hooks/useElementSize.ts +24 -24
  139. package/src/hooks/useWindowSize.ts +20 -20
  140. package/src/index.ts +7 -7
  141. package/src/providers/PortalsProvider/index.tsx +54 -54
  142. package/src/providers/PortalsProvider/styles.ts +27 -27
  143. package/src/providers/SettingsProvider/index.tsx +70 -70
  144. package/src/providers/ThemeProvider/ThemeProvider.ts +55 -55
  145. package/src/providers/ThemeProvider/defaultTheme.ts +444 -444
  146. package/src/providers/ThemeProvider/index.ts +3 -3
  147. package/src/providers/ThemeProvider/types.ts +123 -123
  148. package/src/providers/UiProviders/index.tsx +65 -65
  149. package/src/providers/UiProviders/styles.ts +10 -10
  150. package/src/providers/hooks.ts +8 -8
  151. package/src/providers/index.ts +5 -5
  152. package/src/services/HttpService.ts +80 -80
  153. package/src/services/WebSocketService.ts +147 -147
  154. package/src/services/advancedRequests.ts +101 -101
  155. package/src/services/base.ts +31 -31
  156. package/src/services/hooks.ts +23 -23
  157. package/src/services/index.ts +2 -2
  158. package/src/services/sqlRequests.ts +110 -99
  159. package/src/styles/animations.scss +30 -30
  160. package/src/styles/index.scss +42 -42
  161. package/src/typings.d.ts +6 -6
  162. package/tsconfig.tsbuildinfo +1 -1
  163. package/dist/components/data/DataGrid/helpers.d.ts +0 -28
  164. package/dist/components/data/DataGrid/helpers.js +0 -436
  165. package/dist/config/types.d.ts +0 -11
  166. package/dist/config/types.js +0 -2
@@ -1,100 +1,49 @@
1
- import styled, { css } from 'styled-components';
2
-
3
- import { ThemeColor } from '../../../../providers/ThemeProvider/types';
4
-
5
- export const Menu = styled.div.attrs({
6
- className: 'Menu',
7
- })`
8
- position: absolute;
9
- inset: 0;
10
- color: var(--color-neutral-900);
11
- border-radius: var(--rounded-md);
12
- padding: var(--space-1) 0;
13
- box-shadow: var(--shadow-lg);
14
- background-color: var(--color-neutral-100);
15
- min-width: 20em;
16
- outline: 1px solid var(--color-neutral-200);
17
- display: flex;
18
- flex-direction: column;
19
- `;
20
-
21
- export const MenuItem = styled.button.attrs({
22
- className: 'MenuItem',
23
- })<{ $color?: ThemeColor }>`
24
- display: flex;
25
- align-items: center;
26
- width: 100%;
27
- font-family: var(--font-sans);
28
- font-weight: normal;
29
- text-align: left;
30
- padding: var(--space-1) var(--space-2);
31
- font-size: var(--text-base);
32
- line-height: var(--leading-6);
33
- border: none;
34
- cursor: pointer;
35
-
36
- ${({ $color }) =>
37
- $color
38
- ? css`
39
- color: var(--color-${$color}-600);
40
- background-color: var(--color-neutral-100);
41
- &:hover {
42
- background-color: var(--color-${$color}-200);
43
- }
44
- `
45
- : css`
46
- color: var(--color-neutral-900);
47
- background-color: var(--color-neutral-100);
48
- &:hover {
49
- background-color: var(--color-neutral-200);
50
- }
51
- `}
52
-
53
- svg {
54
- fill: currentColor;
55
- width: var(--space-4);
56
- height: var(--space-4);
57
- margin-right: var(--space-2);
58
- }
59
- `;
60
-
61
- export const InputContainer = styled.div.attrs({
62
- className: 'InputContainer',
63
- })`
64
- position: relative;
65
- border-radius: var(--rounded-md);
66
- padding: 0 var(--space-2);
67
- margin-top: var(--space-1);
68
-
69
- svg {
70
- position: absolute;
71
- top: 50%;
72
- transform: translateY(-50%);
73
- left: var(--space-4);
74
- display: flex;
75
- align-items: center;
76
- fill: var(--color-neutral-400);
77
- width: var(--space-4);
78
- height: var(--space-4);
79
- }
80
-
81
- input {
82
- padding-left: var(--space-8);
83
- }
84
- `;
85
-
86
- export const CheckboxesContainer = styled.div.attrs({
87
- className: 'CheckboxesContainer',
88
- })`
89
- font-weight: normal;
90
- user-select: none;
91
- padding: var(--space-2);
92
- margin: var(--space-2);
93
- border: 1px solid var(--color-neutral-200);
94
- border-radius: var(--rounded-md);
95
- box-shadow: var(--shadow-inner);
96
- background-color: var(--color-neutral-50);
97
- height: 20em;
98
- overflow-y: hidden;
99
- white-space: nowrap;
100
- `;
1
+ import styled from 'styled-components';
2
+
3
+ export const InputContainer = styled.div.attrs({
4
+ className: 'InputContainer',
5
+ })`
6
+ position: relative;
7
+ border-radius: var(--rounded-md);
8
+ padding: 0 var(--space-1);
9
+
10
+ svg {
11
+ position: absolute;
12
+ top: 50%;
13
+ transform: translateY(-50%);
14
+ left: var(--space-4);
15
+ display: flex;
16
+ align-items: center;
17
+ fill: var(--color-neutral-400);
18
+ width: var(--space-4);
19
+ height: var(--space-4);
20
+ }
21
+
22
+ input {
23
+ padding-left: var(--space-8);
24
+ }
25
+ `;
26
+
27
+ export const CheckboxesContainer = styled.div.attrs({
28
+ className: 'CheckboxesContainer',
29
+ })`
30
+ font-weight: normal;
31
+ user-select: none;
32
+ padding: var(--space-2);
33
+ margin: var(--space-1);
34
+ margin-bottom: 0;
35
+ border: 1px solid var(--color-neutral-300);
36
+ border-radius: var(--rounded-md);
37
+ box-shadow: var(--shadow-inner);
38
+ background-color: var(--color-neutral-0);
39
+ height: 20em;
40
+ overflow-y: hidden;
41
+ white-space: nowrap;
42
+ `;
43
+
44
+ export const Separator = styled.div.attrs({
45
+ className: 'Separator',
46
+ })`
47
+ border-top: 1px solid var(--color-neutral-200);
48
+ margin: var(--space-1) 0;
49
+ `;
@@ -1,64 +1,42 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
3
-
4
- import { DataGridContext } from './types';
5
- import { getScrollBarSize } from '../../../helpers/getScrollbarSize';
6
- import { join } from 'lodash';
7
- import { useDataGridContext } from './hooks';
8
-
9
- const SCROLL_BAR_SIZE = getScrollBarSize();
10
-
11
- export const DataGridFooter = <R,>({
12
- context,
13
- }: {
14
- context: DataGridContext<R>;
15
- }) => {
16
- const {
17
- visibleColumns,
18
- rows,
19
- selectedRows,
20
- sortedRows,
21
- rowHeight = 48,
22
- selectable,
23
- } = useDataGridContext(context);
24
-
25
- return (
26
- <tfoot
27
- // className="block border-t border-t-gray-300"
28
- style={{
29
- paddingRight: `${SCROLL_BAR_SIZE[0]}px`,
30
- }}
31
- >
32
- <tr
33
- // className="grid bg-gray-100"
34
- style={{
35
- height: `${rowHeight}px`,
36
- }}
37
- >
38
- {!!selectable && (
39
- <div
40
- // className="inline-block w-12 select-none"
41
- key="__select_checkbox__"
42
- ></div>
43
- )}
44
- {visibleColumns.map(([key, col]) => (
45
- <div
46
- key={key}
47
- className={join(
48
- [
49
- // 'inline-block relative group px-3 py-0 text-left text-sm hover:bg-gray-50 leading-6',
50
- col.className,
51
- col.footerClassName,
52
- // '!overflow-visible',
53
- ],
54
- ' '
55
- )}
56
- style={{ width: (col.width ?? 150) + 'px' }}
57
- >
58
- {col.footer?.(rows, sortedRows, selectedRows)}
59
- </div>
60
- ))}
61
- </tr>
62
- </tfoot>
63
- );
64
- };
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
3
+
4
+ import * as styles from './styles';
5
+
6
+ import { DataGridContext } from './types';
7
+ import { useDataGridContext } from './hooks';
8
+
9
+ export const DataGridFooter = <R,>({
10
+ context,
11
+ }: {
12
+ context: DataGridContext<R>;
13
+ }) => {
14
+ const {
15
+ visibleColumns,
16
+ rows,
17
+ selectedRows,
18
+ sortedRows,
19
+ selectable,
20
+ footers = {},
21
+ gridTemplateColumns,
22
+ footerFunctions,
23
+ } = useDataGridContext(context);
24
+
25
+ if (!Object.keys(footers).length) {
26
+ return null;
27
+ }
28
+
29
+ return (
30
+ <styles.DataGridFooterRow $gridTemplateColumns={gridTemplateColumns}>
31
+ {!!selectable && <styles.HeaderSelectionCell />}
32
+ {visibleColumns.map(([key, col]) => (
33
+ <styles.DataGridHeaderCellContainer
34
+ key={key}
35
+ style={{ width: (col.width ?? 150) + 'px' }}
36
+ >
37
+ {footerFunctions?.[key]?.(rows, sortedRows, selectedRows)}
38
+ </styles.DataGridHeaderCellContainer>
39
+ ))}
40
+ </styles.DataGridFooterRow>
41
+ );
42
+ };
@@ -1,126 +1,126 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
3
-
4
- import * as styles from './styles';
5
-
6
- import {
7
- ArrowsRotateIcon,
8
- CopyIcon,
9
- FilterSlashIcon,
10
- TableColumnsIcon,
11
- } from '../../../Icons';
12
- import { useCallback, useState } from 'react';
13
-
14
- import { Button } from '../../forms';
15
- import { DataGridContext } from './types';
16
- import { DataGridHeaderCell } from './DataGridHeaderCell';
17
- import { IndeterminateCheckbox } from '../../forms/IndeterminateCheckbox';
18
- import { Loading } from '../../layout';
19
- import { useDataGridColumnsModal } from './DataGridColumnsModal/hooks';
20
- import { useDataGridContext } from './hooks';
21
-
22
- export const DataGridHeader = <R,>({
23
- context,
24
- }: {
25
- context: DataGridContext<R>;
26
- }) => {
27
- const {
28
- name,
29
- visibleColumns,
30
- selectable,
31
- rows,
32
- selectedKeys,
33
- setSelectedKeys,
34
- copyTable,
35
- setFilters,
36
- refresh,
37
- headerColor,
38
- rowKeyGetter,
39
- gridTemplateColumns,
40
- getAllIds,
41
- } = useDataGridContext(context);
42
- const [visibleFilter, setVisibleFilter] = useState<string | undefined>();
43
-
44
- const { openModal, modal } = useDataGridColumnsModal<R>(context);
45
-
46
- const checkboxStatus =
47
- selectedKeys.length === 0
48
- ? false
49
- : selectedKeys.length === rows.length
50
- ? true
51
- : undefined;
52
- const toggleAll = useCallback(
53
- async (newStatus: boolean) => {
54
- const allIds = getAllIds ? await getAllIds() : rows.map(rowKeyGetter);
55
- setSelectedKeys(newStatus ? allIds : []);
56
- },
57
- [getAllIds, rowKeyGetter, rows, setSelectedKeys]
58
- );
59
-
60
- const onFilterButtonClicked = useCallback((columnKey: string) => {
61
- setVisibleFilter((prev) => (prev === columnKey ? undefined : columnKey));
62
- }, []);
63
-
64
- const [isLoadingVisible, setIsLoadingVisible] = useState(false);
65
- const runCopyTable = useCallback(() => {
66
- setIsLoadingVisible(true);
67
- copyTable().then(() => setIsLoadingVisible(false));
68
- }, [copyTable]);
69
-
70
- const toolsRow = (
71
- <styles.DataGridToolsRow>
72
- <Loading visible={isLoadingVisible} />
73
- {refresh && (
74
- <Button size="small" onClick={refresh}>
75
- <ArrowsRotateIcon />
76
- Rafraîchir
77
- </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
91
- </Button>
92
- )}
93
- </styles.DataGridToolsRow>
94
- );
95
-
96
- return (
97
- <>
98
- {modal}
99
- {toolsRow}
100
- <styles.DataGridHeaderRow
101
- $gridTemplateColumns={gridTemplateColumns}
102
- $headerColor={headerColor}
103
- >
104
- {!!selectable && (
105
- <styles.HeaderSelectionCell $headerColor={headerColor}>
106
- <IndeterminateCheckbox
107
- checked={checkboxStatus}
108
- onChange={() => toggleAll(!(checkboxStatus ?? true))}
109
- />
110
- </styles.HeaderSelectionCell>
111
- )}
112
- {visibleColumns.map(([key, col], index) => (
113
- <DataGridHeaderCell
114
- key={key}
115
- columnKey={key}
116
- column={col}
117
- context={context}
118
- columnIndex={index}
119
- isFilterOpen={visibleFilter === key}
120
- onFilterButtonClicked={onFilterButtonClicked}
121
- />
122
- ))}
123
- </styles.DataGridHeaderRow>
124
- </>
125
- );
126
- };
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
3
+
4
+ import * as styles from './styles';
5
+
6
+ import {
7
+ ArrowsRotateIcon,
8
+ CopyIcon,
9
+ FilterSlashIcon,
10
+ TableColumnsIcon,
11
+ } from '../../../Icons';
12
+ import { useCallback, useState } from 'react';
13
+
14
+ import { Button } from '../../forms';
15
+ import { DataGridContext } from './types';
16
+ import { DataGridHeaderCell } from './DataGridHeaderCell';
17
+ import { IndeterminateCheckbox } from '../../forms/IndeterminateCheckbox';
18
+ import { Loading } from '../../layout';
19
+ import { useDataGridColumnsModal } from './DataGridColumnsModal/hooks';
20
+ import { useDataGridContext } from './hooks';
21
+
22
+ export const DataGridHeader = <R,>({
23
+ context,
24
+ }: {
25
+ context: DataGridContext<R>;
26
+ }) => {
27
+ const {
28
+ name,
29
+ visibleColumns,
30
+ selectable,
31
+ rows,
32
+ selectedKeys,
33
+ setSelectedKeys,
34
+ copyTable,
35
+ setFilters,
36
+ refresh,
37
+ headerColor,
38
+ rowKeyGetter,
39
+ gridTemplateColumns,
40
+ getAllIds,
41
+ } = useDataGridContext(context);
42
+ const [visibleFilter, setVisibleFilter] = useState<string | undefined>();
43
+
44
+ const { openModal, modal } = useDataGridColumnsModal<R>(context);
45
+
46
+ const checkboxStatus =
47
+ selectedKeys.length === 0
48
+ ? false
49
+ : selectedKeys.length === rows.length
50
+ ? true
51
+ : undefined;
52
+ const toggleAll = useCallback(
53
+ async (newStatus: boolean) => {
54
+ const allIds = getAllIds ? await getAllIds() : rows.map(rowKeyGetter);
55
+ setSelectedKeys(newStatus ? allIds : []);
56
+ },
57
+ [getAllIds, rowKeyGetter, rows, setSelectedKeys]
58
+ );
59
+
60
+ const onFilterButtonClicked = useCallback((columnKey: string) => {
61
+ setVisibleFilter((prev) => (prev === columnKey ? undefined : columnKey));
62
+ }, []);
63
+
64
+ const [isLoadingVisible, setIsLoadingVisible] = useState(false);
65
+ const runCopyTable = useCallback(() => {
66
+ setIsLoadingVisible(true);
67
+ copyTable().then(() => setIsLoadingVisible(false));
68
+ }, [copyTable]);
69
+
70
+ const toolsRow = (
71
+ <styles.DataGridToolsRow>
72
+ <Loading visible={isLoadingVisible} />
73
+ {refresh && (
74
+ <Button size="small" onClick={refresh}>
75
+ <ArrowsRotateIcon />
76
+ Rafraîchir
77
+ </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
91
+ </Button>
92
+ )}
93
+ </styles.DataGridToolsRow>
94
+ );
95
+
96
+ return (
97
+ <>
98
+ {modal}
99
+ {toolsRow}
100
+ <styles.DataGridHeaderRow
101
+ $gridTemplateColumns={gridTemplateColumns}
102
+ $headerColor={headerColor}
103
+ >
104
+ {!!selectable && (
105
+ <styles.HeaderSelectionCell
106
+ $headerColor={headerColor}
107
+ onClick={() => toggleAll(!(checkboxStatus ?? true))}
108
+ >
109
+ <IndeterminateCheckbox checked={checkboxStatus} readOnly />
110
+ </styles.HeaderSelectionCell>
111
+ )}
112
+ {visibleColumns.map(([key, col], index) => (
113
+ <DataGridHeaderCell
114
+ key={key}
115
+ columnKey={key}
116
+ column={col}
117
+ context={context}
118
+ columnIndex={index}
119
+ isFilterOpen={visibleFilter === key}
120
+ onFilterButtonClicked={onFilterButtonClicked}
121
+ />
122
+ ))}
123
+ </styles.DataGridHeaderRow>
124
+ </>
125
+ );
126
+ };