@eztrak/shared 0.1.1 → 0.2.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.
- package/README.md +23 -11
- package/dist/chunk-BDNXC2WX.mjs +72 -0
- package/dist/chunk-BDNXC2WX.mjs.map +1 -0
- package/dist/chunk-WARJTN5T.mjs +212 -0
- package/dist/chunk-WARJTN5T.mjs.map +1 -0
- package/dist/hooks/index.d.mts +13 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.js +99 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +9 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +294 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +49 -3
- package/dist/utils/index.d.mts +40 -1
- package/dist/utils/index.d.ts +40 -1
- package/dist/utils/index.js +223 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +43 -3
- package/package.json +23 -2
- package/dist/chunk-IY5UXNBB.mjs +0 -11
- package/dist/chunk-IY5UXNBB.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -8,38 +8,50 @@ Shared utilities, hooks, and UI components for Eztrak applications.
|
|
|
8
8
|
npm install @eztrak/shared
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Peer dependencies for hooks:
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
```bash
|
|
14
|
+
npm install react react-dom react-router-dom
|
|
15
|
+
```
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Utils
|
|
16
20
|
|
|
17
21
|
```js
|
|
18
|
-
import { cn } from "@eztrak/shared/utils";
|
|
22
|
+
import { cn, formatDate, getApiError, isEmpty } from "@eztrak/shared/utils";
|
|
19
23
|
|
|
20
24
|
<div className={cn("px-4 py-2", isActive && "bg-blue-500", className)} />
|
|
21
25
|
```
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
`cn` combines [`clsx`](https://github.com/lukeed/clsx) with [`tailwind-merge`](https://github.com/dcastil/tailwind-merge).
|
|
28
|
+
|
|
29
|
+
### Hooks
|
|
24
30
|
|
|
25
31
|
```js
|
|
26
|
-
import {
|
|
32
|
+
import { usePaginationUrlSync, useGridHeight } from "@eztrak/shared/hooks";
|
|
33
|
+
|
|
34
|
+
const gridHeight = useGridHeight({ offset: 390 });
|
|
27
35
|
```
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
### Root import
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
import { cn, useGridHeight } from "@eztrak/shared";
|
|
41
|
+
```
|
|
30
42
|
|
|
31
43
|
## Exports
|
|
32
44
|
|
|
33
45
|
| Subpath | Description |
|
|
34
46
|
| --- | --- |
|
|
35
|
-
| `@eztrak/shared` | Main entry — re-exports
|
|
36
|
-
| `@eztrak/shared/utils` |
|
|
37
|
-
|
|
38
|
-
Additional subpath exports (`/hooks`, `/ui`, etc.) will be added in future releases.
|
|
47
|
+
| `@eztrak/shared` | Main entry — re-exports utils and hooks |
|
|
48
|
+
| `@eztrak/shared/utils` | `cn`, date/format helpers, API error helpers, form field helpers |
|
|
49
|
+
| `@eztrak/shared/hooks` | `usePaginationUrlSync`, `useGridHeight` |
|
|
39
50
|
|
|
40
51
|
## Requirements
|
|
41
52
|
|
|
42
53
|
- Node.js 18+
|
|
54
|
+
- React 18+ (for hooks)
|
|
43
55
|
- Works with any bundler that supports the [Node.js `exports` field](https://nodejs.org/api/packages.html#exports)
|
|
44
56
|
|
|
45
57
|
## License
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/hooks/usePaginationUrlSync.ts
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
var usePaginationUrlSync = (searchParams, setSearchParams, page, setPage, perPage, setPerPage, defaultPage = 1, defaultPerPage = 20) => {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
const currentUrlPage = parseInt(searchParams.get("page") ?? "") || defaultPage;
|
|
6
|
+
const currentUrlPerPage = parseInt(searchParams.get("perPage") ?? "") || defaultPerPage;
|
|
7
|
+
const hasPageParam = searchParams.has("page");
|
|
8
|
+
const hasPerPageParam = searchParams.has("perPage");
|
|
9
|
+
if (!hasPageParam || !hasPerPageParam) {
|
|
10
|
+
const newParams = new URLSearchParams(searchParams);
|
|
11
|
+
if (!hasPageParam) {
|
|
12
|
+
newParams.set("page", defaultPage.toString());
|
|
13
|
+
}
|
|
14
|
+
if (!hasPerPageParam) {
|
|
15
|
+
newParams.set("perPage", defaultPerPage.toString());
|
|
16
|
+
}
|
|
17
|
+
setSearchParams(newParams, { replace: true });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (currentUrlPage !== page) {
|
|
21
|
+
setPage(currentUrlPage);
|
|
22
|
+
}
|
|
23
|
+
if (currentUrlPerPage !== perPage) {
|
|
24
|
+
setPerPage(currentUrlPerPage);
|
|
25
|
+
}
|
|
26
|
+
}, [
|
|
27
|
+
searchParams,
|
|
28
|
+
setSearchParams,
|
|
29
|
+
page,
|
|
30
|
+
setPage,
|
|
31
|
+
perPage,
|
|
32
|
+
setPerPage,
|
|
33
|
+
defaultPage,
|
|
34
|
+
defaultPerPage
|
|
35
|
+
]);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/hooks/useGridHeight.ts
|
|
39
|
+
import { useEffect as useEffect2, useState } from "react";
|
|
40
|
+
var useGridHeight = ({
|
|
41
|
+
height,
|
|
42
|
+
headerId = "layout-header",
|
|
43
|
+
footerId = "layout-footer",
|
|
44
|
+
offset = 390
|
|
45
|
+
} = {}) => {
|
|
46
|
+
const [gridHeight, setGridHeight] = useState(height || "300px");
|
|
47
|
+
useEffect2(() => {
|
|
48
|
+
if (height) {
|
|
49
|
+
setGridHeight(height);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const calculateHeight = () => {
|
|
53
|
+
const header = document.getElementById(headerId);
|
|
54
|
+
const footer = document.getElementById(footerId);
|
|
55
|
+
const headerHeight = header ? header.offsetHeight : 0;
|
|
56
|
+
const footerHeight = footer ? footer.offsetHeight : 0;
|
|
57
|
+
const totalHeight = window.innerHeight;
|
|
58
|
+
const remainingHeight = totalHeight - headerHeight - footerHeight - offset;
|
|
59
|
+
setGridHeight(`${remainingHeight}px`);
|
|
60
|
+
};
|
|
61
|
+
calculateHeight();
|
|
62
|
+
window.addEventListener("resize", calculateHeight);
|
|
63
|
+
return () => window.removeEventListener("resize", calculateHeight);
|
|
64
|
+
}, [height, headerId, footerId, offset]);
|
|
65
|
+
return gridHeight;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
usePaginationUrlSync,
|
|
70
|
+
useGridHeight
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=chunk-BDNXC2WX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/usePaginationUrlSync.ts","../src/hooks/useGridHeight.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { SetURLSearchParams } from \"react-router-dom\";\n\nexport const usePaginationUrlSync = (\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParams,\n page: number,\n setPage: (page: number) => void,\n perPage: number,\n setPerPage: (perPage: number) => void,\n defaultPage = 1,\n defaultPerPage = 20\n) => {\n useEffect(() => {\n const currentUrlPage = parseInt(searchParams.get(\"page\") ?? \"\") || defaultPage;\n const currentUrlPerPage =\n parseInt(searchParams.get(\"perPage\") ?? \"\") || defaultPerPage;\n const hasPageParam = searchParams.has(\"page\");\n const hasPerPageParam = searchParams.has(\"perPage\");\n\n if (!hasPageParam || !hasPerPageParam) {\n const newParams = new URLSearchParams(searchParams);\n\n if (!hasPageParam) {\n newParams.set(\"page\", defaultPage.toString());\n }\n\n if (!hasPerPageParam) {\n newParams.set(\"perPage\", defaultPerPage.toString());\n }\n\n setSearchParams(newParams, { replace: true });\n return;\n }\n\n if (currentUrlPage !== page) {\n setPage(currentUrlPage);\n }\n\n if (currentUrlPerPage !== perPage) {\n setPerPage(currentUrlPerPage);\n }\n }, [\n searchParams,\n setSearchParams,\n page,\n setPage,\n perPage,\n setPerPage,\n defaultPage,\n defaultPerPage,\n ]);\n};\n","import { useEffect, useState } from \"react\";\n\nexport interface UseGridHeightOptions {\n height?: string;\n headerId?: string;\n footerId?: string;\n offset?: number;\n}\n\nexport const useGridHeight = ({\n height,\n headerId = \"layout-header\",\n footerId = \"layout-footer\",\n offset = 390,\n}: UseGridHeightOptions = {}) => {\n const [gridHeight, setGridHeight] = useState(height || \"300px\");\n\n useEffect(() => {\n if (height) {\n setGridHeight(height);\n return;\n }\n\n const calculateHeight = () => {\n const header = document.getElementById(headerId);\n const footer = document.getElementById(footerId);\n\n const headerHeight = header ? header.offsetHeight : 0;\n const footerHeight = footer ? footer.offsetHeight : 0;\n const totalHeight = window.innerHeight;\n\n const remainingHeight = totalHeight - headerHeight - footerHeight - offset;\n setGridHeight(`${remainingHeight}px`);\n };\n\n calculateHeight();\n window.addEventListener(\"resize\", calculateHeight);\n return () => window.removeEventListener(\"resize\", calculateHeight);\n }, [height, headerId, footerId, offset]);\n\n return gridHeight;\n};\n"],"mappings":";AAAA,SAAS,iBAAiB;AAGnB,IAAM,uBAAuB,CAClC,cACA,iBACA,MACA,SACA,SACA,YACA,cAAc,GACd,iBAAiB,OACd;AACH,YAAU,MAAM;AACd,UAAM,iBAAiB,SAAS,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK;AACnE,UAAM,oBACJ,SAAS,aAAa,IAAI,SAAS,KAAK,EAAE,KAAK;AACjD,UAAM,eAAe,aAAa,IAAI,MAAM;AAC5C,UAAM,kBAAkB,aAAa,IAAI,SAAS;AAElD,QAAI,CAAC,gBAAgB,CAAC,iBAAiB;AACrC,YAAM,YAAY,IAAI,gBAAgB,YAAY;AAElD,UAAI,CAAC,cAAc;AACjB,kBAAU,IAAI,QAAQ,YAAY,SAAS,CAAC;AAAA,MAC9C;AAEA,UAAI,CAAC,iBAAiB;AACpB,kBAAU,IAAI,WAAW,eAAe,SAAS,CAAC;AAAA,MACpD;AAEA,sBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC5C;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM;AAC3B,cAAQ,cAAc;AAAA,IACxB;AAEA,QAAI,sBAAsB,SAAS;AACjC,iBAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACpDA,SAAS,aAAAA,YAAW,gBAAgB;AAS7B,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AACX,IAA0B,CAAC,MAAM;AAC/B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,UAAU,OAAO;AAE9D,EAAAA,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,oBAAc,MAAM;AACpB;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,YAAM,SAAS,SAAS,eAAe,QAAQ;AAC/C,YAAM,SAAS,SAAS,eAAe,QAAQ;AAE/C,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,cAAc,OAAO;AAE3B,YAAM,kBAAkB,cAAc,eAAe,eAAe;AACpE,oBAAc,GAAG,eAAe,IAAI;AAAA,IACtC;AAEA,oBAAgB;AAChB,WAAO,iBAAiB,UAAU,eAAe;AACjD,WAAO,MAAM,OAAO,oBAAoB,UAAU,eAAe;AAAA,EACnE,GAAG,CAAC,QAAQ,UAAU,UAAU,MAAM,CAAC;AAEvC,SAAO;AACT;","names":["useEffect"]}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// src/utils/cn.ts
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { twMerge } from "tailwind-merge";
|
|
4
|
+
function cn(...inputs) {
|
|
5
|
+
return twMerge(clsx(inputs));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// src/utils/helpers.ts
|
|
9
|
+
var truncateText = (text, maxLength = 20) => {
|
|
10
|
+
if (!text) return "";
|
|
11
|
+
if (text.length <= maxLength) {
|
|
12
|
+
return text;
|
|
13
|
+
}
|
|
14
|
+
return text.slice(0, maxLength - 3) + "...";
|
|
15
|
+
};
|
|
16
|
+
function getApiError(apiError) {
|
|
17
|
+
if (!apiError) return "An unknown error occurred";
|
|
18
|
+
if (typeof apiError === "string") {
|
|
19
|
+
return apiError;
|
|
20
|
+
}
|
|
21
|
+
const error = apiError;
|
|
22
|
+
if (error.response?.data) {
|
|
23
|
+
const responseData = error.response.data;
|
|
24
|
+
if (typeof responseData === "string") {
|
|
25
|
+
return responseData;
|
|
26
|
+
}
|
|
27
|
+
const errors = responseData.errors;
|
|
28
|
+
if (errors && typeof errors === "object") {
|
|
29
|
+
for (const key in errors) {
|
|
30
|
+
const messages = errors[key];
|
|
31
|
+
if (Array.isArray(messages) && messages.length > 0) {
|
|
32
|
+
return String(messages[0]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (responseData.message) {
|
|
37
|
+
return String(responseData.message);
|
|
38
|
+
}
|
|
39
|
+
if (responseData.title) {
|
|
40
|
+
return String(responseData.title);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (error.message) {
|
|
44
|
+
return error.message;
|
|
45
|
+
}
|
|
46
|
+
return "An unknown error occurred";
|
|
47
|
+
}
|
|
48
|
+
var normalizeApiListItems = (responseData) => {
|
|
49
|
+
if (responseData == null) return [];
|
|
50
|
+
if (Array.isArray(responseData)) return responseData;
|
|
51
|
+
const record = responseData;
|
|
52
|
+
const data = record.data;
|
|
53
|
+
if (data && typeof data === "object" && !Array.isArray(data) && Array.isArray(data.items)) {
|
|
54
|
+
return data.items;
|
|
55
|
+
}
|
|
56
|
+
const returnModel = record.returnModel;
|
|
57
|
+
if (Array.isArray(returnModel?.items)) return returnModel.items;
|
|
58
|
+
if (Array.isArray(data)) return data;
|
|
59
|
+
if (typeof data === "object" && data !== null) {
|
|
60
|
+
return [data];
|
|
61
|
+
}
|
|
62
|
+
return [];
|
|
63
|
+
};
|
|
64
|
+
function capitalizeText(name) {
|
|
65
|
+
if (!name) return "";
|
|
66
|
+
return name.split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
|
|
67
|
+
}
|
|
68
|
+
function toLowerCaseText(text) {
|
|
69
|
+
if (!text) return "";
|
|
70
|
+
return text.toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
var formatDate = (dateString) => {
|
|
73
|
+
if (dateString === null || dateString === void 0) return "-";
|
|
74
|
+
const date = new Date(dateString);
|
|
75
|
+
if (isNaN(date.getTime())) {
|
|
76
|
+
return dateString;
|
|
77
|
+
}
|
|
78
|
+
const month = (date.getMonth() + 1).toString().padStart(2, "0");
|
|
79
|
+
const day = date.getDate().toString().padStart(2, "0");
|
|
80
|
+
const year = date.getFullYear().toString().slice(-2);
|
|
81
|
+
return `${month}/${day}/${year}`;
|
|
82
|
+
};
|
|
83
|
+
var isEmpty = (obj) => {
|
|
84
|
+
return Object.keys(obj).length === 0;
|
|
85
|
+
};
|
|
86
|
+
var toDateInputValue = (date) => {
|
|
87
|
+
if (!date) return "";
|
|
88
|
+
let d;
|
|
89
|
+
if (typeof date === "string") {
|
|
90
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(date)) {
|
|
91
|
+
return date;
|
|
92
|
+
}
|
|
93
|
+
d = new Date(date);
|
|
94
|
+
} else {
|
|
95
|
+
d = new Date(date);
|
|
96
|
+
}
|
|
97
|
+
if (isNaN(d.getTime())) return "";
|
|
98
|
+
const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 6e4);
|
|
99
|
+
const year = localDate.getFullYear();
|
|
100
|
+
const month = (localDate.getMonth() + 1).toString().padStart(2, "0");
|
|
101
|
+
const day = localDate.getDate().toString().padStart(2, "0");
|
|
102
|
+
return `${year}-${month}-${day}`;
|
|
103
|
+
};
|
|
104
|
+
function convertCommaDataToArray(data) {
|
|
105
|
+
if (!data || data.trim() === "") {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
return data.split(",").map((item) => item.trim());
|
|
109
|
+
}
|
|
110
|
+
function checkIfExistsInArray(array, searchValue) {
|
|
111
|
+
return array.includes(searchValue);
|
|
112
|
+
}
|
|
113
|
+
var currencyFormatter = (value) => {
|
|
114
|
+
return value?.toLocaleString("en-US", {
|
|
115
|
+
style: "currency",
|
|
116
|
+
currency: "USD"
|
|
117
|
+
}) ?? "";
|
|
118
|
+
};
|
|
119
|
+
var parseCurrencyValueToNumber = (value) => {
|
|
120
|
+
if (value == null || value === "") return 0;
|
|
121
|
+
const raw = typeof value === "object" && value !== null && "value" in value ? value.value : value;
|
|
122
|
+
const stringValue = raw == null || raw === "" ? "" : String(raw);
|
|
123
|
+
const numericValue = stringValue.replace(/[$,]/g, "");
|
|
124
|
+
return parseFloat(numericValue) || 0;
|
|
125
|
+
};
|
|
126
|
+
function flattenTableData(data, columns) {
|
|
127
|
+
if (!Array.isArray(data)) return [];
|
|
128
|
+
return data.map((row) => {
|
|
129
|
+
const flatRow = { ...row };
|
|
130
|
+
(columns ?? []).forEach((col) => {
|
|
131
|
+
const key = col.field;
|
|
132
|
+
if (!key) return;
|
|
133
|
+
if (key.includes(".")) {
|
|
134
|
+
const value = key.split(".").reduce(
|
|
135
|
+
(acc, part) => acc?.[part],
|
|
136
|
+
row
|
|
137
|
+
);
|
|
138
|
+
flatRow[key] = value ?? "";
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return flatRow;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
var getErrorMessages = (error) => {
|
|
145
|
+
if (error?.data?.errors) {
|
|
146
|
+
return Object.values(error.data.errors).flat().join("\n");
|
|
147
|
+
}
|
|
148
|
+
return error?.data?.title ?? error?.data?.error?.name?.[0] ?? "Failed to save";
|
|
149
|
+
};
|
|
150
|
+
var getFieldsByCategory = (fields = [], key) => {
|
|
151
|
+
return fields?.filter(({ category = "" }) => category === key);
|
|
152
|
+
};
|
|
153
|
+
var getFieldsByName = (fields = [], key) => {
|
|
154
|
+
return fields.filter(({ name = "" }) => name === key);
|
|
155
|
+
};
|
|
156
|
+
var deserializeJson = (jsonString) => {
|
|
157
|
+
try {
|
|
158
|
+
return JSON.parse(jsonString);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error("Error parsing JSON:", error);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
var formatDateTime = (dateString) => {
|
|
165
|
+
if (!dateString) return "Invalid Date";
|
|
166
|
+
const date = new Date(dateString);
|
|
167
|
+
if (isNaN(date.getTime())) return "Invalid Date";
|
|
168
|
+
const options = {
|
|
169
|
+
year: "numeric",
|
|
170
|
+
month: "numeric",
|
|
171
|
+
day: "numeric",
|
|
172
|
+
hour: "numeric",
|
|
173
|
+
minute: "numeric",
|
|
174
|
+
hour12: true
|
|
175
|
+
};
|
|
176
|
+
return date.toLocaleString("en-US", options);
|
|
177
|
+
};
|
|
178
|
+
var removeByPropertyValues = (items = [], property, values = [], { caseInsensitive = false } = {}) => {
|
|
179
|
+
if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];
|
|
180
|
+
const normalize = (v) => caseInsensitive && typeof v === "string" ? v.toLowerCase() : v;
|
|
181
|
+
const valuesArr = Array.isArray(values) ? values : [values];
|
|
182
|
+
const toRemove = new Set(valuesArr.map(normalize));
|
|
183
|
+
return items.filter((item) => !toRemove.has(normalize(item?.[property])));
|
|
184
|
+
};
|
|
185
|
+
var getFieldsByInputType = (fields = [], key) => {
|
|
186
|
+
return fields.filter(({ inputType = "" }) => inputType === key);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export {
|
|
190
|
+
cn,
|
|
191
|
+
truncateText,
|
|
192
|
+
getApiError,
|
|
193
|
+
normalizeApiListItems,
|
|
194
|
+
capitalizeText,
|
|
195
|
+
toLowerCaseText,
|
|
196
|
+
formatDate,
|
|
197
|
+
isEmpty,
|
|
198
|
+
toDateInputValue,
|
|
199
|
+
convertCommaDataToArray,
|
|
200
|
+
checkIfExistsInArray,
|
|
201
|
+
currencyFormatter,
|
|
202
|
+
parseCurrencyValueToNumber,
|
|
203
|
+
flattenTableData,
|
|
204
|
+
getErrorMessages,
|
|
205
|
+
getFieldsByCategory,
|
|
206
|
+
getFieldsByName,
|
|
207
|
+
deserializeJson,
|
|
208
|
+
formatDateTime,
|
|
209
|
+
removeByPropertyValues,
|
|
210
|
+
getFieldsByInputType
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=chunk-WARJTN5T.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn.ts","../src/utils/helpers.ts"],"sourcesContent":["import clsx from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: Parameters<typeof clsx>) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","export const truncateText = (text: string | null | undefined, maxLength = 20) => {\n if (!text) return \"\";\n if (text.length <= maxLength) {\n return text;\n }\n return text.slice(0, maxLength - 3) + \"...\";\n};\n\nexport function getApiError(apiError: unknown): string {\n if (!apiError) return \"An unknown error occurred\";\n\n if (typeof apiError === \"string\") {\n return apiError;\n }\n\n const error = apiError as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n };\n\n if (error.response?.data) {\n const responseData = error.response.data;\n\n if (typeof responseData === \"string\") {\n return responseData;\n }\n\n const errors = responseData.errors;\n if (errors && typeof errors === \"object\") {\n for (const key in errors) {\n const messages = (errors as Record<string, unknown>)[key];\n if (Array.isArray(messages) && messages.length > 0) {\n return String(messages[0]);\n }\n }\n }\n\n if (responseData.message) {\n return String(responseData.message);\n }\n\n if (responseData.title) {\n return String(responseData.title);\n }\n }\n\n if (error.message) {\n return error.message;\n }\n\n return \"An unknown error occurred\";\n}\n\nexport const normalizeApiListItems = (responseData: unknown): unknown[] => {\n if (responseData == null) return [];\n if (Array.isArray(responseData)) return responseData;\n\n const record = responseData as Record<string, unknown>;\n const data = record.data;\n\n if (\n data &&\n typeof data === \"object\" &&\n !Array.isArray(data) &&\n Array.isArray((data as { items?: unknown[] }).items)\n ) {\n return (data as { items: unknown[] }).items;\n }\n\n const returnModel = record.returnModel as { items?: unknown[] } | undefined;\n if (Array.isArray(returnModel?.items)) return returnModel.items;\n if (Array.isArray(data)) return data;\n if (typeof data === \"object\" && data !== null) {\n return [data];\n }\n return [];\n};\n\nexport function capitalizeText(name: string | null | undefined): string {\n if (!name) return \"\";\n return name\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\nexport function toLowerCaseText(text: string | null | undefined): string {\n if (!text) return \"\";\n return text.toLowerCase();\n}\n\nexport const formatDate = (dateString: string | null | undefined): string => {\n if (dateString === null || dateString === undefined) return \"-\";\n const date = new Date(dateString);\n\n if (isNaN(date.getTime())) {\n return dateString;\n }\n\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const year = date.getFullYear().toString().slice(-2);\n return `${month}/${day}/${year}`;\n};\n\nexport const isEmpty = (obj: object): boolean => {\n return Object.keys(obj).length === 0;\n};\n\nexport const toDateInputValue = (date: string | Date | null | undefined): string => {\n if (!date) return \"\";\n\n let d: Date;\n\n if (typeof date === \"string\") {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n return date;\n }\n d = new Date(date);\n } else {\n d = new Date(date);\n }\n\n if (isNaN(d.getTime())) return \"\";\n\n const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 60000);\n const year = localDate.getFullYear();\n const month = (localDate.getMonth() + 1).toString().padStart(2, \"0\");\n const day = localDate.getDate().toString().padStart(2, \"0\");\n\n return `${year}-${month}-${day}`;\n};\n\nexport function convertCommaDataToArray(data: string | null | undefined): string[] {\n if (!data || data.trim() === \"\") {\n return [];\n }\n return data.split(\",\").map((item) => item.trim());\n}\n\nexport function checkIfExistsInArray<T>(array: T[], searchValue: T): boolean {\n return array.includes(searchValue);\n}\n\nexport const currencyFormatter = (value: number | null | undefined): string => {\n return value?.toLocaleString(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }) ?? \"\";\n};\n\nexport const parseCurrencyValueToNumber = (value: unknown): number => {\n if (value == null || value === \"\") return 0;\n\n const raw =\n typeof value === \"object\" && value !== null && \"value\" in value\n ? (value as { value: unknown }).value\n : value;\n\n const stringValue = raw == null || raw === \"\" ? \"\" : String(raw);\n const numericValue = stringValue.replace(/[$,]/g, \"\");\n return parseFloat(numericValue) || 0;\n};\n\nexport function flattenTableData<T extends Record<string, unknown>>(\n data: T[] | null | undefined,\n columns: { field?: string }[] | null | undefined\n): T[] {\n if (!Array.isArray(data)) return [];\n return data.map((row) => {\n const flatRow = { ...row };\n (columns ?? []).forEach((col) => {\n const key = col.field;\n if (!key) return;\n if (key.includes(\".\")) {\n const value = key.split(\".\").reduce<unknown>(\n (acc, part) => (acc as Record<string, unknown> | undefined)?.[part],\n row\n );\n (flatRow as Record<string, unknown>)[key] = value ?? \"\";\n }\n });\n return flatRow;\n });\n}\n\nexport const getErrorMessages = (error: {\n data?: {\n errors?: Record<string, string[]>;\n title?: string;\n error?: { name?: string[] };\n };\n} | null | undefined): string => {\n if (error?.data?.errors) {\n return Object.values(error.data.errors).flat().join(\"\\n\");\n }\n return (\n error?.data?.title ??\n error?.data?.error?.name?.[0] ??\n \"Failed to save\"\n );\n};\n\nexport const getFieldsByCategory = <T extends { category?: string }>(\n fields: T[] = [],\n key: string\n): T[] => {\n return fields?.filter(({ category = \"\" }) => category === key);\n};\n\nexport const getFieldsByName = <T extends { name?: string }>(\n fields: T[] = [],\n key: string\n): T[] => {\n return fields.filter(({ name = \"\" }) => name === key);\n};\n\nexport const deserializeJson = <T = unknown>(jsonString: string): T | null => {\n try {\n return JSON.parse(jsonString) as T;\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return null;\n }\n};\n\nexport const formatDateTime = (dateString: string | null | undefined): string => {\n if (!dateString) return \"Invalid Date\";\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return \"Invalid Date\";\n const options: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n hour12: true,\n };\n return date.toLocaleString(\"en-US\", options);\n};\n\nexport const removeByPropertyValues = <T extends Record<string, unknown>>(\n items: T[] = [],\n property: keyof T & string,\n values: unknown[] = [],\n { caseInsensitive = false }: { caseInsensitive?: boolean } = {}\n): T[] => {\n if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];\n const normalize = (v: unknown) =>\n caseInsensitive && typeof v === \"string\" ? v.toLowerCase() : v;\n const valuesArr = Array.isArray(values) ? values : [values];\n const toRemove = new Set(valuesArr.map(normalize));\n return items.filter((item) => !toRemove.has(normalize(item?.[property])));\n};\n\nexport const getFieldsByInputType = <T extends { inputType?: string }>(\n fields: T[] = [],\n key: string\n): T[] => {\n return fields.filter(({ inputType = \"\" }) => inputType === key);\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SetURLSearchParams } from 'react-router-dom';
|
|
2
|
+
|
|
3
|
+
declare const usePaginationUrlSync: (searchParams: URLSearchParams, setSearchParams: SetURLSearchParams, page: number, setPage: (page: number) => void, perPage: number, setPerPage: (perPage: number) => void, defaultPage?: number, defaultPerPage?: number) => void;
|
|
4
|
+
|
|
5
|
+
interface UseGridHeightOptions {
|
|
6
|
+
height?: string;
|
|
7
|
+
headerId?: string;
|
|
8
|
+
footerId?: string;
|
|
9
|
+
offset?: number;
|
|
10
|
+
}
|
|
11
|
+
declare const useGridHeight: ({ height, headerId, footerId, offset, }?: UseGridHeightOptions) => string;
|
|
12
|
+
|
|
13
|
+
export { type UseGridHeightOptions, useGridHeight, usePaginationUrlSync };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SetURLSearchParams } from 'react-router-dom';
|
|
2
|
+
|
|
3
|
+
declare const usePaginationUrlSync: (searchParams: URLSearchParams, setSearchParams: SetURLSearchParams, page: number, setPage: (page: number) => void, perPage: number, setPerPage: (perPage: number) => void, defaultPage?: number, defaultPerPage?: number) => void;
|
|
4
|
+
|
|
5
|
+
interface UseGridHeightOptions {
|
|
6
|
+
height?: string;
|
|
7
|
+
headerId?: string;
|
|
8
|
+
footerId?: string;
|
|
9
|
+
offset?: number;
|
|
10
|
+
}
|
|
11
|
+
declare const useGridHeight: ({ height, headerId, footerId, offset, }?: UseGridHeightOptions) => string;
|
|
12
|
+
|
|
13
|
+
export { type UseGridHeightOptions, useGridHeight, usePaginationUrlSync };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/index.ts
|
|
21
|
+
var hooks_exports = {};
|
|
22
|
+
__export(hooks_exports, {
|
|
23
|
+
useGridHeight: () => useGridHeight,
|
|
24
|
+
usePaginationUrlSync: () => usePaginationUrlSync
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(hooks_exports);
|
|
27
|
+
|
|
28
|
+
// src/hooks/usePaginationUrlSync.ts
|
|
29
|
+
var import_react = require("react");
|
|
30
|
+
var usePaginationUrlSync = (searchParams, setSearchParams, page, setPage, perPage, setPerPage, defaultPage = 1, defaultPerPage = 20) => {
|
|
31
|
+
(0, import_react.useEffect)(() => {
|
|
32
|
+
const currentUrlPage = parseInt(searchParams.get("page") ?? "") || defaultPage;
|
|
33
|
+
const currentUrlPerPage = parseInt(searchParams.get("perPage") ?? "") || defaultPerPage;
|
|
34
|
+
const hasPageParam = searchParams.has("page");
|
|
35
|
+
const hasPerPageParam = searchParams.has("perPage");
|
|
36
|
+
if (!hasPageParam || !hasPerPageParam) {
|
|
37
|
+
const newParams = new URLSearchParams(searchParams);
|
|
38
|
+
if (!hasPageParam) {
|
|
39
|
+
newParams.set("page", defaultPage.toString());
|
|
40
|
+
}
|
|
41
|
+
if (!hasPerPageParam) {
|
|
42
|
+
newParams.set("perPage", defaultPerPage.toString());
|
|
43
|
+
}
|
|
44
|
+
setSearchParams(newParams, { replace: true });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (currentUrlPage !== page) {
|
|
48
|
+
setPage(currentUrlPage);
|
|
49
|
+
}
|
|
50
|
+
if (currentUrlPerPage !== perPage) {
|
|
51
|
+
setPerPage(currentUrlPerPage);
|
|
52
|
+
}
|
|
53
|
+
}, [
|
|
54
|
+
searchParams,
|
|
55
|
+
setSearchParams,
|
|
56
|
+
page,
|
|
57
|
+
setPage,
|
|
58
|
+
perPage,
|
|
59
|
+
setPerPage,
|
|
60
|
+
defaultPage,
|
|
61
|
+
defaultPerPage
|
|
62
|
+
]);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/hooks/useGridHeight.ts
|
|
66
|
+
var import_react2 = require("react");
|
|
67
|
+
var useGridHeight = ({
|
|
68
|
+
height,
|
|
69
|
+
headerId = "layout-header",
|
|
70
|
+
footerId = "layout-footer",
|
|
71
|
+
offset = 390
|
|
72
|
+
} = {}) => {
|
|
73
|
+
const [gridHeight, setGridHeight] = (0, import_react2.useState)(height || "300px");
|
|
74
|
+
(0, import_react2.useEffect)(() => {
|
|
75
|
+
if (height) {
|
|
76
|
+
setGridHeight(height);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const calculateHeight = () => {
|
|
80
|
+
const header = document.getElementById(headerId);
|
|
81
|
+
const footer = document.getElementById(footerId);
|
|
82
|
+
const headerHeight = header ? header.offsetHeight : 0;
|
|
83
|
+
const footerHeight = footer ? footer.offsetHeight : 0;
|
|
84
|
+
const totalHeight = window.innerHeight;
|
|
85
|
+
const remainingHeight = totalHeight - headerHeight - footerHeight - offset;
|
|
86
|
+
setGridHeight(`${remainingHeight}px`);
|
|
87
|
+
};
|
|
88
|
+
calculateHeight();
|
|
89
|
+
window.addEventListener("resize", calculateHeight);
|
|
90
|
+
return () => window.removeEventListener("resize", calculateHeight);
|
|
91
|
+
}, [height, headerId, footerId, offset]);
|
|
92
|
+
return gridHeight;
|
|
93
|
+
};
|
|
94
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
95
|
+
0 && (module.exports = {
|
|
96
|
+
useGridHeight,
|
|
97
|
+
usePaginationUrlSync
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/usePaginationUrlSync.ts","../../src/hooks/useGridHeight.ts"],"sourcesContent":["export { usePaginationUrlSync } from \"./usePaginationUrlSync\";\nexport { useGridHeight } from \"./useGridHeight\";\nexport type { UseGridHeightOptions } from \"./useGridHeight\";\n","import { useEffect } from \"react\";\nimport type { SetURLSearchParams } from \"react-router-dom\";\n\nexport const usePaginationUrlSync = (\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParams,\n page: number,\n setPage: (page: number) => void,\n perPage: number,\n setPerPage: (perPage: number) => void,\n defaultPage = 1,\n defaultPerPage = 20\n) => {\n useEffect(() => {\n const currentUrlPage = parseInt(searchParams.get(\"page\") ?? \"\") || defaultPage;\n const currentUrlPerPage =\n parseInt(searchParams.get(\"perPage\") ?? \"\") || defaultPerPage;\n const hasPageParam = searchParams.has(\"page\");\n const hasPerPageParam = searchParams.has(\"perPage\");\n\n if (!hasPageParam || !hasPerPageParam) {\n const newParams = new URLSearchParams(searchParams);\n\n if (!hasPageParam) {\n newParams.set(\"page\", defaultPage.toString());\n }\n\n if (!hasPerPageParam) {\n newParams.set(\"perPage\", defaultPerPage.toString());\n }\n\n setSearchParams(newParams, { replace: true });\n return;\n }\n\n if (currentUrlPage !== page) {\n setPage(currentUrlPage);\n }\n\n if (currentUrlPerPage !== perPage) {\n setPerPage(currentUrlPerPage);\n }\n }, [\n searchParams,\n setSearchParams,\n page,\n setPage,\n perPage,\n setPerPage,\n defaultPage,\n defaultPerPage,\n ]);\n};\n","import { useEffect, useState } from \"react\";\n\nexport interface UseGridHeightOptions {\n height?: string;\n headerId?: string;\n footerId?: string;\n offset?: number;\n}\n\nexport const useGridHeight = ({\n height,\n headerId = \"layout-header\",\n footerId = \"layout-footer\",\n offset = 390,\n}: UseGridHeightOptions = {}) => {\n const [gridHeight, setGridHeight] = useState(height || \"300px\");\n\n useEffect(() => {\n if (height) {\n setGridHeight(height);\n return;\n }\n\n const calculateHeight = () => {\n const header = document.getElementById(headerId);\n const footer = document.getElementById(footerId);\n\n const headerHeight = header ? header.offsetHeight : 0;\n const footerHeight = footer ? footer.offsetHeight : 0;\n const totalHeight = window.innerHeight;\n\n const remainingHeight = totalHeight - headerHeight - footerHeight - offset;\n setGridHeight(`${remainingHeight}px`);\n };\n\n calculateHeight();\n window.addEventListener(\"resize\", calculateHeight);\n return () => window.removeEventListener(\"resize\", calculateHeight);\n }, [height, headerId, footerId, offset]);\n\n return gridHeight;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA0B;AAGnB,IAAM,uBAAuB,CAClC,cACA,iBACA,MACA,SACA,SACA,YACA,cAAc,GACd,iBAAiB,OACd;AACH,8BAAU,MAAM;AACd,UAAM,iBAAiB,SAAS,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK;AACnE,UAAM,oBACJ,SAAS,aAAa,IAAI,SAAS,KAAK,EAAE,KAAK;AACjD,UAAM,eAAe,aAAa,IAAI,MAAM;AAC5C,UAAM,kBAAkB,aAAa,IAAI,SAAS;AAElD,QAAI,CAAC,gBAAgB,CAAC,iBAAiB;AACrC,YAAM,YAAY,IAAI,gBAAgB,YAAY;AAElD,UAAI,CAAC,cAAc;AACjB,kBAAU,IAAI,QAAQ,YAAY,SAAS,CAAC;AAAA,MAC9C;AAEA,UAAI,CAAC,iBAAiB;AACpB,kBAAU,IAAI,WAAW,eAAe,SAAS,CAAC;AAAA,MACpD;AAEA,sBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC5C;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM;AAC3B,cAAQ,cAAc;AAAA,IACxB;AAEA,QAAI,sBAAsB,SAAS;AACjC,iBAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACpDA,IAAAA,gBAAoC;AAS7B,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AACX,IAA0B,CAAC,MAAM;AAC/B,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,UAAU,OAAO;AAE9D,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,oBAAc,MAAM;AACpB;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,YAAM,SAAS,SAAS,eAAe,QAAQ;AAC/C,YAAM,SAAS,SAAS,eAAe,QAAQ;AAE/C,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,cAAc,OAAO;AAE3B,YAAM,kBAAkB,cAAc,eAAe,eAAe;AACpE,oBAAc,GAAG,eAAe,IAAI;AAAA,IACtC;AAEA,oBAAgB;AAChB,WAAO,iBAAiB,UAAU,eAAe;AACjD,WAAO,MAAM,OAAO,oBAAoB,UAAU,eAAe;AAAA,EACnE,GAAG,CAAC,QAAQ,UAAU,UAAU,MAAM,CAAC;AAEvC,SAAO;AACT;","names":["import_react"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export { cn } from './utils/index.mjs';
|
|
1
|
+
export { capitalizeText, checkIfExistsInArray, cn, convertCommaDataToArray, currencyFormatter, deserializeJson, flattenTableData, formatDate, formatDateTime, getApiError, getErrorMessages, getFieldsByCategory, getFieldsByInputType, getFieldsByName, isEmpty, normalizeApiListItems, parseCurrencyValueToNumber, removeByPropertyValues, toDateInputValue, toLowerCaseText, truncateText } from './utils/index.mjs';
|
|
2
|
+
export { UseGridHeightOptions, useGridHeight, usePaginationUrlSync } from './hooks/index.mjs';
|
|
2
3
|
import 'clsx';
|
|
4
|
+
import 'react-router-dom';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export { cn } from './utils/index.js';
|
|
1
|
+
export { capitalizeText, checkIfExistsInArray, cn, convertCommaDataToArray, currencyFormatter, deserializeJson, flattenTableData, formatDate, formatDateTime, getApiError, getErrorMessages, getFieldsByCategory, getFieldsByInputType, getFieldsByName, isEmpty, normalizeApiListItems, parseCurrencyValueToNumber, removeByPropertyValues, toDateInputValue, toLowerCaseText, truncateText } from './utils/index.js';
|
|
2
|
+
export { UseGridHeightOptions, useGridHeight, usePaginationUrlSync } from './hooks/index.js';
|
|
2
3
|
import 'clsx';
|
|
4
|
+
import 'react-router-dom';
|