kelt-ui-kit-react 2.0.3 → 2.0.4

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 (127) hide show
  1. package/README.md +26 -0
  2. package/dist/addressSearch/AddressSearch.d.ts +20 -0
  3. package/dist/addressSearch/AddressSearch.view.d.ts +1 -0
  4. package/dist/badge/Badge.d.ts +1 -3
  5. package/dist/button/Button.d.ts +1 -1
  6. package/dist/button/button.interface.d.ts +2 -1
  7. package/dist/card/Card.d.ts +4 -1
  8. package/dist/dataTable/DataTable.d.ts +14 -17
  9. package/dist/dataTable/dataTable.interface.d.ts +19 -24
  10. package/dist/dataTable/dataTableActions/DataTableAction.d.ts +5 -3
  11. package/dist/dataTable/dataTableColumn/DataTableColumn.d.ts +7 -13
  12. package/dist/dataTable/dataTableLoading/DataTableLoading.d.ts +3 -1
  13. package/dist/dataTable/dataTableRow/DataTableRow.d.ts +6 -5
  14. package/dist/expands/Expands.d.ts +1 -0
  15. package/dist/expands/expand/expand.d.ts +3 -2
  16. package/dist/form/Form.d.ts +10 -2
  17. package/dist/form/form.enum.d.ts +3 -2
  18. package/dist/form/form.interface.d.ts +22 -3
  19. package/dist/form/input/Input.d.ts +0 -3
  20. package/dist/form/inputNumber/InputNumber.d.ts +2 -0
  21. package/dist/geocoding/GeocodingService.d.ts +13 -0
  22. package/dist/geocoding/geocoding.interface.d.ts +20 -0
  23. package/dist/grid/Grid.d.ts +5 -2
  24. package/dist/grid/col/Col.d.ts +3 -6
  25. package/dist/grid/col/colStyled/ColStyled.d.ts +8 -5
  26. package/dist/grid/grid.interface.d.ts +20 -5
  27. package/dist/grid/row/Row.d.ts +7 -0
  28. package/dist/header/Header.d.ts +1 -1
  29. package/dist/header/header.interface.d.ts +2 -1
  30. package/dist/icon/Icon.d.ts +1 -1
  31. package/dist/icon/icon.interface.d.ts +0 -1
  32. package/dist/index.d.ts +5 -1
  33. package/dist/index.js +3724 -3628
  34. package/dist/menus/menu/Menu.d.ts +1 -0
  35. package/dist/select/Select.d.ts +2 -1
  36. package/dist/style.css +1 -1
  37. package/dist/tabs/Tabs.d.ts +1 -2
  38. package/dist/toaster/store/useToasterStore.d.ts +1 -0
  39. package/index.html +1 -2
  40. package/package.json +1 -1
  41. package/src/App.menu.tsx +8 -0
  42. package/src/addressSearch/AddressSearch.tsx +246 -0
  43. package/src/addressSearch/AddressSearch.view.tsx +52 -0
  44. package/src/addressSearch/addressSearch.css +133 -0
  45. package/src/badge/Badge.tsx +1 -9
  46. package/src/badge/badge.css +0 -4
  47. package/src/button/Button.tsx +3 -1
  48. package/src/button/button.css +2 -2
  49. package/src/button/button.interface.tsx +2 -1
  50. package/src/card/Card.tsx +37 -11
  51. package/src/card/card.css +7 -28
  52. package/src/card/cardAction/CardAction.tsx +4 -4
  53. package/src/damier/Damier.tsx +16 -7
  54. package/src/damier/damier.css +11 -4
  55. package/src/dataTable/DataTable.tsx +542 -685
  56. package/src/dataTable/DataTable.view.tsx +24 -48
  57. package/src/dataTable/dataTable.css +159 -134
  58. package/src/dataTable/dataTable.interface.ts +19 -25
  59. package/src/dataTable/dataTableActions/DataTableAction.tsx +25 -14
  60. package/src/dataTable/dataTableColumn/DataTableColumn.tsx +14 -64
  61. package/src/dataTable/dataTableLoading/DataTableLoading.tsx +15 -4
  62. package/src/dataTable/dataTableRow/DataTableRow.tsx +180 -64
  63. package/src/expands/Expands.tsx +18 -2
  64. package/src/expands/expand/expand.tsx +128 -5
  65. package/src/expands/expands.css +8 -3
  66. package/src/form/Form.tsx +294 -99
  67. package/src/form/Form.view.tsx +9 -1
  68. package/src/form/form.css +64 -1
  69. package/src/form/form.enum.ts +2 -1
  70. package/src/form/form.interface.tsx +31 -3
  71. package/src/form/input/Input.tsx +7 -61
  72. package/src/form/input/input.css +1 -19
  73. package/src/form/inputNumber/InputNumber.tsx +11 -6
  74. package/src/form/inputPrice/InputPrice.tsx +4 -2
  75. package/src/geocoding/GeocodingService.ts +89 -0
  76. package/src/geocoding/geocoding.interface.ts +25 -0
  77. package/src/grid/Grid.tsx +34 -21
  78. package/src/grid/col/Col.tsx +24 -15
  79. package/src/grid/col/col.css +3 -0
  80. package/src/grid/col/colStyled/ColStyled.tsx +59 -41
  81. package/src/grid/container/container.css +2 -2
  82. package/src/grid/grid.interface.tsx +25 -5
  83. package/src/grid/row/Row.tsx +49 -12
  84. package/src/grid/row/row.css +11 -3
  85. package/src/header/Header.tsx +4 -2
  86. package/src/header/header.css +17 -0
  87. package/src/header/header.interface.tsx +2 -1
  88. package/src/icon/Icon.tsx +2 -6
  89. package/src/icon/icon.interface.tsx +0 -1
  90. package/src/index.css +58 -12
  91. package/src/index.ts +12 -2
  92. package/src/menus/Menus.tsx +1 -0
  93. package/src/menus/menu/Menu.tsx +2 -1
  94. package/src/select/Select.tsx +5 -3
  95. package/src/sidebar/Sidebar.tsx +107 -5
  96. package/src/sidebar/sidebar.css +18 -1
  97. package/src/tabs/Tabs.tsx +1 -20
  98. package/src/tabs/tabs.css +9 -3
  99. package/src/toaster/Toaster.tsx +7 -2
  100. package/src/toaster/Toaster.view.tsx +1 -0
  101. package/src/toaster/store/useToasterStore.tsx +2 -0
  102. package/src/toaster/toaster.css +7 -2
  103. package/dist/_core/type/generiqueType.d.ts +0 -4
  104. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.d.ts +0 -10
  105. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.d.ts +0 -9
  106. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.d.ts +0 -9
  107. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.d.ts +0 -13
  108. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.d.ts +0 -9
  109. package/dist/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.d.ts +0 -11
  110. package/dist/dataTable/dataTableFilters/DataTableFilters.d.ts +0 -7
  111. package/dist/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.d.ts +0 -12
  112. package/dist/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.d.ts +0 -11
  113. package/package/package.json +0 -56
  114. package/package/src/sidebar/Sidebar.tsx +0 -208
  115. package/package/src/sidebar/sidebar.css +0 -104
  116. package/src/_core/type/generiqueType.tsx +0 -4
  117. package/src/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.tsx +0 -36
  118. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilter.css +0 -0
  119. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.tsx +0 -39
  120. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.tsx +0 -80
  121. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.tsx +0 -89
  122. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.tsx +0 -37
  123. package/src/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.tsx +0 -42
  124. package/src/dataTable/dataTableFilters/DataTableFilters.tsx +0 -91
  125. package/src/dataTable/dataTableFilters/dataTableFilters.css +0 -16
  126. package/src/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.tsx +0 -80
  127. package/src/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.tsx +0 -123
