@eztrak/shared 0.12.0 → 0.13.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.
@@ -613,6 +613,11 @@ function DropdownFilter({
613
613
  options,
614
614
  placeholder,
615
615
  borderRadius = "20px",
616
+ className,
617
+ isClearable = true,
618
+ isSearchable = true,
619
+ isDisabled = false,
620
+ isLoading = false,
616
621
  ...otherProps
617
622
  }) {
618
623
  const [searchParams, setSearchParams] = useSearchParams2();
@@ -630,17 +635,23 @@ function DropdownFilter({
630
635
  return prev;
631
636
  });
632
637
  };
633
- return /* @__PURE__ */ jsx3(
638
+ return /* @__PURE__ */ jsx3("div", { className: cn(className), children: /* @__PURE__ */ jsx3(
634
639
  Select,
635
640
  {
636
641
  placeholder: placeholder ?? `Select ${name}`,
637
642
  value: selectedOption,
638
643
  onChange: handleChange,
639
644
  options,
645
+ isClearable,
646
+ isSearchable,
647
+ isDisabled,
648
+ isLoading,
649
+ getOptionValue: (option) => String(option[valueKey] ?? ""),
650
+ getOptionLabel: (option) => String(option.label ?? option.name ?? option[valueKey] ?? ""),
640
651
  styles: dropdownStyles(borderRadius),
641
652
  ...otherProps
642
653
  }
643
- );
654
+ ) });
644
655
  }
645
656
 
646
657
  // src/components/search-filters/ResetFiltersButton.tsx
@@ -1459,6 +1470,67 @@ var CustomCellEditor = forwardRef(
1459
1470
  );
1460
1471
  CustomCellEditor.displayName = "CustomCellEditor";
1461
1472
 
