kelt-ui-kit-react 2.0.1 → 2.0.3

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 (115) hide show
  1. package/dist/_core/type/generiqueType.d.ts +4 -0
  2. package/dist/badge/Badge.d.ts +3 -1
  3. package/dist/button/Button.d.ts +1 -1
  4. package/dist/button/button.interface.d.ts +1 -2
  5. package/dist/dataTable/DataTable.d.ts +17 -14
  6. package/dist/dataTable/dataTable.interface.d.ts +24 -19
  7. package/dist/dataTable/dataTableActions/DataTableAction.d.ts +3 -5
  8. package/dist/dataTable/dataTableColumn/DataTableColumn.d.ts +13 -7
  9. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.d.ts +10 -0
  10. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.d.ts +9 -0
  11. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.d.ts +9 -0
  12. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.d.ts +13 -0
  13. package/dist/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.d.ts +9 -0
  14. package/dist/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.d.ts +11 -0
  15. package/dist/dataTable/dataTableFilters/DataTableFilters.d.ts +7 -0
  16. package/dist/dataTable/dataTableLoading/DataTableLoading.d.ts +1 -3
  17. package/dist/dataTable/dataTableRow/DataTableRow.d.ts +5 -6
  18. package/dist/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.d.ts +12 -0
  19. package/dist/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.d.ts +11 -0
  20. package/dist/expands/expand/expand.d.ts +1 -1
  21. package/dist/form/Form.d.ts +1 -2
  22. package/dist/form/form.enum.d.ts +2 -2
  23. package/dist/form/form.interface.d.ts +2 -4
  24. package/dist/form/input/Input.d.ts +3 -0
  25. package/dist/form/inputNumber/InputNumber.d.ts +0 -2
  26. package/dist/grid/col/Col.d.ts +6 -3
  27. package/dist/grid/col/colStyled/ColStyled.d.ts +5 -7
  28. package/dist/grid/grid.interface.d.ts +5 -9
  29. package/dist/header/Header.d.ts +1 -1
  30. package/dist/header/header.interface.d.ts +1 -2
  31. package/dist/icon/Icon.d.ts +1 -1
  32. package/dist/icon/icon.interface.d.ts +1 -0
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +3740 -3443
  35. package/dist/menus/menu/Menu.d.ts +0 -1
  36. package/dist/overlayPanel/OverlayPanel.d.ts +4 -2
  37. package/dist/overlayPanel/overlayPanelStyled/OverlayPanelStyled.d.ts +2 -0
  38. package/dist/select/Select.d.ts +6 -2
  39. package/dist/select/selectOption.interface.d.ts +1 -0
  40. package/dist/style.css +1 -1
  41. package/dist/tabs/Tabs.d.ts +2 -1
  42. package/dist/toaster/store/useToasterStore.d.ts +0 -1
  43. package/index.html +2 -1
  44. package/package/package.json +56 -0
  45. package/package/src/sidebar/Sidebar.tsx +208 -0
  46. package/package/src/sidebar/sidebar.css +104 -0
  47. package/package.json +1 -1
  48. package/src/_core/type/generiqueType.tsx +4 -0
  49. package/src/badge/Badge.tsx +9 -1
  50. package/src/badge/badge.css +4 -0
  51. package/src/button/Button.tsx +1 -3
  52. package/src/button/button.css +2 -2
  53. package/src/button/button.interface.tsx +1 -2
  54. package/src/card/card.css +25 -5
  55. package/src/card/cardAction/CardAction.tsx +4 -4
  56. package/src/damier/Damier.tsx +7 -16
  57. package/src/damier/damier.css +4 -11
  58. package/src/dataTable/DataTable.tsx +685 -542
  59. package/src/dataTable/DataTable.view.tsx +48 -24
  60. package/src/dataTable/dataTable.css +134 -159
  61. package/src/dataTable/dataTable.interface.ts +25 -19
  62. package/src/dataTable/dataTableActions/DataTableAction.tsx +14 -25
  63. package/src/dataTable/dataTableColumn/DataTableColumn.tsx +64 -14
  64. package/src/dataTable/dataTableColumn/dataTableColumnFilter/DataTableColumnFilter.tsx +36 -0
  65. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilter.css +0 -0
  66. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDate/DataTableColumnFilterDate.tsx +39 -0
  67. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterDateRange/dataTableColumnFilterDateRange.tsx +80 -0
  68. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterEnum/DataTableColumnFilterEnum.tsx +89 -0
  69. package/src/dataTable/dataTableColumn/dataTableColumnFilter/dataTableColumnFilterString/DataTableColumnFilterString.tsx +37 -0
  70. package/src/dataTable/dataTableColumn/dataTableColumnSort/DataTableColumnSort.tsx +42 -0
  71. package/src/dataTable/dataTableFilters/DataTableFilters.tsx +91 -0
  72. package/src/dataTable/dataTableFilters/dataTableFilters.css +16 -0
  73. package/src/dataTable/dataTableLoading/DataTableLoading.tsx +4 -15
  74. package/src/dataTable/dataTableRow/DataTableRow.tsx +64 -180
  75. package/src/dataTable/dataTableRow/dataTableRowOverlay/DataTableRowOverlay.tsx +80 -0
  76. package/src/dataTable/dataTableRow/dataTableRowValue/DataTableRowValue.tsx +123 -0
  77. package/src/expands/Expands.tsx +2 -16
  78. package/src/expands/expand/expand.tsx +5 -122
  79. package/src/expands/expands.css +3 -8
  80. package/src/form/Form.tsx +25 -125
  81. package/src/form/Form.view.tsx +1 -9
  82. package/src/form/form.css +1 -38
  83. package/src/form/form.enum.ts +1 -1
  84. package/src/form/form.interface.tsx +2 -7
  85. package/src/form/input/Input.tsx +61 -7
  86. package/src/form/input/input.css +23 -1
  87. package/src/form/inputNumber/InputNumber.tsx +6 -11
  88. package/src/form/inputPrice/InputPrice.tsx +2 -4
  89. package/src/grid/col/Col.tsx +7 -5
  90. package/src/grid/col/colStyled/ColStyled.tsx +7 -21
  91. package/src/grid/grid.interface.tsx +5 -11
  92. package/src/header/Header.tsx +2 -4
  93. package/src/header/header.css +0 -17
  94. package/src/header/header.interface.tsx +1 -2
  95. package/src/icon/Icon.tsx +6 -2
  96. package/src/icon/icon.interface.tsx +1 -0
  97. package/src/index.css +12 -58
  98. package/src/index.ts +2 -1
  99. package/src/menus/Menus.tsx +0 -1
  100. package/src/menus/menu/Menu.tsx +1 -2
  101. package/src/overlayPanel/OverlayPanel.tsx +71 -18
  102. package/src/overlayPanel/overlay.context.tsx +6 -4
  103. package/src/overlayPanel/overlayPanel.css +10 -1
  104. package/src/overlayPanel/overlayPanelStyled/OverlayPanelStyled.tsx +7 -2
  105. package/src/select/Select.tsx +178 -41
  106. package/src/select/select.css +94 -13
  107. package/src/select/selectOption.interface.ts +1 -0
  108. package/src/sidebar/Sidebar.tsx +5 -107
  109. package/src/sidebar/sidebar.css +1 -18
  110. package/src/tabs/Tabs.tsx +20 -1
  111. package/src/tabs/tabs.css +3 -9
  112. package/src/toaster/Toaster.tsx +2 -7
  113. package/src/toaster/Toaster.view.tsx +0 -1
  114. package/src/toaster/store/useToasterStore.tsx +0 -2
  115. package/src/toaster/toaster.css +2 -7
