kelt-ui-kit-react 1.8.5 → 1.9.0

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 (124) hide show
  1. package/dist/App.js +22 -0
  2. package/dist/App.menu.js +251 -0
  3. package/dist/App.routes.js +8 -0
  4. package/dist/_core/hooks/HistoryProvider.js +29 -0
  5. package/dist/_core/hooks/ImageChecker.js +68 -0
  6. package/dist/_core/hooks/imageExist.js +5 -0
  7. package/dist/_core/hooks/isEAN13.js +10 -0
  8. package/dist/_core/hooks/objectToQueryParams.js +28 -0
  9. package/dist/_core/hooks/useCurrency.js +12 -0
  10. package/dist/_core/hooks/useDateutils.js +59 -0
  11. package/dist/_core/hooks/useIsMobile.js +13 -0
  12. package/dist/_core/hooks/useToken.js +17 -0
  13. package/dist/_core/hooks/useValidate.js +15 -0
  14. package/dist/_core/hooks/widgetSupport.js +18 -0
  15. package/dist/action/Action.view.js +22 -0
  16. package/dist/action/ButtonAction.js +25 -0
  17. package/dist/badge/Badge.js +25 -0
  18. package/dist/badge/Badge.view.js +5 -0
  19. package/dist/button/Button.js +25 -0
  20. package/dist/button/Button.view.js +74 -0
  21. package/dist/button/button.interface.js +1 -0
  22. package/dist/button/buttonActions/ButtonActions.js +55 -0
  23. package/dist/button/buttonFile/ButtonFile.js +37 -0
  24. package/dist/button/buttonFile/ButtonFile.view.js +35 -0
  25. package/dist/button/buttonFilters/ButtonFilters.js +47 -0
  26. package/dist/card/Card.js +57 -0
  27. package/dist/card/Card.view.js +60 -0
  28. package/dist/card/card.interface.js +1 -0
  29. package/dist/card/cardAction/CardAction.js +66 -0
  30. package/dist/card/cardAction.interface.js +1 -0
  31. package/dist/card/hook/useCardInteractions.js +25 -0
  32. package/dist/carousel/Carousel.js +67 -0
  33. package/dist/carousel/Carousel.view.js +16 -0
  34. package/dist/damier/Damier.js +48 -0
  35. package/dist/damier/Damier.view.js +22 -0
  36. package/dist/damier/damierCell/DamierCell.js +21 -0
  37. package/dist/damier/damierCell/damierCell.interface.js +1 -0
  38. package/dist/dataTable/DataTable.js +117 -0
  39. package/dist/dataTable/DataTable.view.js +48 -0
  40. package/dist/dataTable/dataTable.interface.d.ts +4 -1
  41. package/dist/dataTable/dataTable.interface.js +1 -0
  42. package/dist/dataTable/dataTableActions/DataTableAction.js +26 -0
  43. package/dist/dataTable/dataTableColumn/DataTableColumn.js +21 -0
  44. package/dist/dataTable/dataTableLoading/DataTableLoading.js +16 -0
  45. package/dist/dataTable/dataTableRow/DataTableRow.js +39 -0
  46. package/dist/datePicker/DatePicker.js +64 -0
  47. package/dist/datePicker/DatePicker.view.js +5 -0
  48. package/dist/expands/Expands.js +28 -0
  49. package/dist/expands/Expands.view.js +67 -0
  50. package/dist/expands/expand/expand.interface.js +1 -0
  51. package/dist/expands/expand/expand.js +40 -0
  52. package/dist/filAriane/FilAriane.js +28 -0
  53. package/dist/filAriane/FilAriane.view.js +28 -0
  54. package/dist/filAriane/filAriane.interface.js +1 -0
  55. package/dist/form/Form.js +135 -0
  56. package/dist/form/Form.view.js +50 -0
  57. package/dist/form/form.enum.js +14 -0
  58. package/dist/form/form.interface.js +1 -0
  59. package/dist/form/input/Input.js +26 -0
  60. package/dist/form/inputNumber/InputNumber.js +57 -0
  61. package/dist/form/inputNumber/InputNumber.view.js +7 -0
  62. package/dist/form/inputPrice/InputPrice.js +36 -0
  63. package/dist/form/inputPrice/InputPrice.view.js +7 -0
  64. package/dist/form/textArea/TextArea.js +18 -0
  65. package/dist/form/textArea/TextArea.view.js +15 -0
  66. package/dist/grid/Grid.js +19 -0
  67. package/dist/grid/Grid.view.js +22 -0
  68. package/dist/grid/col/Col.js +17 -0
  69. package/dist/grid/col/colStyled/ColStyled.js +26 -0
  70. package/dist/grid/container/Container.js +17 -0
  71. package/dist/grid/grid.interface.js +1 -0
  72. package/dist/grid/row/Row.js +17 -0
  73. package/dist/header/Header.js +26 -0
  74. package/dist/header/Header.view.js +5 -0
  75. package/dist/header/header.interface.js +1 -0
  76. package/dist/home/Home.js +4 -0
  77. package/dist/icon/Icon.js +6 -0
  78. package/dist/icon/Icons.view.js +27 -0
  79. package/dist/icon/icon.interface.js +1 -0
  80. package/dist/icon/iconSize.enum.js +8 -0
  81. package/dist/index.js +50 -5356
  82. package/dist/loader/Loader.js +20 -0
  83. package/dist/loader/Loader.view.js +9 -0
  84. package/dist/main.js +7 -0
  85. package/dist/menus/Menus.js +23 -0
  86. package/dist/menus/Menus.view.js +48 -0
  87. package/dist/menus/menu/Menu.js +15 -0
  88. package/dist/menus/menu/menu.interface.js +1 -0
  89. package/dist/message/Message.js +33 -0
  90. package/dist/message/Message.view.js +11 -0
  91. package/dist/modal/Modal.js +27 -0
  92. package/dist/modal/Modal.view.js +22 -0
  93. package/dist/notFound/NotFound.js +4 -0
  94. package/dist/overlayPanel/OverlayPanel.js +132 -0
  95. package/dist/overlayPanel/OverlayPanel.view.js +20 -0
  96. package/dist/overlayPanel/overlay.context.js +26 -0
  97. package/dist/overlayPanel/overlayPanelStyled/OverlayPanelStyled.js +13 -0
  98. package/dist/pdfViewer/PdfViewer.js +71 -0
  99. package/dist/pdfViewer/PdfViewer.view.js +5 -0
  100. package/dist/quantity/Quantity.js +60 -0
  101. package/dist/quantity/Quantity.view.js +1 -0
  102. package/dist/search/Search.js +80 -0
  103. package/dist/search/Search.view.js +8 -0
  104. package/dist/select/Select.d.ts +2 -1
  105. package/dist/select/Select.js +41 -0
  106. package/dist/select/Select.view.js +75 -0
  107. package/dist/select/selectOption.interface.js +1 -0
  108. package/dist/sidebar/Sidebar.js +132 -0
  109. package/dist/sidebar/Sidebar.view.js +11 -0
  110. package/dist/sidebarData/SidebarData.js +17 -0
  111. package/dist/sidebarData/SidebarData.view.js +14 -0
  112. package/dist/style.css +1 -1
  113. package/dist/tabs/Tabs.js +41 -0
  114. package/dist/tabs/Tabs.view.js +26 -0
  115. package/dist/toaster/Toaster.js +37 -0
  116. package/dist/toaster/Toaster.view.js +16 -0
  117. package/dist/toaster/store/useToasterStore.js +22 -0
  118. package/package.json +1 -1
  119. package/src/dataTable/DataTable.tsx +55 -14
  120. package/src/dataTable/dataTable.css +26 -2
  121. package/src/dataTable/dataTable.interface.ts +4 -1
  122. package/src/dataTable/dataTableRow/DataTableRow.tsx +36 -11
  123. package/src/select/Select.tsx +4 -1
  124. package/vite.config.ts.timestamp-1787675603363-8ddae73d076bd.mjs +28 -0
