kelt-ui-kit-react 1.8.3 → 1.8.5

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 (243) hide show
  1. package/dist/badge/Badge.d.ts +1 -3
  2. package/dist/button/button.interface.d.ts +1 -1
  3. package/dist/dataTable/DataTable.d.ts +3 -17
  4. package/dist/dataTable/dataTable.interface.d.ts +4 -21
  5. package/dist/dataTable/dataTableActions/DataTableAction.d.ts +2 -2
  6. package/dist/dataTable/dataTableColumn/DataTableColumn.d.ts +7 -13
  7. package/dist/dataTable/dataTableLoading/DataTableLoading.d.ts +3 -1
  8. package/dist/dataTable/dataTableRow/DataTableRow.d.ts +3 -5
  9. package/dist/expands/expand/expand.d.ts +1 -1
  10. package/dist/form/form.enum.d.ts +0 -1
  11. package/dist/form/input/Input.d.ts +0 -3
  12. package/dist/form/inputNumber/InputNumber.d.ts +2 -0
  13. package/dist/icon/Icon.d.ts +1 -1
  14. package/dist/icon/icon.interface.d.ts +0 -1
  15. package/dist/index.d.ts +0 -1
  16. package/dist/index.js +2759 -3573
  17. package/dist/overlayPanel/OverlayPanel.d.ts +1 -3
  18. package/dist/select/Select.d.ts +1 -4
  19. package/dist/select/selectOption.interface.d.ts +0 -1
  20. package/dist/style.css +1 -1
  21. package/dist/tabs/Tabs.d.ts +1 -2
  22. package/package.json +1 -1
  23. package/src/badge/Badge.tsx +1 -9
  24. package/src/badge/badge.css +0 -4
  25. package/src/button/Button.tsx +1 -1
  26. package/src/button/button.interface.tsx +1 -1
  27. package/src/card/card.css +3 -23
  28. package/src/card/cardAction/CardAction.tsx +4 -4
  29. package/src/damier/damier.css +3 -2
  30. package/src/dataTable/DataTable.tsx +45 -670
  31. package/src/dataTable/DataTable.view.tsx +14 -47
  32. package/src/dataTable/dataTable.css +5 -153
  33. package/src/dataTable/dataTable.interface.ts +4 -21
  34. package/src/dataTable/dataTableActions/DataTableAction.tsx +2 -2
  35. package/src/dataTable/dataTableColumn/DataTableColumn.tsx +14 -64
  36. package/src/dataTable/dataTableLoading/DataTableLoading.tsx +15 -4
  37. package/src/dataTable/dataTableRow/DataTableRow.tsx +35 -60
  38. package/src/expands/Expands.tsx +16 -2
  39. package/src/expands/expand/expand.tsx +18 -6
  40. package/src/form/Form.tsx +12 -13
  41. package/src/form/form.css +2 -13
  42. package/src/form/form.enum.ts +0 -1
  43. package/src/form/input/Input.tsx +7 -61
  44. package/src/form/input/input.css +1 -23
  45. package/src/form/inputNumber/InputNumber.tsx +11 -6
  46. package/src/form/inputPrice/InputPrice.tsx +4 -2
  47. package/src/icon/Icon.tsx +2 -6
  48. package/src/icon/icon.interface.tsx +0 -1
  49. package/src/index.ts +0 -2
  50. package/src/overlayPanel/OverlayPanel.tsx +10 -23
  51. package/src/overlayPanel/overlay.context.tsx +4 -6
  52. package/src/overlayPanel/overlayPanel.css +1 -10
  53. package/src/select/Select.tsx +38 -134
  54. package/src/select/select.css +14 -65
  55. package/src/select/selectOption.interface.ts +0 -1
  56. package/src/sidebar/Sidebar.tsx +80 -9
  57. package/src/sidebar/sidebar.css +18 -1
  58. package/src/tabs/Tabs.tsx +1 -19
  59. package/dist/_core/type/generiqueType.d.ts +0 -4
  60. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.d.ts +0 -10
  61. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.d.ts +0 -9
  62. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.d.ts +0 -9
  63. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.d.ts +0 -13
  64. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.d.ts +0 -9
  65. package/dist/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.d.ts +0 -11
  66. package/dist/dataTable/dataTableFilters/DataTableFilters.d.ts +0 -7
  67. package/dist/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.d.ts +0 -12
  68. package/dist/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.d.ts +0 -11
  69. package/kelt-ui-kit-react-1.6.9.tgz +0 -0
  70. package/package/README.md +0 -46
  71. package/package/index.html +0 -20
  72. package/package/package.json +0 -56
  73. package/package/public/favicon.ico +0 -0
  74. package/package/public/index.html +0 -18
  75. package/package/public/logo192.png +0 -0
  76. package/package/public/logo512.png +0 -0
  77. package/package/public/manifest.json +0 -25
  78. package/package/public/robots.txt +0 -3
  79. package/package/src/App.css +0 -11
  80. package/package/src/App.menu.tsx +0 -249
  81. package/package/src/App.routes.tsx +0 -16
  82. package/package/src/App.tsx +0 -30
  83. package/package/src/_core/hooks/HistoryProvider.tsx +0 -25
  84. package/package/src/_core/hooks/ImageChecker.tsx +0 -26
  85. package/package/src/_core/hooks/imageExist.tsx +0 -9
  86. package/package/src/_core/hooks/isEAN13.tsx +0 -16
  87. package/package/src/_core/hooks/objectToQueryParams.tsx +0 -32
  88. package/package/src/_core/hooks/useCurrency.tsx +0 -18
  89. package/package/src/_core/hooks/useDateutils.ts +0 -64
  90. package/package/src/_core/hooks/useIsMobile.ts +0 -18
  91. package/package/src/_core/hooks/useToken.tsx +0 -19
  92. package/package/src/_core/hooks/useValidate.tsx +0 -18
  93. package/package/src/_core/hooks/widgetSupport.tsx +0 -39
  94. package/package/src/action/Action.view.tsx +0 -21
  95. package/package/src/action/ButtonAction.tsx +0 -32
  96. package/package/src/action/action.css +0 -20
  97. package/package/src/badge/Badge.tsx +0 -34
  98. package/package/src/badge/Badge.view.tsx +0 -15
  99. package/package/src/badge/badge.css +0 -55
  100. package/package/src/button/Button.tsx +0 -46
  101. package/package/src/button/Button.view.tsx +0 -85
  102. package/package/src/button/button.css +0 -53
  103. package/package/src/button/button.interface.tsx +0 -21
  104. package/package/src/button/buttonActions/ButtonActions.tsx +0 -104
  105. package/package/src/button/buttonFile/ButtonFile.tsx +0 -59
  106. package/package/src/button/buttonFile/ButtonFile.view.tsx +0 -70
  107. package/package/src/button/buttonFilters/ButtonFilters.tsx +0 -102
  108. package/package/src/button/buttonFilters/buttonFilters.css +0 -22
  109. package/package/src/card/Card.tsx +0 -125
  110. package/package/src/card/Card.view.tsx +0 -73
  111. package/package/src/card/card.css +0 -145
  112. package/package/src/card/card.interface.tsx +0 -9
  113. package/package/src/card/cardAction/CardAction.tsx +0 -135
  114. package/package/src/card/cardAction/cardAction.css +0 -10
  115. package/package/src/card/cardAction.interface.tsx +0 -10
  116. package/package/src/card/hook/useCardInteractions.tsx +0 -30
  117. package/package/src/carousel/Carousel.css +0 -44
  118. package/package/src/carousel/Carousel.tsx +0 -115
  119. package/package/src/carousel/Carousel.view.tsx +0 -13
  120. package/package/src/damier/Damier.tsx +0 -64
  121. package/package/src/damier/Damier.view.tsx +0 -31
  122. package/package/src/damier/damier.css +0 -50
  123. package/package/src/damier/damierCell/DamierCell.tsx +0 -18
  124. package/package/src/damier/damierCell/damierCell.interface.tsx +0 -5
  125. package/package/src/dataTable/DataTable.tsx +0 -259
  126. package/package/src/dataTable/DataTable.view.tsx +0 -62
  127. package/package/src/dataTable/dataTable.css +0 -30
  128. package/package/src/dataTable/dataTable.interface.ts +0 -30
  129. package/package/src/dataTable/dataTableActions/DataTableAction.tsx +0 -44
  130. package/package/src/dataTable/dataTableColumn/DataTableColumn.tsx +0 -27
  131. package/package/src/dataTable/dataTableLoading/DataTableLoading.tsx +0 -21
  132. package/package/src/dataTable/dataTableRow/DataTableRow.tsx +0 -54
  133. package/package/src/datePicker/DatePicker.tsx +0 -110
  134. package/package/src/datePicker/DatePicker.view.tsx +0 -9
  135. package/package/src/datePicker/datePicker.css +0 -77
  136. package/package/src/expands/Expands.tsx +0 -42
  137. package/package/src/expands/Expands.view.tsx +0 -90
  138. package/package/src/expands/expand/expand.interface.tsx +0 -8
  139. package/package/src/expands/expand/expand.tsx +0 -75
  140. package/package/src/expands/expands.css +0 -97
  141. package/package/src/filAriane/FilAriane.tsx +0 -57
  142. package/package/src/filAriane/FilAriane.view.tsx +0 -28
  143. package/package/src/filAriane/filAriane.css +0 -23
  144. package/package/src/filAriane/filAriane.interface.tsx +0 -6
  145. package/package/src/form/Form.tsx +0 -279
  146. package/package/src/form/Form.view.tsx +0 -59
  147. package/package/src/form/form.css +0 -62
  148. package/package/src/form/form.enum.ts +0 -13
  149. package/package/src/form/form.interface.tsx +0 -37
  150. package/package/src/form/input/Input.tsx +0 -106
  151. package/package/src/form/input/input.css +0 -26
  152. package/package/src/form/inputNumber/InputNumber.tsx +0 -132
  153. package/package/src/form/inputNumber/InputNumber.view.tsx +0 -15
  154. package/package/src/form/inputPrice/InputPrice.tsx +0 -42
  155. package/package/src/form/inputPrice/InputPrice.view.tsx +0 -15
  156. package/package/src/form/textArea/TextArea.tsx +0 -59
  157. package/package/src/form/textArea/TextArea.view.tsx +0 -34
  158. package/package/src/form/textArea/textArea.css +0 -9
  159. package/package/src/grid/Grid.tsx +0 -21
  160. package/package/src/grid/Grid.view.tsx +0 -24
  161. package/package/src/grid/col/Col.tsx +0 -15
  162. package/package/src/grid/col/colStyled/ColStyled.tsx +0 -41
  163. package/package/src/grid/container/Container.tsx +0 -8
  164. package/package/src/grid/container/container.css +0 -5
  165. package/package/src/grid/grid.interface.tsx +0 -7
  166. package/package/src/grid/row/Row.tsx +0 -12
  167. package/package/src/grid/row/row.css +0 -18
  168. package/package/src/header/Header.tsx +0 -62
  169. package/package/src/header/Header.view.tsx +0 -5
  170. package/package/src/header/header.css +0 -26
  171. package/package/src/header/header.interface.tsx +0 -10
  172. package/package/src/home/Home.tsx +0 -3
  173. package/package/src/icon/Icon.tsx +0 -6
  174. package/package/src/icon/Icons.view.tsx +0 -29
  175. package/package/src/icon/icon.css +0 -20
  176. package/package/src/icon/icon.interface.tsx +0 -6
  177. package/package/src/icon/iconSize.enum.ts +0 -7
  178. package/package/src/index.css +0 -502
  179. package/package/src/index.ts +0 -58
  180. package/package/src/loader/Loader.tsx +0 -37
  181. package/package/src/loader/Loader.view.tsx +0 -20
  182. package/package/src/loader/loader.css +0 -30
  183. package/package/src/logo.svg +0 -1
  184. package/package/src/main.tsx +0 -10
  185. package/package/src/menus/Menus.tsx +0 -42
  186. package/package/src/menus/Menus.view.tsx +0 -39
  187. package/package/src/menus/menu/Menu.tsx +0 -17
  188. package/package/src/menus/menu/menu.interface.tsx +0 -9
  189. package/package/src/menus/menus.css +0 -47
  190. package/package/src/message/Message.tsx +0 -30
  191. package/package/src/message/Message.view.tsx +0 -22
  192. package/package/src/message/message.css +0 -29
  193. package/package/src/modal/Modal.tsx +0 -59
  194. package/package/src/modal/Modal.view.tsx +0 -26
  195. package/package/src/modal/modal.css +0 -71
  196. package/package/src/notFound/NotFound.tsx +0 -3
  197. package/package/src/overlayPanel/OverlayPanel.tsx +0 -195
  198. package/package/src/overlayPanel/OverlayPanel.view.tsx +0 -25
  199. package/package/src/overlayPanel/overlay.context.tsx +0 -28
  200. package/package/src/overlayPanel/overlayPanel.css +0 -35
  201. package/package/src/overlayPanel/overlayPanelStyled/OverlayPanelStyled.tsx +0 -18
  202. package/package/src/pdfViewer/PdfViewer.tsx +0 -73
  203. package/package/src/pdfViewer/PdfViewer.view.tsx +0 -5
  204. package/package/src/quantity/Quantity.tsx +0 -103
  205. package/package/src/quantity/Quantity.view.tsx +0 -0
  206. package/package/src/quantity/quantity.css +0 -26
  207. package/package/src/search/Search.tsx +0 -161
  208. package/package/src/search/Search.view.tsx +0 -14
  209. package/package/src/search/search.css +0 -59
  210. package/package/src/select/Select.tsx +0 -103
  211. package/package/src/select/Select.view.tsx +0 -71
  212. package/package/src/select/select.css +0 -69
  213. package/package/src/select/selectOption.interface.ts +0 -4
  214. package/package/src/sidebar/Sidebar.tsx +0 -208
  215. package/package/src/sidebar/Sidebar.view.tsx +0 -17
  216. package/package/src/sidebar/sidebar.css +0 -104
  217. package/package/src/sidebarData/SidebarData.tsx +0 -19
  218. package/package/src/sidebarData/SidebarData.view.tsx +0 -19
  219. package/package/src/sidebarData/sidebarData.css +0 -27
  220. package/package/src/tabs/Tabs.tsx +0 -90
  221. package/package/src/tabs/Tabs.view.tsx +0 -20
  222. package/package/src/tabs/tabs.css +0 -24
  223. package/package/src/toaster/Toaster.tsx +0 -55
  224. package/package/src/toaster/Toaster.view.tsx +0 -24
  225. package/package/src/toaster/store/useToasterStore.tsx +0 -41
  226. package/package/src/toaster/toaster.css +0 -87
  227. package/package/tsconfig.json +0 -28
  228. package/package/vite.config.ts +0 -20
  229. package/package/vite.config.ts.timestamp-1733262892554-a13dfef6e8a29.mjs +0 -24
  230. package/package/vite.config.ts.timestamp-1757847121745-e5a5bf54b81b.mjs +0 -28
  231. package/package/vite.config.ts.timestamp-1759742478362-4ac5c5a7db34b.mjs +0 -28
  232. package/src/_core/type/generiqueType.tsx +0 -4
  233. package/src/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.tsx +0 -36
  234. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilter.css +0 -0
  235. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.tsx +0 -39
  236. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.tsx +0 -80
  237. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.tsx +0 -89
  238. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.tsx +0 -37
  239. package/src/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.tsx +0 -42
  240. package/src/dataTable/dataTableFilters/DataTableFilters.tsx +0 -91
  241. package/src/dataTable/dataTableFilters/dataTableFilters.css +0 -16
  242. package/src/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.tsx +0 -80
  243. package/src/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.tsx +0 -123
