@eztrak/shared 0.7.3 → 0.8.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/README.md +44 -2
- package/dist/{chunk-KQHEJS62.mjs → chunk-QW67L4Z5.mjs} +173 -59
- package/dist/chunk-QW67L4Z5.mjs.map +1 -0
- package/dist/components/index.d.mts +65 -5
- package/dist/components/index.d.ts +65 -5
- package/dist/components/index.js +188 -68
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +7 -3
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +179 -65
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -2
- package/package.json +3 -1
- package/dist/chunk-KQHEJS62.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npm install @eztrak/shared
|
|
|
11
11
|
Peer dependencies:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npm install react react-dom react-router-dom react-hot-toast sweetalert2 react-icons framer-motion
|
|
14
|
+
npm install react react-dom react-router-dom react-hot-toast sweetalert2 react-icons framer-motion react-tooltip
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
Your app must render `<Toaster />` from `react-hot-toast` (e.g. in your root layout).
|
|
@@ -360,6 +360,47 @@ import { HiOutlineSearch } from "react-icons/hi";
|
|
|
360
360
|
|
|
361
361
|
Also accepts standard `<input>` HTML attributes (except `name`, `type`, `value`, `onChange`, and `defaultValue`, which are managed internally).
|
|
362
362
|
|
|
363
|
+
### Components — TooltipText
|
|
364
|
+
|
|
365
|
+
Displays truncated text with the full value available on hover or keyboard focus. Uses `react-tooltip` for placement and delay behavior.
|
|
366
|
+
|
|
367
|
+
```tsx
|
|
368
|
+
import { TooltipText } from "@eztrak/shared/components";
|
|
369
|
+
|
|
370
|
+
<TooltipText text="A very long material description" maxLength={20} />
|
|
371
|
+
|
|
372
|
+
<TooltipText
|
|
373
|
+
text={row.description}
|
|
374
|
+
placement="bottom"
|
|
375
|
+
delayShow={300}
|
|
376
|
+
tooltipWhenTruncatedOnly
|
|
377
|
+
/>
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
For lower-level composition, use `ToolTip` directly:
|
|
381
|
+
|
|
382
|
+
```tsx
|
|
383
|
+
import { ToolTip } from "@eztrak/shared/components";
|
|
384
|
+
|
|
385
|
+
<ToolTip text="Full details" placement="right">
|
|
386
|
+
<button type="button">Info</button>
|
|
387
|
+
</ToolTip>
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
| Prop | Type | Default | Description |
|
|
391
|
+
| --- | --- | --- | --- |
|
|
392
|
+
| `text` | `string \| number \| null` | `""` | Full value shown inside the tooltip |
|
|
393
|
+
| `maxLength` | `number` | `20` | Visible truncated text length |
|
|
394
|
+
| `fallback` | `string` | `"-"` | Displayed when `text` is empty |
|
|
395
|
+
| `placement` | `PlacesType` | `"top"` | Tooltip placement from `react-tooltip` |
|
|
396
|
+
| `delayShow` / `delayHide` | `number` | — | Tooltip delay in milliseconds |
|
|
397
|
+
| `className` | `string` | — | Classes for the tooltip trigger wrapper |
|
|
398
|
+
| `textClassName` | `string` | — | Classes for the visible text |
|
|
399
|
+
| `tooltipClassName` | `string` | — | Classes for the tooltip popup |
|
|
400
|
+
| `tooltipStyle` | `CSSProperties` | — | Inline style overrides for the tooltip popup |
|
|
401
|
+
| `showTooltip` | `boolean` | `true` | Disable tooltip while still rendering truncated text |
|
|
402
|
+
| `tooltipWhenTruncatedOnly` | `boolean` | `false` | Only show tooltip when truncation occurs |
|
|
403
|
+
|
|
363
404
|
### Components — Loader
|
|
364
405
|
|
|
365
406
|
Spinner for full-page or inline loading states. Requires `loader.css`:
|
|
@@ -537,7 +578,7 @@ Opens on [http://localhost:6006](http://localhost:6006) with stories for `Eztrak
|
|
|
537
578
|
| `@eztrak/shared` | Main entry — re-exports utils, hooks, and components |
|
|
538
579
|
| `@eztrak/shared/utils` | `cn`, `handleApiError`, `confirmationAlert`, date/format helpers, API error helpers, form field helpers |
|
|
539
580
|
| `@eztrak/shared/hooks` | `usePaginationUrlSync`, `useGridHeight` |
|
|
540
|
-
| `@eztrak/shared/components` | `EztrakTabs`, `CustomPagination`, `CustomCellEditor`, `SearchInput`, `ResetFiltersButton`, `Modal`, `Loader`, `TableLayoutToolbarControls`, `ResetColumnsButton`, and related types |
|
|
581
|
+
| `@eztrak/shared/components` | `EztrakTabs`, `CustomPagination`, `CustomCellEditor`, `SearchInput`, `ResetFiltersButton`, `TooltipText`, `ToolTip`, `Modal`, `Loader`, `TableLayoutToolbarControls`, `ResetColumnsButton`, and related types |
|
|
541
582
|
| `@eztrak/shared/components/tabs.css` | Default tab styles (CSS variables) |
|
|
542
583
|
| `@eztrak/shared/components/loader.css` | Loader spinner styles |
|
|
543
584
|
|
|
@@ -599,6 +640,7 @@ Keyboard: Arrow keys move between tabs; Home/End jump to first/last enabled tab.
|
|
|
599
640
|
- `react-hot-toast` — toast feedback in `CustomCellEditor` and `handleApiError`
|
|
600
641
|
- `sweetalert2` — `ResetColumnsButton` and `confirmationAlert`
|
|
601
642
|
- `react-icons` — `CustomCellEditor`, `SearchInput`, and `Modal`
|
|
643
|
+
- `react-tooltip` — `ToolTip` and `TooltipText`
|
|
602
644
|
- `framer-motion` — `Modal`
|
|
603
645
|
- Works with any bundler that supports the [Node.js `exports` field](https://nodejs.org/api/packages.html#exports)
|
|
604
646
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn,
|
|
3
3
|
confirmationAlert,
|
|
4
|
-
toDateInputValue
|
|
4
|
+
toDateInputValue,
|
|
5
|
+
truncateText
|
|
5
6
|
} from "./chunk-GVIHLI67.mjs";
|
|
6
7
|
|
|
7
8
|
// src/components/tabs/EztrakTabs.tsx
|
|
@@ -920,29 +921,124 @@ function Modal({
|
|
|
920
921
|
return createPortal(modalContent, modalRoot);
|
|
921
922
|
}
|
|
922
923
|
|
|
924
|
+
// src/components/tooltip/ToolTip.tsx
|
|
925
|
+
import { useId as useId2 } from "react";
|
|
926
|
+
import { Tooltip } from "react-tooltip";
|
|
927
|
+
import { Fragment, jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
928
|
+
var defaultTooltipStyle = {
|
|
929
|
+
color: "#fff",
|
|
930
|
+
borderRadius: "5px",
|
|
931
|
+
zIndex: 999,
|
|
932
|
+
textAlign: "justify",
|
|
933
|
+
maxWidth: "300px",
|
|
934
|
+
whiteSpace: "pre-wrap",
|
|
935
|
+
wordWrap: "break-word",
|
|
936
|
+
overflowWrap: "break-word"
|
|
937
|
+
};
|
|
938
|
+
function ToolTip({
|
|
939
|
+
text = "tool tip",
|
|
940
|
+
placement = "top",
|
|
941
|
+
delayShow,
|
|
942
|
+
delayHide,
|
|
943
|
+
className,
|
|
944
|
+
tooltipClassName,
|
|
945
|
+
tooltipStyle,
|
|
946
|
+
wrapperTabIndex,
|
|
947
|
+
disabled = false,
|
|
948
|
+
children
|
|
949
|
+
}) {
|
|
950
|
+
const generatedId = useId2();
|
|
951
|
+
const tooltipId = `eztrak-tooltip-${generatedId.replace(/:/g, "")}`;
|
|
952
|
+
const tooltipText = String(text ?? "");
|
|
953
|
+
if (disabled || !tooltipText) {
|
|
954
|
+
return /* @__PURE__ */ jsx7("span", { className, children });
|
|
955
|
+
}
|
|
956
|
+
return /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
957
|
+
/* @__PURE__ */ jsx7(
|
|
958
|
+
"span",
|
|
959
|
+
{
|
|
960
|
+
className,
|
|
961
|
+
"data-tooltip-id": tooltipId,
|
|
962
|
+
"data-tooltip-content": tooltipText,
|
|
963
|
+
tabIndex: wrapperTabIndex,
|
|
964
|
+
children
|
|
965
|
+
}
|
|
966
|
+
),
|
|
967
|
+
/* @__PURE__ */ jsx7(
|
|
968
|
+
Tooltip,
|
|
969
|
+
{
|
|
970
|
+
id: tooltipId,
|
|
971
|
+
place: placement,
|
|
972
|
+
delayShow,
|
|
973
|
+
delayHide,
|
|
974
|
+
className: tooltipClassName,
|
|
975
|
+
style: { ...defaultTooltipStyle, ...tooltipStyle }
|
|
976
|
+
}
|
|
977
|
+
)
|
|
978
|
+
] });
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
// src/components/tooltip/TooltipText.tsx
|
|
982
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
983
|
+
function TooltipText({
|
|
984
|
+
text = "",
|
|
985
|
+
maxLength = 20,
|
|
986
|
+
fallback = "-",
|
|
987
|
+
placement = "top",
|
|
988
|
+
delayShow,
|
|
989
|
+
delayHide,
|
|
990
|
+
className,
|
|
991
|
+
textClassName,
|
|
992
|
+
tooltipClassName,
|
|
993
|
+
tooltipStyle,
|
|
994
|
+
showTooltip = true,
|
|
995
|
+
tooltipWhenTruncatedOnly = false
|
|
996
|
+
}) {
|
|
997
|
+
const hasValue = text !== null && text !== void 0 && text !== "";
|
|
998
|
+
const fullText = hasValue ? String(text) : fallback;
|
|
999
|
+
const displayText = truncateText(fullText, maxLength);
|
|
1000
|
+
const isTruncated = displayText !== fullText;
|
|
1001
|
+
const tooltipDisabled = !showTooltip || !hasValue || tooltipWhenTruncatedOnly && !isTruncated;
|
|
1002
|
+
return /* @__PURE__ */ jsx8(
|
|
1003
|
+
ToolTip,
|
|
1004
|
+
{
|
|
1005
|
+
text: fullText,
|
|
1006
|
+
placement,
|
|
1007
|
+
delayShow,
|
|
1008
|
+
delayHide,
|
|
1009
|
+
className: cn("inline-block max-w-full", className),
|
|
1010
|
+
tooltipClassName,
|
|
1011
|
+
tooltipStyle,
|
|
1012
|
+
wrapperTabIndex: tooltipDisabled ? void 0 : 0,
|
|
1013
|
+
disabled: tooltipDisabled,
|
|
1014
|
+
children: /* @__PURE__ */ jsx8("span", { className: cn("inline-block max-w-full align-bottom", textClassName), children: displayText })
|
|
1015
|
+
}
|
|
1016
|
+
);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
923
1019
|
// src/components/cell-editor/CustomCellEditor.tsx
|
|
924
1020
|
import {
|
|
925
1021
|
forwardRef,
|
|
926
1022
|
useEffect as useEffect4,
|
|
927
1023
|
useImperativeHandle,
|
|
1024
|
+
useMemo,
|
|
928
1025
|
useRef as useRef4,
|
|
929
1026
|
useState as useState3
|
|
930
1027
|
} from "react";
|
|
931
1028
|
import toast from "react-hot-toast";
|
|
932
|
-
import {
|
|
933
|
-
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1029
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
934
1030
|
function ButtonSpinner() {
|
|
935
|
-
return /* @__PURE__ */
|
|
1031
|
+
return /* @__PURE__ */ jsxs7(
|
|
936
1032
|
"svg",
|
|
937
1033
|
{
|
|
938
1034
|
className: "animate-spin",
|
|
939
|
-
width:
|
|
940
|
-
height:
|
|
1035
|
+
width: 12,
|
|
1036
|
+
height: 12,
|
|
941
1037
|
viewBox: "0 0 24 24",
|
|
942
1038
|
fill: "none",
|
|
943
1039
|
"aria-hidden": true,
|
|
944
1040
|
children: [
|
|
945
|
-
/* @__PURE__ */
|
|
1041
|
+
/* @__PURE__ */ jsx9(
|
|
946
1042
|
"circle",
|
|
947
1043
|
{
|
|
948
1044
|
cx: "12",
|
|
@@ -953,7 +1049,7 @@ function ButtonSpinner() {
|
|
|
953
1049
|
strokeOpacity: "0.25"
|
|
954
1050
|
}
|
|
955
1051
|
),
|
|
956
|
-
/* @__PURE__ */
|
|
1052
|
+
/* @__PURE__ */ jsx9(
|
|
957
1053
|
"path",
|
|
958
1054
|
{
|
|
959
1055
|
d: "M12 2a10 10 0 0 1 10 10",
|
|
@@ -985,47 +1081,59 @@ var CustomCellEditor = forwardRef(
|
|
|
985
1081
|
entityName = "Record",
|
|
986
1082
|
onSave,
|
|
987
1083
|
dropdownOptions = [],
|
|
988
|
-
|
|
1084
|
+
customOptions,
|
|
1085
|
+
valueKey = "value",
|
|
1086
|
+
labelKey = "label",
|
|
1087
|
+
containerStyle,
|
|
1088
|
+
className,
|
|
1089
|
+
inputClassName,
|
|
1090
|
+
loadingIndicator,
|
|
1091
|
+
saveButtonContent,
|
|
1092
|
+
cancelButtonContent,
|
|
1093
|
+
saveButtonStyle,
|
|
1094
|
+
cancelButtonStyle,
|
|
1095
|
+
saveButtonClassName,
|
|
1096
|
+
cancelButtonClassName
|
|
989
1097
|
}, ref) => {
|
|
990
1098
|
const normalizedInitial = normalizeInitialValue(initialValue, inputType);
|
|
991
1099
|
const [value, setValue] = useState3(normalizedInitial);
|
|
992
1100
|
const [isLoading, setIsLoading] = useState3(false);
|
|
993
1101
|
const inputRef = useRef4(null);
|
|
994
1102
|
const selectRef = useRef4(null);
|
|
1103
|
+
const normalizedOptions = useMemo(() => {
|
|
1104
|
+
if (customOptions && customOptions.length > 0) {
|
|
1105
|
+
return customOptions.map((opt) => ({
|
|
1106
|
+
value: String(opt[valueKey] ?? ""),
|
|
1107
|
+
label: String(opt[labelKey] ?? "")
|
|
1108
|
+
}));
|
|
1109
|
+
}
|
|
1110
|
+
return dropdownOptions;
|
|
1111
|
+
}, [customOptions, dropdownOptions, valueKey, labelKey]);
|
|
1112
|
+
const isDropdown = inputType === "dropdown" || normalizedOptions.length > 0;
|
|
995
1113
|
useImperativeHandle(ref, () => ({
|
|
996
1114
|
getValue: () => value,
|
|
997
1115
|
isCancelBeforeStart: () => false,
|
|
998
|
-
isCancelAfterEnd: () => false
|
|
1116
|
+
isCancelAfterEnd: () => false,
|
|
1117
|
+
isPopup: () => true
|
|
999
1118
|
}));
|
|
1000
1119
|
useEffect4(() => {
|
|
1001
|
-
if (
|
|
1002
|
-
|
|
1003
|
-
if (el2) {
|
|
1004
|
-
el2.focus();
|
|
1005
|
-
}
|
|
1120
|
+
if (isDropdown) {
|
|
1121
|
+
selectRef.current?.focus();
|
|
1006
1122
|
return;
|
|
1007
1123
|
}
|
|
1008
1124
|
const el = inputRef.current;
|
|
1009
|
-
if (!el)
|
|
1010
|
-
return;
|
|
1011
|
-
}
|
|
1125
|
+
if (!el) return;
|
|
1012
1126
|
el.focus();
|
|
1013
1127
|
if (inputType !== "date") {
|
|
1014
1128
|
el.select();
|
|
1015
1129
|
}
|
|
1016
|
-
}, [inputType]);
|
|
1130
|
+
}, [isDropdown, inputType]);
|
|
1017
1131
|
const handleSave = async () => {
|
|
1018
|
-
if (isLoading)
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1132
|
+
if (isLoading) return;
|
|
1021
1133
|
if (String(value) === String(normalizedInitial)) {
|
|
1022
1134
|
stopEditing();
|
|
1023
1135
|
return;
|
|
1024
1136
|
}
|
|
1025
|
-
if (!entityId) {
|
|
1026
|
-
toast.error("Entity ID is required");
|
|
1027
|
-
return;
|
|
1028
|
-
}
|
|
1029
1137
|
if (!name) {
|
|
1030
1138
|
toast.error("Property name is required");
|
|
1031
1139
|
return;
|
|
@@ -1074,29 +1182,33 @@ var CustomCellEditor = forwardRef(
|
|
|
1074
1182
|
setValue(event.target.value);
|
|
1075
1183
|
};
|
|
1076
1184
|
const isSaveDisabled = isLoading || String(value) === String(normalizedInitial);
|
|
1077
|
-
|
|
1185
|
+
const defaultInputClass = "w-48 px-2 py-1 text-sm border border-gray-200 rounded-md bg-white focus:outline-none focus:ring-1 focus:ring-blue-400";
|
|
1186
|
+
const defaultSaveBtnClass = "px-3 py-1 text-sm font-medium text-white bg-green-500 rounded-md hover:bg-green-600 disabled:opacity-50 whitespace-nowrap shrink-0";
|
|
1187
|
+
const defaultCancelBtnClass = "px-3 py-1 text-sm font-medium text-white bg-red-500 rounded-md hover:bg-red-600 disabled:opacity-50 whitespace-nowrap shrink-0";
|
|
1188
|
+
return /* @__PURE__ */ jsxs7(
|
|
1078
1189
|
"div",
|
|
1079
1190
|
{
|
|
1080
1191
|
className: cn(
|
|
1081
|
-
"flex items-center
|
|
1192
|
+
"flex items-center gap-2 px-2 py-1 min-w-[320px] bg-white border border-gray-200 rounded-md shadow-md",
|
|
1082
1193
|
className
|
|
1083
1194
|
),
|
|
1195
|
+
style: containerStyle,
|
|
1084
1196
|
children: [
|
|
1085
|
-
|
|
1197
|
+
isDropdown ? /* @__PURE__ */ jsxs7(
|
|
1086
1198
|
"select",
|
|
1087
1199
|
{
|
|
1088
1200
|
ref: selectRef,
|
|
1089
1201
|
value: String(value),
|
|
1090
1202
|
onChange: handleDropdownChange,
|
|
1091
1203
|
onKeyDown: handleKeyDown,
|
|
1092
|
-
className:
|
|
1204
|
+
className: inputClassName ?? defaultInputClass,
|
|
1093
1205
|
disabled: isLoading,
|
|
1094
1206
|
children: [
|
|
1095
|
-
/* @__PURE__ */
|
|
1096
|
-
|
|
1207
|
+
/* @__PURE__ */ jsx9("option", { value: "", disabled: true, children: "Select option..." }),
|
|
1208
|
+
normalizedOptions.map((opt) => /* @__PURE__ */ jsx9("option", { value: opt.value, children: opt.label }, opt.value))
|
|
1097
1209
|
]
|
|
1098
1210
|
}
|
|
1099
|
-
) : /* @__PURE__ */
|
|
1211
|
+
) : /* @__PURE__ */ jsx9(
|
|
1100
1212
|
"input",
|
|
1101
1213
|
{
|
|
1102
1214
|
ref: inputRef,
|
|
@@ -1104,35 +1216,35 @@ var CustomCellEditor = forwardRef(
|
|
|
1104
1216
|
value: String(value),
|
|
1105
1217
|
onChange: handleInputChange,
|
|
1106
1218
|
onKeyDown: handleKeyDown,
|
|
1107
|
-
className:
|
|
1219
|
+
className: inputClassName ?? defaultInputClass,
|
|
1108
1220
|
placeholder: "...",
|
|
1109
1221
|
disabled: isLoading
|
|
1110
1222
|
}
|
|
1111
1223
|
),
|
|
1112
|
-
/* @__PURE__ */
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1224
|
+
/* @__PURE__ */ jsx9(
|
|
1225
|
+
"button",
|
|
1226
|
+
{
|
|
1227
|
+
type: "button",
|
|
1228
|
+
onClick: handleSave,
|
|
1229
|
+
disabled: isSaveDisabled,
|
|
1230
|
+
className: saveButtonClassName ?? (saveButtonStyle ? void 0 : defaultSaveBtnClass),
|
|
1231
|
+
style: saveButtonStyle,
|
|
1232
|
+
title: "Save (Enter)",
|
|
1233
|
+
children: isLoading ? loadingIndicator ?? /* @__PURE__ */ jsx9(ButtonSpinner, {}) : saveButtonContent ?? "Save"
|
|
1234
|
+
}
|
|
1235
|
+
),
|
|
1236
|
+
/* @__PURE__ */ jsx9(
|
|
1237
|
+
"button",
|
|
1238
|
+
{
|
|
1239
|
+
type: "button",
|
|
1240
|
+
onClick: handleCancel,
|
|
1241
|
+
disabled: isLoading,
|
|
1242
|
+
className: cancelButtonClassName ?? (cancelButtonStyle ? void 0 : defaultCancelBtnClass),
|
|
1243
|
+
style: cancelButtonStyle,
|
|
1244
|
+
title: "Cancel (Escape)",
|
|
1245
|
+
children: cancelButtonContent ?? "Cancel"
|
|
1246
|
+
}
|
|
1247
|
+
)
|
|
1136
1248
|
]
|
|
1137
1249
|
}
|
|
1138
1250
|
);
|
|
@@ -1149,6 +1261,8 @@ export {
|
|
|
1149
1261
|
SearchInput,
|
|
1150
1262
|
Loader,
|
|
1151
1263
|
Modal,
|
|
1264
|
+
ToolTip,
|
|
1265
|
+
TooltipText,
|
|
1152
1266
|
CustomCellEditor
|
|
1153
1267
|
};
|
|
1154
|
-
//# sourceMappingURL=chunk-
|
|
1268
|
+
//# sourceMappingURL=chunk-QW67L4Z5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/tabs/EztrakTabs.tsx","../src/components/pagination/CustomPagination.tsx","../src/components/search-filters/ResetFiltersButton.tsx","../src/components/search-filters/SearchInput.tsx","../src/components/modal/Modal.tsx","../src/components/Loader/Loader.tsx","../src/components/tooltip/ToolTip.tsx","../src/components/tooltip/TooltipText.tsx","../src/components/cell-editor/CustomCellEditor.tsx"],"sourcesContent":["import {\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { EztrakTab, EztrakTabsProps } from \"./types\";\r\n\r\nfunction getInitialTabId(\r\n tabs: EztrakTab[],\r\n defaultTabId?: string\r\n): string | undefined {\r\n if (defaultTabId && tabs.some((t) => t.id === defaultTabId && !t.disabled)) {\r\n return defaultTabId;\r\n }\r\n return tabs.find((t) => !t.disabled)?.id;\r\n}\r\n\r\nfunction getEnabledTabIds(tabs: EztrakTab[]): string[] {\r\n return tabs.filter((t) => !t.disabled).map((t) => t.id);\r\n}\r\n\r\nexport function EztrakTabs({\r\n tabs,\r\n activeTab,\r\n defaultTabId,\r\n onTabChange,\r\n showPanels = true,\r\n keepMounted = false,\r\n classNames,\r\n className,\r\n}: EztrakTabsProps) {\r\n const baseId = useId().replace(/:/g, \"\");\r\n const isControlled = activeTab !== undefined && activeTab !== null;\r\n const [uncontrolledActive, setUncontrolledActive] = useState(() =>\r\n getInitialTabId(tabs, defaultTabId)\r\n );\r\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\r\n\r\n const displayActive = isControlled ? activeTab : uncontrolledActive;\r\n\r\n useEffect(() => {\r\n if (isControlled) return;\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (!displayActive || !enabledIds.includes(displayActive)) {\r\n const next = getInitialTabId(tabs, defaultTabId);\r\n if (next !== displayActive) {\r\n setUncontrolledActive(next);\r\n }\r\n }\r\n }, [tabs, defaultTabId, isControlled, displayActive]);\r\n\r\n const handleTabClick = useCallback(\r\n (tabId: string, disabled?: boolean) => {\r\n if (disabled) return;\r\n if (!isControlled) {\r\n setUncontrolledActive(tabId);\r\n }\r\n onTabChange?.(tabId);\r\n },\r\n [isControlled, onTabChange]\r\n );\r\n\r\n const focusTab = useCallback((tabId: string) => {\r\n tabRefs.current.get(tabId)?.focus();\r\n }, []);\r\n\r\n const handleListKeyDown = useCallback(\r\n (event: KeyboardEvent<HTMLUListElement>) => {\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (enabledIds.length === 0) return;\r\n\r\n const currentIndex = displayActive\r\n ? enabledIds.indexOf(displayActive)\r\n : -1;\r\n let nextIndex = currentIndex;\r\n\r\n switch (event.key) {\r\n case \"ArrowRight\":\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? 0\r\n : (currentIndex + 1) % enabledIds.length;\r\n break;\r\n case \"ArrowLeft\":\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? enabledIds.length - 1\r\n : (currentIndex - 1 + enabledIds.length) % enabledIds.length;\r\n break;\r\n case \"Home\":\r\n event.preventDefault();\r\n nextIndex = 0;\r\n break;\r\n case \"End\":\r\n event.preventDefault();\r\n nextIndex = enabledIds.length - 1;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n const nextId = enabledIds[nextIndex];\r\n if (nextId) {\r\n handleTabClick(nextId);\r\n focusTab(nextId);\r\n }\r\n },\r\n [tabs, displayActive, handleTabClick, focusTab]\r\n );\r\n\r\n if (!tabs.length) {\r\n return null;\r\n }\r\n\r\n const wrapperClass = cn(\r\n \"eztrak-tabs-wrapper\",\r\n classNames?.wrapper,\r\n className\r\n );\r\n\r\n return (\r\n <div className={wrapperClass}>\r\n <div className={cn(\"eztrak-tabs-container\", classNames?.container)}>\r\n <nav\r\n className={cn(\"eztrak-tabs-nav\", classNames?.nav)}\r\n aria-label=\"Tabs\"\r\n >\r\n <ul\r\n role=\"tablist\"\r\n className={cn(\"eztrak-tabs-list\", classNames?.list)}\r\n onKeyDown={handleListKeyDown}\r\n >\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n\r\n return (\r\n <li\r\n key={tab.id}\r\n role=\"presentation\"\r\n className={cn(\r\n \"eztrak-tabs-item\",\r\n isActive && \"eztrak-tabs-item-active\",\r\n classNames?.item,\r\n isActive && classNames?.itemActive\r\n )}\r\n >\r\n <button\r\n ref={(el) => {\r\n if (el) {\r\n tabRefs.current.set(tab.id, el);\r\n } else {\r\n tabRefs.current.delete(tab.id);\r\n }\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n id={tabId}\r\n aria-selected={isActive}\r\n aria-controls={showPanels ? panelId : undefined}\r\n tabIndex={isActive ? 0 : -1}\r\n disabled={tab.disabled}\r\n className={cn(\r\n \"eztrak-tabs-button\",\r\n isActive && \"eztrak-tabs-button-active\",\r\n classNames?.button,\r\n isActive && classNames?.buttonActive\r\n )}\r\n onClick={() => handleTabClick(tab.id, tab.disabled)}\r\n >\r\n {tab.icon ? (\r\n <span\r\n className={cn(\"eztrak-tabs-icon\", classNames?.icon)}\r\n aria-hidden\r\n >\r\n {tab.icon}\r\n </span>\r\n ) : null}\r\n <span\r\n className={cn(\"eztrak-tabs-label\", classNames?.label)}\r\n >\r\n {tab.label}\r\n </span>\r\n {isActive ? (\r\n <span\r\n className={cn(\r\n \"eztrak-tabs-underline\",\r\n classNames?.underline\r\n )}\r\n aria-hidden\r\n />\r\n ) : null}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </nav>\r\n\r\n {showPanels ? (\r\n <div className={cn(\"eztrak-tabs-content\", classNames?.content)}>\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n\r\n if (!keepMounted && !isActive) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n key={tab.id}\r\n id={panelId}\r\n role=\"tabpanel\"\r\n aria-labelledby={tabId}\r\n hidden={!isActive}\r\n className={cn(\"eztrak-tabs-panel\", classNames?.panel)}\r\n >\r\n {tab.content}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { type ChangeEvent, type ReactNode } from \"react\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport type {\r\n CustomPaginationProps,\r\n ResetColumnsButtonProps,\r\n TableLayoutToolbarControlsProps,\r\n} from \"./types\";\r\n\r\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100];\r\nconst ALL_PAGES_VALUE = -1;\r\n\r\nfunction padCount(num: number) {\r\n return num.toString().padStart(2, \"0\");\r\n}\r\n\r\nfunction RefreshIcon({\r\n size = 14,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetColumnsButton({\r\n onReset,\r\n disabled = false,\r\n isLoading = false,\r\n}: ResetColumnsButtonProps) {\r\n const handleClick = () => {\r\n confirmationAlert(onReset, {\r\n text: \"Reset column order, widths, and visibility to defaults?\",\r\n icon: \"warning\",\r\n title: \"Reset column layout to default\",\r\n });\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n disabled={disabled || isLoading}\r\n title=\"Reset column layout to default\"\r\n className=\"inline-flex items-center gap-1.5 rounded-xl border border-primary-150 bg-white px-3 py-1.5 text-sm font-medium text-primary-150 hover:bg-gray-50 focus:outline-none disabled:hover:bg-white\"\r\n >\r\n <RefreshIcon size={14} className={cn(isLoading ? \"animate-spin\" : \"\")} />\r\n Reset columns\r\n </button>\r\n );\r\n}\r\n\r\nexport function TableLayoutToolbarControls({\r\n layoutStatus = {},\r\n onResetLayout,\r\n renderResetControl,\r\n isLoading = false,\r\n}: TableLayoutToolbarControlsProps) {\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } = layoutStatus;\r\n const isLayoutBusy = isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport function CustomPagination({\r\n paginationData,\r\n paginationPageSize,\r\n pageSizeOptions: pageSizeOptionsProp,\r\n isLoading = false,\r\n paramNames,\r\n onPageChange,\r\n onPageSizeChange,\r\n onResetLayout,\r\n renderResetControl,\r\n layoutStatus,\r\n showAllPagesOption = false,\r\n classNames,\r\n className,\r\n}: CustomPaginationProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const pageKey = paramNames?.page ?? \"page\";\r\n const perPageKey = paramNames?.perPage ?? \"perPage\";\r\n const pageSizeOptions =\r\n pageSizeOptionsProp ?? paginationPageSize ?? DEFAULT_PAGE_SIZE_OPTIONS;\r\n const perPageParam = searchParams.get(perPageKey);\r\n const perPageNumber =\r\n perPageParam !== null && perPageParam !== \"\"\r\n ? parseInt(perPageParam, 10)\r\n : NaN;\r\n const isShowingAll = perPageNumber === ALL_PAGES_VALUE;\r\n\r\n const currentPage = paginationData\r\n ? Math.max(0, paginationData.currentPage - 1)\r\n : 0;\r\n\r\n const handlePageChange = (pageNumber: number) => {\r\n if (\r\n !paginationData ||\r\n pageNumber < 0 ||\r\n pageNumber >= paginationData.pageCount\r\n ) {\r\n return;\r\n }\r\n\r\n const safePage = Math.max(\r\n 1,\r\n Math.min(pageNumber + 1, paginationData.pageCount)\r\n );\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, String(safePage));\r\n setSearchParams(newParams, { replace: true });\r\n onPageChange?.(safePage);\r\n };\r\n\r\n const handlePageSizeChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n const parsed = parseInt(event.target.value, 10);\r\n if (\r\n !Number.isFinite(parsed) ||\r\n (parsed < 1 && parsed !== ALL_PAGES_VALUE)\r\n ) {\r\n return;\r\n }\r\n\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, \"1\");\r\n newParams.set(perPageKey, String(parsed));\r\n setSearchParams(newParams, { replace: true });\r\n onPageSizeChange?.(parsed);\r\n };\r\n\r\n const createPageButtons = () => {\r\n const buttons: ReactNode[] = [];\r\n const maxButtons = 5;\r\n const totalPages = Math.max(1, paginationData?.pageCount ?? 1);\r\n\r\n let startPage = Math.max(0, currentPage - Math.floor(maxButtons / 2));\r\n let endPage = Math.min(totalPages - 1, startPage + maxButtons - 1);\r\n\r\n if (endPage - startPage + 1 < maxButtons) {\r\n startPage = Math.max(0, endPage - maxButtons + 1);\r\n }\r\n\r\n if (startPage > 0) {\r\n buttons.push(\r\n <button\r\n key=\"1\"\r\n type=\"button\"\r\n onClick={() => handlePageChange(0)}\r\n aria-label=\"Page 1\"\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-blue-600 hover:bg-blue-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n 1\r\n </button>\r\n );\r\n\r\n if (startPage > 1) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis1\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n }\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n const isActive = currentPage === i;\r\n buttons.push(\r\n <button\r\n key={i + 1}\r\n type=\"button\"\r\n onClick={() => handlePageChange(i)}\r\n aria-label={`Page ${i + 1}`}\r\n aria-current={isActive ? \"page\" : undefined}\r\n className={cn(\r\n \"px-3 py-2 text-sm rounded-md transition-colors\",\r\n isActive\r\n ? cn(\"bg-gray-400 text-white\", classNames?.activePageButton)\r\n : cn(\r\n \"text-gray-600 hover:text-gray-600 hover:bg-gray-50\",\r\n classNames?.pageButton\r\n )\r\n )}\r\n >\r\n {i + 1}\r\n </button>\r\n );\r\n }\r\n\r\n if (endPage < totalPages - 1) {\r\n if (endPage < totalPages - 2) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis2\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n\r\n buttons.push(\r\n <button\r\n key={totalPages}\r\n type=\"button\"\r\n onClick={() => handlePageChange(totalPages - 1)}\r\n aria-label={`Page ${totalPages}`}\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-gray-600 hover:bg-gray-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n {totalPages}\r\n </button>\r\n );\r\n }\r\n\r\n return buttons;\r\n };\r\n\r\n if (isLoading || !paginationData) {\r\n return (\r\n <div className=\"flex items-center justify-center p-6 bg-gray-50\">\r\n <span className=\"text-gray-500\">\r\n {isLoading ? \"Loading...\" : \"No pagination data\"}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n const effectiveSizeOptions =\r\n paginationData.perPage > 0 &&\r\n !pageSizeOptions.includes(paginationData.perPage)\r\n ? [...pageSizeOptions, paginationData.perPage].sort((a, b) => a - b)\r\n : pageSizeOptions;\r\n\r\n const selectValue = isShowingAll\r\n ? ALL_PAGES_VALUE\r\n : paginationData.perPage ||\r\n (Number.isFinite(perPageNumber) && perPageNumber > 0\r\n ? perPageNumber\r\n : 10);\r\n\r\n const startItem =\r\n paginationData.totalCount === 0\r\n ? 0\r\n : (paginationData.currentPage - 1) * paginationData.perPage + 1;\r\n const endItem = Math.min(\r\n startItem + paginationData.perPage - 1,\r\n paginationData.totalCount\r\n );\r\n\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } =\r\n layoutStatus ?? {};\r\n const isLayoutBusy =\r\n isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-between pb-4\",\r\n className,\r\n classNames?.root\r\n )}\r\n >\r\n <div className={cn(\"flex-1\", classNames?.info)}>\r\n <span className=\"text-xs font-medium text-neutral-400\">\r\n {isShowingAll\r\n ? `Showing All ${paginationData.totalCount ?? 0} Results`\r\n : `Showing ${padCount(startItem)} - ${padCount(endItem)} of ${paginationData.totalCount ?? 0} results`}\r\n </span>\r\n </div>\r\n\r\n <nav\r\n aria-label=\"Pagination\"\r\n className={cn(\"flex items-center space-x-1\", classNames?.nav)}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage - 1)}\r\n disabled={currentPage === 0 || isShowingAll}\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Previous page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10.7 2.3a1 1 0 0 1 0 1.4L6.4 8l4.3 4.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 0z\" />\r\n </svg>\r\n </button>\r\n\r\n <div className=\"flex items-center space-x-1\">\r\n {isShowingAll ? (\r\n <span className=\"px-3 py-2 text-sm text-gray-400\" aria-hidden=\"true\">\r\n All\r\n </span>\r\n ) : (\r\n createPageButtons()\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage + 1)}\r\n disabled={\r\n currentPage >= paginationData.pageCount - 1 || isShowingAll\r\n }\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Next page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M5.3 13.7a1 1 0 0 1 0-1.4L9.6 8 5.3 3.7a1 1 0 0 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4 0z\" />\r\n </svg>\r\n </button>\r\n </nav>\r\n\r\n <div className=\"flex-1 flex justify-end\">\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n <div className=\"flex items-center space-x-2\">\r\n <label\r\n htmlFor=\"pagination-per-page\"\r\n className=\"text-sm text-gray-600\"\r\n >\r\n Items per page\r\n </label>\r\n <select\r\n id=\"pagination-per-page\"\r\n value={selectValue}\r\n onChange={handlePageSizeChange}\r\n className={cn(\r\n \"px-3 py-1.5 text-sm border border-gray-300 rounded-md bg-white text-gray-700 hover:border-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors\",\r\n classNames?.select\r\n )}\r\n >\r\n {showAllPagesOption && (\r\n <option value={ALL_PAGES_VALUE}>All</option>\r\n )}\r\n {effectiveSizeOptions.map((option) => (\r\n <option key={option} value={option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CustomPagination;\r\n","import { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResetFiltersButtonProps,\r\n ResetFiltersButtonVariant,\r\n} from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"inline-flex items-center gap-1.5 px-5 py-3 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\";\r\n\r\nconst VARIANTS: Record<ResetFiltersButtonVariant, string> = {\r\n primary:\r\n \"bg-white text-secondary border border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border border-primary-150 font-bold hover:bg-primary-100 hover:text-white\",\r\n \"primary-fill\":\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n secondary:\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border border-transparent hover:bg-primary/10\",\r\n};\r\n\r\nfunction ResetIcon({\r\n size = 16,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetFiltersButton({\r\n label = \"Reset Filters\",\r\n showLabel = true,\r\n icon,\r\n variant = \"primary-outline\",\r\n className,\r\n onReset,\r\n disabled = false,\r\n}: ResetFiltersButtonProps) {\r\n const [, setSearchParams] = useSearchParams();\r\n\r\n const handleReset = () => {\r\n setSearchParams({}, { replace: true });\r\n onReset?.();\r\n };\r\n\r\n const resolvedIcon = icon === undefined ? <ResetIcon size={16} /> : icon;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleReset}\r\n disabled={disabled}\r\n className={cn(BASE_STYLES, VARIANTS[variant], className)}\r\n >\r\n {resolvedIcon}\r\n {showLabel && label}\r\n </button>\r\n );\r\n}\r\n","import {\r\n useEffect,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type FormEvent,\r\n} from \"react\";\r\nimport { FiSearch } from \"react-icons/fi\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { SearchInputProps } from \"./types\";\r\n\r\nexport function SearchInput({\r\n placeholder = \"Search...\",\r\n searchBtn = \"\",\r\n searchClassName = \"\",\r\n searchWrapperClass = \"\",\r\n searchIconClassName = \"\",\r\n defaultParam = \"query\",\r\n showIcon = true,\r\n name = \"search\",\r\n type = \"search\",\r\n liveSearch = false,\r\n debounceDelay = 500,\r\n customIcon = null,\r\n defaultValue,\r\n ...props\r\n}: SearchInputProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const queryParam = searchParams.get(defaultParam) || defaultValue || \"\";\r\n\r\n const [inputValue, setInputValue] = useState(queryParam);\r\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const updateSearchParams = (searchQuery: string) => {\r\n if (searchQuery?.trim()) {\r\n setSearchParams((prev) => {\r\n prev.set(defaultParam, searchQuery.trim());\r\n return prev;\r\n });\r\n } else {\r\n setSearchParams((prev) => {\r\n prev.delete(defaultParam);\r\n return prev;\r\n });\r\n }\r\n };\r\n\r\n const handleSearch = (e: FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n const formData = new FormData(e.currentTarget);\r\n const searchQuery = formData.get(name);\r\n updateSearchParams(String(searchQuery ?? \"\"));\r\n };\r\n\r\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setInputValue(value);\r\n\r\n if (liveSearch) {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n\r\n debounceTimerRef.current = setTimeout(() => {\r\n updateSearchParams(value);\r\n }, debounceDelay);\r\n }\r\n\r\n if (value === \"\") {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n setInputValue(\"\");\r\n updateSearchParams(\"\");\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setInputValue(queryParam);\r\n }, [queryParam]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return (\r\n <form\r\n onSubmit={handleSearch}\r\n className={cn(\r\n \"flex items-center justify-between bg-white rounded-xl px-2 h-11 border\",\r\n searchWrapperClass,\r\n )}\r\n >\r\n {showIcon && (\r\n <button\r\n type=\"submit\"\r\n className={cn(\r\n \"bg-white text-secondary rounded-full flex items-center justify-center w-10 h-10\",\r\n searchBtn,\r\n )}\r\n >\r\n {customIcon ? (\r\n customIcon\r\n ) : (\r\n <FiSearch\r\n className={cn(\"h-5 w-5 text-gray-400\", searchIconClassName)}\r\n />\r\n )}\r\n </button>\r\n )}\r\n <input\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n name={name}\r\n type={type}\r\n className={cn(\"outline-none text-sm w-96\", searchClassName)}\r\n placeholder={placeholder}\r\n {...props}\r\n />\r\n </form>\r\n );\r\n}\r\n","import { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useEffect, useRef, type MouseEvent } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { FaFileExport, FaPrint } from \"react-icons/fa\";\r\nimport { IoCloseCircleOutline } from \"react-icons/io5\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { ModalProps } from \"./types\";\r\n\r\nexport function Modal({\r\n isOpen,\r\n onClose,\r\n title,\r\n children,\r\n footer,\r\n className = \"w-2/3\",\r\n width,\r\n onPrint,\r\n onExport,\r\n modalBodyClassName,\r\n modalBodyWrapperClass,\r\n closeOnBackdropClick = false,\r\n closeOnEscape = true,\r\n zIndex = 1000,\r\n isLoading = false,\r\n customLoader = null,\r\n footerClassName,\r\n}: ModalProps) {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget && closeOnBackdropClick) {\r\n onClose();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen && closeOnEscape) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"hidden\";\r\n }\r\n\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen, onClose, closeOnEscape]);\r\n\r\n const modalContent = (\r\n <AnimatePresence>\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex justify-center items-center z-1000 p-4\"\r\n onClick={handleBackdropClick}\r\n style={{\r\n // Ensure it covers the entire viewport, even in micro frontend context\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n margin: 0,\r\n padding: \"1rem\",\r\n zIndex: zIndex,\r\n }}\r\n >\r\n <motion.div\r\n ref={modalRef}\r\n initial={{ y: \"-100vh\", opacity: 0 }}\r\n animate={{ y: 0, opacity: 1 }}\r\n exit={{ y: \"100vh\", opacity: 0 }}\r\n transition={{ duration: 0.3 }}\r\n className={cn(\r\n `bg-white rounded-3xl shadow-lg max-h-[90vh] flex flex-col mx-auto`,\r\n className,\r\n width,\r\n )}\r\n onClick={(e) => e.stopPropagation()} // Prevent backdrop click when clicking modal content\r\n style={{\r\n maxWidth: \"95vw\", // Ensure modal doesn't exceed viewport width\r\n maxHeight: \"90vh\", // Ensure modal doesn't exceed viewport height\r\n }}\r\n >\r\n {/* Modal Header */}\r\n <div\r\n style={{\r\n borderRadius: \"24px 24px 0 0\",\r\n }}\r\n className=\"sticky top-0 z-10 flex justify-between items-center bg-white text-2xl p-8 pb-4 rounded-t-3xl\"\r\n >\r\n <h2 className=\"font-semibold\">{title}</h2>\r\n <div className=\"flex items-center space-x-4\">\r\n {onPrint && (\r\n <button\r\n onClick={onPrint}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaPrint name=\"FaPrint\" />\r\n <span>Print</span>\r\n </button>\r\n )}\r\n {onExport && (\r\n <button\r\n onClick={onExport}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaFileExport />\r\n <span>Export</span>\r\n </button>\r\n )}\r\n <button\r\n onClick={onClose}\r\n className=\"px-2 hover:opacity-70 transition-opacity\"\r\n >\r\n <IoCloseCircleOutline color=\"#8898AA\" size={25} />\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n className={cn(\r\n \"overflow-y-auto px-8 pb-8 grow scroll scrollbar-hidden\",\r\n modalBodyWrapperClass,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n\r\n {/* Modal Footer */}\r\n {footer && (\r\n\r\n <div\r\n className={cn(\"sticky bottom-0 flex justify-end p-4 space-x-4 border-t bg-white \",footerClassName)}\r\n\r\n style={{\r\n zIndex: 1000,\r\n \r\n borderRadius: \"24px\",\r\n }}\r\n >\r\n {footer}\r\n </div>\r\n )}\r\n </motion.div>\r\n {isLoading && (\r\n <div\r\n className=\"fixed inset-0 flex items-center justify-center bg-gray-200/60\"\r\n style={{ zIndex: 1100 }}\r\n aria-busy=\"true\"\r\n aria-live=\"polite\"\r\n role=\"status\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {customLoader ? customLoader : <Loader size=\"48px\" />}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </AnimatePresence>\r\n );\r\n\r\n let modalRoot = document.getElementById(\"modal-root\");\r\n if (!modalRoot) {\r\n modalRoot = document.createElement(\"div\");\r\n modalRoot.id = \"modal-root\";\r\n document.body.appendChild(modalRoot);\r\n }\r\n\r\n return createPortal(modalContent, modalRoot);\r\n}\r\n","import React from 'react';\r\nimport './Loader.css';\r\nimport { LoaderProps } from './Loader.types';\r\n\r\nexport const Loader: React.FC<LoaderProps> = ({ className, color = \"#F54C00\", size = '50px', speed = '1s' }) => {\r\n return (\r\n <div className={`loader`}>\r\n <div \r\n className={`spinner ${className}`} \r\n style={{\r\n border: `4px solid rgba(0, 0, 0, 0.1)`,\r\n borderWidth: '4px',\r\n borderLeftColor: color,\r\n width: size,\r\n height: size,\r\n animation: `spin ${speed} linear infinite`\r\n }}\r\n ></div>\r\n </div>\r\n );\r\n};","import { useId } from \"react\";\r\nimport { Tooltip } from \"react-tooltip\";\r\nimport type { ToolTipProps } from \"./types\";\r\n\r\nconst defaultTooltipStyle = {\r\n color: \"#fff\",\r\n borderRadius: \"5px\",\r\n zIndex: 999,\r\n textAlign: \"justify\",\r\n maxWidth: \"300px\",\r\n whiteSpace: \"pre-wrap\",\r\n wordWrap: \"break-word\",\r\n overflowWrap: \"break-word\",\r\n} as const;\r\n\r\nexport function ToolTip({\r\n text = \"tool tip\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n tooltipClassName,\r\n tooltipStyle,\r\n wrapperTabIndex,\r\n disabled = false,\r\n children,\r\n}: ToolTipProps) {\r\n const generatedId = useId();\r\n const tooltipId = `eztrak-tooltip-${generatedId.replace(/:/g, \"\")}`;\r\n const tooltipText = String(text ?? \"\");\r\n\r\n if (disabled || !tooltipText) {\r\n return <span className={className}>{children}</span>;\r\n }\r\n\r\n return (\r\n <>\r\n <span\r\n className={className}\r\n data-tooltip-id={tooltipId}\r\n data-tooltip-content={tooltipText}\r\n tabIndex={wrapperTabIndex}\r\n >\r\n {children}\r\n </span>\r\n <Tooltip\r\n id={tooltipId}\r\n place={placement}\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={tooltipClassName}\r\n style={{ ...defaultTooltipStyle, ...tooltipStyle }}\r\n />\r\n </>\r\n );\r\n}\r\n","import { cn } from \"../../utils/cn\";\r\nimport { truncateText } from \"../../utils/helpers\";\r\nimport { ToolTip } from \"./ToolTip\";\r\nimport type { TooltipTextProps } from \"./types\";\r\n\r\nexport function TooltipText({\r\n text = \"\",\r\n maxLength = 20,\r\n fallback = \"-\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n textClassName,\r\n tooltipClassName,\r\n tooltipStyle,\r\n showTooltip = true,\r\n tooltipWhenTruncatedOnly = false,\r\n}: TooltipTextProps) {\r\n const hasValue = text !== null && text !== undefined && text !== \"\";\r\n const fullText = hasValue ? String(text) : fallback;\r\n const displayText = truncateText(fullText, maxLength);\r\n const isTruncated = displayText !== fullText;\r\n const tooltipDisabled =\r\n !showTooltip || !hasValue || (tooltipWhenTruncatedOnly && !isTruncated);\r\n\r\n return (\r\n <ToolTip\r\n text={fullText}\r\n placement={placement}\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={cn(\"inline-block max-w-full\", className)}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n wrapperTabIndex={tooltipDisabled ? undefined : 0}\r\n disabled={tooltipDisabled}\r\n >\r\n <span className={cn(\"inline-block max-w-full align-bottom\", textClassName)}>\r\n {displayText}\r\n </span>\r\n </ToolTip>\r\n );\r\n}\r\n","import {\r\n forwardRef,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport toast from \"react-hot-toast\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { toDateInputValue } from \"../../utils/helpers\";\r\nimport type { CellEditPayload, CustomCellEditorProps, CustomCellEditorRef, DropdownOption } from \"./types\";\r\n\r\nfunction ButtonSpinner() {\r\n return (\r\n <svg\r\n className=\"animate-spin\"\r\n width={12}\r\n height={12}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeOpacity=\"0.25\"\r\n />\r\n <path\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction normalizeInitialValue(\r\n initialValue: CustomCellEditorProps[\"value\"],\r\n inputType: CustomCellEditorProps[\"inputType\"]\r\n): string | number {\r\n if (inputType === \"date\" && initialValue != null && initialValue !== \"\") {\r\n return toDateInputValue(String(initialValue));\r\n }\r\n if (initialValue == null) {\r\n return \"\";\r\n }\r\n return initialValue;\r\n}\r\n\r\nexport const CustomCellEditor = forwardRef<\r\n CustomCellEditorRef,\r\n CustomCellEditorProps\r\n>(\r\n (\r\n {\r\n value: initialValue,\r\n name,\r\n inputType = \"text\",\r\n stopEditing,\r\n entityId,\r\n entityName = \"Record\",\r\n onSave,\r\n dropdownOptions = [],\r\n customOptions,\r\n valueKey = \"value\",\r\n labelKey = \"label\",\r\n containerStyle,\r\n className,\r\n inputClassName,\r\n loadingIndicator,\r\n saveButtonContent,\r\n cancelButtonContent,\r\n saveButtonStyle,\r\n cancelButtonStyle,\r\n saveButtonClassName,\r\n cancelButtonClassName,\r\n },\r\n ref\r\n ) => {\r\n const normalizedInitial = normalizeInitialValue(initialValue, inputType);\r\n const [value, setValue] = useState<string | number>(normalizedInitial);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const selectRef = useRef<HTMLSelectElement>(null);\r\n\r\n // Merge customOptions (arbitrary shape) and dropdownOptions ({value,label}) into one array\r\n const normalizedOptions = useMemo<DropdownOption[]>(() => {\r\n if (customOptions && customOptions.length > 0) {\r\n return customOptions.map((opt) => ({\r\n value: String(opt[valueKey] ?? \"\"),\r\n label: String(opt[labelKey] ?? \"\"),\r\n }));\r\n }\r\n return dropdownOptions;\r\n }, [customOptions, dropdownOptions, valueKey, labelKey]);\r\n\r\n const isDropdown = inputType === \"dropdown\" || normalizedOptions.length > 0;\r\n\r\n useImperativeHandle(ref, () => ({\r\n getValue: () => value,\r\n isCancelBeforeStart: () => false,\r\n isCancelAfterEnd: () => false,\r\n isPopup: () => true,\r\n }));\r\n\r\n useEffect(() => {\r\n if (isDropdown) {\r\n selectRef.current?.focus();\r\n return;\r\n }\r\n const el = inputRef.current;\r\n if (!el) return;\r\n el.focus();\r\n if (inputType !== \"date\") {\r\n el.select();\r\n }\r\n }, [isDropdown, inputType]);\r\n\r\n const handleSave = async () => {\r\n if (isLoading) return;\r\n\r\n if (String(value) === String(normalizedInitial)) {\r\n stopEditing();\r\n return;\r\n }\r\n\r\n if (!name) {\r\n toast.error(\"Property name is required\");\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n const payloadValue: string | number =\r\n inputType === \"number\" && value !== \"\"\r\n ? parseFloat(String(value))\r\n : value;\r\n\r\n const payload: CellEditPayload = {\r\n propertyName: name,\r\n propertyValue: payloadValue,\r\n entityId,\r\n entityName,\r\n };\r\n\r\n try {\r\n await onSave(payload);\r\n toast.success(\"Record updated successfully\");\r\n stopEditing();\r\n } catch (error) {\r\n console.error(\"Update error:\", error);\r\n const errorMessage =\r\n error instanceof Error ? error.message : \"Failed to update record\";\r\n toast.error(errorMessage);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setValue(normalizedInitial);\r\n stopEditing();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\r\n if (event.key === \"Enter\") {\r\n event.preventDefault();\r\n handleSave();\r\n } else if (event.key === \"Escape\") {\r\n event.preventDefault();\r\n handleCancel();\r\n }\r\n };\r\n\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n let newValue = event.target.value;\r\n if (inputType === \"number\") {\r\n newValue = newValue.replace(/[^0-9.-]/g, \"\");\r\n }\r\n setValue(newValue);\r\n };\r\n\r\n const handleDropdownChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n const isSaveDisabled =\r\n isLoading || String(value) === String(normalizedInitial);\r\n\r\n const defaultInputClass =\r\n \"w-48 px-2 py-1 text-sm border border-gray-200 rounded-md bg-white focus:outline-none focus:ring-1 focus:ring-blue-400\";\r\n\r\n const defaultSaveBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-green-500 rounded-md hover:bg-green-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n const defaultCancelBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-red-500 rounded-md hover:bg-red-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 px-2 py-1 min-w-[320px] bg-white border border-gray-200 rounded-md shadow-md\",\r\n className\r\n )}\r\n style={containerStyle}\r\n >\r\n {isDropdown ? (\r\n <select\r\n ref={selectRef}\r\n value={String(value)}\r\n onChange={handleDropdownChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n disabled={isLoading}\r\n >\r\n <option value=\"\" disabled>\r\n Select option...\r\n </option>\r\n {normalizedOptions.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n ) : (\r\n <input\r\n ref={inputRef}\r\n type={inputType}\r\n value={String(value)}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n placeholder=\"...\"\r\n disabled={isLoading}\r\n />\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={isSaveDisabled}\r\n className={saveButtonClassName ?? (saveButtonStyle ? undefined : defaultSaveBtnClass)}\r\n style={saveButtonStyle}\r\n title=\"Save (Enter)\"\r\n >\r\n {isLoading\r\n ? (loadingIndicator ?? <ButtonSpinner />)\r\n : (saveButtonContent ?? \"Save\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n disabled={isLoading}\r\n className={cancelButtonClassName ?? (cancelButtonStyle ? undefined : defaultCancelBtnClass)}\r\n style={cancelButtonStyle}\r\n title=\"Cancel (Escape)\"\r\n >\r\n {cancelButtonContent ?? \"Cancel\"}\r\n </button>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCustomCellEditor.displayName = \"CustomCellEditor\";\r\n\r\nexport default CustomCellEditor;\r\n"],"mappings":"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","names":["jsx","jsxs","useSearchParams","jsx","jsxs","useSearchParams","useEffect","useRef","useState","useSearchParams","jsx","jsxs","useSearchParams","useState","useRef","useEffect","useEffect","useRef","jsx","jsx","jsxs","useRef","useEffect","useId","jsx","jsxs","jsx","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect"]}
|