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.
- package/dist/App.js +22 -0
- package/dist/App.menu.js +251 -0
- package/dist/App.routes.js +8 -0
- package/dist/_core/hooks/HistoryProvider.js +29 -0
- package/dist/_core/hooks/ImageChecker.js +68 -0
- package/dist/_core/hooks/imageExist.js +5 -0
- package/dist/_core/hooks/isEAN13.js +10 -0
- package/dist/_core/hooks/objectToQueryParams.js +28 -0
- package/dist/_core/hooks/useCurrency.js +12 -0
- package/dist/_core/hooks/useDateutils.js +59 -0
- package/dist/_core/hooks/useIsMobile.js +13 -0
- package/dist/_core/hooks/useToken.js +17 -0
- package/dist/_core/hooks/useValidate.js +15 -0
- package/dist/_core/hooks/widgetSupport.js +18 -0
- package/dist/action/Action.view.js +22 -0
- package/dist/action/ButtonAction.js +25 -0
- package/dist/badge/Badge.js +25 -0
- package/dist/badge/Badge.view.js +5 -0
- package/dist/button/Button.js +25 -0
- package/dist/button/Button.view.js +74 -0
- package/dist/button/button.interface.js +1 -0
- package/dist/button/buttonActions/ButtonActions.js +55 -0
- package/dist/button/buttonFile/ButtonFile.js +37 -0
- package/dist/button/buttonFile/ButtonFile.view.js +35 -0
- package/dist/button/buttonFilters/ButtonFilters.js +47 -0
- package/dist/card/Card.js +57 -0
- package/dist/card/Card.view.js +60 -0
- package/dist/card/card.interface.js +1 -0
- package/dist/card/cardAction/CardAction.js +66 -0
- package/dist/card/cardAction.interface.js +1 -0
- package/dist/card/hook/useCardInteractions.js +25 -0
- package/dist/carousel/Carousel.js +67 -0
- package/dist/carousel/Carousel.view.js +16 -0
- package/dist/damier/Damier.js +48 -0
- package/dist/damier/Damier.view.js +22 -0
- package/dist/damier/damierCell/DamierCell.js +21 -0
- package/dist/damier/damierCell/damierCell.interface.js +1 -0
- package/dist/dataTable/DataTable.js +117 -0
- package/dist/dataTable/DataTable.view.js +48 -0
- package/dist/dataTable/dataTable.interface.d.ts +4 -1
- package/dist/dataTable/dataTable.interface.js +1 -0
- package/dist/dataTable/dataTableActions/DataTableAction.js +26 -0
- package/dist/dataTable/dataTableColumn/DataTableColumn.js +21 -0
- package/dist/dataTable/dataTableLoading/DataTableLoading.js +16 -0
- package/dist/dataTable/dataTableRow/DataTableRow.js +39 -0
- package/dist/datePicker/DatePicker.js +64 -0
- package/dist/datePicker/DatePicker.view.js +5 -0
- package/dist/expands/Expands.js +28 -0
- package/dist/expands/Expands.view.js +67 -0
- package/dist/expands/expand/expand.interface.js +1 -0
- package/dist/expands/expand/expand.js +40 -0
- package/dist/filAriane/FilAriane.js +28 -0
- package/dist/filAriane/FilAriane.view.js +28 -0
- package/dist/filAriane/filAriane.interface.js +1 -0
- package/dist/form/Form.js +135 -0
- package/dist/form/Form.view.js +50 -0
- package/dist/form/form.enum.js +14 -0
- package/dist/form/form.interface.js +1 -0
- package/dist/form/input/Input.js +26 -0
- package/dist/form/inputNumber/InputNumber.js +57 -0
- package/dist/form/inputNumber/InputNumber.view.js +7 -0
- package/dist/form/inputPrice/InputPrice.js +36 -0
- package/dist/form/inputPrice/InputPrice.view.js +7 -0
- package/dist/form/textArea/TextArea.js +18 -0
- package/dist/form/textArea/TextArea.view.js +15 -0
- package/dist/grid/Grid.js +19 -0
- package/dist/grid/Grid.view.js +22 -0
- package/dist/grid/col/Col.js +17 -0
- package/dist/grid/col/colStyled/ColStyled.js +26 -0
- package/dist/grid/container/Container.js +17 -0
- package/dist/grid/grid.interface.js +1 -0
- package/dist/grid/row/Row.js +17 -0
- package/dist/header/Header.js +26 -0
- package/dist/header/Header.view.js +5 -0
- package/dist/header/header.interface.js +1 -0
- package/dist/home/Home.js +4 -0
- package/dist/icon/Icon.js +6 -0
- package/dist/icon/Icons.view.js +27 -0
- package/dist/icon/icon.interface.js +1 -0
- package/dist/icon/iconSize.enum.js +8 -0
- package/dist/index.js +50 -5356
- package/dist/loader/Loader.js +20 -0
- package/dist/loader/Loader.view.js +9 -0
- package/dist/main.js +7 -0
- package/dist/menus/Menus.js +23 -0
- package/dist/menus/Menus.view.js +48 -0
- package/dist/menus/menu/Menu.js +15 -0
- package/dist/menus/menu/menu.interface.js +1 -0
- package/dist/message/Message.js +33 -0
- package/dist/message/Message.view.js +11 -0
- package/dist/modal/Modal.js +27 -0
- package/dist/modal/Modal.view.js +22 -0
- package/dist/notFound/NotFound.js +4 -0
- package/dist/overlayPanel/OverlayPanel.js +132 -0
- package/dist/overlayPanel/OverlayPanel.view.js +20 -0
- package/dist/overlayPanel/overlay.context.js +26 -0
- package/dist/overlayPanel/overlayPanelStyled/OverlayPanelStyled.js +13 -0
- package/dist/pdfViewer/PdfViewer.js +71 -0
- package/dist/pdfViewer/PdfViewer.view.js +5 -0
- package/dist/quantity/Quantity.js +60 -0
- package/dist/quantity/Quantity.view.js +1 -0
- package/dist/search/Search.js +80 -0
- package/dist/search/Search.view.js +8 -0
- package/dist/select/Select.d.ts +2 -1
- package/dist/select/Select.js +41 -0
- package/dist/select/Select.view.js +75 -0
- package/dist/select/selectOption.interface.js +1 -0
- package/dist/sidebar/Sidebar.js +132 -0
- package/dist/sidebar/Sidebar.view.js +11 -0
- package/dist/sidebarData/SidebarData.js +17 -0
- package/dist/sidebarData/SidebarData.view.js +14 -0
- package/dist/style.css +1 -1
- package/dist/tabs/Tabs.js +41 -0
- package/dist/tabs/Tabs.view.js +26 -0
- package/dist/toaster/Toaster.js +37 -0
- package/dist/toaster/Toaster.view.js +16 -0
- package/dist/toaster/store/useToasterStore.js +22 -0
- package/package.json +1 -1
- package/src/dataTable/DataTable.tsx +55 -14
- package/src/dataTable/dataTable.css +26 -2
- package/src/dataTable/dataTable.interface.ts +4 -1
- package/src/dataTable/dataTableRow/DataTableRow.tsx +36 -11
- package/src/select/Select.tsx +4 -1
- 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
|
@@ -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
|
|
234
|
+
<tr
|
|
235
|
+
key={rowIndex}
|
|
236
|
+
className={rowIndex % 2 === 0 ? "even" : "odd"}
|
|
237
|
+
onClick={(e) => handleClickRow?.(e, row)}
|
|
238
|
+
>
|
|
202
239
|
{onSelectionChange && (
|
|
203
|
-
<td
|
|
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:
|
|
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.
|
|
26
|
-
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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={{
|
|
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);
|
package/src/select/Select.tsx
CHANGED
|
@@ -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=
|