@@ -0,0 +1,36 @@
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
+ };
@@ -0,0 +1,39 @@
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
+ };
@@ -0,0 +1,80 @@
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
+ };
@@ -0,0 +1,89 @@
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
+ };
@@ -0,0 +1,37 @@
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
+ };
@@ -0,0 +1,42 @@
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
+ };
@@ -0,0 +1,91 @@
1
+ import { Badge } from "../../badge/Badge";
2
+ import { Icon } from "../../icon/Icon";
3
+ import {
4
+ DataTableDateRangeFilterValue,
5
+ DataTableFilterState,
6
+ } from "../DataTable";
7
+ import "./dataTableFilters.css";
8
+ export type DataTableFiltersProps = {
9
+ currentFilters: DataTableFilterState;
10
+ setCurrentFilters: React.Dispatch<React.SetStateAction<DataTableFilterState>>;
11
+ };
12
+ export const DataTableFilters = ({
13
+ currentFilters,
14
+ setCurrentFilters,
15
+ }: DataTableFiltersProps) => {
16
+ const isDateRangeFilterValue = (
17
+ value: DataTableFilterState[string],
18
+ ): value is DataTableDateRangeFilterValue => {
19
+ return (
20
+ typeof value === "object" &&
21
+ value !== null &&
22
+ "startDate" in value &&
23
+ "endDate" in value
24
+ );
25
+ };
26
+
27
+ const getDisplayValue = (value: DataTableFilterState[string]) => {
28
+ if (isDateRangeFilterValue(value)) {
29
+ if (value.startDate && value.endDate) {
30
+ return `${value.startDate} - ${value.endDate}`;
31
+ }
32
+
33
+ if (value.startDate) {
34
+ return `a partir de ${value.startDate}`;
35
+ }
36
+
37
+ if (value.endDate) {
38
+ return `jusqu'au ${value.endDate}`;
39
+ }
40
+
41
+ return "";
42
+ }
43
+
44
+ return String(value ?? "");
45
+ };
46
+
47
+ const generateColor = (str: string): string => {
48
+ let hash = 0;
49
+ for (let i = 0; i < str.length; i++) {
50
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
51
+ }
52
+
53
+ const hue = hash % 360;
54
+ return `hsl(${hue}, 80%, 30%)`;
55
+ };
56
+
57
+ const removeFilters = (key: string) => {
58
+ setCurrentFilters((prev: any) => {
59
+ const { [key]: _removed, ...rest } = prev;
60
+ return rest;
61
+ });
62
+ };
63
+ if (!currentFilters || Object.keys(currentFilters).length === 0) {
64
+ return null;
65
+ }
66
+
67
+ return (
68
+ <div className="badge-filters">
69
+ {Object.keys(currentFilters).map((key) => {
70
+ const value = getDisplayValue(currentFilters[key]);
71
+ const displayValue =
72
+ value.length > 20 ? value.substring(0, 20) + "..." : value;
73
+
74
+ return (
75
+ <Badge
76
+ onRemove={() => removeFilters(key)}
77
+ className="mr-2"
78
+ title={`${key} : ${displayValue}`}
79
+ color={generateColor(key)}
80
+ key={key}
81
+ />
82
+ );
83
+ })}
84
+
85
+ <Icon
86
+ classIcon="bi-x badge-filters-clear"
87
+ onClick={() => setCurrentFilters({})}
88
+ />
89
+ </div>
90
+ );
91
+ };
@@ -0,0 +1,16 @@
1
+ .badge-filters {
2
+ border-radius: 4px;
3
+ padding: 0.25rem;
4
+ border: 1px solid #dedede;
5
+ width: fit-content;
6
+ display: flex;
7
+ align-items: center;
8
+ position: sticky;
9
+ left: 0;
10
+ .badge-filters-clear {
11
+ padding: 0.05rem;
12
+ border: 1px solid #dedede;
13
+ border-radius: 4px;
14
+ cursor: pointer;
15
+ }
16
+ }
@@ -1,21 +1,10 @@
1
1
  type DataTableLoadingProps = {
2
- columns: any[];
3
- actions: any[];
4
2
  emptyMessage?: string;
5
3
  };
6
- export const DataTableLoading = ({
7
- columns,
8
- actions,
9
- emptyMessage,
10
- }: DataTableLoadingProps) => {
4
+ export const DataTableLoading = ({ emptyMessage }: DataTableLoadingProps) => {
11
5
  return (
12
- <tr>
13
- <td
14
- align="center"
15
- colSpan={columns.length + (actions.length > 0 ? 1 : 0)}
16
- >
17
- <div className="mt-3">{emptyMessage || "Aucune donnée disponible"}</div>
18
- </td>
19
- </tr>
6
+ <div className="data-table-empty-state-content mt-3">
7
+ {emptyMessage || "Aucune donnée disponible"}
8
+ </div>
20
9
  );
21
10
  };