1473
+ // src/components/popup-cell-renderer/PopupCellRenderer.tsx
1474
+ import { useState as useState4 } from "react";
1475
+ import Tippy from "@tippyjs/react";
1476
+ import { BiDotsVerticalRounded } from "react-icons/bi";
1477
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1478
+ function PopupCellRenderer({
1479
+ dropDownContent,
1480
+ actionIcon: ActionIcon = BiDotsVerticalRounded,
1481
+ title = "Actions",
1482
+ className,
1483
+ hideTitle = false,
1484
+ params,
1485
+ onAction,
1486
+ placement = "bottom-end",
1487
+ tippyProps
1488
+ }) {
1489
+ const [visible, setVisible] = useState4(false);
1490
+ const show = () => setVisible(true);
1491
+ const hide = () => setVisible(false);
1492
+ const rowData = params?.data;
1493
+ const handleAction = (actionType, actionRowData) => {
1494
+ onAction?.(actionType, actionRowData ?? rowData, hide);
1495
+ hide();
1496
+ };
1497
+ const content = typeof dropDownContent === "function" ? dropDownContent(handleAction) : dropDownContent;
1498
+ return /* @__PURE__ */ jsx12("div", { className: "flex h-full", children: /* @__PURE__ */ jsx12(
1499
+ Tippy,
1500
+ {
1501
+ content,
1502
+ visible,
1503
+ onClickOutside: hide,
1504
+ allowHTML: true,
1505
+ arrow: false,
1506
+ appendTo: () => document.body,
1507
+ interactive: true,
1508
+ placement,
1509
+ animation: "shift-away",
1510
+ theme: "light",
1511
+ maxWidth: "none",
1512
+ offset: [0, 5],
1513
+ ...tippyProps,
1514
+ children: /* @__PURE__ */ jsxs9(
1515
+ "button",
1516
+ {
1517
+ type: "button",
1518
+ onClick: visible ? hide : show,
1519
+ className: cn(
1520
+ "flex items-center justify-center gap-2 rounded-full text-gray-500 hover:text-gray-800",
1521
+ className
1522
+ ),
1523
+ "aria-label": "Row actions",
1524
+ children: [
1525
+ !hideTitle && title,
1526
+ /* @__PURE__ */ jsx12(ActionIcon, { "aria-hidden": true })
1527
+ ]
1528
+ }
1529
+ )
1530
+ }
1531
+ ) });
1532
+ }
1533
+
1462
1534
  export {
1463
1535
  EztrakTabs,
1464
1536
  ResetColumnsButton,
@@ -1473,6 +1545,7 @@ export {
1473
1545
  CardSkeleton,
1474
1546
  ToolTip,
1475
1547
  TooltipText,
1476
- CustomCellEditor
1548
+ CustomCellEditor,
1549
+ PopupCellRenderer
1477
1550
  };
1478
- //# sourceMappingURL=chunk-PHK4IOCF.mjs.map
1551
+ //# sourceMappingURL=chunk-4P22KKIJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tabs/EztrakTabs.tsx","../src/components/pagination/CustomPagination.tsx","../src/components/search-filters/DropdownFilter.tsx","../src/components/search-filters/dropdownStyles.ts","../src/components/search-filters/ResetFiltersButton.tsx","../src/components/search-filters/SearchInput.tsx","../src/components/modal/Modal.tsx","../src/components/Loader/Loader.tsx","../src/components/skeleton/CardSkeleton.tsx","../src/components/tooltip/ToolTip.tsx","../src/components/tooltip/TooltipText.tsx","../src/components/cell-editor/CustomCellEditor.tsx","../src/components/popup-cell-renderer/PopupCellRenderer.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 Select from \"react-select\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { dropdownStyles } from \"./dropdownStyles\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { DropdownFilterProps } from \"./types\";\r\n\r\nexport function DropdownFilter<Option extends Record<string, unknown>>({\r\n name,\r\n valueKey = \"id\",\r\n options,\r\n placeholder,\r\n borderRadius = \"20px\",\r\n className,\r\n isClearable = true,\r\n isSearchable = true, \r\n isDisabled = false,\r\n isLoading = false,\r\n ...otherProps\r\n}: DropdownFilterProps<Option>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n const currentValue = searchParams.get(name);\r\n const selectedOption = currentValue\r\n ? options?.find(\r\n (option) => option[valueKey]?.toString() === currentValue,\r\n ) ?? null\r\n : null;\r\n\r\n const handleChange = (selected: Option | null) => {\r\n setSearchParams((prev) => {\r\n if (!selected || selected[valueKey] === \"\") {\r\n prev.delete(name);\r\n } else {\r\n prev.set(name, String(selected[valueKey]));\r\n }\r\n return prev;\r\n });\r\n };\r\n\r\n return (\r\n <div className={cn(className)}>\r\n <Select<Option, false>\r\n placeholder={placeholder ?? `Select ${name}`}\r\n value={selectedOption}\r\n onChange={handleChange}\r\n options={options}\r\n isClearable={isClearable}\r\n isSearchable={isSearchable}\r\n isDisabled={isDisabled}\r\n isLoading={isLoading}\r\n getOptionValue={(option) => String(option[valueKey] ?? \"\")}\r\n getOptionLabel={(option) =>\r\n String(option.label ?? option.name ?? option[valueKey] ?? \"\")\r\n }\r\n styles={dropdownStyles<Option>(borderRadius)}\r\n {...otherProps}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { StylesConfig } from \"react-select\";\r\n\r\nconst themeColors = {\r\n primary: \"#FF7335\",\r\n primaryHover: \"#E65C2E\",\r\n lightBackground: \"#FFF3EB\",\r\n textColor: \"black\",\r\n white: \"white\",\r\n};\r\n\r\nexport\r\n const dropdownStyles = <Option,>(\r\n _borderRadius = \"5px\",\r\n): StylesConfig<Option, false> => ({\r\n control: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n padding: \"4px 8px\",\r\n minWidth: \"180px\",\r\n borderRadius: \"5px\",\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n boxShadow: state.isFocused\r\n ? \"0 0 0 2px rgba(255, 115, 53, 0.3)\"\r\n : \"none\",\r\n \"&:hover\": {\r\n borderColor: themeColors.primary,\r\n },\r\n transition: \"border-color 0.2s, box-shadow 0.2s\",\r\n zIndex: 50,\r\n }),\r\n option: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n backgroundColor: state.isSelected\r\n ? themeColors.primary\r\n : state.isFocused\r\n ? themeColors.lightBackground\r\n : themeColors.white,\r\n borderRadius: \"5px\",\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n color: state.isSelected\r\n ? themeColors.white\r\n : state.isFocused\r\n ? themeColors.primary\r\n : themeColors.textColor,\r\n \"&:hover\": {\r\n backgroundColor: themeColors.lightBackground,\r\n color: themeColors.primary,\r\n },\r\n \"&:active\": {\r\n backgroundColor: themeColors.primary,\r\n color: themeColors.white,\r\n },\r\n transition: \"background-color 0.2s, color 0.2s\",\r\n zIndex: 50,\r\n }),\r\n singleValue: (provided) => ({\r\n ...provided,\r\n color: themeColors.textColor,\r\n zIndex: 50,\r\n }),\r\n menu: (provided) => ({\r\n ...provided,\r\n borderRadius: \"5px\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n marginTop: \"4px\",\r\n zIndex: 50,\r\n }),\r\n dropdownIndicator: (provided) => ({\r\n ...provided,\r\n color: themeColors.primary,\r\n \"&:hover\": {\r\n color: themeColors.primaryHover,\r\n },\r\n zIndex: 50,\r\n }),\r\n indicatorSeparator: () => ({\r\n display: \"none\",\r\n }),\r\n});\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 { cn } from \"../../utils/cn\";\r\nimport type { CardSkeletonProps, CardSkeletonVariant } from \"./types\";\r\n\r\nconst DEFAULT_LINE_WIDTHS = [\"w-32\", \"w-48\"];\r\n\r\nfunction shouldShowAvatar(\r\n variant: CardSkeletonVariant,\r\n showAvatar: boolean | undefined\r\n) {\r\n return showAvatar ?? variant === \"profile\";\r\n}\r\n\r\nfunction shouldShowImage(\r\n variant: CardSkeletonVariant,\r\n showImage: boolean | undefined\r\n) {\r\n return showImage ?? variant === \"image\";\r\n}\r\n\r\nfunction AvatarSkeleton({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={cn(\"w-10 h-10 text-gray-200 dark:text-gray-700\", className)}\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 20 20\"\r\n >\r\n <path d=\"M10 0a10 10 0 1 0 10 10A10.011 10.011 0 0 0 10 0Zm0 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6Zm0 13a8.949 8.949 0 0 1-4.951-1.488A3.987 3.987 0 0 1 9 13h2a3.987 3.987 0 0 1 3.951 3.512A8.949 8.949 0 0 1 10 18Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SkeletonBlock({\r\n widthClass,\r\n className,\r\n isFirst,\r\n}: {\r\n widthClass: string;\r\n className?: string;\r\n isFirst: boolean;\r\n}) {\r\n return (\r\n <div\r\n className={cn(\r\n isFirst ? \"h-2.5 mb-2\" : \"h-2\",\r\n \"bg-gray-200 rounded-full dark:bg-gray-700\",\r\n widthClass,\r\n className\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport function CardSkeleton({\r\n variant = \"profile\",\r\n count = 1,\r\n lines = 2,\r\n lineWidths = DEFAULT_LINE_WIDTHS,\r\n showAvatar,\r\n showImage,\r\n animationDuration = \"0.7s\",\r\n className,\r\n style,\r\n avatarClassName,\r\n imageClassName,\r\n contentClassName,\r\n lineClassName,\r\n srLabel = \"Loading...\",\r\n ...props\r\n}: CardSkeletonProps) {\r\n const skeletons = Array.from({ length: Math.max(1, count) }, (_, index) => {\r\n const renderAvatar = shouldShowAvatar(variant, showAvatar);\r\n const renderImage = shouldShowImage(variant, showImage);\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={cn(\"animate-pulse md:p-6 dark:border-gray-700\", className)}\r\n style={{ animationDuration, ...style }}\r\n {...props}\r\n >\r\n {renderImage ? (\r\n <div\r\n className={cn(\r\n \"mb-4 h-32 w-full rounded-xl bg-gray-200 dark:bg-gray-700\",\r\n imageClassName\r\n )}\r\n />\r\n ) : null}\r\n <div className={cn(\"flex items-center mt-4 gap-4\", contentClassName)}>\r\n {renderAvatar ? <AvatarSkeleton className={avatarClassName} /> : null}\r\n <div>\r\n {Array.from({ length: Math.max(1, lines) }, (_, lineIndex) => (\r\n <SkeletonBlock\r\n key={lineIndex}\r\n widthClass={\r\n lineWidths[lineIndex] ??\r\n lineWidths[lineWidths.length - 1] ??\r\n DEFAULT_LINE_WIDTHS[1]\r\n }\r\n className={lineClassName}\r\n isFirst={lineIndex === 0}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n <span className=\"sr-only\">{srLabel}</span>\r\n </div>\r\n );\r\n });\r\n\r\n return <>{skeletons}</>;\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 positionStrategy=\"fixed\"\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","import { useState } from \"react\";\r\nimport Tippy from \"@tippyjs/react\";\r\nimport type { TippyProps } from \"@tippyjs/react\";\r\nimport { BiDotsVerticalRounded } from \"react-icons/bi\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { PopupCellRendererProps } from \"./types\";\r\n\r\n/**\r\n * Interactive popup trigger for table row actions (e.g. AG Grid cell renderer).\r\n *\r\n * Import Tippy styles in your app once:\r\n * `import \"tippy.js/dist/tippy.css\"`\r\n * `import \"tippy.js/themes/light.css\"`\r\n */\r\nexport function PopupCellRenderer<TRow = unknown>({\r\n dropDownContent,\r\n actionIcon: ActionIcon = BiDotsVerticalRounded,\r\n title = \"Actions\",\r\n className,\r\n hideTitle = false,\r\n params,\r\n onAction,\r\n placement = \"bottom-end\",\r\n tippyProps,\r\n}: PopupCellRendererProps<TRow>) {\r\n const [visible, setVisible] = useState(false);\r\n\r\n const show = () => setVisible(true);\r\n const hide = () => setVisible(false);\r\n\r\n const rowData = params?.data;\r\n\r\n const handleAction = (actionType: string, actionRowData?: TRow) => {\r\n onAction?.(actionType, actionRowData ?? rowData, hide);\r\n hide();\r\n };\r\n\r\n const content: TippyProps[\"content\"] =\r\n typeof dropDownContent === \"function\"\r\n ? dropDownContent(handleAction)\r\n : dropDownContent;\r\n\r\n return (\r\n <div className=\"flex h-full\">\r\n <Tippy\r\n content={content}\r\n visible={visible}\r\n onClickOutside={hide}\r\n allowHTML\r\n arrow={false}\r\n appendTo={() => document.body}\r\n interactive\r\n placement={placement}\r\n animation=\"shift-away\"\r\n theme=\"light\"\r\n maxWidth=\"none\"\r\n offset={[0, 5]}\r\n {...tippyProps}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={visible ? hide : show}\r\n className={cn(\r\n \"flex items-center justify-center gap-2 rounded-full text-gray-500 hover:text-gray-800\",\r\n className,\r\n )}\r\n aria-label=\"Row actions\"\r\n >\r\n {!hideTitle && title}\r\n <ActionIcon aria-hidden />\r\n </button>\r\n </Tippy>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["jsx","jsxs","useSearchParams","jsx","useSearchParams","useSearchParams","jsx","jsxs","useSearchParams","useEffect","useRef","useState","useSearchParams","jsx","jsxs","useSearchParams","useState","useRef","useEffect","useEffect","useRef","jsx","jsx","jsxs","useRef","useEffect","jsx","jsxs","_","useId","Fragment","jsx","jsxs","jsx","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useState","jsx","jsxs","useState"]}
@@ -2,6 +2,8 @@ import * as react from 'react';
2
2
  import react__default, { ReactNode, InputHTMLAttributes, HTMLAttributes, CSSProperties } from 'react';
3
3
  import { Props, StylesConfig } from 'react-select';
4
4
  import { PlacesType } from 'react-tooltip';
5
+ import { IconType } from 'react-icons';
6
+ import { TippyProps } from '@tippyjs/react';
5
7
 
6
8
  type EztrakTab = {
7
9
  id: string;
@@ -139,7 +141,7 @@ interface DropdownFilterProps<Option extends Record<string, unknown>> extends Om
139
141
  borderRadius?: string;
140
142
  }
141
143
 
142
- declare function DropdownFilter<Option extends Record<string, unknown>>({ name, valueKey, options, placeholder, borderRadius, ...otherProps }: DropdownFilterProps<Option>): react.JSX.Element;
144
+ declare function DropdownFilter<Option extends Record<string, unknown>>({ name, valueKey, options, placeholder, borderRadius, className, isClearable, isSearchable, isDisabled, isLoading, ...otherProps }: DropdownFilterProps<Option>): react.JSX.Element;
143
145
 
144
146
  declare function ResetFiltersButton({ label, showLabel, icon, variant, className, onReset, disabled, }: ResetFiltersButtonProps): react.JSX.Element;
145
147
 
@@ -285,4 +287,32 @@ interface CustomCellEditorProps {
285
287
 
286
288
  declare const CustomCellEditor: react.ForwardRefExoticComponent<CustomCellEditorProps & react.RefAttributes<CustomCellEditorRef>>;
287
289
 
288
- export { CardSkeleton, type CardSkeletonProps, type CardSkeletonVariant, type CellEditPayload, type CellEditorInputType, CustomCellEditor, type CustomCellEditorProps, type CustomCellEditorRef, CustomPagination, type CustomPaginationClassNames, type CustomPaginationProps, DropdownFilter, type DropdownFilterProps, type DropdownOption, type EztrakTab, EztrakTabs, type EztrakTabsClassNames, type EztrakTabsProps, type LayoutStatus, Loader, type LoaderProps, Modal, type ModalProps, type PaginationData, ResetColumnsButton, type ResetColumnsButtonProps, ResetFiltersButton, type ResetFiltersButtonProps, type ResetFiltersButtonVariant, SearchInput, type SearchInputProps, TableLayoutToolbarControls, type TableLayoutToolbarControlsProps, ToolTip, type ToolTipProps, TooltipText, type TooltipTextProps, dropdownStyles };
290
+ type PopupActionHandler<TRow = unknown> = (actionType: string, rowData?: TRow) => void;
291
+ type PopupDropDownContent<TRow = unknown> = ReactNode | ((handleAction: PopupActionHandler<TRow>) => ReactNode);
292
+ interface PopupCellRendererParams<TRow = unknown> {
293
+ data?: TRow;
294
+ [key: string]: unknown;
295
+ }
296
+ interface PopupCellRendererProps<TRow = unknown> {
297
+ dropDownContent: PopupDropDownContent<TRow>;
298
+ actionIcon?: IconType;
299
+ title?: string;
300
+ className?: string;
301
+ hideTitle?: boolean;
302
+ /** AG Grid cell renderer params; row data is read from `params.data`. */
303
+ params?: PopupCellRendererParams<TRow>;
304
+ onAction?: (actionType: string, rowData: TRow | undefined, hide: () => void) => void;
305
+ placement?: TippyProps["placement"];
306
+ tippyProps?: Omit<Partial<TippyProps>, "children" | "content" | "visible" | "placement">;
307
+ }
308
+
309
+ /**
310
+ * Interactive popup trigger for table row actions (e.g. AG Grid cell renderer).
311
+ *
312
+ * Import Tippy styles in your app once:
313
+ * `import "tippy.js/dist/tippy.css"`
314
+ * `import "tippy.js/themes/light.css"`
315
+ */
316
+ declare function PopupCellRenderer<TRow = unknown>({ dropDownContent, actionIcon: ActionIcon, title, className, hideTitle, params, onAction, placement, tippyProps, }: PopupCellRendererProps<TRow>): react.JSX.Element;
317
+
318
+ export { CardSkeleton, type CardSkeletonProps, type CardSkeletonVariant, type CellEditPayload, type CellEditorInputType, CustomCellEditor, type CustomCellEditorProps, type CustomCellEditorRef, CustomPagination, type CustomPaginationClassNames, type CustomPaginationProps, DropdownFilter, type DropdownFilterProps, type DropdownOption, type EztrakTab, EztrakTabs, type EztrakTabsClassNames, type EztrakTabsProps, type LayoutStatus, Loader, type LoaderProps, Modal, type ModalProps, type PaginationData, type PopupActionHandler, PopupCellRenderer, type PopupCellRendererParams, type PopupCellRendererProps, type PopupDropDownContent, ResetColumnsButton, type ResetColumnsButtonProps, ResetFiltersButton, type ResetFiltersButtonProps, type ResetFiltersButtonVariant, SearchInput, type SearchInputProps, TableLayoutToolbarControls, type TableLayoutToolbarControlsProps, ToolTip, type ToolTipProps, TooltipText, type TooltipTextProps, dropdownStyles };
@@ -2,6 +2,8 @@ import * as react from 'react';
2
2
  import react__default, { ReactNode, InputHTMLAttributes, HTMLAttributes, CSSProperties } from 'react';
3
3
  import { Props, StylesConfig } from 'react-select';
4
4
  import { PlacesType } from 'react-tooltip';
5
+ import { IconType } from 'react-icons';
6
+ import { TippyProps } from '@tippyjs/react';
5
7
 
6
8
  type EztrakTab = {
7
9
  id: string;
@@ -139,7 +141,7 @@ interface DropdownFilterProps<Option extends Record<string, unknown>> extends Om
139
141
  borderRadius?: string;
140
142
  }
141
143
 
142
- declare function DropdownFilter<Option extends Record<string, unknown>>({ name, valueKey, options, placeholder, borderRadius, ...otherProps }: DropdownFilterProps<Option>): react.JSX.Element;
144
+ declare function DropdownFilter<Option extends Record<string, unknown>>({ name, valueKey, options, placeholder, borderRadius, className, isClearable, isSearchable, isDisabled, isLoading, ...otherProps }: DropdownFilterProps<Option>): react.JSX.Element;
143
145
 
144
146
  declare function ResetFiltersButton({ label, showLabel, icon, variant, className, onReset, disabled, }: ResetFiltersButtonProps): react.JSX.Element;
145
147
 
@@ -285,4 +287,32 @@ interface CustomCellEditorProps {
285
287
 
286
288
  declare const CustomCellEditor: react.ForwardRefExoticComponent<CustomCellEditorProps & react.RefAttributes<CustomCellEditorRef>>;
287
289
 
288
- export { CardSkeleton, type CardSkeletonProps, type CardSkeletonVariant, type CellEditPayload, type CellEditorInputType, CustomCellEditor, type CustomCellEditorProps, type CustomCellEditorRef, CustomPagination, type CustomPaginationClassNames, type CustomPaginationProps, DropdownFilter, type DropdownFilterProps, type DropdownOption, type EztrakTab, EztrakTabs, type EztrakTabsClassNames, type EztrakTabsProps, type LayoutStatus, Loader, type LoaderProps, Modal, type ModalProps, type PaginationData, ResetColumnsButton, type ResetColumnsButtonProps, ResetFiltersButton, type ResetFiltersButtonProps, type ResetFiltersButtonVariant, SearchInput, type SearchInputProps, TableLayoutToolbarControls, type TableLayoutToolbarControlsProps, ToolTip, type ToolTipProps, TooltipText, type TooltipTextProps, dropdownStyles };
290
+ type PopupActionHandler<TRow = unknown> = (actionType: string, rowData?: TRow) => void;
291
+ type PopupDropDownContent<TRow = unknown> = ReactNode | ((handleAction: PopupActionHandler<TRow>) => ReactNode);
292
+ interface PopupCellRendererParams<TRow = unknown> {
293
+ data?: TRow;
294
+ [key: string]: unknown;
295
+ }
296
+ interface PopupCellRendererProps<TRow = unknown> {
297
+ dropDownContent: PopupDropDownContent<TRow>;
298
+ actionIcon?: IconType;
299
+ title?: string;
300
+ className?: string;
301
+ hideTitle?: boolean;
302
+ /** AG Grid cell renderer params; row data is read from `params.data`. */
303
+ params?: PopupCellRendererParams<TRow>;
304
+ onAction?: (actionType: string, rowData: TRow | undefined, hide: () => void) => void;
305
+ placement?: TippyProps["placement"];
306
+ tippyProps?: Omit<Partial<TippyProps>, "children" | "content" | "visible" | "placement">;
307
+ }
308
+
309
+ /**
310
+ * Interactive popup trigger for table row actions (e.g. AG Grid cell renderer).
311
+ *
312
+ * Import Tippy styles in your app once:
313
+ * `import "tippy.js/dist/tippy.css"`
314
+ * `import "tippy.js/themes/light.css"`
315
+ */
316
+ declare function PopupCellRenderer<TRow = unknown>({ dropDownContent, actionIcon: ActionIcon, title, className, hideTitle, params, onAction, placement, tippyProps, }: PopupCellRendererProps<TRow>): react.JSX.Element;
317
+
318
+ export { CardSkeleton, type CardSkeletonProps, type CardSkeletonVariant, type CellEditPayload, type CellEditorInputType, CustomCellEditor, type CustomCellEditorProps, type CustomCellEditorRef, CustomPagination, type CustomPaginationClassNames, type CustomPaginationProps, DropdownFilter, type DropdownFilterProps, type DropdownOption, type EztrakTab, EztrakTabs, type EztrakTabsClassNames, type EztrakTabsProps, type LayoutStatus, Loader, type LoaderProps, Modal, type ModalProps, type PaginationData, type PopupActionHandler, PopupCellRenderer, type PopupCellRendererParams, type PopupCellRendererProps, type PopupDropDownContent, ResetColumnsButton, type ResetColumnsButtonProps, ResetFiltersButton, type ResetFiltersButtonProps, type ResetFiltersButtonVariant, SearchInput, type SearchInputProps, TableLayoutToolbarControls, type TableLayoutToolbarControlsProps, ToolTip, type ToolTipProps, TooltipText, type TooltipTextProps, dropdownStyles };
@@ -37,6 +37,7 @@ __export(components_exports, {
37
37
  EztrakTabs: () => EztrakTabs,
38
38
  Loader: () => Loader,
39
39
  Modal: () => Modal,
40
+ PopupCellRenderer: () => PopupCellRenderer,
40
41
  ResetColumnsButton: () => ResetColumnsButton,
41
42
  ResetFiltersButton: () => ResetFiltersButton,
42
43
  SearchInput: () => SearchInput,
@@ -753,6 +754,11 @@ function DropdownFilter({
753
754
  options,
754
755
  placeholder,
755
756
  borderRadius = "20px",
757
+ className,
758
+ isClearable = true,
759
+ isSearchable = true,
760
+ isDisabled = false,
761
+ isLoading = false,
756
762
  ...otherProps
757
763
  }) {
758
764
  const [searchParams, setSearchParams] = (0, import_react_router_dom2.useSearchParams)();
@@ -770,17 +776,23 @@ function DropdownFilter({
770
776
  return prev;
771
777
  });
772
778
  };
773
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
779
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: cn(className), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
774
780
  import_react_select.default,
775
781
  {
776
782
  placeholder: placeholder ?? `Select ${name}`,
777
783
  value: selectedOption,
778
784
  onChange: handleChange,
779
785
  options,
786
+ isClearable,
787
+ isSearchable,
788
+ isDisabled,
789
+ isLoading,
790
+ getOptionValue: (option) => String(option[valueKey] ?? ""),
791
+ getOptionLabel: (option) => String(option.label ?? option.name ?? option[valueKey] ?? ""),
780
792
  styles: dropdownStyles(borderRadius),
781
793
  ...otherProps
782
794
  }
783
- );
795
+ ) });
784
796
  }