@@ -1,7 +1,5 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
1
+ import { useCallback, useRef } from "react";
2
2
  import { Icon } from "../icon/Icon";
3
-
4
- import { OverlayPanel } from "../overlayPanel/OverlayPanel";
5
3
  import "./select.css";
6
4
  import { SelectOptionInterface } from "./selectOption.interface";
7
5
 
@@ -13,8 +11,6 @@ export interface SelectProps {
13
11
  name?: string;
14
12
  defaultValue?: string | string[];
15
13
  multiple?: boolean;
16
- showOptions?: boolean;
17
- usePortal?: boolean;
18
14
  required?: boolean;
19
15
  value?: string | string[];
20
16
  className?: string;
@@ -22,7 +18,6 @@ export interface SelectProps {
22
18
  onChangeMultiple?: (value: string[]) => void;
23
19
  onChange?: (value: string) => void;
24
20
  placeholder?: string;
25
- classNameOverlay?: string;
26
21
  }
27
22
 
28
23
  export const Select = ({
@@ -32,92 +27,38 @@ export const Select = ({
32
27
  className,
33
28
  disabled,
34
29
  multiple = false,
35
- showOptions = false,
30
+ required = false,
36
31
  defaultValue,
37
- usePortal = false,
32
+ name,
38
33
  onChange,
39
34
  onChangeMultiple,
40
35
  value,
41
36
  placeholder,
42
- classNameOverlay,
43
37
  }: SelectProps): JSX.Element => {
44
- const [showOverlay, setShowOverlay] = useState(false);
45
- const [overlayRef, setOverlayRef] = useState<HTMLElement | null>(null);
46
- const triggerRef = useRef<HTMLButtonElement | null>(null);
47
- const hasAutoOpened = useRef(false);
48
- const optionsListRef = useRef<HTMLDivElement | null>(null);
49
-
50
- useEffect(() => {
51
- if (!showOverlay) return;
52
- const timer = setTimeout(() => {
53
- const container = optionsListRef.current;
54
- if (!container) return;
55
- const selected = container.querySelector<HTMLElement>(
56
- ".select-overlay-option.selected",
57
- );
58
- selected?.scrollIntoView({ block: "nearest" });
59
- }, 0);
60
- return () => clearTimeout(timer);
61
- }, [showOverlay]);
62
- const selectedValues = Array.isArray(value)
63
- ? value
64
- : value
65
- ? [value]
66
- : defaultValue
67
- ? Array.isArray(defaultValue)
68
- ? defaultValue
69
- : [defaultValue]
70
- : [];
38
+ const inputRefs = useRef<{ [key: string]: HTMLSelectElement | null }>({});
71
39
 
72
- const getDisplayValue = () => {
73
- if (selectedValues.length === 0) return placeholder || "";
40
+ const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
41
+ let selectedValue: string | string[];
74
42
  if (multiple) {
75
- const labels = selectedValues
76
- .map((v) => options.find((opt) => opt.value === v)?.label)
77
- .filter((l): l is string => !!l);
78
- return labels.join(", ");
79
- }
80
- const selected = options.find((opt) => opt.value === selectedValues[0]);
81
- return selected?.label || "";
82
- };
83
-
84
- const handleOptionClick = (optionValue: string) => {
85
- if (multiple) {
86
- const newValues = selectedValues.includes(optionValue)
87
- ? selectedValues.filter((v) => v !== optionValue)
88
- : [...selectedValues, optionValue];
43
+ selectedValue = Array.from(
44
+ event.target.selectedOptions,
45
+ (opt) => opt.value
46
+ );
89
47
  if (onChangeMultiple) {
90
- onChangeMultiple(newValues);
48
+ onChangeMultiple(selectedValue as string[]);
91
49
  }
92
50
  } else {
51
+ selectedValue = event.target.value;
93
52
  if (onChange) {
94
- onChange(optionValue);
53
+ onChange(selectedValue);
95
54
  }
96
- setShowOverlay(false);
97
55
  }
98
56
  };
99
-
100
57
  const resetValue = useCallback(() => {
101
- if (multiple && onChangeMultiple) {
102
- onChangeMultiple([]);
103
- } else if (onChange) {
58
+ if (onChange) {
104
59
  onChange("");
105
60
  }
106
- }, [onChange, onChangeMultiple, multiple]);
107
-
108
- useEffect(() => {
109
- if (
110
- showOptions &&
111
- !disabled &&
112
- !hasAutoOpened.current &&
113
- triggerRef.current
114
- ) {
115
- setOverlayRef(triggerRef.current);
116
- setShowOverlay(true);
117
- hasAutoOpened.current = true;
118
- }
119
- }, [showOptions, disabled]);
120
-
61
+ }, [onChange]);
121
62
  return (
122
63
  <div id={id} className={`select-container ${className ? className : ""}`}>
123
64
  {label && (
@@ -125,73 +66,36 @@ export const Select = ({
125
66
  {label}
126
67
  </label>
127
68
  )}
128
- <button
129
- ref={triggerRef}
130
- id={`select-${id}`}
69
+ <select
70
+ defaultValue=""
71
+ required={required}
72
+ name={name}
131
73
  disabled={disabled}
132
- className="select-container-button"
133
- onClick={(e) => {
134
- setOverlayRef(e.currentTarget as HTMLElement);
135
- setShowOverlay(true);
136
- }}
137
- type="button"
138
- aria-valuetext={getDisplayValue() || placeholder}
139
- aria-haspopup="listbox"
140
- aria-expanded={showOverlay}
74
+ id={`select-${id}`}
75
+ className="select-container-select"
76
+ value={value ?? defaultValue ?? (multiple ? [] : "")}
77
+ onChange={handleChange}
78
+ multiple={multiple}
79
+ ref={(el) => (inputRefs.current[id ?? "select"] = el)}
141
80
  >
142
- <span className="select-container-value">
143
- {getDisplayValue() || (
144
- <span className="placeholder">{placeholder}</span>
145
- )}
146
- </span>
147
- </button>
148
-
149
- {showOverlay && overlayRef && (
150
- <OverlayPanel
151
- show={showOverlay}
152
- position="bottomLeft"
153
- className={classNameOverlay ?? ""}
154
- closeOverlay={() => setShowOverlay(false)}
155
- referenceElement={overlayRef}
156
- usePortal={usePortal}
157
- children={
158
- <div className="select-overlay-options" ref={optionsListRef}>
159
- {options.map((option) => (
160
- <div
161
- key={option.value}
162
- aria-valuetext={option.label}
163
- className={`select-overlay-option ${option.disabled ? "disabled" : ""} ${
164
- selectedValues.includes(option.value) ? "selected" : ""
165
- }`}
166
- onClick={() =>
167
- !option.disabled && handleOptionClick(option.value)
168
- }
169
- role="option"
170
- aria-selected={selectedValues.includes(option.value)}
171
- >
172
- {multiple && (
173
- <input
174
- type="checkbox"
175
- checked={selectedValues.includes(option.value)}
176
- readOnly
177
- className="select-overlay-checkbox"
178
- />
179
- )}
180
- <span>{option.label}</span>
181
- </div>
182
- ))}
183
- </div>
184
- }
185
- />
186
- )}
187
-
188
- {selectedValues.length > 0 && placeholder && (
81
+ {placeholder && !defaultValue && !multiple && (
82
+ <option selected disabled hidden value="">
83
+ {placeholder}
84
+ </option>
85
+ )}
86
+ {options.map((option, index) => (
87
+ <option key={index} value={option.value}>
88
+ {option.label}
89
+ </option>
90
+ ))}
91
+ </select>
92
+ {value !== "" && placeholder && (
189
93
  <div
190
94
  className="clear-btn"
191
95
  onClick={resetValue}
192
96
  aria-label="Réinitialiser"
193
97
  >
194
- <Icon classIcon="bi-x-circle" />
98
+ <Icon classIcon="bi-x" />
195
99
  </div>
196
100
  )}
197
101
  </div>
@@ -1,6 +1,5 @@
1
1
  .select-container {
2
2
  position: relative;
3
-
4
3
  &::after,
5
4
  &::before {
6
5
  --size: 0.3rem;
@@ -9,19 +8,23 @@
9
8
  right: 1rem;
10
9
  pointer-events: none;
11
10
  }
12
-
11
+ select:has(option[value=""]:checked) {
12
+ color: gray;
13
+ }
14
+ option {
15
+ color: #000;
16
+ }
13
17
  .clear-btn {
14
18
  position: absolute;
15
- top: 50%;
16
- transform: translateY(-50%);
19
+ top: 2px;
17
20
  display: flex;
18
21
  align-items: center;
19
22
  z-index: 2;
20
23
  justify-content: center;
21
- right: 10px;
24
+ bottom: 0;
25
+ right: 30px;
22
26
  cursor: pointer;
23
27
  }
24
-
25
28
  &::before {
26
29
  border-left: var(--size) solid transparent;
27
30
  border-right: var(--size) solid transparent;
@@ -35,18 +38,15 @@
35
38
  border-top: var(--size) solid black;
36
39
  top: 55%;
37
40
  }
38
-
39
41
  .select-container-label {
40
42
  font-weight: bold;
41
43
  color: #333;
42
44
  margin-bottom: 2px;
43
- display: block;
44
45
  }
45
-
46
- .select-container-button {
46
+ .select-container-select {
47
47
  appearance: none;
48
48
  width: 100%;
49
- font-size: 0.8rem;
49
+ font-size: 1rem;
50
50
  padding: 0.5rem 1rem;
51
51
  margin: 0.25rem 0;
52
52
  background-color: #fff;
@@ -54,67 +54,16 @@
54
54
  border-radius: 0.25rem;
55
55
  color: #000;
56
56
  cursor: pointer;
57
- text-align: left;
58
- display: flex;
59
- align-items: center;
60
- justify-content: space-between;
61
- padding-right: 2rem;
62
-
63
- .select-container-value {
64
- flex: 1;
65
-
66
- .placeholder {
67
- color: gray;
68
- }
69
- }
70
-
57
+ font-size: 0.8rem;
71
58
  &:disabled {
72
59
  background-color: #e9ecef;
73
60
  color: #6c757d;
74
61
  cursor: not-allowed;
75
62
  }
76
-
77
63
  &:focus {
64
+ border-color: #007bff;
78
65
  outline: none;
79
66
  background-color: #fff;
80
67
  }
81
-
82
-
83
- }
84
-
85
- .select-overlay-options {
86
- display: flex;
87
- flex-direction: column;
88
- max-height: 300px;
89
- overflow-y: auto;
90
- padding: 0.5rem 0;
91
- background-color: #fff;
92
- border: 1px solid #b2a1a1;
93
- border-radius: 0.25rem;
94
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
95
-
96
- .select-overlay-option {
97
- padding: 0.5rem 1rem;
98
- cursor: pointer;
99
- display: flex;
100
- align-items: center;
101
- gap: 0.5rem;
102
- user-select: none;
103
-
104
- .select-overlay-checkbox {
105
- min-width: 20px;
106
- width: 20px;
107
- cursor: pointer;
108
- }
109
-
110
- &:hover {
111
- background-color: #f0f0f0;
112
- }
113
-
114
- &.selected {
115
- background-color: #e7f3ff;
116
- color: #007bff;
117
- }
118
- }
119
68
  }
120
- }
69
+ }
@@ -1,5 +1,4 @@
1
1
  export interface SelectOptionInterface {
2
2
  value: string;
3
3
  label: string;
4
- disabled?: boolean;
5
4
  }
@@ -15,6 +15,9 @@ export interface SidebarProps {
15
15
  onClose?: (close: boolean) => void;
16
16
  }
17
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
+
18
21
  export const Sidebar = ({
19
22
  open,
20
23
  children,
@@ -27,10 +30,13 @@ export const Sidebar = ({
27
30
  displayOverlay = true,
28
31
  }: SidebarProps): JSX.Element => {
29
32
  const [isOpen, setIsOpen] = useState(open || false);
33
+ const [dragX, setDragX] = useState(0);
34
+ const [isDragging, setIsDragging] = useState(false);
30
35
  const sidebarRef = useRef<HTMLDivElement | null>(null);
31
36
  const rootRef = useRef<HTMLDivElement | null>(null);
32
37
  const touchStartX = useRef(0);
33
38
  const touchStartY = useRef(0);
39
+ const axisLocked = useRef<"x" | "y" | null>(null);
34
40
 
35
41
  // Créer le conteneur une seule fois
36
42
  useEffect(() => {
@@ -62,7 +68,7 @@ export const Sidebar = ({
62
68
  }, [onClose]);
63
69
 
64
70
  const handleClickOutside = useCallback(
65
- (event: MouseEvent) => {
71
+ (event: MouseEvent | TouchEvent) => {
66
72
  if (!closeOnClickOutside) return;
67
73
  if (
68
74
  sidebarRef.current &&
@@ -78,33 +84,87 @@ export const Sidebar = ({
78
84
  const touch = event.touches[0];
79
85
  touchStartX.current = touch.clientX;
80
86
  touchStartY.current = touch.clientY;
87
+ axisLocked.current = null;
88
+ setIsDragging(false);
89
+ setDragX(0);
81
90
  }, []);
82
91
 
83
- const handleTouchEnd = useCallback(
92
+ const handleTouchMove = useCallback(
84
93
  (event: React.TouchEvent) => {
85
94
  if (!isOpen) return;
86
95
 
87
- const touch = event.changedTouches[0];
96
+ const touch = event.touches[0];
88
97
  const deltaX = touch.clientX - touchStartX.current;
89
- const deltaY = Math.abs(touch.clientY - touchStartY.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
+ }
90
110
 
91
- // Ferme seulement sur un vrai swipe horizontal gauche -> droite.
92
- if (deltaX > 60 && deltaY < 40) {
93
- toggleSidebar();
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;
94
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;
95
142
  },
96
143
  [isOpen, toggleSidebar],
97
144
  );
98
145
 
146
+ const handleOverlayTouchEnd = useCallback(
147
+ (event: React.TouchEvent) => {
148
+ event.preventDefault();
149
+ toggleSidebar();
150
+ },
151
+ [toggleSidebar],
152
+ );
153
+
99
154
  useEffect(() => {
100
155
  if (isOpen) {
101
156
  document.addEventListener("mousedown", handleClickOutside);
157
+ document.addEventListener("touchstart", handleClickOutside, {
158
+ passive: true,
159
+ });
102
160
  } else {
103
161
  document.removeEventListener("mousedown", handleClickOutside);
162
+ document.removeEventListener("touchstart", handleClickOutside);
104
163
  }
105
164
 
106
165
  return () => {
107
166
  document.removeEventListener("mousedown", handleClickOutside);
167
+ document.removeEventListener("touchstart", handleClickOutside);
108
168
  };
109
169
  }, [isOpen, handleClickOutside]);
110
170
 
@@ -114,12 +174,23 @@ export const Sidebar = ({
114
174
 
115
175
  return ReactDOM.createPortal(
116
176
  <>
117
- {isOpen && displayOverlay && <div className="overlay"></div>}
177
+ {isOpen && displayOverlay && (
178
+ <div
179
+ className="overlay"
180
+ onClick={toggleSidebar}
181
+ onTouchEnd={handleOverlayTouchEnd}
182
+ ></div>
183
+ )}
118
184
  <div
119
185
  ref={sidebarRef}
120
- style={width ? { width: width } : {}}
186
+ style={{
187
+ ...(width ? { width } : {}),
188
+ transform: dragX ? `translateX(${dragX}px)` : undefined,
189
+ transition: isDragging ? "none" : undefined,
190
+ }}
121
191
  className={`sidebar ${isOpen ? "open" : "closed"} ${className ?? ""}`}
122
192
  onTouchStart={handleTouchStart}
193
+ onTouchMove={handleTouchMove}
123
194
  onTouchEnd={handleTouchEnd}
124
195
  >
125
196
  <div className="sidebar-header">
@@ -1,3 +1,18 @@
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
+
1
16
  .sidebar {
2
17
  width: 200px;
3
18
  height: 100vh;
@@ -10,6 +25,8 @@
10
25
  transform: translateX(0);
11
26
  z-index: 2;
12
27
 
28
+
29
+
13
30
  &:not(.full) {
14
31
  inset: 0;
15
32
  }
@@ -84,4 +101,4 @@
84
101
  width: 40vw;
85
102
  }
86
103
  }
87
- }
104
+ }
package/src/tabs/Tabs.tsx CHANGED
@@ -15,7 +15,6 @@ export type TabsProps = {
15
15
  className?: string;
16
16
  tabClassName?: string;
17
17
  panelClassName?: string;
18
- keepMountedVisited?: boolean;
19
18
  };
20
19
 
21
20
  export const Tabs = ({
@@ -26,13 +25,9 @@ export const Tabs = ({
26
25
  className = "",
27
26
  tabClassName = "",
28
27
  panelClassName = "",
29
- keepMountedVisited = false,
30
28
  }: TabsProps) => {
31
29
  const isControlled = typeof index === "number";
32
30
  const [active, setActive] = useState<number>(defaultIndex);
33
- const [visitedTabs, setVisitedTabs] = useState<Set<number>>(
34
- () => new Set([defaultIndex]),
35
- );
36
31
  const current = isControlled ? (index as number) : active;
37
32
 
38
33
  useEffect(() => {
@@ -42,18 +37,6 @@ export const Tabs = ({
42
37
  }
43
38
  }, [defaultIndex, items.length, isControlled]);
44
39
 
45
- useEffect(() => {
46
- setVisitedTabs((prev) => {
47
- if (prev.has(current)) {
48
- return prev;
49
- }
50
-
51
- const next = new Set(prev);
52
- next.add(current);
53
- return next;
54
- });
55
- }, [current]);
56
-
57
40
  const tabsRef = useRef<Array<HTMLButtonElement | null>>([]);
58
41
 
59
42
  const activate = (next: number) => {
@@ -99,8 +82,7 @@ export const Tabs = ({
99
82
  hidden={current !== i}
100
83
  className={`${panelClassName} mt-3`}
101
84
  >
102
- {(current === i || (keepMountedVisited && visitedTabs.has(i))) &&
103
- t.panel}
85
+ {current === i && t.panel}
104
86
  </div>
105
87
  ))}
106
88
  </div>
@@ -1,4 +0,0 @@
1
- export interface EnumerableType {
2
- label: string;
3
- value: string;
4
- }
@@ -1,10 +0,0 @@
1
- import { DataTableColumnsInterface } from '../../dataTable.interface';
2
-
3
- type DataTableColumnFilterProps<T> = {
4
- className?: string;
5
- column: DataTableColumnsInterface<T>;
6
- isFilterVisible?: boolean;
7
- onToggleVisibility?: (column: DataTableColumnsInterface<T>) => void;
8
- };
9
- export declare const DataTableColumnFilter: <T>({ className, column, isFilterVisible, onToggleVisibility, }: DataTableColumnFilterProps<T>) => import("react/jsx-runtime").JSX.Element;
10
- export {};
@@ -1,9 +0,0 @@
1
- type DataTableColumnFilterDateProps = {
2
- id: string;
3
- name: string;
4
- label: string;
5
- onChange: (value: string) => void;
6
- currentValue?: string;
7
- };
8
- export declare const DataTableColumnFilterDate: ({ id, name, label, onChange, currentValue, }: DataTableColumnFilterDateProps) => import("react/jsx-runtime").JSX.Element;
9
- export {};
@@ -1,9 +0,0 @@
1
- type DataTableColumnFilterDateRangeProps = {
2
- id: string;
3
- name: string;
4
- onChange: (startDate: string, endDate: string) => void;
5
- currentStartValue?: string;
6
- currentEndValue?: string;
7
- };
8
- export declare const DataTableColumnFilterDateRange: ({ id, name, onChange, currentStartValue, currentEndValue, }: DataTableColumnFilterDateRangeProps) => import("react/jsx-runtime").JSX.Element;
9
- export {};
@@ -1,13 +0,0 @@
1
- import { EnumerableType } from '../../../../_core/type/generiqueType';
2
- import { TypeInputEnum } from '../../../../form/form.enum';
3
-
4
- type DataTableColumnFilterEnumProps = {
5
- type: TypeInputEnum;
6
- id: string;
7
- name?: string;
8
- data: EnumerableType[];
9
- onChange: (value: string) => void;
10
- currentValue?: string;
11
- };
12
- export declare const DataTableColumnFilterEnum: ({ type, id, onChange, name, data, currentValue, }: DataTableColumnFilterEnumProps) => import("react/jsx-runtime").JSX.Element;
13
- export {};
@@ -1,9 +0,0 @@
1
- type DataTableColumnFilterStringProps = {
2
- id: string;
3
- name: string;
4
- label: string;
5
- onChange: (value: string) => void;
6
- currentValue?: string;
7
- };
8
- export declare const DataTableColumnFilterString: ({ id, name, label, onChange, currentValue, }: DataTableColumnFilterStringProps) => import("react/jsx-runtime").JSX.Element;
9
- export {};
@@ -1,11 +0,0 @@
1
- import { DataTableSortDirection } from '../../DataTable';
2
- import { DataTableColumnsInterface } from '../../dataTable.interface';
3
-
4
- type DataTableColumnSortProps<T> = {
5
- className?: string;
6
- column: DataTableColumnsInterface<T>;
7
- sortDirection?: DataTableSortDirection | null;
8
- onToggleSort?: (column: DataTableColumnsInterface<T>) => void;
9
- };
10
- export declare const DataTableColumnSort: <T>({ className, column, sortDirection, onToggleSort, }: DataTableColumnSortProps<T>) => import("react/jsx-runtime").JSX.Element;
11
- export {};
@@ -1,7 +0,0 @@
1
- import { DataTableFilterState } from '../DataTable';
2
-
3
- export type DataTableFiltersProps = {
4
- currentFilters: DataTableFilterState;
5
- setCurrentFilters: React.Dispatch<React.SetStateAction<DataTableFilterState>>;
6
- };
7
- export declare const DataTableFilters: ({ currentFilters, setCurrentFilters, }: DataTableFiltersProps) => import("react/jsx-runtime").JSX.Element | null;