@eztrak/shared 0.6.9 → 0.7.2
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 +228 -9
- package/dist/{chunk-HANZBMA7.mjs → chunk-BLCEEXZR.mjs} +359 -27
- package/dist/chunk-BLCEEXZR.mjs.map +1 -0
- package/dist/chunk-GED6IT3S.mjs +1 -0
- package/dist/chunk-GED6IT3S.mjs.map +1 -0
- package/dist/{chunk-GIBPOQGL.mjs → chunk-GVIHLI67.mjs} +81 -2
- package/dist/chunk-GVIHLI67.mjs.map +1 -0
- package/dist/components/index.d.mts +48 -2
- package/dist/components/index.d.ts +48 -2
- package/dist/components/index.js +368 -23
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +6 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +346 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +23 -20
- package/dist/utils/index.mjs +6 -7
- package/package.json +1 -1
- package/dist/chunk-5OG22DIX.mjs +0 -82
- package/dist/chunk-5OG22DIX.mjs.map +0 -1
- package/dist/chunk-GIBPOQGL.mjs.map +0 -1
- package/dist/chunk-HANZBMA7.mjs.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn,
|
|
3
|
-
confirmationAlert
|
|
4
|
-
|
|
3
|
+
confirmationAlert,
|
|
4
|
+
toDateInputValue
|
|
5
|
+
} from "./chunk-GVIHLI67.mjs";
|
|
5
6
|
|
|
6
7
|
// src/components/tabs/EztrakTabs.tsx
|
|
7
8
|
import {
|
|
@@ -600,17 +601,136 @@ function ResetFiltersButton({
|
|
|
600
601
|
);
|
|
601
602
|
}
|
|
602
603
|
|
|
604
|
+
// src/components/search-filters/SearchInput.tsx
|
|
605
|
+
import {
|
|
606
|
+
useEffect as useEffect2,
|
|
607
|
+
useRef as useRef2,
|
|
608
|
+
useState as useState2
|
|
609
|
+
} from "react";
|
|
610
|
+
import { FiSearch } from "react-icons/fi";
|
|
611
|
+
import { useSearchParams as useSearchParams3 } from "react-router-dom";
|
|
612
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
613
|
+
function SearchInput({
|
|
614
|
+
placeholder = "Search...",
|
|
615
|
+
searchBtn = "",
|
|
616
|
+
searchClassName = "",
|
|
617
|
+
searchWrapperClass = "",
|
|
618
|
+
searchIconClassName = "",
|
|
619
|
+
defaultParam = "query",
|
|
620
|
+
showIcon = true,
|
|
621
|
+
name = "search",
|
|
622
|
+
type = "search",
|
|
623
|
+
liveSearch = false,
|
|
624
|
+
debounceDelay = 500,
|
|
625
|
+
customIcon = null,
|
|
626
|
+
defaultValue,
|
|
627
|
+
...props
|
|
628
|
+
}) {
|
|
629
|
+
const [searchParams, setSearchParams] = useSearchParams3();
|
|
630
|
+
const queryParam = searchParams.get(defaultParam) || defaultValue || "";
|
|
631
|
+
const [inputValue, setInputValue] = useState2(queryParam);
|
|
632
|
+
const debounceTimerRef = useRef2(null);
|
|
633
|
+
const updateSearchParams = (searchQuery) => {
|
|
634
|
+
if (searchQuery?.trim()) {
|
|
635
|
+
setSearchParams((prev) => {
|
|
636
|
+
prev.set(defaultParam, searchQuery.trim());
|
|
637
|
+
return prev;
|
|
638
|
+
});
|
|
639
|
+
} else {
|
|
640
|
+
setSearchParams((prev) => {
|
|
641
|
+
prev.delete(defaultParam);
|
|
642
|
+
return prev;
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
const handleSearch = (e) => {
|
|
647
|
+
e.preventDefault();
|
|
648
|
+
const formData = new FormData(e.currentTarget);
|
|
649
|
+
const searchQuery = formData.get(name);
|
|
650
|
+
updateSearchParams(String(searchQuery ?? ""));
|
|
651
|
+
};
|
|
652
|
+
const handleInputChange = (e) => {
|
|
653
|
+
const value = e.target.value;
|
|
654
|
+
setInputValue(value);
|
|
655
|
+
if (liveSearch) {
|
|
656
|
+
if (debounceTimerRef.current) {
|
|
657
|
+
clearTimeout(debounceTimerRef.current);
|
|
658
|
+
}
|
|
659
|
+
debounceTimerRef.current = setTimeout(() => {
|
|
660
|
+
updateSearchParams(value);
|
|
661
|
+
}, debounceDelay);
|
|
662
|
+
}
|
|
663
|
+
if (value === "") {
|
|
664
|
+
if (debounceTimerRef.current) {
|
|
665
|
+
clearTimeout(debounceTimerRef.current);
|
|
666
|
+
}
|
|
667
|
+
setInputValue("");
|
|
668
|
+
updateSearchParams("");
|
|
669
|
+
}
|
|
670
|
+
};
|
|
671
|
+
useEffect2(() => {
|
|
672
|
+
setInputValue(queryParam);
|
|
673
|
+
}, [queryParam]);
|
|
674
|
+
useEffect2(() => {
|
|
675
|
+
return () => {
|
|
676
|
+
if (debounceTimerRef.current) {
|
|
677
|
+
clearTimeout(debounceTimerRef.current);
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
}, []);
|
|
681
|
+
return /* @__PURE__ */ jsxs4(
|
|
682
|
+
"form",
|
|
683
|
+
{
|
|
684
|
+
onSubmit: handleSearch,
|
|
685
|
+
className: cn(
|
|
686
|
+
"flex items-center justify-between bg-white rounded-xl px-2 h-11 border",
|
|
687
|
+
searchWrapperClass
|
|
688
|
+
),
|
|
689
|
+
children: [
|
|
690
|
+
showIcon && /* @__PURE__ */ jsx4(
|
|
691
|
+
"button",
|
|
692
|
+
{
|
|
693
|
+
type: "submit",
|
|
694
|
+
className: cn(
|
|
695
|
+
"bg-white text-secondary rounded-full flex items-center justify-center w-10 h-10",
|
|
696
|
+
searchBtn
|
|
697
|
+
),
|
|
698
|
+
children: customIcon ? customIcon : /* @__PURE__ */ jsx4(
|
|
699
|
+
FiSearch,
|
|
700
|
+
{
|
|
701
|
+
className: cn("h-5 w-5 text-gray-400", searchIconClassName)
|
|
702
|
+
}
|
|
703
|
+
)
|
|
704
|
+
}
|
|
705
|
+
),
|
|
706
|
+
/* @__PURE__ */ jsx4(
|
|
707
|
+
"input",
|
|
708
|
+
{
|
|
709
|
+
value: inputValue,
|
|
710
|
+
onChange: handleInputChange,
|
|
711
|
+
name,
|
|
712
|
+
type,
|
|
713
|
+
className: cn("outline-none text-sm w-96", searchClassName),
|
|
714
|
+
placeholder,
|
|
715
|
+
...props
|
|
716
|
+
}
|
|
717
|
+
)
|
|
718
|
+
]
|
|
719
|
+
}
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
|
|
603
723
|
// src/components/modal/Modal.tsx
|
|
604
724
|
import { AnimatePresence, motion } from "framer-motion";
|
|
605
|
-
import { useEffect as
|
|
725
|
+
import { useEffect as useEffect3, useRef as useRef3 } from "react";
|
|
606
726
|
import { createPortal } from "react-dom";
|
|
607
727
|
import { FaFileExport, FaPrint } from "react-icons/fa";
|
|
608
728
|
import { IoCloseCircleOutline } from "react-icons/io5";
|
|
609
729
|
|
|
610
730
|
// src/components/Loader/Loader.tsx
|
|
611
|
-
import { jsx as
|
|
731
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
612
732
|
var Loader = ({ className, color = "#F54C00", size = "50px", speed = "1s" }) => {
|
|
613
|
-
return /* @__PURE__ */
|
|
733
|
+
return /* @__PURE__ */ jsx5("div", { className: `loader`, children: /* @__PURE__ */ jsx5(
|
|
614
734
|
"div",
|
|
615
735
|
{
|
|
616
736
|
className: `spinner ${className}`,
|
|
@@ -627,7 +747,7 @@ var Loader = ({ className, color = "#F54C00", size = "50px", speed = "1s" }) =>
|
|
|
627
747
|
};
|
|
628
748
|
|
|
629
749
|
// src/components/modal/Modal.tsx
|
|
630
|
-
import { jsx as
|
|
750
|
+
import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
631
751
|
function Modal({
|
|
632
752
|
isOpen,
|
|
633
753
|
onClose,
|
|
@@ -647,13 +767,13 @@ function Modal({
|
|
|
647
767
|
customLoader = null,
|
|
648
768
|
footerClassName
|
|
649
769
|
}) {
|
|
650
|
-
const modalRef =
|
|
770
|
+
const modalRef = useRef3(null);
|
|
651
771
|
const handleBackdropClick = (e) => {
|
|
652
772
|
if (e.target === e.currentTarget && closeOnBackdropClick) {
|
|
653
773
|
onClose();
|
|
654
774
|
}
|
|
655
775
|
};
|
|
656
|
-
|
|
776
|
+
useEffect3(() => {
|
|
657
777
|
const handleEscape = (e) => {
|
|
658
778
|
if (e.key === "Escape" && isOpen && closeOnEscape) {
|
|
659
779
|
onClose();
|
|
@@ -668,7 +788,7 @@ function Modal({
|
|
|
668
788
|
document.body.style.overflow = "unset";
|
|
669
789
|
};
|
|
670
790
|
}, [isOpen, onClose, closeOnEscape]);
|
|
671
|
-
const modalContent = /* @__PURE__ */
|
|
791
|
+
const modalContent = /* @__PURE__ */ jsx6(AnimatePresence, { children: isOpen && /* @__PURE__ */ jsxs5(
|
|
672
792
|
"div",
|
|
673
793
|
{
|
|
674
794
|
className: "fixed inset-0 bg-gray-500 bg-opacity-50 flex justify-center items-center z-1000 p-4",
|
|
@@ -687,7 +807,7 @@ function Modal({
|
|
|
687
807
|
zIndex
|
|
688
808
|
},
|
|
689
809
|
children: [
|
|
690
|
-
/* @__PURE__ */
|
|
810
|
+
/* @__PURE__ */ jsxs5(
|
|
691
811
|
motion.div,
|
|
692
812
|
{
|
|
693
813
|
ref: modalRef,
|
|
@@ -708,7 +828,7 @@ function Modal({
|
|
|
708
828
|
// Ensure modal doesn't exceed viewport height
|
|
709
829
|
},
|
|
710
830
|
children: [
|
|
711
|
-
/* @__PURE__ */
|
|
831
|
+
/* @__PURE__ */ jsxs5(
|
|
712
832
|
"div",
|
|
713
833
|
{
|
|
714
834
|
style: {
|
|
@@ -716,43 +836,43 @@ function Modal({
|
|
|
716
836
|
},
|
|
717
837
|
className: "sticky top-0 z-10 flex justify-between items-center bg-white text-2xl p-8 pb-4 rounded-t-3xl",
|
|
718
838
|
children: [
|
|
719
|
-
/* @__PURE__ */
|
|
720
|
-
/* @__PURE__ */
|
|
721
|
-
onPrint && /* @__PURE__ */
|
|
839
|
+
/* @__PURE__ */ jsx6("h2", { className: "font-semibold", children: title }),
|
|
840
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex items-center space-x-4", children: [
|
|
841
|
+
onPrint && /* @__PURE__ */ jsxs5(
|
|
722
842
|
"button",
|
|
723
843
|
{
|
|
724
844
|
onClick: onPrint,
|
|
725
845
|
className: "flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded",
|
|
726
846
|
children: [
|
|
727
|
-
/* @__PURE__ */
|
|
728
|
-
/* @__PURE__ */
|
|
847
|
+
/* @__PURE__ */ jsx6(FaPrint, { name: "FaPrint" }),
|
|
848
|
+
/* @__PURE__ */ jsx6("span", { children: "Print" })
|
|
729
849
|
]
|
|
730
850
|
}
|
|
731
851
|
),
|
|
732
|
-
onExport && /* @__PURE__ */
|
|
852
|
+
onExport && /* @__PURE__ */ jsxs5(
|
|
733
853
|
"button",
|
|
734
854
|
{
|
|
735
855
|
onClick: onExport,
|
|
736
856
|
className: "flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded",
|
|
737
857
|
children: [
|
|
738
|
-
/* @__PURE__ */
|
|
739
|
-
/* @__PURE__ */
|
|
858
|
+
/* @__PURE__ */ jsx6(FaFileExport, {}),
|
|
859
|
+
/* @__PURE__ */ jsx6("span", { children: "Export" })
|
|
740
860
|
]
|
|
741
861
|
}
|
|
742
862
|
),
|
|
743
|
-
/* @__PURE__ */
|
|
863
|
+
/* @__PURE__ */ jsx6(
|
|
744
864
|
"button",
|
|
745
865
|
{
|
|
746
866
|
onClick: onClose,
|
|
747
867
|
className: "px-2 hover:opacity-70 transition-opacity",
|
|
748
|
-
children: /* @__PURE__ */
|
|
868
|
+
children: /* @__PURE__ */ jsx6(IoCloseCircleOutline, { color: "#8898AA", size: 25 })
|
|
749
869
|
}
|
|
750
870
|
)
|
|
751
871
|
] })
|
|
752
872
|
]
|
|
753
873
|
}
|
|
754
874
|
),
|
|
755
|
-
/* @__PURE__ */
|
|
875
|
+
/* @__PURE__ */ jsx6(
|
|
756
876
|
"div",
|
|
757
877
|
{
|
|
758
878
|
className: cn(
|
|
@@ -762,7 +882,7 @@ function Modal({
|
|
|
762
882
|
children
|
|
763
883
|
}
|
|
764
884
|
),
|
|
765
|
-
footer && /* @__PURE__ */
|
|
885
|
+
footer && /* @__PURE__ */ jsx6(
|
|
766
886
|
"div",
|
|
767
887
|
{
|
|
768
888
|
className: cn("sticky bottom-0 flex justify-end p-4 space-x-4 border-t bg-white ", footerClassName),
|
|
@@ -776,7 +896,7 @@ function Modal({
|
|
|
776
896
|
]
|
|
777
897
|
}
|
|
778
898
|
),
|
|
779
|
-
isLoading && /* @__PURE__ */
|
|
899
|
+
isLoading && /* @__PURE__ */ jsx6(
|
|
780
900
|
"div",
|
|
781
901
|
{
|
|
782
902
|
className: "fixed inset-0 flex items-center justify-center bg-gray-200/60",
|
|
@@ -785,7 +905,7 @@ function Modal({
|
|
|
785
905
|
"aria-live": "polite",
|
|
786
906
|
role: "status",
|
|
787
907
|
onClick: (e) => e.stopPropagation(),
|
|
788
|
-
children: customLoader ? customLoader : /* @__PURE__ */
|
|
908
|
+
children: customLoader ? customLoader : /* @__PURE__ */ jsx6(Loader, { size: "48px" })
|
|
789
909
|
}
|
|
790
910
|
)
|
|
791
911
|
]
|
|
@@ -800,13 +920,225 @@ function Modal({
|
|
|
800
920
|
return createPortal(modalContent, modalRoot);
|
|
801
921
|
}
|
|
802
922
|
|
|
923
|
+
// src/components/cell-editor/CustomCellEditor.tsx
|
|
924
|
+
import {
|
|
925
|
+
forwardRef,
|
|
926
|
+
useEffect as useEffect4,
|
|
927
|
+
useImperativeHandle,
|
|
928
|
+
useRef as useRef4,
|
|
929
|
+
useState as useState3
|
|
930
|
+
} from "react";
|
|
931
|
+
import toast from "react-hot-toast";
|
|
932
|
+
import { FaCheck, FaTimes } from "react-icons/fa";
|
|
933
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
934
|
+
function ButtonSpinner() {
|
|
935
|
+
return /* @__PURE__ */ jsxs6(
|
|
936
|
+
"svg",
|
|
937
|
+
{
|
|
938
|
+
className: "animate-spin",
|
|
939
|
+
width: 8,
|
|
940
|
+
height: 8,
|
|
941
|
+
viewBox: "0 0 24 24",
|
|
942
|
+
fill: "none",
|
|
943
|
+
"aria-hidden": true,
|
|
944
|
+
children: [
|
|
945
|
+
/* @__PURE__ */ jsx7(
|
|
946
|
+
"circle",
|
|
947
|
+
{
|
|
948
|
+
cx: "12",
|
|
949
|
+
cy: "12",
|
|
950
|
+
r: "10",
|
|
951
|
+
stroke: "white",
|
|
952
|
+
strokeWidth: "4",
|
|
953
|
+
strokeOpacity: "0.25"
|
|
954
|
+
}
|
|
955
|
+
),
|
|
956
|
+
/* @__PURE__ */ jsx7(
|
|
957
|
+
"path",
|
|
958
|
+
{
|
|
959
|
+
d: "M12 2a10 10 0 0 1 10 10",
|
|
960
|
+
stroke: "white",
|
|
961
|
+
strokeWidth: "4",
|
|
962
|
+
strokeLinecap: "round"
|
|
963
|
+
}
|
|
964
|
+
)
|
|
965
|
+
]
|
|
966
|
+
}
|
|
967
|
+
);
|
|
968
|
+
}
|
|
969
|
+
function normalizeInitialValue(initialValue, inputType) {
|
|
970
|
+
if (inputType === "date" && initialValue != null && initialValue !== "") {
|
|
971
|
+
return toDateInputValue(String(initialValue));
|
|
972
|
+
}
|
|
973
|
+
if (initialValue == null) {
|
|
974
|
+
return "";
|
|
975
|
+
}
|
|
976
|
+
return initialValue;
|
|
977
|
+
}
|
|
978
|
+
var CustomCellEditor = forwardRef(
|
|
979
|
+
({
|
|
980
|
+
value: initialValue,
|
|
981
|
+
name,
|
|
982
|
+
inputType = "text",
|
|
983
|
+
stopEditing,
|
|
984
|
+
entityId,
|
|
985
|
+
entityName = "Record",
|
|
986
|
+
onSave,
|
|
987
|
+
dropdownOptions = []
|
|
988
|
+
}, ref) => {
|
|
989
|
+
const normalizedInitial = normalizeInitialValue(initialValue, inputType);
|
|
990
|
+
const [value, setValue] = useState3(normalizedInitial);
|
|
991
|
+
const [isLoading, setIsLoading] = useState3(false);
|
|
992
|
+
const inputRef = useRef4(null);
|
|
993
|
+
const selectRef = useRef4(null);
|
|
994
|
+
useImperativeHandle(ref, () => ({
|
|
995
|
+
getValue: () => value,
|
|
996
|
+
isCancelBeforeStart: () => false,
|
|
997
|
+
isCancelAfterEnd: () => false
|
|
998
|
+
}));
|
|
999
|
+
useEffect4(() => {
|
|
1000
|
+
if (inputType === "dropdown") {
|
|
1001
|
+
const el2 = selectRef.current;
|
|
1002
|
+
if (el2) {
|
|
1003
|
+
el2.focus();
|
|
1004
|
+
}
|
|
1005
|
+
return;
|
|
1006
|
+
}
|
|
1007
|
+
const el = inputRef.current;
|
|
1008
|
+
if (!el) {
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
el.focus();
|
|
1012
|
+
if (inputType !== "date") {
|
|
1013
|
+
el.select();
|
|
1014
|
+
}
|
|
1015
|
+
}, [inputType]);
|
|
1016
|
+
const handleSave = async () => {
|
|
1017
|
+
if (isLoading) {
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
if (String(value) === String(normalizedInitial)) {
|
|
1021
|
+
stopEditing();
|
|
1022
|
+
return;
|
|
1023
|
+
}
|
|
1024
|
+
if (!entityId) {
|
|
1025
|
+
toast.error("Entity ID is required");
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
if (!name) {
|
|
1029
|
+
toast.error("Property name is required");
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
setIsLoading(true);
|
|
1033
|
+
const payloadValue = inputType === "number" && value !== "" ? parseFloat(String(value)) : value;
|
|
1034
|
+
const payload = {
|
|
1035
|
+
propertyName: name,
|
|
1036
|
+
propertyValue: payloadValue,
|
|
1037
|
+
entityId,
|
|
1038
|
+
entityName
|
|
1039
|
+
};
|
|
1040
|
+
try {
|
|
1041
|
+
await onSave(payload);
|
|
1042
|
+
toast.success("Record updated successfully");
|
|
1043
|
+
stopEditing();
|
|
1044
|
+
} catch (error) {
|
|
1045
|
+
console.error("Update error:", error);
|
|
1046
|
+
const errorMessage = error instanceof Error ? error.message : "Failed to update record";
|
|
1047
|
+
toast.error(errorMessage);
|
|
1048
|
+
} finally {
|
|
1049
|
+
setIsLoading(false);
|
|
1050
|
+
}
|
|
1051
|
+
};
|
|
1052
|
+
const handleCancel = () => {
|
|
1053
|
+
setValue(normalizedInitial);
|
|
1054
|
+
stopEditing();
|
|
1055
|
+
};
|
|
1056
|
+
const handleKeyDown = (event) => {
|
|
1057
|
+
if (event.key === "Enter") {
|
|
1058
|
+
event.preventDefault();
|
|
1059
|
+
handleSave();
|
|
1060
|
+
} else if (event.key === "Escape") {
|
|
1061
|
+
event.preventDefault();
|
|
1062
|
+
handleCancel();
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
const handleInputChange = (event) => {
|
|
1066
|
+
let newValue = event.target.value;
|
|
1067
|
+
if (inputType === "number") {
|
|
1068
|
+
newValue = newValue.replace(/[^0-9.-]/g, "");
|
|
1069
|
+
}
|
|
1070
|
+
setValue(newValue);
|
|
1071
|
+
};
|
|
1072
|
+
const handleDropdownChange = (event) => {
|
|
1073
|
+
setValue(event.target.value);
|
|
1074
|
+
};
|
|
1075
|
+
const isSaveDisabled = isLoading || String(value) === String(normalizedInitial);
|
|
1076
|
+
return /* @__PURE__ */ jsxs6("div", { className: "flex items-center w-full h-full min-h-0 overflow-hidden gap-0.5 min-w-[80px]", children: [
|
|
1077
|
+
inputType === "dropdown" ? /* @__PURE__ */ jsxs6(
|
|
1078
|
+
"select",
|
|
1079
|
+
{
|
|
1080
|
+
ref: selectRef,
|
|
1081
|
+
value: String(value),
|
|
1082
|
+
onChange: handleDropdownChange,
|
|
1083
|
+
onKeyDown: handleKeyDown,
|
|
1084
|
+
className: "flex-1 h-full p-0 text-[10px] border border-gray-300 rounded-sm focus:outline-none focus:ring-1 focus:ring-blue-400 min-w-0 truncate",
|
|
1085
|
+
disabled: isLoading,
|
|
1086
|
+
children: [
|
|
1087
|
+
/* @__PURE__ */ jsx7("option", { value: "", disabled: true, children: "Select option..." }),
|
|
1088
|
+
dropdownOptions.map((opt) => /* @__PURE__ */ jsx7("option", { value: opt.value, children: opt.label }, opt.value))
|
|
1089
|
+
]
|
|
1090
|
+
}
|
|
1091
|
+
) : /* @__PURE__ */ jsx7(
|
|
1092
|
+
"input",
|
|
1093
|
+
{
|
|
1094
|
+
ref: inputRef,
|
|
1095
|
+
type: inputType,
|
|
1096
|
+
value: String(value),
|
|
1097
|
+
onChange: handleInputChange,
|
|
1098
|
+
onKeyDown: handleKeyDown,
|
|
1099
|
+
className: "flex-1 h-full p-0 text-[10px] border border-gray-300 rounded-sm focus:outline-none focus:ring-1 focus:ring-blue-400 min-w-0 truncate",
|
|
1100
|
+
placeholder: "...",
|
|
1101
|
+
disabled: isLoading
|
|
1102
|
+
}
|
|
1103
|
+
),
|
|
1104
|
+
/* @__PURE__ */ jsxs6("div", { className: "flex items-center shrink-0 gap-0.5", children: [
|
|
1105
|
+
/* @__PURE__ */ jsx7(
|
|
1106
|
+
"button",
|
|
1107
|
+
{
|
|
1108
|
+
type: "button",
|
|
1109
|
+
onClick: handleSave,
|
|
1110
|
+
disabled: isSaveDisabled,
|
|
1111
|
+
className: "flex items-center justify-center w-4 h-4 text-white bg-green-500 rounded-sm hover:bg-green-600 disabled:opacity-50",
|
|
1112
|
+
title: "Save (Enter)",
|
|
1113
|
+
children: isLoading ? /* @__PURE__ */ jsx7(ButtonSpinner, {}) : /* @__PURE__ */ jsx7(FaCheck, { size: 7, "aria-hidden": true })
|
|
1114
|
+
}
|
|
1115
|
+
),
|
|
1116
|
+
/* @__PURE__ */ jsx7(
|
|
1117
|
+
"button",
|
|
1118
|
+
{
|
|
1119
|
+
type: "button",
|
|
1120
|
+
onClick: handleCancel,
|
|
1121
|
+
disabled: isLoading,
|
|
1122
|
+
className: "flex items-center justify-center w-4 h-4 text-white bg-red-500 rounded-sm hover:bg-red-600 disabled:opacity-50",
|
|
1123
|
+
title: "Cancel (Escape)",
|
|
1124
|
+
children: /* @__PURE__ */ jsx7(FaTimes, { size: 7, "aria-hidden": true })
|
|
1125
|
+
}
|
|
1126
|
+
)
|
|
1127
|
+
] })
|
|
1128
|
+
] });
|
|
1129
|
+
}
|
|
1130
|
+
);
|
|
1131
|
+
CustomCellEditor.displayName = "CustomCellEditor";
|
|
1132
|
+
|
|
803
1133
|
export {
|
|
804
1134
|
EztrakTabs,
|
|
805
1135
|
ResetColumnsButton,
|
|
806
1136
|
TableLayoutToolbarControls,
|
|
807
1137
|
CustomPagination,
|
|
808
1138
|
ResetFiltersButton,
|
|
1139
|
+
SearchInput,
|
|
809
1140
|
Loader,
|
|
810
|
-
Modal
|
|
1141
|
+
Modal,
|
|
1142
|
+
CustomCellEditor
|
|
811
1143
|
};
|
|
812
|
-
//# sourceMappingURL=chunk-
|
|
1144
|
+
//# sourceMappingURL=chunk-BLCEEXZR.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/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 {\r\n\r\n forwardRef,\r\n\r\n useEffect,\r\n\r\n useImperativeHandle,\r\n\r\n useRef,\r\n\r\n useState,\r\n\r\n type ChangeEvent,\r\n\r\n type KeyboardEvent,\r\n\r\n} from \"react\";\r\n\r\nimport toast from \"react-hot-toast\";\r\n\r\nimport { FaCheck, FaTimes } from \"react-icons/fa\";\r\n\r\nimport { toDateInputValue } from \"../../utils/helpers\";\r\n\r\nimport type { CellEditPayload, CustomCellEditorProps, CustomCellEditorRef } from \"./types\";\r\n\r\n\r\n\r\nfunction ButtonSpinner() {\r\n\r\n return (\r\n\r\n <svg\r\n\r\n className=\"animate-spin\"\r\n\r\n width={8}\r\n\r\n height={8}\r\n\r\n viewBox=\"0 0 24 24\"\r\n\r\n fill=\"none\"\r\n\r\n aria-hidden\r\n\r\n >\r\n\r\n <circle\r\n\r\n cx=\"12\"\r\n\r\n cy=\"12\"\r\n\r\n r=\"10\"\r\n\r\n stroke=\"white\"\r\n\r\n strokeWidth=\"4\"\r\n\r\n strokeOpacity=\"0.25\"\r\n\r\n />\r\n\r\n <path\r\n\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n\r\n stroke=\"white\"\r\n\r\n strokeWidth=\"4\"\r\n\r\n strokeLinecap=\"round\"\r\n\r\n />\r\n\r\n </svg>\r\n\r\n );\r\n\r\n}\r\n\r\n\r\n\r\nfunction normalizeInitialValue(\r\n\r\n initialValue: CustomCellEditorProps[\"value\"],\r\n\r\n inputType: CustomCellEditorProps[\"inputType\"]\r\n\r\n): string | number {\r\n\r\n if (inputType === \"date\" && initialValue != null && initialValue !== \"\") {\r\n\r\n return toDateInputValue(String(initialValue));\r\n\r\n }\r\n\r\n if (initialValue == null) {\r\n\r\n return \"\";\r\n\r\n }\r\n\r\n return initialValue;\r\n\r\n}\r\n\r\n\r\n\r\nexport const CustomCellEditor = forwardRef<\r\n\r\n CustomCellEditorRef,\r\n\r\n CustomCellEditorProps\r\n\r\n>(\r\n\r\n (\r\n\r\n {\r\n\r\n value: initialValue,\r\n\r\n name,\r\n\r\n inputType = \"text\",\r\n\r\n stopEditing,\r\n\r\n entityId,\r\n\r\n entityName = \"Record\",\r\n\r\n onSave,\r\n\r\n dropdownOptions = [],\r\n\r\n },\r\n\r\n ref\r\n\r\n ) => {\r\n\r\n const normalizedInitial = normalizeInitialValue(initialValue, inputType);\r\n\r\n const [value, setValue] = useState<string | number>(normalizedInitial);\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const selectRef = useRef<HTMLSelectElement>(null);\r\n\r\n\r\n\r\n useImperativeHandle(ref, () => ({\r\n\r\n getValue: () => value,\r\n\r\n isCancelBeforeStart: () => false,\r\n\r\n isCancelAfterEnd: () => false,\r\n\r\n }));\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n if (inputType === \"dropdown\") {\r\n\r\n const el = selectRef.current;\r\n\r\n if (el) {\r\n\r\n el.focus();\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n const el = inputRef.current;\r\n\r\n if (!el) {\r\n\r\n return;\r\n\r\n }\r\n\r\n el.focus();\r\n\r\n if (inputType !== \"date\") {\r\n\r\n el.select();\r\n\r\n }\r\n\r\n }, [inputType]);\r\n\r\n\r\n\r\n const handleSave = async () => {\r\n\r\n if (isLoading) {\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n if (String(value) === String(normalizedInitial)) {\r\n\r\n stopEditing();\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n if (!entityId) {\r\n\r\n toast.error(\"Entity ID is required\");\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n if (!name) {\r\n\r\n toast.error(\"Property name is required\");\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n setIsLoading(true);\r\n\r\n\r\n\r\n const payloadValue: string | number =\r\n\r\n inputType === \"number\" && value !== \"\"\r\n\r\n ? parseFloat(String(value))\r\n\r\n : value;\r\n\r\n\r\n\r\n const payload: CellEditPayload = {\r\n\r\n propertyName: name,\r\n\r\n propertyValue: payloadValue,\r\n\r\n entityId,\r\n\r\n entityName,\r\n\r\n };\r\n\r\n\r\n\r\n try {\r\n\r\n await onSave(payload);\r\n\r\n toast.success(\"Record updated successfully\");\r\n\r\n stopEditing();\r\n\r\n } catch (error) {\r\n\r\n console.error(\"Update error:\", error);\r\n\r\n const errorMessage =\r\n\r\n error instanceof Error ? error.message : \"Failed to update record\";\r\n\r\n toast.error(errorMessage);\r\n\r\n } finally {\r\n\r\n setIsLoading(false);\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n const handleCancel = () => {\r\n\r\n setValue(normalizedInitial);\r\n\r\n stopEditing();\r\n\r\n };\r\n\r\n\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\r\n\r\n if (event.key === \"Enter\") {\r\n\r\n event.preventDefault();\r\n\r\n handleSave();\r\n\r\n } else if (event.key === \"Escape\") {\r\n\r\n event.preventDefault();\r\n\r\n handleCancel();\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n\r\n let newValue = event.target.value;\r\n\r\n\r\n\r\n if (inputType === \"number\") {\r\n\r\n newValue = newValue.replace(/[^0-9.-]/g, \"\");\r\n\r\n }\r\n\r\n\r\n\r\n setValue(newValue);\r\n\r\n };\r\n\r\n\r\n\r\n const handleDropdownChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n\r\n setValue(event.target.value);\r\n\r\n };\r\n\r\n\r\n\r\n const isSaveDisabled =\r\n\r\n isLoading || String(value) === String(normalizedInitial);\r\n\r\n\r\n\r\n return (\r\n\r\n <div className=\"flex items-center w-full h-full min-h-0 overflow-hidden gap-0.5 min-w-[80px]\">\r\n\r\n {inputType === \"dropdown\" ? (\r\n\r\n <select\r\n\r\n ref={selectRef}\r\n\r\n value={String(value)}\r\n\r\n onChange={handleDropdownChange}\r\n\r\n onKeyDown={handleKeyDown}\r\n\r\n className=\"flex-1 h-full p-0 text-[10px] border border-gray-300 rounded-sm focus:outline-none focus:ring-1 focus:ring-blue-400 min-w-0 truncate\"\r\n\r\n disabled={isLoading}\r\n\r\n >\r\n\r\n <option value=\"\" disabled>\r\n\r\n Select option...\r\n\r\n </option>\r\n\r\n {dropdownOptions.map((opt) => (\r\n\r\n <option key={opt.value} value={opt.value}>\r\n\r\n {opt.label}\r\n\r\n </option>\r\n\r\n ))}\r\n\r\n </select>\r\n\r\n ) : (\r\n\r\n <input\r\n\r\n ref={inputRef}\r\n\r\n type={inputType}\r\n\r\n value={String(value)}\r\n\r\n onChange={handleInputChange}\r\n\r\n onKeyDown={handleKeyDown}\r\n\r\n className=\"flex-1 h-full p-0 text-[10px] border border-gray-300 rounded-sm focus:outline-none focus:ring-1 focus:ring-blue-400 min-w-0 truncate\"\r\n\r\n placeholder=\"...\"\r\n\r\n disabled={isLoading}\r\n\r\n />\r\n\r\n )}\r\n\r\n\r\n\r\n <div className=\"flex items-center shrink-0 gap-0.5\">\r\n\r\n <button\r\n\r\n type=\"button\"\r\n\r\n onClick={handleSave}\r\n\r\n disabled={isSaveDisabled}\r\n\r\n className=\"flex items-center justify-center w-4 h-4 text-white bg-green-500 rounded-sm hover:bg-green-600 disabled:opacity-50\"\r\n\r\n title=\"Save (Enter)\"\r\n\r\n >\r\n\r\n {isLoading ? (\r\n\r\n <ButtonSpinner />\r\n\r\n ) : (\r\n\r\n <FaCheck size={7} aria-hidden />\r\n\r\n )}\r\n\r\n </button>\r\n\r\n <button\r\n\r\n type=\"button\"\r\n\r\n onClick={handleCancel}\r\n\r\n disabled={isLoading}\r\n\r\n className=\"flex items-center justify-center w-4 h-4 text-white bg-red-500 rounded-sm hover:bg-red-600 disabled:opacity-50\"\r\n\r\n title=\"Cancel (Escape)\"\r\n\r\n >\r\n\r\n <FaTimes size={7} aria-hidden />\r\n\r\n </button>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n );\r\n\r\n }\r\n\r\n);\r\n\r\n\r\n\r\nCustomCellEditor.displayName = \"CustomCellEditor\";\r\n\r\n\r\n\r\nexport default CustomCellEditor;\r\n\r\n\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","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","el"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-GED6IT3S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|