@@ -0,0 +1,41 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useEffect, useRef, useState } from "react";
14
+ import "./tabs.css";
15
+ export var Tabs = function (_a) {
16
+ var items = _a.items, _b = _a.defaultIndex, defaultIndex = _b === void 0 ? 0 : _b, index = _a.index, onChange = _a.onChange, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.tabClassName, tabClassName = _d === void 0 ? "" : _d, _e = _a.panelClassName, panelClassName = _e === void 0 ? "" : _e;
17
+ var isControlled = typeof index === "number";
18
+ var _f = useState(defaultIndex), active = _f[0], setActive = _f[1];
19
+ var current = isControlled ? index : active;
20
+ useEffect(function () {
21
+ // clamp
22
+ if (!isControlled && (defaultIndex < 0 || defaultIndex >= items.length)) {
23
+ setActive(0);
24
+ }
25
+ }, [defaultIndex, items.length, isControlled]);
26
+ var tabsRef = useRef([]);
27
+ var activate = function (next) {
28
+ var _a, _b;
29
+ if ((_a = items[next]) === null || _a === void 0 ? void 0 : _a.disabled)
30
+ return;
31
+ if (isControlled) {
32
+ onChange === null || onChange === void 0 ? void 0 : onChange(next);
33
+ }
34
+ else {
35
+ setActive(next);
36
+ onChange === null || onChange === void 0 ? void 0 : onChange(next);
37
+ }
38
+ (_b = tabsRef.current[next]) === null || _b === void 0 ? void 0 : _b.focus();
39
+ };
40
+ return (_jsxs("div", __assign({ className: "tabs-root ".concat(className) }, { children: [_jsx("div", __assign({ role: "tablist", className: "tabs-header" }, { children: items.map(function (t, i) { return (_jsx("button", __assign({ ref: function (r) { return (tabsRef.current[i] = r); }, role: "tab", id: "tab-".concat(t.key), "aria-selected": current === i, "aria-controls": "panel-".concat(t.key), tabIndex: current === i ? 0 : -1, disabled: t.disabled, onClick: function () { return activate(i); }, className: "".concat(tabClassName, " tab-button ").concat(current === i ? "tab-button--active" : "", " ").concat(t.disabled ? "tab-button--disabled" : "") }, { children: t.title }), "tab-".concat(t.key))); }) })), items.map(function (t, i) { return (_jsx("div", __assign({ role: "tabpanel", id: "panel-".concat(t.key), "aria-labelledby": "tab-".concat(t.key), hidden: current !== i, className: "".concat(panelClassName, " mt-3") }, { children: current === i && t.panel }), "panel-".concat(t.key))); })] })));
41
+ };
@@ -0,0 +1,26 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { Tabs } from "./Tabs";
14
+ export var TabsView = function () {
15
+ var items = [
16
+ { key: "first", title: "Info", panel: _jsx("div", { children: "Contenu 1" }) },
17
+ { key: "second", title: "Détails", panel: _jsx("div", { children: "Contenu 2" }) },
18
+ {
19
+ key: "third",
20
+ title: "Paramètres",
21
+ panel: _jsx("div", { children: "Contenu 3" }),
22
+ disabled: false,
23
+ },
24
+ ];
25
+ return (_jsxs("div", { children: [_jsx("h2", __assign({ className: "text-xl mb-4" }, { children: "Exemple de Tabs" })), _jsx(Tabs, { items: items, defaultIndex: 0 })] }));
26
+ };
@@ -0,0 +1,37 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useCallback, useEffect } from "react";
14
+ import ReactDOM from "react-dom";
15
+ import { Icon } from "../icon/Icon";
16
+ import { useToasterStore } from "./store/useToasterStore";
17
+ import "./toaster.css";
18
+ export var Toaster = function () {
19
+ var _a = useToasterStore(), title = _a.title, description = _a.description, _b = _a.severity, severity = _b === void 0 ? "info" : _b, visible = _a.visible, children = _a.children, duration = _a.duration, hideToast = _a.hideToast, close = _a.close;
20
+ var onClose = useCallback(function () {
21
+ hideToast();
22
+ }, [hideToast]);
23
+ useEffect(function () {
24
+ if (!visible)
25
+ return;
26
+ var timer = setTimeout(function () {
27
+ hideToast();
28
+ }, duration);
29
+ return function () { return clearTimeout(timer); };
30
+ }, [visible, duration, hideToast]);
31
+ if (!visible)
32
+ return null;
33
+ var toasterRoot = document.getElementById("toaster-root");
34
+ if (!toasterRoot)
35
+ return null;
36
+ return ReactDOM.createPortal(_jsxs("div", __assign({ className: "toaster toaster-".concat(severity) }, { children: [close && (_jsx("div", __assign({ className: "toaster--close", onClick: onClose }, { children: _jsx(Icon, { classIcon: "bi-x" }) }))), _jsxs("div", { children: [severity === "info" && _jsx(Icon, { classIcon: "bi-info-circle" }), severity === "success" && _jsx(Icon, { classIcon: "bi-check-circle" }), severity === "error" && _jsx(Icon, { classIcon: "bi-x-circle" }), severity === "warning" && _jsx(Icon, { classIcon: "bi-exclamation-triangle" })] }), _jsxs("div", { children: [_jsx("div", __assign({ className: "title title-".concat(severity) }, { children: title })), description && _jsx("div", __assign({ className: "subtitle" }, { children: description })), children] })] })), toasterRoot);
37
+ };
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from "react";
3
+ import { Button } from "../button/Button";
4
+ import { useToasterStore } from "./store/useToasterStore";
5
+ export var ToasterView = function () {
6
+ var showToast = useToasterStore().showToast;
7
+ var handleClickToast = useCallback(function () {
8
+ showToast("This is a toast message", {
9
+ description: "This is a description for the toast message.",
10
+ severity: "warning",
11
+ duration: 10000,
12
+ children: _jsx("div", { children: "Additional content can go here." }),
13
+ });
14
+ }, [showToast]);
15
+ return (_jsx("div", { children: _jsx(Button, { title: "Show Toast", onClick: handleClickToast, className: "btn btn-primary" }) }));
16
+ };
@@ -0,0 +1,22 @@
1
+ import { create } from "zustand";
2
+ export var useToasterStore = create(function (set) { return ({
3
+ title: "",
4
+ description: "",
5
+ severity: "info",
6
+ visible: false,
7
+ duration: 2500,
8
+ close: true,
9
+ children: null,
10
+ showToast: function (title, options) {
11
+ if (options === void 0) { options = {}; }
12
+ return set(function () { return ({
13
+ title: title,
14
+ description: options.description,
15
+ severity: options.severity || "info",
16
+ duration: options.duration || 2500,
17
+ visible: true,
18
+ children: options.children || null,
19
+ }); });
20
+ },
21
+ hideToast: function () { return set(function () { return ({ visible: false }); }); },
22
+ }); });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kelt-ui-kit-react",
3
3
  "type": "module",