785
797
 
786
798
  // src/components/search-filters/ResetFiltersButton.tsx
@@ -1615,6 +1627,67 @@ var CustomCellEditor = (0, import_react5.forwardRef)(
1615
1627
  }
1616
1628
  );
1617
1629
  CustomCellEditor.displayName = "CustomCellEditor";
1630
+
1631
+ // src/components/popup-cell-renderer/PopupCellRenderer.tsx
1632
+ var import_react6 = require("react");
1633
+ var import_react7 = __toESM(require("@tippyjs/react"));
1634
+ var import_bi = require("react-icons/bi");
1635
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1636
+ function PopupCellRenderer({
1637
+ dropDownContent,
1638
+ actionIcon: ActionIcon = import_bi.BiDotsVerticalRounded,
1639
+ title = "Actions",
1640
+ className,
1641
+ hideTitle = false,
1642
+ params,
1643
+ onAction,
1644
+ placement = "bottom-end",
1645
+ tippyProps
1646
+ }) {
1647
+ const [visible, setVisible] = (0, import_react6.useState)(false);
1648
+ const show = () => setVisible(true);
1649
+ const hide = () => setVisible(false);
1650
+ const rowData = params?.data;
1651
+ const handleAction = (actionType, actionRowData) => {
1652
+ onAction?.(actionType, actionRowData ?? rowData, hide);
1653
+ hide();
1654
+ };
1655
+ const content = typeof dropDownContent === "function" ? dropDownContent(handleAction) : dropDownContent;
1656
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex h-full", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1657
+ import_react7.default,
1658
+ {
1659
+ content,
1660
+ visible,
1661
+ onClickOutside: hide,
1662
+ allowHTML: true,
1663
+ arrow: false,
1664
+ appendTo: () => document.body,
1665
+ interactive: true,
1666
+ placement,
1667
+ animation: "shift-away",
1668
+ theme: "light",
1669
+ maxWidth: "none",
1670
+ offset: [0, 5],
1671
+ ...tippyProps,
1672
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1673
+ "button",
1674
+ {
1675
+ type: "button",
1676
+ onClick: visible ? hide : show,
1677
+ className: cn(
1678
+ "flex items-center justify-center gap-2 rounded-full text-gray-500 hover:text-gray-800",
1679
+ className
1680
+ ),
1681
+ "aria-label": "Row actions",
1682
+ children: [
1683
+ !hideTitle && title,
1684
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ActionIcon, { "aria-hidden": true })
1685
+ ]
1686
+ }
1687
+ )
1688
+ }
1689
+ ) });
1690
+ }
1618
1691
  // Annotate the CommonJS export names for ESM import in node:
1619
1692
  0 && (module.exports = {
1620
1693
  CardSkeleton,
@@ -1624,6 +1697,7 @@ CustomCellEditor.displayName = "CustomCellEditor";
1624
1697
  EztrakTabs,
1625
1698
  Loader,
1626
1699
  Modal,
1700
+ PopupCellRenderer,
1627
1701
  ResetColumnsButton,
1628
1702
  ResetFiltersButton,
1629
1703
  SearchInput,