@@ -1,208 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
2
- import ReactDOM from "react-dom";
3
- import { Icon } from "../icon/Icon";
4
- import "./sidebar.css";
5
-
6
- export interface SidebarProps {
7
- id?: string;
8
- open?: boolean;
9
- title?: string;
10
- children?: React.ReactNode;
11
- className?: string;
12
- width?: string;
13
- displayOverlay?: boolean;
14
- closeOnClickOutside?: boolean;
15
- onClose?: (close: boolean) => void;
16
- }
17
-
18
- const SWIPE_CLOSE_THRESHOLD = 60; // px à parcourir pour fermer
19
- const SWIPE_AXIS_LOCK_THRESHOLD = 10; // px pour déterminer l'axe du geste
20
-
21
- export const Sidebar = ({
22
- open,
23
- children,
24
- title,
25
- onClose,
26
- className,
27
- id,
28
- width,
29
- closeOnClickOutside = true,
30
- displayOverlay = true,
31
- }: SidebarProps): JSX.Element => {
32
- const [isOpen, setIsOpen] = useState(open || false);
33
- const [dragX, setDragX] = useState(0);
34
- const [isDragging, setIsDragging] = useState(false);
35
- const sidebarRef = useRef<HTMLDivElement | null>(null);
36
- const rootRef = useRef<HTMLDivElement | null>(null);
37
- const touchStartX = useRef(0);
38
- const touchStartY = useRef(0);
39
- const axisLocked = useRef<"x" | "y" | null>(null);
40
-
41
- // Créer le conteneur une seule fois
42
- useEffect(() => {
43
- if (!rootRef.current) {
44
- rootRef.current = document.createElement("div");
45
- rootRef.current.id = `sidebar-root-${id || crypto.randomUUID()}`;
46
- document.body.appendChild(rootRef.current);
47
- }
48
-
49
- return () => {
50
- // Nettoyage lors du démontage
51
- if (rootRef.current && rootRef.current.parentNode) {
52
- document.body.removeChild(rootRef.current);
53
- rootRef.current = null;
54
- }
55
- };
56
- }, [id]);
57
-
58
- // Synchroniser l'état `isOpen` avec la prop `open`
59
- useEffect(() => {
60
- setIsOpen(open || false);
61
- }, [open]);
62
-
63
- const toggleSidebar = useCallback(() => {
64
- setIsOpen(false);
65
- if (onClose) {
66
- onClose(false);
67
- }
68
- }, [onClose]);
69
-
70
- const handleClickOutside = useCallback(
71
- (event: MouseEvent | TouchEvent) => {
72
- if (!closeOnClickOutside) return;
73
- if (
74
- sidebarRef.current &&
75
- !sidebarRef.current.contains(event.target as Node)
76
- ) {
77
- toggleSidebar();
78
- }
79
- },
80
- [toggleSidebar, closeOnClickOutside],
81
- );
82
-
83
- const handleTouchStart = useCallback((event: React.TouchEvent) => {
84
- const touch = event.touches[0];
85
- touchStartX.current = touch.clientX;
86
- touchStartY.current = touch.clientY;
87
- axisLocked.current = null;
88
- setIsDragging(false);
89
- setDragX(0);
90
- }, []);
91
-
92
- const handleTouchMove = useCallback(
93
- (event: React.TouchEvent) => {
94
- if (!isOpen) return;
95
-
96
- const touch = event.touches[0];
97
- const deltaX = touch.clientX - touchStartX.current;
98
- const deltaY = touch.clientY - touchStartY.current;
99
-
100
- // Détermine l'axe du geste une seule fois, dès qu'on a un déplacement suffisant
101
- if (!axisLocked.current) {
102
- if (
103
- Math.abs(deltaX) < SWIPE_AXIS_LOCK_THRESHOLD &&
104
- Math.abs(deltaY) < SWIPE_AXIS_LOCK_THRESHOLD
105
- ) {
106
- return; // pas encore assez de mouvement pour trancher
107
- }
108
- axisLocked.current = Math.abs(deltaX) > Math.abs(deltaY) ? "x" : "y";
109
- }
110
-
111
- if (axisLocked.current !== "x") return; // c'est un scroll vertical, on laisse faire
112
-
113
- // On gère le swipe horizontal nous-mêmes : on empêche le scroll natif
114
- // et on bloque le bounce/scroll de la page pendant le drag
115
- event.preventDefault();
116
-
117
- setIsDragging(true);
118
- // On ne permet que le swipe vers la droite (fermeture), pas de drag négatif
119
- setDragX(Math.max(0, deltaX));
120
- },
121
- [isOpen],
122
- );
123
-
124
- const handleTouchEnd = useCallback(
125
- (event: React.TouchEvent) => {
126
- if (!isOpen) {
127
- return;
128
- }
129
-
130
- if (axisLocked.current === "x") {
131
- const touch = event.changedTouches[0];
132
- const deltaX = touch.clientX - touchStartX.current;
133
-
134
- if (deltaX > SWIPE_CLOSE_THRESHOLD) {
135
- toggleSidebar();
136
- }
137
- }
138
-
139
- setIsDragging(false);
140
- setDragX(0);
141
- axisLocked.current = null;
142
- },
143
- [isOpen, toggleSidebar],
144
- );
145
-
146
- const handleOverlayTouchEnd = useCallback(
147
- (event: React.TouchEvent) => {
148
- event.preventDefault();
149
- toggleSidebar();
150
- },
151
- [toggleSidebar],
152
- );
153
-
154
- useEffect(() => {
155
- if (isOpen) {
156
- document.addEventListener("mousedown", handleClickOutside);
157
- document.addEventListener("touchstart", handleClickOutside, {
158
- passive: true,
159
- });
160
- } else {
161
- document.removeEventListener("mousedown", handleClickOutside);
162
- document.removeEventListener("touchstart", handleClickOutside);
163
- }
164
-
165
- return () => {
166
- document.removeEventListener("mousedown", handleClickOutside);
167
- document.removeEventListener("touchstart", handleClickOutside);
168
- };
169
- }, [isOpen, handleClickOutside]);
170
-
171
- if (!rootRef.current) {
172
- return <></>; // Ne pas tenter de rendre si le conteneur n'existe pas
173
- }
174
-
175
- return ReactDOM.createPortal(
176
- <>
177
- {isOpen && displayOverlay && (
178
- <div
179
- className="overlay"
180
- onClick={toggleSidebar}
181
- onTouchEnd={handleOverlayTouchEnd}
182
- ></div>
183
- )}
184
- <div
185
- ref={sidebarRef}
186
- style={{
187
- ...(width ? { width } : {}),
188
- transform: dragX ? `translateX(${dragX}px)` : undefined,
189
- transition: isDragging ? "none" : undefined,
190
- }}
191
- className={`sidebar ${isOpen ? "open" : "closed"} ${className ?? ""}`}
192
- onTouchStart={handleTouchStart}
193
- onTouchMove={handleTouchMove}
194
- onTouchEnd={handleTouchEnd}
195
- >
196
- <div className="sidebar-header">
197
- {title && <h2 className="flex-1">{title}</h2>}
198
- <button className="toggle-btn" onClick={toggleSidebar}>
199
- <Icon classIcon="bi-x-lg" />
200
- </button>
201
- </div>
202
-
203
- {children && children}
204
- </div>
205
- </>,
206
- rootRef.current,
207
- );
208
- };
@@ -1,104 +0,0 @@
1
- .sidebar {
2
- touch-action: pan-y;
3
- /* laisse le scroll vertical natif, gère le X nous-même */
4
- will-change: transform;
5
- }
6
-
7
- .overlay {
8
- touch-action: none;
9
- }
10
-
11
- .toggle-btn {
12
- -webkit-tap-highlight-color: transparent;
13
- touch-action: manipulation;
14
- }
15
-
16
- .sidebar {
17
- width: 200px;
18
- height: 100vh;
19
- background-color: var(--primary-color);
20
- color: white;
21
- transition: width 0.3s;
22
- overflow: hidden;
23
- position: fixed;
24
- transition: transform 0.3s ease-in-out;
25
- transform: translateX(0);
26
- z-index: 2;
27
-
28
-
29
-
30
- &:not(.full) {
31
- inset: 0;
32
- }
33
-
34
- &.full {
35
- width: 100%;
36
- right: 0px;
37
- top: 0;
38
- }
39
-
40
- .sidebar-header {
41
- display: flex;
42
- align-items: center;
43
- padding: 1rem;
44
- }
45
-
46
- &.closed {
47
- transform: translateX(-100vw);
48
- }
49
-
50
- .sidebar-items {
51
- list-style-type: none;
52
- padding: 0;
53
-
54
- .sidebar-item {
55
- padding: 10px;
56
- cursor: pointer;
57
- display: flex;
58
- align-items: center;
59
-
60
- .item-icon {
61
- margin-right: 10px;
62
- }
63
-
64
- &:hover {
65
- background-color: #34495e;
66
- }
67
- }
68
- }
69
-
70
- .toggle-btn {
71
- display: flex;
72
- width: 100%;
73
- position: absolute;
74
- right: 10px;
75
- top: 10px;
76
- justify-content: flex-end;
77
- background-color: transparent;
78
- border: none;
79
- color: white;
80
- cursor: pointer;
81
- font-size: 18px;
82
- margin: 0;
83
- min-width: 10px;
84
- width: auto;
85
- padding: 0px;
86
- }
87
- }
88
-
89
- .overlay {
90
- background-color: #0006;
91
- opacity: 30%;
92
- width: 100%;
93
- position: fixed;
94
- inset: 0;
95
- z-index: 1;
96
- }
97
-
98
- @media screen and (min-width: 992px) {
99
- .sidebar {
100
- &.full {
101
- width: 40vw;
102
- }
103
- }
104
- }
@@ -1,4 +0,0 @@
1
- export interface EnumerableType {
2
- label: string;
3
- value: string;
4
- }
@@ -1,36 +0,0 @@
1
- import { Icon } from "../../../icon/Icon";
2
- import { DataTableColumnsInterface } from "../../dataTable.interface";
3
- import "./dataTableColumnFilter.css";
4
-
5
- type DataTableColumnFilterProps<T> = {
6
- className?: string;
7
- column: DataTableColumnsInterface<T>;
8
- isFilterVisible?: boolean;
9
- onToggleVisibility?: (column: DataTableColumnsInterface<T>) => void;
10
- };
11
- export const DataTableColumnFilter = <T,>({
12
- className,
13
- column,
14
- isFilterVisible = false,
15
- onToggleVisibility,
16
- }: DataTableColumnFilterProps<T>) => {
17
- return (
18
- <div
19
- className={`data-table-column-filter ${
20
- isFilterVisible ? "active" : ""
21
- } ${className ?? ""}`}
22
- >
23
- <span>
24
- <Icon
25
- onClick={(e) => {
26
- e.stopPropagation();
27
- onToggleVisibility?.(column);
28
- }}
29
- classIcon={`bi-filter cursor-pointer ${
30
- isFilterVisible ? "data-table-column-filter-active" : ""
31
- }`}
32
- />
33
- </span>
34
- </div>
35
- );
36
- };
@@ -1,39 +0,0 @@
1
- import { useState } from "react";
2
-
3
- import { TypeInputEnum } from "../../../../form/form.enum";
4
- import { Input } from "../../../../form/input/Input";
5
-
6
- type DataTableColumnFilterDateProps = {
7
- id: string;
8
- name: string;
9
- label: string;
10
- onChange: (value: string) => void;
11
- currentValue?: string;
12
- };
13
- export const DataTableColumnFilterDate = ({
14
- id,
15
- name,
16
- label,
17
- onChange,
18
- currentValue,
19
- }: DataTableColumnFilterDateProps) => {
20
- const [selectedValue, setSelectedValue] = useState<string>(
21
- currentValue ?? "",
22
- );
23
- const handleChange = (value: string) => {
24
- setSelectedValue(value);
25
- onChange(value);
26
- };
27
- return (
28
- <div>
29
- <p>{label}</p>
30
- <Input
31
- id={id}
32
- name={name}
33
- type={TypeInputEnum.DATE}
34
- value={selectedValue}
35
- onChange={(e) => handleChange(e.target.value)}
36
- />
37
- </div>
38
- );
39
- };
@@ -1,80 +0,0 @@
1
- import { useEffect, useState } from "react";
2
-
3
- import { TypeInputEnum } from "../../../../form/form.enum";
4
- import { Input } from "../../../../form/input/Input";
5
-
6
- type DataTableColumnFilterDateRangeProps = {
7
- id: string;
8
- name: string;
9
- onChange: (startDate: string, endDate: string) => void;
10
- currentStartValue?: string;
11
- currentEndValue?: string;
12
- };
13
-
14
- export const DataTableColumnFilterDateRange = ({
15
- id,
16
- name,
17
- onChange,
18
- currentStartValue,
19
- currentEndValue,
20
- }: DataTableColumnFilterDateRangeProps) => {
21
- const [startDate, setStartDate] = useState<string>(currentStartValue ?? "");
22
- const [endDate, setEndDate] = useState<string>(currentEndValue ?? "");
23
-
24
- useEffect(() => {
25
- setStartDate(currentStartValue ?? "");
26
- }, [currentStartValue]);
27
-
28
- useEffect(() => {
29
- setEndDate(currentEndValue ?? "");
30
- }, [currentEndValue]);
31
-
32
- const handleStartDateChange = (value: string) => {
33
- setStartDate(value);
34
- onChange(value, endDate);
35
- };
36
-
37
- const handleEndDateChange = (value: string) => {
38
- setEndDate(value);
39
- onChange(startDate, value);
40
- };
41
-
42
- return (
43
- <div>
44
- <div style={{ display: "flex", flexDirection: "column", gap: "12px" }}>
45
- <div>
46
- <label
47
- htmlFor={`${id}-start`}
48
- style={{ display: "block", marginBottom: "4px" }}
49
- >
50
- Date début
51
- </label>
52
- <Input
53
- id={`${id}-start`}
54
- name={`${name}-start`}
55
- type={TypeInputEnum.DATE}
56
- value={startDate}
57
- onClick={(e) => e.stopPropagation()}
58
- onChange={(e) => handleStartDateChange(e.target.value)}
59
- />
60
- </div>
61
- <div>
62
- <label
63
- htmlFor={`${id}-end`}
64
- style={{ display: "block", marginBottom: "4px" }}
65
- >
66
- Date fin
67
- </label>
68
- <Input
69
- id={`${id}-end`}
70
- name={`${name}-end`}
71
- type={TypeInputEnum.DATE}
72
- value={endDate}
73
- onClick={(e) => e.stopPropagation()}
74
- onChange={(e) => handleEndDateChange(e.target.value)}
75
- />
76
- </div>
77
- </div>
78
- </div>
79
- );
80
- };
@@ -1,89 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { Button } from "../../../..";
3
- import { EnumerableType } from "../../../../_core/type/generiqueType";
4
- import { TypeInputEnum } from "../../../../form/form.enum";
5
- import { Input } from "../../../../form/input/Input";
6
-
7
- type DataTableColumnFilterEnumProps = {
8
- type: TypeInputEnum;
9
- id: string;
10
- name?: string;
11
- data: EnumerableType[];
12
- onChange: (value: string) => void;
13
- currentValue?: string;
14
- };
15
- export const DataTableColumnFilterEnum = ({
16
- type,
17
- id,
18
- onChange,
19
- name,
20
- data,
21
- currentValue = "",
22
- }: DataTableColumnFilterEnumProps) => {
23
- const [selectedValue, setSelectedValue] = useState<string[]>(() => {
24
- return currentValue ? currentValue.split(",") : [];
25
- });
26
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
27
- let newSelectedValue: string[];
28
-
29
- if (type === TypeInputEnum.RADIO) {
30
- newSelectedValue = [e.target.value];
31
- } else {
32
- if (selectedValue.includes(e.target.value)) {
33
- newSelectedValue = selectedValue.filter(
34
- (val) => val !== e.target.value,
35
- );
36
- } else {
37
- newSelectedValue = [...selectedValue, e.target.value];
38
- }
39
- }
40
-
41
- setSelectedValue(newSelectedValue);
42
- onChange(newSelectedValue.join(","));
43
- };
44
- const allSelected = () => {
45
- if (selectedValue.length === data.length) {
46
- setSelectedValue([]);
47
- onChange("");
48
- } else {
49
- const allValues = data.map((d) => d.value);
50
- setSelectedValue(allValues);
51
- onChange(allValues.join(","));
52
- }
53
- };
54
- useEffect(() => {
55
- const newValue = currentValue ? currentValue.split(",") : [];
56
- setSelectedValue(newValue);
57
- }, [currentValue]);
58
- return (
59
- <>
60
- {data?.map((opt) => (
61
- <div
62
- style={{
63
- width: "150px",
64
- }}
65
- className="d-flex align-items-center"
66
- key={opt.value}
67
- >
68
- <Input
69
- id={id}
70
- name={`${name}-${opt.value}-filter`}
71
- value={opt.value}
72
- onChange={handleChange}
73
- type={type}
74
- checked={selectedValue.includes(opt.value)}
75
- />
76
- <label className="ml-2" htmlFor={`${name}-${opt.value}-filter`}>
77
- {opt.label}
78
- </label>
79
- </div>
80
- ))}
81
- <Button
82
- className="mt-2"
83
- onClick={allSelected}
84
- id={`${id}-select-all`}
85
- title="Tout sélectionner"
86
- />
87
- </>
88
- );
89
- };
@@ -1,37 +0,0 @@
1
- import { useState } from "react";
2
-
3
- import { Input } from "../../../../form/input/Input";
4
-
5
- type DataTableColumnFilterStringProps = {
6
- id: string;
7
- name: string;
8
- label: string;
9
- onChange: (value: string) => void;
10
- currentValue?: string;
11
- };
12
- export const DataTableColumnFilterString = ({
13
- id,
14
- name,
15
- label,
16
- onChange,
17
- currentValue,
18
- }: DataTableColumnFilterStringProps) => {
19
- const [selectedValue, setSelectedValue] = useState<string>(
20
- currentValue ?? "",
21
- );
22
- const handleChange = (value: string) => {
23
- setSelectedValue(value);
24
- onChange(value);
25
- };
26
- return (
27
- <div>
28
- <p>{label}</p>
29
- <Input
30
- id={id}
31
- name={name}
32
- value={selectedValue}
33
- onChange={(e) => handleChange(e.target.value)}
34
- />
35
- </div>
36
- );
37
- };
@@ -1,42 +0,0 @@
1
- import { Icon } from "../../../icon/Icon";
2
- import { DataTableSortDirection } from "../../DataTable";
3
- import { DataTableColumnsInterface } from "../../dataTable.interface";
4
-
5
- type DataTableColumnSortProps<T> = {
6
- className?: string;
7
- column: DataTableColumnsInterface<T>;
8
- sortDirection?: DataTableSortDirection | null;
9
- onToggleSort?: (column: DataTableColumnsInterface<T>) => void;
10
- };
11
-
12
- export const DataTableColumnSort = <T,>({
13
- className,
14
- column,
15
- sortDirection,
16
- onToggleSort,
17
- }: DataTableColumnSortProps<T>) => {
18
- const iconClass =
19
- sortDirection === "asc"
20
- ? "bi-sort-up"
21
- : sortDirection === "desc"
22
- ? "bi-sort-down"
23
- : "bi-arrow-down-up";
24
-
25
- return (
26
- <div
27
- className={`data-table-column-sort ${sortDirection ? "active" : ""} ${className ?? ""}`}
28
- >
29
- <span>
30
- <Icon
31
- onClick={(e) => {
32
- e.stopPropagation();
33
- onToggleSort?.(column);
34
- }}
35
- classIcon={`${iconClass} cursor-pointer ${
36
- sortDirection ? "data-table-column-sort-active" : ""
37
- }`}
38
- />
39
- </span>
40
- </div>
41
- );
42
- };