4
- "version": "1.8.5",
4
+ "version": "1.9.0",
5
5
  "private": false,
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -55,15 +55,35 @@ export function DataTable<T>(props: DataTableProps<T>) {
55
55
 
56
56
  const loaderRef = useRef<HTMLDivElement | null>(null);
57
57
  const [selectedRowIds, setSelectedRowIds] = useState<Set<string | number>>(
58
- new Set()
58
+ new Set(),
59
59
  );
60
+
61
+ const isInteractiveClick = useCallback((target: EventTarget | null) => {
62
+ const element =
63
+ target instanceof Element
64
+ ? target
65
+ : target instanceof Node
66
+ ? target.parentElement
67
+ : null;
68
+
69
+ if (!element) {
70
+ return false;
71
+ }
72
+
73
+ return Boolean(
74
+ element.closest(
75
+ "input,button,a,select,textarea,label,option,[role='button'],[role='checkbox'],[role='option'],[contenteditable='true'],[data-stop-row-click='true']",
76
+ ),
77
+ );
78
+ }, []);
79
+
60
80
  const toggleSelectAll = useCallback(() => {
61
81
  if (selectedRowIds.size === data.length) {
62
82
  setSelectedRowIds(new Set());
63
83
  onSelectionChange?.([]);
64
84
  } else {
65
85
  let allIds = data.map((d) =>
66
- getRowId ? getRowId(d) : (d as any).id ?? d
86
+ getRowId ? getRowId(d) : ((d as any).id ?? d),
67
87
  );
68
88
 
69
89
  if (limitSelect && allIds.length > limitSelect) {
@@ -74,8 +94,8 @@ export function DataTable<T>(props: DataTableProps<T>) {
74
94
  setSelectedRowIds(newSelection);
75
95
  onSelectionChange?.(
76
96
  data.filter((d) =>
77
- newSelection.has(getRowId ? getRowId(d) : (d as any).id ?? d)
78
- )
97
+ newSelection.has(getRowId ? getRowId(d) : ((d as any).id ?? d)),
98
+ ),
79
99
  );
80
100
  }
81
101
  }, [data, onSelectionChange, limitSelect, getRowId, selectedRowIds.size]);
@@ -83,16 +103,29 @@ export function DataTable<T>(props: DataTableProps<T>) {
83
103
  const handleClickRow = useCallback(
84
104
  (e: React.MouseEvent, row: T) => {
85
105
  e.stopPropagation();
106
+
107
+ if (isInteractiveClick(e.target)) {
108
+ return;
109
+ }
110
+
111
+ const selectedText =
112
+ typeof window !== "undefined"
113
+ ? window.getSelection?.()?.toString().trim()
114
+ : "";
115
+ if (selectedText) {
116
+ return;
117
+ }
118
+
86
119
  if (onRowClick) {
87
120
  onRowClick?.(row);
88
121
  }
89
122
  },
90
- [onRowClick]
123
+ [isInteractiveClick, onRowClick],
91
124
  );
92
125
  const toggleRow = useCallback(
93
126
  (e: React.ChangeEvent<HTMLInputElement>, row: T) => {
94
127
  e.stopPropagation();
95
- const rowId = getRowId ? getRowId(row) : (row as any).id ?? row;
128
+ const rowId = getRowId ? getRowId(row) : ((row as any).id ?? row);
96
129
  const newSelection = new Set(selectedRowIds);
97
130
 
98
131
  if (newSelection.has(rowId)) {
@@ -107,11 +140,11 @@ export function DataTable<T>(props: DataTableProps<T>) {
107
140
 
108
141
  setSelectedRowIds(newSelection);
109
142
  const selectedItems = data.filter((d) =>
110
- newSelection.has(getRowId ? getRowId(d) : (d as any).id ?? d)
143
+ newSelection.has(getRowId ? getRowId(d) : ((d as any).id ?? d)),
111
144
  );
112
145
  onSelectionChange?.(selectedItems);
113
146
  },
114
- [data, getRowId, limitSelect, onSelectionChange, selectedRowIds]
147
+ [data, getRowId, limitSelect, onSelectionChange, selectedRowIds],
115
148
  );
116
149
  useEffect(() => {
117
150
  if (!onLoadMore || !hasMore) return;
@@ -126,7 +159,7 @@ export function DataTable<T>(props: DataTableProps<T>) {
126
159
  root: null,
127
160
  rootMargin: "0px",
128
161
  threshold: 1.0,
129
- }
162
+ },
130
163
  );
131
164
 
132
165
  if (loaderRef.current) {
@@ -198,9 +231,17 @@ export function DataTable<T>(props: DataTableProps<T>) {
198
231
  )}
199
232
  {!loading &&
200
233
  data.map((row, rowIndex) => (
201
- <tr key={rowIndex} onClick={(e) => handleClickRow?.(e, row)}>
234
+ <tr
235
+ key={rowIndex}
236
+ className={rowIndex % 2 === 0 ? "even" : "odd"}
237
+ onClick={(e) => handleClickRow?.(e, row)}
238
+ >
202
239
  {onSelectionChange && (
203
- <td className="select-cell" style={{ textAlign: "center" }}>
240
+ <td
241
+ className="select-cell"
242
+ style={{ textAlign: "center" }}
243
+ onClick={(e) => e.stopPropagation()}
244
+ >
204
245
  <Input
205
246
  id={`select-row-${rowIndex}`}
206
247
  name={`select-row-${rowIndex}`}
@@ -209,11 +250,11 @@ export function DataTable<T>(props: DataTableProps<T>) {
209
250
  limitSelect !== undefined &&
210
251
  selectedRowIds.size >= limitSelect &&
211
252
  !selectedRowIds.has(
212
- getRowId ? getRowId(row) : (row as any).id ?? row
253
+ getRowId ? getRowId(row) : ((row as any).id ?? row),
213
254
  )
214
255
  }
215
256
  checked={selectedRowIds.has(
216
- getRowId ? getRowId(row) : (row as any).id ?? row
257
+ getRowId ? getRowId(row) : ((row as any).id ?? row),
217
258
  )}
218
259
  onChange={(e) => toggleRow(e, row)} // empêche le clic de déclencher onRowClick
219
260
  />
@@ -223,7 +264,7 @@ export function DataTable<T>(props: DataTableProps<T>) {
223
264
  <DataTableRow column={column} idx={idx} row={row} key={idx} />
224
265
  ))}
225
266
  {actions.length > 0 && (
226
- <td align="right">
267
+ <td align="right" onClick={(e) => e.stopPropagation()}>
227
268
  <div className="d-flex align-items-center justify-content-end">
228
269
  {actions.map((action, index) => (
229
270
  <DataTableAction
@@ -1,14 +1,18 @@
1
1
  .data-table-container {
2
2
  overflow: auto;
3
+
3
4
  .data-table {
4
5
  width: 100%;
5
- border-spacing: 5px;
6
+ border-spacing: 0;
6
7
  font-size: 14px;
7
8
  color: #333;
9
+
8
10
  .select-cell {
9
11
  min-width: 40px !important;
12
+
10
13
  .input-container {
11
14
  min-width: 20px;
15
+
12
16
  input {
13
17
  min-width: 20px;
14
18
  width: 20px;
@@ -16,15 +20,35 @@
16
20
  }
17
21
  }
18
22
  }
23
+
19
24
  thead {
20
25
  margin-bottom: 1rem;
21
26
  position: sticky;
22
27
  top: 0;
23
28
  background-color: #fff;
29
+
24
30
  th {
25
31
  color: #bdbaba;
26
32
  min-width: 100px;
27
33
  }
28
34
  }
35
+
36
+ tbody {
37
+ td {
38
+ padding: 0.5rem;
39
+
40
+ &:not(:first-child) {
41
+ padding-left: 0 !important;
42
+ }
43
+ }
44
+
45
+ tr.even {
46
+ background-color: #ffffff;
47
+ }
48
+
49
+ tr.odd {
50
+ background-color: #f5f5f5;
51
+ }
52
+ }
29
53
  }
30
- }
54
+ }
@@ -16,7 +16,10 @@ export interface dataTableColumnsInterface<T> {
16
16
  onEdit?: (value: any, row: T) => void;
17
17
  onDisable?: (row: T) => boolean;
18
18
  onRowStyle?: (row: T) => React.CSSProperties;
19
- type: HTMLInputTypeAttribute | "select";
19
+ type: HTMLInputTypeAttribute | "select" | "image";
20
+ imageAlt?: (row: T) => string;
21
+ imageStyle?: React.CSSProperties;
22
+ imageSrc?: (row: T) => string;
20
23
  }
21
24
  export interface dataTableActionsInterface<T> {
22
25
  id: string;
@@ -1,3 +1,4 @@
1
+ import { Icon } from "../..";
1
2
  import { Select } from "../../select/Select";
2
3
  import { dataTableColumnsInterface } from "../dataTable.interface";
3
4
 
@@ -10,6 +11,7 @@ export const DataTableRow = ({ column, idx, row }: DataTableRowProps) => {
10
11
  const value = (row as any)[column.id]; // On utilise [column.id] pour accéder aux bonnes propriétés
11
12
  const style = column.onRowStyle ? column.onRowStyle(row) : {};
12
13
  const isDisabled = column.onDisable?.(row) ?? false;
14
+
13
15
  return (
14
16
  <td
15
17
  className={`${isDisabled ? "disabled" : ""}`}
@@ -22,23 +24,46 @@ export const DataTableRow = ({ column, idx, row }: DataTableRowProps) => {
22
24
  }}
23
25
  key={`row-${column.id}-${idx}`}
24
26
  >
25
- {column.editable ? (
26
- column.type === "select" ? (
27
- <Select
28
- options={column.options ?? []}
29
- value={value}
30
- onChange={(e) => {
31
- if (column.onEdit) {
32
- column.onEdit(e, row);
33
- }
34
- }}
27
+ {column.type === "image" ? (
28
+ value ? (
29
+ <img
30
+ src={column.imageSrc ? column.imageSrc(row) : ""}
31
+ alt={column.imageAlt ? column.imageAlt(row) : ""}
32
+ style={column.imageStyle}
35
33
  />
34
+ ) : (
35
+ <Icon classIcon="bi-image" />
36
+ )
37
+ ) : column.editable ? (
38
+ column.type === "select" ? (
39
+ <div onClick={(e) => e.stopPropagation()}>
40
+ <Select
41
+ style={{
42
+ minWidth: column.minWidth,
43
+ maxWidth: column.maxWidth,
44
+ width: column.width,
45
+ }}
46
+ options={column.options ?? []}
47
+ value={value}
48
+ onChange={(e) => {
49
+ if (column.onEdit) {
50
+ column.onEdit(e, row);
51
+ }
52
+ }}
53
+ />
54
+ </div>
36
55
  ) : (
37
56
  <input
38
57
  type={column.type}
39
58
  value={value}
40
59
  step="0.01"
41
- style={{ textAlign: column.align || "left" }}
60
+ style={{
61
+ textAlign: column.align || "left",
62
+ minWidth: column.minWidth,
63
+ maxWidth: column.maxWidth,
64
+ width: column.width,
65
+ }}
66
+ onClick={(e) => e.stopPropagation()}
42
67
  onChange={(e) => {
43
68
  if (column.onEdit) {
44
69
  column.onEdit(e.target.value, row);
@@ -8,6 +8,7 @@ export interface SelectProps {
8
8
  label?: string;
9
9
  title?: string;
10
10
  disabled?: boolean;
11
+ style?: React.CSSProperties;
11
12
  name?: string;
12
13
  defaultValue?: string | string[];
13
14
  multiple?: boolean;
@@ -26,6 +27,7 @@ export const Select = ({
26
27
  options,
27
28
  className,
28
29
  disabled,
30
+ style,
29
31
  multiple = false,
30
32
  required = false,
31
33
  defaultValue,
@@ -42,7 +44,7 @@ export const Select = ({
42
44
  if (multiple) {
43
45
  selectedValue = Array.from(
44
46
  event.target.selectedOptions,
45
- (opt) => opt.value
47
+ (opt) => opt.value,
46
48
  );
47
49
  if (onChangeMultiple) {
48
50
  onChangeMultiple(selectedValue as string[]);
@@ -70,6 +72,7 @@ export const Select = ({
70
72
  defaultValue=""
71
73
  required={required}
72
74
  name={name}
75
+ style={style}
73
76
  disabled={disabled}
74
77
  id={`select-${id}`}
75
78
  className="select-container-select"
@@ -0,0 +1,28 @@
1
+ // vite.config.ts
2
+ import { defineConfig } from "file:///C:/Users/alex/Documents/workspace/ui-kit-react/node_modules/vite/dist/node/index.js";
3
+ import checker from "file:///C:/Users/alex/Documents/workspace/ui-kit-react/node_modules/vite-plugin-checker/dist/esm/main.js";
4
+ import dts from "file:///C:/Users/alex/Documents/workspace/ui-kit-react/node_modules/vite-plugin-dts/dist/index.mjs";
5
+ var vite_config_default = defineConfig({
6
+ plugins: [dts(), checker({ typescript: true })],
7
+ server: {
8
+ port: 2552
9
+ // Remplace 3000 par le port souhaité
10
+ },
11
+ build: {
12
+ lib: {
13
+ entry: "./src/index.ts",
14
+ // Remplacer par l'entrée correcte
15
+ formats: ["es"],
16
+ // Génère un module ES
17
+ name: "kelt-ui-kit-react",
18
+ fileName: "index"
19
+ },
20
+ rollupOptions: {
21
+ external: ["react", "react-dom"]
22
+ }
23
+ }
24
+ });
25
+ export {
26
+ vite_config_default as default
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxhbGV4XFxcXERvY3VtZW50c1xcXFx3b3Jrc3BhY2VcXFxcdWkta2l0LXJlYWN0XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxhbGV4XFxcXERvY3VtZW50c1xcXFx3b3Jrc3BhY2VcXFxcdWkta2l0LXJlYWN0XFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9DOi9Vc2Vycy9hbGV4L0RvY3VtZW50cy93b3Jrc3BhY2UvdWkta2l0LXJlYWN0L3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcclxuaW1wb3J0IGNoZWNrZXIgZnJvbSBcInZpdGUtcGx1Z2luLWNoZWNrZXJcIjtcclxuaW1wb3J0IGR0cyBmcm9tIFwidml0ZS1wbHVnaW4tZHRzXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgcGx1Z2luczogW2R0cygpLCBjaGVja2VyKHsgdHlwZXNjcmlwdDogdHJ1ZSB9KV0sXHJcbiAgc2VydmVyOiB7XHJcbiAgICBwb3J0OiAyNTUyLCAvLyBSZW1wbGFjZSAzMDAwIHBhciBsZSBwb3J0IHNvdWhhaXRcdTAwRTlcclxuICB9LFxyXG4gIGJ1aWxkOiB7XHJcbiAgICBsaWI6IHtcclxuICAgICAgZW50cnk6IFwiLi9zcmMvaW5kZXgudHNcIiwgLy8gUmVtcGxhY2VyIHBhciBsJ2VudHJcdTAwRTllIGNvcnJlY3RlXHJcbiAgICAgIGZvcm1hdHM6IFtcImVzXCJdLCAvLyBHXHUwMEU5blx1MDBFOHJlIHVuIG1vZHVsZSBFU1xyXG4gICAgICBuYW1lOiBcImtlbHQtdWkta2l0LXJlYWN0XCIsXHJcbiAgICAgIGZpbGVOYW1lOiBcImluZGV4XCIsXHJcbiAgICB9LFxyXG4gICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICBleHRlcm5hbDogW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIl0sXHJcbiAgICB9LFxyXG4gIH0sXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQXdVLFNBQVMsb0JBQW9CO0FBQ3JXLE9BQU8sYUFBYTtBQUNwQixPQUFPLFNBQVM7QUFDaEIsSUFBTyxzQkFBUSxhQUFhO0FBQUEsRUFDMUIsU0FBUyxDQUFDLElBQUksR0FBRyxRQUFRLEVBQUUsWUFBWSxLQUFLLENBQUMsQ0FBQztBQUFBLEVBQzlDLFFBQVE7QUFBQSxJQUNOLE1BQU07QUFBQTtBQUFBLEVBQ1I7QUFBQSxFQUNBLE9BQU87QUFBQSxJQUNMLEtBQUs7QUFBQSxNQUNILE9BQU87QUFBQTtBQUFBLE1BQ1AsU0FBUyxDQUFDLElBQUk7QUFBQTtBQUFBLE1BQ2QsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLFVBQVUsQ0FBQyxTQUFTLFdBQVc7QUFBQSxJQUNqQztBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=